1 /* src/native/vm/VMSystemProperties.c - gnu/classpath/VMSystemProperties
3 Copyright (C) 1996-2005 R. Grafl, A. Krall, C. Kruegel, C. Oates,
4 R. Obermaisser, M. Platter, M. Probst, S. Ring, E. Steiner,
5 C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich, J. Wenninger,
6 Institut f. Computersprachen - TU Wien
8 This file is part of CACAO.
10 This program is free software; you can redistribute it and/or
11 modify it under the terms of the GNU General Public License as
12 published by the Free Software Foundation; either version 2, or (at
13 your option) any later version.
15 This program is distributed in the hope that it will be useful, but
16 WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 General Public License for more details.
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
25 Contact: cacao@complang.tuwien.ac.at
27 Authors: Christian Thalinger
31 $Id: VMSystemProperties.c 3166 2005-09-10 16:34:12Z twisti $
38 #include <sys/utsname.h>
42 #include "cacao/cacao.h"
43 #include "mm/memory.h"
44 #include "native/jni.h"
45 #include "native/native.h"
46 #include "native/include/java_util_Properties.h"
47 #include "toolbox/logging.h"
48 #include "toolbox/util.h"
49 #include "vm/exceptions.h"
50 #include "vm/builtin.h"
51 #include "vm/loader.h"
52 #include "vm/options.h"
53 #include "vm/stringlocal.h"
54 #include "vm/tables.h"
55 #include "vm/jit/asmpart.h"
58 /* temporary property structure */
60 typedef struct property property;
68 static property *properties = NULL;
71 /* create_property *************************************************************
73 Create a property entry for a command line property definition.
75 *******************************************************************************/
77 void create_property(char *key, char *value)
89 /* insert_property *************************************************************
91 Used for inserting a property into the system's properties table. Method m
92 (usually put) and the properties table must be given.
94 *******************************************************************************/
96 static void insert_property(methodinfo *m, java_util_Properties *p, char *key,
102 k = javastring_new_char(key);
103 v = javastring_new_char(value);
105 asm_calljavafunction(m, p, k, v, NULL);
110 * Class: gnu/classpath/VMSystemProperties
112 * Signature: (Ljava/util/Properties;)V
114 JNIEXPORT void JNICALL Java_gnu_classpath_VMSystemProperties_preInit(JNIEnv *env, jclass clazz, java_util_Properties *p)
124 struct utsname utsnamebuf;
126 /* endianess union */
132 #if !defined(ENABLE_STATICVM)
133 char *ld_library_path;
139 *exceptionptr = new_nullpointerexception();
143 /* get properties from system */
146 java_home = getenv("JAVA_HOME");
147 user = getenv("USER");
148 home = getenv("HOME");
151 /* search for method to add properties */
153 m = class_resolveclassmethod(p->header.vftbl->class,
155 utf_new_char("(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;"),
162 insert_property(m, p, "java.version", JAVA_VERSION);
163 insert_property(m, p, "java.vendor", "CACAO Team");
164 insert_property(m, p, "java.vendor.url", "http://www.cacaojvm.org/");
165 insert_property(m, p, "java.home", java_home ? java_home : CACAO_INSTALL_PREFIX""CACAO_JRE_DIR);
166 insert_property(m, p, "java.vm.specification.version", "1.0");
167 insert_property(m, p, "java.vm.specification.vendor", "Sun Microsystems Inc.");
168 insert_property(m, p, "java.vm.specification.name", "Java Virtual Machine Specification");
169 insert_property(m, p, "java.vm.version", VERSION);
170 insert_property(m, p, "java.vm.vendor", "CACAO Team");
171 insert_property(m, p, "java.vm.name", "CACAO");
172 insert_property(m, p, "java.specification.version", "1.4");
173 insert_property(m, p, "java.specification.vendor", "Sun Microsystems Inc.");
174 insert_property(m, p, "java.specification.name", "Java Platform API Specification");
175 insert_property(m, p, "java.class.version", "48.0");
176 insert_property(m, p, "java.class.path", classpath);
178 insert_property(m, p, "java.runtime.version", VERSION);
179 insert_property(m, p, "java.runtime.name", "CACAO");
181 /* Set bootclasspath properties. One for GNU classpath and the other for */
182 /* compatibility with Sun (required by most applications). */
183 insert_property(m, p, "java.boot.class.path", bootclasspath);
184 insert_property(m, p, "sun.boot.class.path", bootclasspath);
186 #if defined(ENABLE_STATICVM)
187 insert_property(m, p, "gnu.classpath.boot.library.path", ".");
188 insert_property(m, p, "java.library.path" , ".");
190 /* fill gnu.classpath.boot.library.path with GNU classpath library path */
192 #if !defined(WITH_EXTERNAL_CLASSPATH)
193 libpathlen = strlen(CACAO_INSTALL_PREFIX) + strlen(CACAO_LIBRARY_PATH) +
196 libpathlen = strlen(EXTERNAL_CLASSPATH_PREFIX) +
197 strlen(CLASSPATH_LIBRARY_PATH) + strlen("0");
200 libpath = MNEW(char, libpathlen);
202 #if !defined(WITH_EXTERNAL_CLASSPATH)
203 strcat(libpath, CACAO_INSTALL_PREFIX);
204 strcat(libpath, CACAO_LIBRARY_PATH);
206 strcat(libpath, EXTERNAL_CLASSPATH_PREFIX);
207 strcat(libpath, CLASSPATH_LIBRARY_PATH);
209 insert_property(m, p, "gnu.classpath.boot.library.path", libpath);
211 MFREE(libpath, char, libpathlen);
214 /* now fill java.library.path */
216 ld_library_path = getenv("LD_LIBRARY_PATH");
218 if (ld_library_path) {
219 libpathlen = strlen(".:") + strlen(ld_library_path) + strlen("0");
221 libpath = MNEW(char, libpathlen);
223 strcpy(libpath, ".:");
224 strcat(libpath, ld_library_path);
226 insert_property(m, p, "java.library.path", libpath);
228 MFREE(libpath, char, libpathlen);
231 insert_property(m, p, "java.library.path", ".");
235 insert_property(m, p, "java.io.tmpdir", "/tmp");
237 #if defined(ENABLE_INTRP)
239 /* XXX We don't support java.lang.Compiler */
240 /* insert_property(m, p, "java.compiler", "cacao.intrp"); */
241 insert_property(m, p, "java.vm.info", "interpreted mode");
245 /* XXX We don't support java.lang.Compiler */
246 /* insert_property(m, p, "java.compiler", "cacao.jit"); */
247 insert_property(m, p, "java.vm.info", "JIT mode");
250 insert_property(m, p, "java.ext.dirs", CACAO_INSTALL_PREFIX""CACAO_EXT_DIR);
251 insert_property(m, p, "os.name", utsnamebuf.sysname);
252 insert_property(m, p, "os.arch", utsnamebuf.machine);
253 insert_property(m, p, "os.version", utsnamebuf.release);
254 insert_property(m, p, "file.separator", "/");
255 /* insert_property(m, p, "file.encoding", "null"); -- this must be set properly */
256 insert_property(m, p, "path.separator", ":");
257 insert_property(m, p, "line.separator", "\n");
258 insert_property(m, p, "user.name", user ? user : "null");
259 insert_property(m, p, "user.home", home ? home : "null");
260 insert_property(m, p, "user.dir", cwd ? cwd : "null");
262 /* Are we little or big endian? */
264 insert_property(m, p, "gnu.cpu.endian", u.c[0] ? "little" : "big");
267 /* disable gthread-jni's portable native sync due to yet unresolved
269 insert_property(m, p, "gnu.classpath.awt.gtk.portable.native.sync", "false");
274 locale = getenv("LANG");
275 if (locale != NULL) { /* gnu classpath is going to set en as language */
276 if (strlen(locale) <= 2) {
277 insert_property(m, p, "user.language", locale);
279 if ((locale[2]=='_')&&(strlen(locale)>=5)) {
280 lang = MNEW(char, 3);
281 strncpy(lang, (char*)&locale[0], 2);
283 region = MNEW(char, 3);
284 strncpy(region, (char*)&locale[3], 2);
286 insert_property(m, p, "user.language", lang);
287 insert_property(m, p, "user.region", region);
294 /* how do we get them? */
295 { "user.country", "US" },
296 { "user.timezone", "Europe/Vienna" },
298 /* XXX do we need this one? */
299 { "java.protocol.handler.pkgs", "gnu.java.net.protocol"}
301 insert_property(m, p, "java.protocol.handler.pkgs", "gnu.java.net.protocol");
303 /* insert properties defined on commandline */
308 insert_property(m, p, properties->key, properties->value);
311 properties = properties->next;
324 * These are local overrides for various environment variables in Emacs.
325 * Please do not remove this and leave it at the end of the file, where
326 * Emacs will automagically detect them.
327 * ---------------------------------------------------------------------
330 * indent-tabs-mode: t