1 /* src/vm/properties.c - handling commandline properties
3 Copyright (C) 1996-2005, 2006, 2007 R. Grafl, A. Krall, C. Kruegel,
4 C. Oates, R. Obermaisser, M. Platter, M. Probst, S. Ring,
5 E. Steiner, C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich,
6 J. Wenninger, 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., 51 Franklin Street, Fifth Floor, Boston, MA
25 $Id: properties.c 8236 2007-07-27 10:18:17Z twisti $
34 #include <sys/utsname.h>
39 #include "mm/memory.h"
41 #include "native/jni.h"
43 #include "vm/global.h" /* required by java_lang_String.h */
44 #include "native/include/java_lang_String.h"
46 #include "toolbox/list.h"
47 #include "toolbox/util.h"
49 #include "vm/properties.h"
50 #include "vm/stringlocal.h"
53 #include "vm/jit/asmpart.h"
55 #include "vmcore/method.h"
56 #include "vmcore/options.h"
59 /* internal property structure ************************************************/
61 typedef struct list_properties_entry list_properties_entry;
63 struct list_properties_entry {
70 /* global variables ***********************************************************/
72 static list_t *list_properties = NULL;
75 /* properties_init *************************************************************
77 Initialize the properties list and fill the list with default
80 *******************************************************************************/
82 bool properties_init(void)
84 #if defined(ENABLE_JAVASE)
89 # if defined(WITH_CLASSPATH_GNU)
97 struct utsname *utsnamebuf;
101 /* create the properties list */
103 list_properties = list_create(OFFSET(list_properties_entry, linkage));
105 #if defined(ENABLE_JAVASE)
107 /* get properties from system */
109 env_java_home = getenv("JAVA_HOME");
111 /* set JAVA_HOME to default prefix if not defined */
113 if (env_java_home == NULL)
114 env_java_home = cacao_prefix;
116 /* fill in system properties */
118 /* add /jre to java.home property */
120 len = strlen(env_java_home) + strlen("/jre") + strlen("0");
122 java_home = MNEW(char, len);
124 strcpy(java_home, env_java_home);
125 strcat(java_home, "/jre");
127 properties_add("java.home", java_home);
129 properties_add("java.vm.specification.version", "1.0");
130 properties_add("java.vm.specification.vendor", "Sun Microsystems Inc.");
131 properties_add("java.vm.specification.name", "Java Virtual Machine Specification");
132 properties_add("java.vm.version", VERSION);
133 properties_add("java.vm.vendor", "CACAO Team");
134 properties_add("java.vm.name", "CACAO");
136 # if defined(ENABLE_INTRP)
138 /* XXX We don't support java.lang.Compiler */
139 /* properties_add("java.compiler", "cacao.intrp"); */
140 properties_add("java.vm.info", "interpreted mode");
145 /* XXX We don't support java.lang.Compiler */
146 /* properties_add("java.compiler", "cacao.jit"); */
147 properties_add("java.vm.info", "JIT mode");
150 # if defined(WITH_CLASSPATH_GNU)
152 /* get properties from system */
156 env_user = getenv("USER");
157 env_home = getenv("HOME");
158 env_lang = getenv("LANG");
160 utsnamebuf = NEW(struct utsname);
164 properties_add("java.runtime.version", VERSION);
165 properties_add("java.runtime.name", "CACAO");
167 properties_add("java.specification.version", "1.5");
168 properties_add("java.specification.vendor", "Sun Microsystems Inc.");
169 properties_add("java.specification.name", "Java Platform API Specification");
171 properties_add("java.version", JAVA_VERSION);
172 properties_add("java.vendor", "GNU Classpath");
173 properties_add("java.vendor.url", "http://www.gnu.org/software/classpath/");
175 properties_add("java.class.path", _Jv_classpath);
176 properties_add("java.class.version", CLASS_VERSION);
178 /* Set bootclasspath properties. One for GNU classpath and the
179 other for compatibility with Sun (required by most
182 properties_add("java.boot.class.path", _Jv_bootclasspath);
183 properties_add("sun.boot.class.path", _Jv_bootclasspath);
185 # if defined(WITH_STATIC_CLASSPATH)
186 properties_add("gnu.classpath.boot.library.path", ".");
187 properties_add("java.library.path" , ".");
189 /* fill gnu.classpath.boot.library.path with GNU Classpath library
192 properties_add("gnu.classpath.boot.library.path", classpath_libdir);
193 properties_add("java.library.path", _Jv_java_library_path);
196 properties_add("java.io.tmpdir", "/tmp");
198 # if defined(ENABLE_INTRP)
200 properties_add("gnu.java.compiler.name", "cacao.intrp");
205 properties_add("gnu.java.compiler.name", "cacao.jit");
208 /* set the java.ext.dirs property */
210 len = strlen(env_java_home) + strlen("/jre/lib/ext") + strlen("0");
212 extdirs = MNEW(char, len);
214 strcpy(extdirs, env_java_home);
215 strcat(extdirs, "/jre/lib/ext");
217 properties_add("java.ext.dirs", extdirs);
219 properties_add("java.endorsed.dirs", ""CACAO_PREFIX"/jre/lib/endorsed");
221 # if defined(DISABLE_GC)
222 /* When we disable the GC, we mmap the whole heap to a specific
223 address, so we can compare call traces. For this reason we have
224 to add the same properties on different machines, otherwise
225 more memory may be allocated (e.g. strlen("i386")
226 vs. strlen("alpha"). */
228 properties_add("os.arch", "unknown");
229 properties_add("os.name", "unknown");
230 properties_add("os.version", "unknown");
232 /* We need to set the os.arch hardcoded to be compatible with SUN. */
234 # if defined(__I386__)
235 /* map all x86 architectures (i386, i486, i686) to i386 */
237 properties_add("os.arch", "i386");
238 # elif defined(__POWERPC__)
239 properties_add("os.arch", "ppc");
240 # elif defined(__X86_64__)
241 properties_add("os.arch", "amd64");
243 /* default to what uname returns */
245 properties_add("os.arch", utsnamebuf->machine);
248 properties_add("os.name", utsnamebuf->sysname);
249 properties_add("os.version", utsnamebuf->release);
252 # if defined(WITH_STATIC_CLASSPATH)
253 /* This is just for debugging purposes and can cause troubles in
256 properties_add("gnu.cpu.endian", "unknown");
258 # if WORDS_BIGENDIAN == 1
259 properties_add("gnu.cpu.endian", "big");
261 properties_add("gnu.cpu.endian", "little");
265 properties_add("file.separator", "/");
266 properties_add("path.separator", ":");
267 properties_add("line.separator", "\n");
269 properties_add("user.name", env_user ? env_user : "null");
270 properties_add("user.home", env_home ? env_home : "null");
271 properties_add("user.dir", cwd ? cwd : "null");
275 if (env_lang != NULL) {
276 /* get the local stuff from the environment */
278 if (strlen(env_lang) <= 2) {
279 properties_add("user.language", env_lang);
282 if ((env_lang[2] == '_') && (strlen(env_lang) >= 5)) {
283 lang = MNEW(char, 3);
284 strncpy(lang, (char *) &env_lang[0], 2);
287 country = MNEW(char, 3);
288 strncpy(country, (char *) &env_lang[3], 2);
291 properties_add("user.language", lang);
292 properties_add("user.country", country);
297 /* if no default locale was specified, use `en_US' */
299 properties_add("user.language", "en");
300 properties_add("user.country", "US");
303 # elif defined(WITH_CLASSPATH_SUN)
305 properties_add("sun.boot.library.path", classpath_libdir);
309 # error unknown classpath configuration
313 #elif defined(ENABLE_JAVAME_CLDC1_1)
315 properties_add("microedition.configuration", "CLDC-1.1");
316 properties_add("microedition.platform", "generic");
317 properties_add("microedition.encoding", "ISO8859_1");
318 properties_add("microedition.profiles", "");
322 # error unknown Java configuration
326 /* everything's ok */
332 /* properties_add **************************************************************
334 Adds a property entry to the internal property list. If there's
335 already an entry with the same key, replace it.
337 *******************************************************************************/
339 void properties_add(char *key, char *value)
341 list_properties_entry *pe;
343 /* search for the entry */
345 for (pe = list_first_unsynced(list_properties); pe != NULL;
346 pe = list_next_unsynced(list_properties, pe)) {
347 if (strcmp(pe->key, key) == 0) {
348 /* entry was found, replace the value */
356 /* entry was not found, insert a new one */
358 pe = NEW(list_properties_entry);
363 list_add_last_unsynced(list_properties, pe);
367 /* properties_get **************************************************************
369 Get a property entry from the internal property list.
371 *******************************************************************************/
373 char *properties_get(char *key)
375 list_properties_entry *pe;
377 for (pe = list_first_unsynced(list_properties); pe != NULL;
378 pe = list_next_unsynced(list_properties, pe)) {
379 if (strcmp(pe->key, key) == 0)
387 /* properties_system_add *******************************************************
389 Adds a given property to the Java system properties.
391 *******************************************************************************/
393 void properties_system_add(java_objectheader *p, char *key, char *value)
396 java_objectheader *k;
397 java_objectheader *v;
399 /* search for method to add properties */
401 m = class_resolveclassmethod(p->vftbl->class,
403 utf_new_char("(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;"),
410 /* add to the Java system properties */
412 k = javastring_new_from_utf_string(key);
413 v = javastring_new_from_utf_string(value);
415 (void) vm_call_method(m, p, k, v);
419 /* properties_system_add_all ***************************************************
421 Adds all properties from the properties list to the Java system
425 p.... is actually a java_util_Properties structure
427 *******************************************************************************/
429 #if defined(ENABLE_JAVASE)
430 void properties_system_add_all(java_objectheader *p)
432 list_properties_entry *pe;
434 java_objectheader *key;
435 java_objectheader *value;
437 /* search for method to add properties */
439 m = class_resolveclassmethod(p->vftbl->class,
441 utf_new_char("(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;"),
448 /* process all properties stored in the internal table */
450 for (pe = list_first(list_properties); pe != NULL;
451 pe = list_next(list_properties, pe)) {
452 /* add to the Java system properties */
454 key = javastring_new_from_utf_string(pe->key);
455 value = javastring_new_from_utf_string(pe->value);
457 (void) vm_call_method(m, (java_objectheader *) p, key, value);
460 #endif /* defined(ENABLE_JAVASE) */
464 * These are local overrides for various environment variables in Emacs.
465 * Please do not remove this and leave it at the end of the file, where
466 * Emacs will automagically detect them.
467 * ---------------------------------------------------------------------
470 * indent-tabs-mode: t