From: Michael Koch Date: Mon, 25 Apr 2005 19:48:35 +0000 (+0000) Subject: [multiple changes] X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=ee141b882274c83730b641028543aaa2ca59dcc4;p=gcc.git [multiple changes] 2005-04-25 Archie Cobbs * java/lang/Throwable.java: simplify initializing cause in constructor 2005-04-25 Michael Koch * gnu/classpath/SystemProperties.java: New file. * gnu/classpath/natSystemProperties.cc: New file. * java/lang/Runtime.java (defaultProperties): Removed. (static): Likewise. (): Made thrown exceptions more verbose. (insertSystemProperties): Removed. * java/lang/System.java (static): Likewise. (properties): Likewise. (setSecurityManager): Reordered modifiers. (getenv): Improved javadoc. (): Likewise. (isWordsBigEndian): Removed. * java/lang/natRuntime.cc (_Jv_SetDLLSearchPath): Likewise. (file_encoding): Likewise. (default_file_encoding): Likewise. (getpwuid_adaptor): Likewise. (insertSystemProperties): Likewise. * java/lang/natSystem.cc (isWordsBigEndian): Likewise. * Makefile.am (ordinary_java_source_files): Added gnu/classpath/SystemProperties.java. (nat_source_files): Added gnu/classpath/natSystemProperties.cc. * Makefile.in: Regenerated. From-SVN: r98734 --- diff --git a/libjava/ChangeLog b/libjava/ChangeLog index c43b743d4d0..9e7922aa28b 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,3 +1,37 @@ +2005-04-25 Archie Cobbs + + * java/lang/Throwable.java: simplify initializing cause in constructor + +2005-04-25 Michael Koch + + * gnu/classpath/SystemProperties.java: New file. + * gnu/classpath/natSystemProperties.cc: New file. + * java/lang/Runtime.java + (defaultProperties): Removed. + (static): Likewise. + (): Made thrown exceptions more verbose. + (insertSystemProperties): Removed. + * java/lang/System.java + (static): Likewise. + (properties): Likewise. + (setSecurityManager): Reordered modifiers. + (getenv): Improved javadoc. + (): Likewise. + (isWordsBigEndian): Removed. + * java/lang/natRuntime.cc + (_Jv_SetDLLSearchPath): Likewise. + (file_encoding): Likewise. + (default_file_encoding): Likewise. + (getpwuid_adaptor): Likewise. + (insertSystemProperties): Likewise. + * java/lang/natSystem.cc + (isWordsBigEndian): Likewise. + * Makefile.am + (ordinary_java_source_files): + Added gnu/classpath/SystemProperties.java. + (nat_source_files): Added gnu/classpath/natSystemProperties.cc. + * Makefile.in: Regenerated. + 2005-04-25 Roman Kennke * javax/swing/plaf/basic/BasicScrollBarUI.java diff --git a/libjava/Makefile.am b/libjava/Makefile.am index 89cb6333a96..ec82b73e7ec 100644 --- a/libjava/Makefile.am +++ b/libjava/Makefile.am @@ -3122,6 +3122,7 @@ java/util/regex/PatternSyntaxException.java ordinary_java_source_files = $(core_java_source_files) \ gnu/classpath/ServiceFactory.java \ gnu/classpath/ServiceProviderLoadingAction.java \ +gnu/classpath/SystemProperties.java \ gnu/gcj/Core.java \ gnu/gcj/RawData.java \ gnu/gcj/RawDataManaged.java \ @@ -3884,6 +3885,7 @@ math_c_source_files = \ ## This lists all the C++ source files in subdirectories. nat_source_files = \ +gnu/classpath/natSystemProperties.cc \ gnu/gcj/natCore.cc \ gnu/gcj/convert/JIS0208_to_Unicode.cc \ gnu/gcj/convert/JIS0212_to_Unicode.cc \ diff --git a/libjava/Makefile.in b/libjava/Makefile.in index aa822ca586c..926b5dace7d 100644 --- a/libjava/Makefile.in +++ b/libjava/Makefile.in @@ -238,7 +238,8 @@ libgcj0_convenience_la_DEPENDENCIES = gnu-xml.lo javax-imageio.lo \ external/w3c_dom/libw3c-gcj.la am__libgcj0_convenience_la_SOURCES_DIST = prims.cc jni.cc exception.cc \ stacktrace.cc link.cc defineclass.cc interpret.cc verify.cc \ - gnu/gcj/natCore.cc gnu/gcj/convert/JIS0208_to_Unicode.cc \ + gnu/classpath/natSystemProperties.cc gnu/gcj/natCore.cc \ + gnu/gcj/convert/JIS0208_to_Unicode.cc \ gnu/gcj/convert/JIS0212_to_Unicode.cc \ gnu/gcj/convert/Unicode_to_JIS.cc gnu/gcj/convert/natIconv.cc \ gnu/gcj/convert/natInput_EUCJIS.cc \ @@ -453,9 +454,10 @@ am__libgcj0_convenience_la_SOURCES_DIST = prims.cc jni.cc exception.cc \ java/util/regex/PatternSyntaxException.java \ gnu/classpath/ServiceFactory.java \ gnu/classpath/ServiceProviderLoadingAction.java \ - gnu/gcj/Core.java gnu/gcj/RawData.java \ - gnu/gcj/RawDataManaged.java gnu/gcj/io/DefaultMimeTypes.java \ - gnu/gcj/io/MimeTypes.java gnu/gcj/io/SimpleSHSStream.java \ + gnu/classpath/SystemProperties.java gnu/gcj/Core.java \ + gnu/gcj/RawData.java gnu/gcj/RawDataManaged.java \ + gnu/gcj/io/DefaultMimeTypes.java gnu/gcj/io/MimeTypes.java \ + gnu/gcj/io/SimpleSHSStream.java \ gnu/gcj/runtime/BootClassLoader.java \ gnu/gcj/runtime/ExtensionClassLoader.java \ gnu/gcj/runtime/FileDeleter.java \ @@ -2281,8 +2283,8 @@ am__libgcj0_convenience_la_SOURCES_DIST = prims.cc jni.cc exception.cc \ gnu/classpath/Configuration.java boehm.cc nogc.cc \ sysdep/dwarf2-backtrace.cc posix.cc win32.cc darwin.cc \ posix-threads.cc win32-threads.cc no-threads.cc -am__objects_5 = gnu/gcj/natCore.lo \ - gnu/gcj/convert/JIS0208_to_Unicode.lo \ +am__objects_5 = gnu/classpath/natSystemProperties.lo \ + gnu/gcj/natCore.lo gnu/gcj/convert/JIS0208_to_Unicode.lo \ gnu/gcj/convert/JIS0212_to_Unicode.lo \ gnu/gcj/convert/Unicode_to_JIS.lo gnu/gcj/convert/natIconv.lo \ gnu/gcj/convert/natInput_EUCJIS.lo \ @@ -3585,7 +3587,8 @@ am__objects_13 = org/ietf/jgss/GSSManager.lo \ org/ietf/jgss/Oid.lo org/ietf/jgss/GSSCredential.lo \ org/ietf/jgss/ChannelBinding.lo am__objects_14 = $(am__objects_8) gnu/classpath/ServiceFactory.lo \ - gnu/classpath/ServiceProviderLoadingAction.lo gnu/gcj/Core.lo \ + gnu/classpath/ServiceProviderLoadingAction.lo \ + gnu/classpath/SystemProperties.lo gnu/gcj/Core.lo \ gnu/gcj/RawData.lo gnu/gcj/RawDataManaged.lo \ gnu/gcj/io/DefaultMimeTypes.lo gnu/gcj/io/MimeTypes.lo \ gnu/gcj/io/SimpleSHSStream.lo \ @@ -6911,6 +6914,7 @@ java/util/regex/PatternSyntaxException.java ordinary_java_source_files = $(core_java_source_files) \ gnu/classpath/ServiceFactory.java \ gnu/classpath/ServiceProviderLoadingAction.java \ +gnu/classpath/SystemProperties.java \ gnu/gcj/Core.java \ gnu/gcj/RawData.java \ gnu/gcj/RawDataManaged.java \ @@ -7668,6 +7672,7 @@ math_c_source_files = \ java/lang/k_cos.c java/lang/s_sin.c java/lang/sf_fabs.c nat_source_files = \ +gnu/classpath/natSystemProperties.cc \ gnu/gcj/natCore.cc \ gnu/gcj/convert/JIS0208_to_Unicode.cc \ gnu/gcj/convert/JIS0212_to_Unicode.cc \ @@ -8194,6 +8199,14 @@ jni/classpath/lib_gnu_java_awt_peer_gtk_la-native_state.lo: \ jni/classpath/$(DEPDIR)/$(am__dirstamp) lib-gnu-java-awt-peer-gtk.la: $(lib_gnu_java_awt_peer_gtk_la_OBJECTS) $(lib_gnu_java_awt_peer_gtk_la_DEPENDENCIES) $(lib_gnu_java_awt_peer_gtk_la_LINK) $(am_lib_gnu_java_awt_peer_gtk_la_rpath) $(lib_gnu_java_awt_peer_gtk_la_LDFLAGS) $(lib_gnu_java_awt_peer_gtk_la_OBJECTS) $(lib_gnu_java_awt_peer_gtk_la_LIBADD) $(LIBS) +gnu/classpath/$(am__dirstamp): + @$(mkdir_p) gnu/classpath + @: > gnu/classpath/$(am__dirstamp) +gnu/classpath/$(DEPDIR)/$(am__dirstamp): + @$(mkdir_p) gnu/classpath/$(DEPDIR) + @: > gnu/classpath/$(DEPDIR)/$(am__dirstamp) +gnu/classpath/natSystemProperties.lo: gnu/classpath/$(am__dirstamp) \ + gnu/classpath/$(DEPDIR)/$(am__dirstamp) gnu/gcj/$(am__dirstamp): @$(mkdir_p) gnu/gcj @: > gnu/gcj/$(am__dirstamp) @@ -9041,17 +9054,13 @@ java/util/regex/Pattern.lo: java/util/regex/$(am__dirstamp) \ java/util/regex/PatternSyntaxException.lo: \ java/util/regex/$(am__dirstamp) \ java/util/regex/$(DEPDIR)/$(am__dirstamp) -gnu/classpath/$(am__dirstamp): - @$(mkdir_p) gnu/classpath - @: > gnu/classpath/$(am__dirstamp) -gnu/classpath/$(DEPDIR)/$(am__dirstamp): - @$(mkdir_p) gnu/classpath/$(DEPDIR) - @: > gnu/classpath/$(DEPDIR)/$(am__dirstamp) gnu/classpath/ServiceFactory.lo: gnu/classpath/$(am__dirstamp) \ gnu/classpath/$(DEPDIR)/$(am__dirstamp) gnu/classpath/ServiceProviderLoadingAction.lo: \ gnu/classpath/$(am__dirstamp) \ gnu/classpath/$(DEPDIR)/$(am__dirstamp) +gnu/classpath/SystemProperties.lo: gnu/classpath/$(am__dirstamp) \ + gnu/classpath/$(DEPDIR)/$(am__dirstamp) gnu/gcj/Core.lo: gnu/gcj/$(am__dirstamp) \ gnu/gcj/$(DEPDIR)/$(am__dirstamp) gnu/gcj/RawData.lo: gnu/gcj/$(am__dirstamp) \ @@ -15017,6 +15026,10 @@ mostlyclean-compile: -rm -f gnu/classpath/ServiceFactory.lo -rm -f gnu/classpath/ServiceProviderLoadingAction.$(OBJEXT) -rm -f gnu/classpath/ServiceProviderLoadingAction.lo + -rm -f gnu/classpath/SystemProperties.$(OBJEXT) + -rm -f gnu/classpath/SystemProperties.lo + -rm -f gnu/classpath/natSystemProperties.$(OBJEXT) + -rm -f gnu/classpath/natSystemProperties.lo -rm -f gnu/gcj/Core.$(OBJEXT) -rm -f gnu/gcj/Core.lo -rm -f gnu/gcj/RawData.$(OBJEXT) @@ -20071,6 +20084,8 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@gnu/classpath/$(DEPDIR)/Configuration.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@gnu/classpath/$(DEPDIR)/ServiceFactory.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@gnu/classpath/$(DEPDIR)/ServiceProviderLoadingAction.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gnu/classpath/$(DEPDIR)/SystemProperties.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gnu/classpath/$(DEPDIR)/natSystemProperties.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@gnu/gcj/$(DEPDIR)/Core.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@gnu/gcj/$(DEPDIR)/RawData.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@gnu/gcj/$(DEPDIR)/RawDataManaged.Plo@am__quote@ diff --git a/libjava/gnu/classpath/SystemProperties.java b/libjava/gnu/classpath/SystemProperties.java new file mode 100644 index 00000000000..ee642804378 --- /dev/null +++ b/libjava/gnu/classpath/SystemProperties.java @@ -0,0 +1,154 @@ +/* SystemProperties.java -- Manage the System properties. + Copyright (C) 2004, 2005 Free Software Foundation + +This file is part of GNU Classpath. + +GNU Classpath is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2, or (at your option) +any later version. + +GNU Classpath is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +General Public License for more details. + +You should have received a copy of the GNU General Public License +along with GNU Classpath; see the file COPYING. If not, write to the +Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA +02111-1307 USA. + +Linking this library statically or dynamically with other modules is +making a combined work based on this library. Thus, the terms and +conditions of the GNU General Public License cover the whole +combination. + +As a special exception, the copyright holders of this library give you +permission to link this library with independent modules to produce an +executable, regardless of the license terms of these independent +modules, and to copy and distribute the resulting executable under +terms of your choice, provided that you also meet, for each linked +independent module, the terms and conditions of the license of that +module. An independent module is a module which is not derived from +or based on this library. If you modify this library, you may extend +this exception to your version of the library, but you are not +obligated to do so. If you do not wish to do so, delete this +exception statement from your version. */ + + +package gnu.classpath; + +import java.util.Properties; + +/** + * The class manages the System properties. This class is only available to + * privileged code (i.e. code loaded by the bootstrap class loader) and + * therefore doesn't do any security checks. + * This class is separated out from java.lang.System to simplify bootstrap + * dependencies and to allow trusted code a simple and efficient mechanism + * to access the system properties. + */ +public class SystemProperties +{ + /** + * Stores the current system properties. This can be modified by + * {@link #setProperties(Properties)}, but will never be null, because + * setProperties(null) sucks in the default properties. + */ + private static Properties properties; + + /** + * The default properties. Once the default is stabilized, + * it should not be modified; + * instead it is cloned when calling setProperties(null). + */ + private static final Properties defaultProperties = new Properties(); + + private static native void insertSystemProperties(Properties properties); + + static + { + insertSystemProperties(defaultProperties); + + // Set base URL if not already set. + if (defaultProperties.get("gnu.classpath.home.url") == null) + defaultProperties.put("gnu.classpath.home.url", + "file://" + + defaultProperties.get("gnu.classpath.home") + + "/lib"); + + // Set short name if not already set. + if (defaultProperties.get("gnu.classpath.vm.shortname") == null) + { + String value = defaultProperties.getProperty("java.vm.name"); + int index = value.lastIndexOf(' '); + if (index != -1) + value = value.substring(index + 1); + defaultProperties.put("gnu.classpath.vm.shortname", value); + } + + // Network properties + if (defaultProperties.get("http.agent") == null) + { + String userAgent = ("gnu-classpath/" + + defaultProperties.getProperty("gnu.classpath.version") + + " (" + + defaultProperties.getProperty("gnu.classpath.vm.shortname") + + "/" + + defaultProperties.getProperty("java.vm.version") + + ")"); + defaultProperties.put("http.agent", userAgent); + } + + defaultProperties.put("gnu.cpu.endian", + isWordsBigEndian() ? "big" : "little"); + + // XXX FIXME - Temp hack for old systems that set the wrong property + if (defaultProperties.get("java.io.tmpdir") == null) + defaultProperties.put("java.io.tmpdir", + defaultProperties.get("java.tmpdir")); + + // Note that we use clone here and not new. Some programs assume + // that the system properties do not have a parent. + properties = (Properties) defaultProperties.clone(); + } + + public static String getProperty(String name) + { + return properties.getProperty(name); + } + + public static String getProperty(String name, String defaultValue) + { + return properties.getProperty(name, defaultValue); + } + + public static String setProperty(String name, String value) + { + return (String) properties.setProperty(name, value); + } + + public static Properties getProperties() + { + return properties; + } + + public static void setProperties(Properties properties) + { + if (properties == null) + { + // Note that we use clone here and not new. Some programs + // assume that the system properties do not have a parent. + properties = (Properties)defaultProperties.clone(); + } + + SystemProperties.properties = properties; + } + + /** + * Detect big-endian systems. + * + * @return true if the system is big-endian. + */ + private static native boolean isWordsBigEndian(); +} diff --git a/libjava/gnu/classpath/natSystemProperties.cc b/libjava/gnu/classpath/natSystemProperties.cc new file mode 100644 index 00000000000..d4f610951af --- /dev/null +++ b/libjava/gnu/classpath/natSystemProperties.cc @@ -0,0 +1,390 @@ +// natSystemProperties.cc - Implementation of native side of +// SystemProperties class. + +/* Copyright (C) 2005 Free Software Foundation + + This file is part of libgcj. + +This software is copyrighted work licensed under the terms of the +Libgcj License. Please consult the file "LIBGCJ_LICENSE" for +details. */ + +#include +#include + +#include +#include + +#ifdef HAVE_PWD_H +#include +#endif + +#ifdef HAVE_UNAME +#include +#endif + +#ifdef HAVE_LOCALE_H +#include +#endif + +#ifdef HAVE_LANGINFO_H +#include +#endif + +#include +#include +#include +#include +#include +#include + +#ifdef USE_LTDL +#include + +void +_Jv_SetDLLSearchPath (const char *path) +{ + lt_dlsetsearchpath (path); +} + +#else + +void +_Jv_SetDLLSearchPath (const char *) +{ + // Nothing. +} + +#endif /* USE_LTDL */ + +#if ! defined (DEFAULT_FILE_ENCODING) && defined (HAVE_ICONV) \ + && defined (HAVE_NL_LANGINFO) + +static char * +file_encoding () +{ + setlocale (LC_CTYPE, ""); + char *e = nl_langinfo (CODESET); + if (e == NULL || *e == '\0') + e = "8859_1"; + return e; +} + +#define DEFAULT_FILE_ENCODING file_encoding () + +#endif + +#ifndef DEFAULT_FILE_ENCODING +#define DEFAULT_FILE_ENCODING "8859_1" +#endif + +static char *default_file_encoding = DEFAULT_FILE_ENCODING; + +#if HAVE_GETPWUID_R +/* Use overload resolution to find out the signature of getpwuid_r. */ + + /* This is Posix getpwuid_r. */ +template +static inline int +getpwuid_adaptor(int (*getpwuid_r)(T_uid user_id, T_passwd *pwd_r, + T_buf *buf_r, T_len len_r, + T_passwd **pwd_entry_ptr), + uid_t user_id, struct passwd *pwd_r, + char *buf_r, size_t len_r, struct passwd **pwd_entry) +{ + return getpwuid_r (user_id, pwd_r, buf_r, len_r, pwd_entry); +} + +/* This is used on HPUX 10.20 */ +template +static inline int +getpwuid_adaptor(int (*getpwuid_r)(T_uid user_id, T_passwd *pwd_r, + T_buf *buf_r, T_len len_r), + uid_t user_id, struct passwd *pwd_r, + char *buf_r, size_t len_r, struct passwd **pwd_entry) +{ + return getpwuid_r (user_id, pwd_r, buf_r, len_r); +} + +/* This is used on IRIX 5.2. */ +template +static inline int +getpwuid_adaptor(T_passwd * (*getpwuid_r)(T_uid user_id, T_passwd *pwd_r, + T_buf *buf_r, T_len len_r), + uid_t user_id, struct passwd *pwd_r, + char *buf_r, size_t len_r, struct passwd **pwd_entry) +{ + *pwd_entry = getpwuid_r (user_id, pwd_r, buf_r, len_r); + return (*pwd_entry == NULL) ? errno : 0; +} +#endif + +void +gnu::classpath::SystemProperties::insertSystemProperties (java::util::Properties *newprops) +{ + // A convenience define. +#define SET(Prop,Val) \ + newprops->put(JvNewStringLatin1 (Prop), JvNewStringLatin1 (Val)) + + // A mixture of the Java Product Versioning Specification + // (introduced in 1.2), and earlier versioning properties. Some + // programs rely on seeing values that they expect, so we claim to + // be a 1.4-ish VM for their sake. + SET ("java.version", JV_VERSION); + SET ("java.runtime.version", JV_VERSION); + SET ("java.vendor", "Free Software Foundation, Inc."); + SET ("java.vendor.url", "http://gcc.gnu.org/java/"); + SET ("java.class.version", "46.0"); + SET ("java.vm.specification.version", "1.0"); + SET ("java.vm.specification.name", "Java(tm) Virtual Machine Specification"); + SET ("java.vm.specification.vendor", "Sun Microsystems Inc."); + SET ("java.vm.version", __VERSION__); + SET ("java.vm.vendor", "Free Software Foundation, Inc."); + SET ("java.vm.name", "GNU libgcj"); + SET ("java.specification.version", JV_API_VERSION); + SET ("java.specification.name", "Java(tm) Platform API Specification"); + SET ("java.specification.vendor", "Sun Microsystems Inc."); + + char value[100]; +#define NAME "GNU libgcj " + strcpy (value, NAME); + strncpy (value + sizeof (NAME) - 1, __VERSION__, + sizeof(value) - sizeof(NAME)); + value[sizeof (value) - 1] = '\0'; + jstring version = JvNewStringLatin1 (value); + newprops->put (JvNewStringLatin1 ("java.fullversion"), version); + newprops->put (JvNewStringLatin1 ("java.vm.info"), version); + + // This definition is rather arbitrary: we choose $(prefix). In + // part we do this because most people specify only --prefix and + // nothing else when installing gcj. Plus, people are free to + // redefine `java.home' with `-D' if necessary. + SET ("java.home", JAVA_HOME); + SET ("gnu.classpath.home", PREFIX); + // This is set to $(libdir) because we use this to find .security + // files at runtime. + char val2[sizeof ("file://") + sizeof (LIBDIR) + 1]; + strcpy (val2, "file://"); + strcat (val2, LIBDIR); + SET ("gnu.classpath.home.url", val2); + + SET ("file.encoding", default_file_encoding); + +#ifdef HAVE_UNAME + struct utsname u; + if (! uname (&u)) + { + SET ("os.name", u.sysname); + SET ("os.version", u.release); + + // Normalize x86 architecture names to "i386" (except on Windows, which + // is handled in win32.cc). + if (u.machine[0] == 'i' + && u.machine[1] != 0 + && u.machine[2] == '8' + && u.machine[3] == '6' + && u.machine[4] == 0) + SET ("os.arch", "i386"); + else + SET ("os.arch", u.machine); + } + else + { + SET ("os.name", "unknown"); + SET ("os.arch", "unknown"); + SET ("os.version", "unknown"); + } +#endif /* HAVE_UNAME */ + +#ifndef NO_GETUID +#ifdef HAVE_PWD_H + uid_t user_id = getuid (); + struct passwd *pwd_entry; + +#ifdef HAVE_GETPWUID_R + struct passwd pwd_r; + size_t len_r = 200; + char *buf_r = (char *) _Jv_AllocBytes (len_r); + + while (buf_r != NULL) + { + int r = getpwuid_adaptor (getpwuid_r, user_id, &pwd_r, + buf_r, len_r, &pwd_entry); + if (r == 0) + break; + else if (r != ERANGE) + { + pwd_entry = NULL; + break; + } + len_r *= 2; + buf_r = (char *) _Jv_AllocBytes (len_r); + } +#else + pwd_entry = getpwuid (user_id); +#endif /* HAVE_GETPWUID_R */ + + if (pwd_entry != NULL) + { + SET ("user.name", pwd_entry->pw_name); + SET ("user.home", pwd_entry->pw_dir); + } +#endif /* HAVE_PWD_H */ +#endif /* NO_GETUID */ + +#ifdef HAVE_GETCWD +#ifdef HAVE_UNISTD_H + /* Use getcwd to set "user.dir". */ + int buflen = 250; + char *buffer = (char *) malloc (buflen); + while (buffer != NULL) + { + if (getcwd (buffer, buflen) != NULL) + { + SET ("user.dir", buffer); + break; + } + if (errno != ERANGE) + break; + buflen = 2 * buflen; + buffer = (char *) realloc (buffer, buflen); + } + if (buffer != NULL) + free (buffer); +#endif /* HAVE_UNISTD_H */ +#endif /* HAVE_GETCWD */ + + // Set user locale properties based on setlocale() +#if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES) + // We let the user choose the locale. However, since Java differs + // from POSIX, we arbitrarily pick LC_MESSAGES as determining the + // Java locale. We can't use LC_ALL because it might return a full + // list of all the settings. If we don't have LC_MESSAGES then we + // just default to `en_US'. + setlocale (LC_ALL, ""); + char *locale = setlocale (LC_MESSAGES, ""); + if (locale && strlen (locale) >= 2) + { + char buf[3]; + buf[2] = '\0'; + // copy the first two chars to user.language + strncpy (buf, locale, 2); + SET ("user.language", buf); + // if the next char is a '_', copy the two after that to user.region + locale += 2; + if (locale[0] == '_') + { + locale++; + strncpy (buf, locale, 2); + SET ("user.region", buf); + } + } + else +#endif /* HAVE_SETLOCALE and HAVE_LC_MESSAGES */ + { + SET ("user.language", "en"); + SET ("user.region", "US"); + } + + // The java extensions directory. + SET ("java.ext.dirs", JAVA_EXT_DIRS); + + // The endorsed directories that libgcj knows about by default. + // This is a way to get other jars into the boot class loader + // without overriding java.endorsed.dirs. + SET ("gnu.gcj.runtime.endorsed.dirs", GCJ_ENDORSED_DIRS); + + // The path to libgcj's boot classes + SET ("sun.boot.class.path", BOOT_CLASS_PATH); + + // If there is a default system database, set it. + SET ("gnu.gcj.precompiled.db.path", LIBGCJ_DEFAULT_DATABASE); + + // Set some properties according to whatever was compiled in with + // `-D'. Important: after this point, the only properties that + // should be set are those which either the user cannot meaningfully + // override, or which augment whatever value the user has provided. + for (int i = 0; i < _Jv_Properties_Count; ++i) + { + const char *s, *p; + // Find the `='. + for (s = p = _Jv_Compiler_Properties[i]; *s && *s != '='; ++s) + ; + jstring name = JvNewStringLatin1 (p, s - p); + jstring val = JvNewStringLatin1 (*s == '=' ? s + 1 : s); + newprops->put (name, val); + } + + // Set the system properties from the user's environment. +#ifndef DISABLE_GETENV_PROPERTIES + if (_Jv_Environment_Properties) + { + size_t i = 0; + + while (_Jv_Environment_Properties[i].key) + { + SET (_Jv_Environment_Properties[i].key, + _Jv_Environment_Properties[i].value); + i++; + } + } +#endif + + // The name used to invoke this process (argv[0] in C). + SET ("gnu.gcj.progname", _Jv_GetSafeArg (0)); + + // Allow platform specific settings and overrides. + _Jv_platform_initProperties (newprops); + + // If java.library.path is set, tell libltdl so we search the new + // directories as well. FIXME: does this work properly on Windows? + ::java::lang::String *path = newprops->getProperty(JvNewStringLatin1("java.library.path")); + if (path) + { + char *val = (char *) _Jv_Malloc (JvGetStringUTFLength (path) + 1); + jsize total = JvGetStringUTFRegion (path, 0, path->length(), val); + val[total] = '\0'; + _Jv_SetDLLSearchPath (val); + _Jv_Free (val); + } + else + { + // Set a value for user code to see. + // FIXME: JDK sets this to the actual path used, including + // LD_LIBRARY_PATH, etc. + SET ("java.library.path", ""); + } + + // If java.class.path is still not set then set it according to the + // CLASSPATH environment variable if given. See gij.cc main () and + // prims.cc _Jv_CreateJavaVM () for all the ways this could have + // been set much earlier. + // If CLASSPATH isn't set or if the path is empty fall back to "." + path = newprops->getProperty(JvNewStringLatin1("java.class.path")); + if (!path) + { + char *classpath = getenv("CLASSPATH"); + if (classpath && classpath[0] != 0) + { + path = JvNewStringLatin1 (classpath); + newprops->put(JvNewStringLatin1 ("java.class.path"), path); + } + } + + if (!path || path->length() == 0) + SET ("java.class.path", "."); +} + +jboolean +gnu::classpath::SystemProperties::isWordsBigEndian (void) +{ + union + { + long lval; + char cval; + } u; + + u.lval = 1; + return u.cval == 0; +} + diff --git a/libjava/java/lang/Runtime.java b/libjava/java/lang/Runtime.java index 1094720404d..858b331c62b 100644 --- a/libjava/java/lang/Runtime.java +++ b/libjava/java/lang/Runtime.java @@ -1,5 +1,5 @@ /* Runtime.java -- access to the VM process - Copyright (C) 1998, 2002, 2003, 2004 Free Software Foundation + Copyright (C) 1998, 2002, 2003, 2004, 2005 Free Software Foundation This file is part of GNU Classpath. @@ -38,13 +38,14 @@ exception statement from your version. */ package java.lang; +import gnu.classpath.SystemProperties; + import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.HashSet; import java.util.Iterator; -import java.util.Properties; import java.util.Set; import java.util.StringTokenizer; @@ -72,47 +73,9 @@ public class Runtime */ static SecurityManager securityManager; - /** - * The default properties defined by the system. This is likewise located - * here instead of in Runtime, to avoid bootstrap issues; it is package - * visible to avoid overhead in java.lang. Note that System will add a - * few more properties to this collection, but that after that, it is - * treated as read-only. - * - * No matter what class you start initialization with, it defers to the - * superclass, therefore Object.<clinit> will be the first Java code - * executed. From there, the bootstrap sequence, up to the point that - * native libraries are loaded (as of March 24, when I traced this - * manually) is as follows: - * - * Object.<clinit> uses a String literal, possibly triggering initialization - * String.<clinit> calls WeakHashMap.<init>, triggering initialization - * AbstractMap, WeakHashMap, WeakHashMap$1 have no dependencies - * String.<clinit> calls CaseInsensitiveComparator.<init>, triggering - * initialization - * CaseInsensitiveComparator has no dependencies - * Object.<clinit> calls System.loadLibrary, triggering initialization - * System.<clinit> calls System.loadLibrary - * System.loadLibrary calls Runtime.getRuntime, triggering initialization - * Runtime.<clinit> calls Properties.<init>, triggering initialization - * Dictionary, Hashtable, and Properties have no dependencies - * Runtime.<clinit> calls VMRuntime.insertSystemProperties, triggering - * initialization of VMRuntime; the VM must make sure that there are - * not any harmful dependencies - * Runtime.<clinit> calls Runtime.<init> - * Runtime.<init> calls StringTokenizer.<init>, triggering initialization - * StringTokenizer has no dependencies - * System.loadLibrary calls Runtime.loadLibrary - * Runtime.loadLibrary should be able to load the library, although it - * will probably set off another string of initializations from - * ClassLoader first - */ - static Properties defaultProperties = new Properties(); - static { init(); - insertSystemProperties(defaultProperties); } /** @@ -134,8 +97,7 @@ public class Runtime private boolean finalizeOnExit; /** - * The one and only runtime instance. This must appear after the default - * properties have been initialized by the VM. + * The one and only runtime instance. */ private static final Runtime current = new Runtime(); @@ -146,12 +108,11 @@ public class Runtime { if (current != null) throw new InternalError("Attempt to recreate Runtime"); - + // We don't use libpath in the libgcj implementation. We still // set it to something to allow the various synchronizations to // work. libpath = new String[0]; - } /** @@ -322,15 +283,15 @@ public class Runtime if (sm != null) sm.checkPermission(new RuntimePermission("shutdownHooks")); if (hook.isAlive() || hook.getThreadGroup() == null) - throw new IllegalArgumentException(); + throw new IllegalArgumentException("The hook thread " + hook + " must not have been already run or started"); synchronized (libpath) { if (exitSequence != null) - throw new IllegalStateException(); + throw new IllegalStateException("The Virtual Machine is exiting. It is not possible anymore to add any hooks"); if (shutdownHooks == null) shutdownHooks = new HashSet(); // Lazy initialization. if (! shutdownHooks.add(hook)) - throw new IllegalArgumentException(); + throw new IllegalArgumentException(hook.toString() + " had already been inserted"); } } @@ -740,48 +701,4 @@ public class Runtime */ native Process execInternal(String[] cmd, String[] env, File dir) throws IOException; - - - /** - * Get the system properties. This is done here, instead of in System, - * because of the bootstrap sequence. Note that the native code should - * not try to use the Java I/O classes yet, as they rely on the properties - * already existing. The only safe method to use to insert these default - * system properties is {@link Properties#setProperty(String, String)}. - * - *

These properties MUST include: - *

- *
java.version
Java version number - *
java.vendor
Java vendor specific string - *
java.vendor.url
Java vendor URL - *
java.home
Java installation directory - *
java.vm.specification.version
VM Spec version - *
java.vm.specification.vendor
VM Spec vendor - *
java.vm.specification.name
VM Spec name - *
java.vm.version
VM implementation version - *
java.vm.vendor
VM implementation vendor - *
java.vm.name
VM implementation name - *
java.specification.version
Java Runtime Environment version - *
java.specification.vendor
Java Runtime Environment vendor - *
java.specification.name
Java Runtime Environment name - *
java.class.version
Java class version number - *
java.class.path
Java classpath - *
java.library.path
Path for finding Java libraries - *
java.io.tmpdir
Default temp file path - *
java.compiler
Name of JIT to use - *
java.ext.dirs
Java extension path - *
os.name
Operating System Name - *
os.arch
Operating System Architecture - *
os.version
Operating System Version - *
file.separator
File separator ("/" on Unix) - *
path.separator
Path separator (":" on Unix) - *
line.separator
Line separator ("\n" on Unix) - *
user.name
User account name - *
user.home
User home directory - *
user.dir
User's current working directory - *
- * - * @param p the Properties object to insert the system properties into - */ - static native void insertSystemProperties(Properties p); } // class Runtime diff --git a/libjava/java/lang/System.java b/libjava/java/lang/System.java index fa02666c9b0..b621f265ff9 100644 --- a/libjava/java/lang/System.java +++ b/libjava/java/lang/System.java @@ -1,5 +1,5 @@ /* System.java -- useful methods to interface with the system - Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004 + Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. This file is part of GNU Classpath. @@ -39,7 +39,7 @@ exception statement from your version. */ package java.lang; -import gnu.classpath.Configuration; +import gnu.classpath.SystemProperties; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; @@ -65,77 +65,6 @@ public final class System // WARNING: System is a CORE class in the bootstrap cycle. See the comments // in vm/reference/java/lang/Runtime for implications of this fact. - /** - * Add to the default properties. The field is stored in Runtime, because - * of the bootstrap sequence; but this adds several useful properties to - * the defaults. Once the default is stabilized, it should not be modified; - * instead it is passed as a parent properties for fast setup of the - * defaults when calling setProperties(null). - */ - static - { - // Note that this loadLibrary() takes precedence over the one in Object, - // since Object. is waiting for System. to complete - // first; but loading a library twice is harmless. - if (Configuration.INIT_LOAD_LIBRARY) - loadLibrary("javalang"); - - Properties defaultProperties = Runtime.defaultProperties; - - // Set base URL if not already set. - if (defaultProperties.get("gnu.classpath.home.url") == null) - defaultProperties.put("gnu.classpath.home.url", - "file://" - + defaultProperties.get("gnu.classpath.home") - + "/lib"); - - // Set short name if not already set. - if (defaultProperties.get("gnu.classpath.vm.shortname") == null) - { - String value = defaultProperties.getProperty("java.vm.name"); - int index = value.lastIndexOf(' '); - if (index != -1) - value = value.substring(index + 1); - defaultProperties.put("gnu.classpath.vm.shortname", value); - } - - // Network properties - if (defaultProperties.get("http.agent") == null) - { - String userAgent - = ("gnu-classpath/" - + defaultProperties.getProperty("gnu.classpath.version") - + " (" - + defaultProperties.getProperty("gnu.classpath.vm.shortname") - + "/" - + defaultProperties.getProperty("java.vm.version") - + ")"); - defaultProperties.put("http.agent", userAgent); - } - - defaultProperties.put("gnu.cpu.endian", - isWordsBigEndian() ? "big" : "little"); - - // GCJ LOCAL: Classpath sets common encoding aliases here. - // Since we don't (yet) have gnu.java.io.EncodingManager, these - // are a waste of time and just slow down system startup. - - // XXX FIXME - Temp hack for old systems that set the wrong property - if (defaultProperties.get("java.io.tmpdir") == null) - defaultProperties.put("java.io.tmpdir", - defaultProperties.get("java.tmpdir")); - } - - /** - * Stores the current system properties. This can be modified by - * {@link #setProperties(Properties)}, but will never be null, because - * setProperties(null) sucks in the default properties. - */ - // Note that we use clone here and not new. Some programs assume - // that the system properties do not have a parent. - static Properties properties - = (Properties) Runtime.defaultProperties.clone(); - /** * The standard InputStream. This is assigned at startup and starts its * life perfectly valid. Although it is marked final, you can change it @@ -246,7 +175,7 @@ public final class System * @param sm the new SecurityManager * @throws SecurityException if permission is denied */ - public synchronized static void setSecurityManager(SecurityManager sm) + public static synchronized void setSecurityManager(SecurityManager sm) { // Implementation note: the field lives in Runtime because of bootstrap // initialization issues. This method is synchronized so that no other @@ -383,7 +312,7 @@ public final class System SecurityManager sm = Runtime.securityManager; // Be thread-safe. if (sm != null) sm.checkPropertiesAccess(); - return properties; + return SystemProperties.getProperties(); } /** @@ -400,13 +329,7 @@ public final class System SecurityManager sm = Runtime.securityManager; // Be thread-safe. if (sm != null) sm.checkPropertiesAccess(); - if (properties == null) - { - // Note that we use clone here and not new. Some programs - // assume that the system properties do not have a parent. - properties = (Properties) Runtime.defaultProperties.clone(); - } - System.properties = properties; + SystemProperties.setProperties(properties); } /** @@ -426,7 +349,7 @@ public final class System sm.checkPropertyAccess(key); else if (key.length() == 0) throw new IllegalArgumentException("key can't be empty"); - return properties.getProperty(key); + return SystemProperties.getProperty(key); } /** @@ -445,7 +368,7 @@ public final class System SecurityManager sm = Runtime.securityManager; // Be thread-safe. if (sm != null) sm.checkPropertyAccess(key); - return properties.getProperty(key, def); + return SystemProperties.getProperty(key, def); } /** @@ -465,17 +388,20 @@ public final class System SecurityManager sm = Runtime.securityManager; // Be thread-safe. if (sm != null) sm.checkPermission(new PropertyPermission(key, "write")); - return (String) properties.setProperty(key, value); + return SystemProperties.setProperty(key, value); } /** * Gets the value of an environment variable. * * @param name the name of the environment variable - * @return the string value of the variable + * @return the string value of the variable or null when the + * environment variable is not defined. * @throws NullPointerException * @throws SecurityException if permission is denied * @since 1.5 + * @specnote This method was deprecated in some JDK releases, but + * was restored in 1.5. */ public static String getenv(String name) { @@ -483,7 +409,7 @@ public final class System throw new NullPointerException(); SecurityManager sm = Runtime.securityManager; // Be thread-safe. if (sm != null) - sm.checkPermission(new RuntimePermission("getenv."+name)); + sm.checkPermission(new RuntimePermission("getenv." + name)); return getenv0(name); } @@ -553,6 +479,10 @@ public final class System * check may be performed, checkLink. This just calls * Runtime.getRuntime().load(filename). * + *

+ * The library is loaded using the class loader associated with the + * class associated with the invoking method. + * * @param filename the code file to load * @throws SecurityException if permission is denied * @throws UnsatisfiedLinkError if the file cannot be loaded @@ -568,6 +498,10 @@ public final class System * check may be performed, checkLink. This just calls * Runtime.getRuntime().load(filename). * + *

+ * The library is loaded using the class loader associated with the + * class associated with the invoking method. + * * @param libname the library file to load * @throws SecurityException if permission is denied * @throws UnsatisfiedLinkError if the file cannot be loaded @@ -591,13 +525,6 @@ public final class System return Runtime.nativeGetLibname("", libname); } - /** - * Detect big-endian systems. - * - * @return true if the system is big-endian. - */ - static native boolean isWordsBigEndian(); - /** * Set {@link #in} to a new InputStream. * diff --git a/libjava/java/lang/Throwable.java b/libjava/java/lang/Throwable.java index ad5157823f5..d69b543141b 100644 --- a/libjava/java/lang/Throwable.java +++ b/libjava/java/lang/Throwable.java @@ -37,6 +37,8 @@ exception statement from your version. */ package java.lang; +import gnu.classpath.SystemProperties; + import java.io.PrintStream; import java.io.PrintWriter; import java.io.Serializable; @@ -170,7 +172,7 @@ public class Throwable implements Serializable public Throwable(String message, Throwable cause) { this(message); - initCause(cause); + this.cause = cause; } /** @@ -401,13 +403,7 @@ public class Throwable implements Serializable */ private static class StaticData { - static final String nl; - - static - { - // Access package private properties field to prevent Security check. - nl = System.properties.getProperty("line.separator"); - } + static final String nl = SystemProperties.getProperty("line.separator"); } // Create whole stack trace in a stringbuffer so we don't have to print diff --git a/libjava/java/lang/natRuntime.cc b/libjava/java/lang/natRuntime.cc index affe27a5fad..3df5cdd4d11 100644 --- a/libjava/java/lang/natRuntime.cc +++ b/libjava/java/lang/natRuntime.cc @@ -24,7 +24,6 @@ details. */ #include #include #include -#include #include #include #include @@ -38,10 +37,6 @@ details. */ #endif #include -#ifdef HAVE_UNAME -#include -#endif - #ifdef HAVE_LOCALE_H #include #endif @@ -83,12 +78,6 @@ _Jv_FindSymbolInExecutable (const char *symname) return data.result; } -void -_Jv_SetDLLSearchPath (const char *path) -{ - lt_dlsetsearchpath (path); -} - #else void * @@ -97,12 +86,6 @@ _Jv_FindSymbolInExecutable (const char *) return NULL; } -void -_Jv_SetDLLSearchPath (const char *) -{ - // Nothing. -} - #endif /* USE_LTDL */ @@ -296,324 +279,6 @@ java::lang::Runtime::traceMethodCalls (jboolean) // Do nothing. } -#if ! defined (DEFAULT_FILE_ENCODING) && defined (HAVE_ICONV) \ - && defined (HAVE_NL_LANGINFO) - -static char * -file_encoding () -{ - setlocale (LC_CTYPE, ""); - char *e = nl_langinfo (CODESET); - if (e == NULL || *e == '\0') - e = "8859_1"; - return e; -} - -#define DEFAULT_FILE_ENCODING file_encoding () - -#endif - -#ifndef DEFAULT_FILE_ENCODING -#define DEFAULT_FILE_ENCODING "8859_1" -#endif - -static char *default_file_encoding = DEFAULT_FILE_ENCODING; - -#if HAVE_GETPWUID_R -/* Use overload resolution to find out the signature of getpwuid_r. */ - - /* This is Posix getpwuid_r. */ -template -static inline int -getpwuid_adaptor(int (*getpwuid_r)(T_uid user_id, T_passwd *pwd_r, - T_buf *buf_r, T_len len_r, - T_passwd **pwd_entry_ptr), - uid_t user_id, struct passwd *pwd_r, - char *buf_r, size_t len_r, struct passwd **pwd_entry) -{ - return getpwuid_r (user_id, pwd_r, buf_r, len_r, pwd_entry); -} - -/* This is used on HPUX 10.20 */ -template -static inline int -getpwuid_adaptor(int (*getpwuid_r)(T_uid user_id, T_passwd *pwd_r, - T_buf *buf_r, T_len len_r), - uid_t user_id, struct passwd *pwd_r, - char *buf_r, size_t len_r, struct passwd **pwd_entry) -{ - return getpwuid_r (user_id, pwd_r, buf_r, len_r); -} - -/* This is used on IRIX 5.2. */ -template -static inline int -getpwuid_adaptor(T_passwd * (*getpwuid_r)(T_uid user_id, T_passwd *pwd_r, - T_buf *buf_r, T_len len_r), - uid_t user_id, struct passwd *pwd_r, - char *buf_r, size_t len_r, struct passwd **pwd_entry) -{ - *pwd_entry = getpwuid_r (user_id, pwd_r, buf_r, len_r); - return (*pwd_entry == NULL) ? errno : 0; -} -#endif - -void -java::lang::Runtime::insertSystemProperties (java::util::Properties *newprops) -{ - // A convenience define. -#define SET(Prop,Val) \ - newprops->put(JvNewStringLatin1 (Prop), JvNewStringLatin1 (Val)) - - // A mixture of the Java Product Versioning Specification - // (introduced in 1.2), and earlier versioning properties. Some - // programs rely on seeing values that they expect, so we claim to - // be a 1.4-ish VM for their sake. - SET ("java.version", JV_VERSION); - SET ("java.runtime.version", JV_VERSION); - SET ("java.vendor", "Free Software Foundation, Inc."); - SET ("java.vendor.url", "http://gcc.gnu.org/java/"); - SET ("java.class.version", "46.0"); - SET ("java.vm.specification.version", "1.0"); - SET ("java.vm.specification.name", "Java(tm) Virtual Machine Specification"); - SET ("java.vm.specification.vendor", "Sun Microsystems Inc."); - SET ("java.vm.version", __VERSION__); - SET ("java.vm.vendor", "Free Software Foundation, Inc."); - SET ("java.vm.name", "GNU libgcj"); - SET ("java.specification.version", JV_API_VERSION); - SET ("java.specification.name", "Java(tm) Platform API Specification"); - SET ("java.specification.vendor", "Sun Microsystems Inc."); - - char value[100]; -#define NAME "GNU libgcj " - strcpy (value, NAME); - strncpy (value + sizeof (NAME) - 1, __VERSION__, - sizeof(value) - sizeof(NAME)); - value[sizeof (value) - 1] = '\0'; - jstring version = JvNewStringLatin1 (value); - newprops->put (JvNewStringLatin1 ("java.fullversion"), version); - newprops->put (JvNewStringLatin1 ("java.vm.info"), version); - - // This definition is rather arbitrary: we choose $(prefix). In - // part we do this because most people specify only --prefix and - // nothing else when installing gcj. Plus, people are free to - // redefine `java.home' with `-D' if necessary. - SET ("java.home", JAVA_HOME); - SET ("gnu.classpath.home", PREFIX); - // This is set to $(libdir) because we use this to find .security - // files at runtime. - char val2[sizeof ("file://") + sizeof (LIBDIR) + 1]; - strcpy (val2, "file://"); - strcat (val2, LIBDIR); - SET ("gnu.classpath.home.url", val2); - - SET ("file.encoding", default_file_encoding); - -#ifdef HAVE_UNAME - struct utsname u; - if (! uname (&u)) - { - SET ("os.name", u.sysname); - SET ("os.version", u.release); - - // Normalize x86 architecture names to "i386" (except on Windows, which - // is handled in win32.cc). - if (u.machine[0] == 'i' - && u.machine[1] != 0 - && u.machine[2] == '8' - && u.machine[3] == '6' - && u.machine[4] == 0) - SET ("os.arch", "i386"); - else - SET ("os.arch", u.machine); - } - else - { - SET ("os.name", "unknown"); - SET ("os.arch", "unknown"); - SET ("os.version", "unknown"); - } -#endif /* HAVE_UNAME */ - -#ifndef NO_GETUID -#ifdef HAVE_PWD_H - uid_t user_id = getuid (); - struct passwd *pwd_entry; - -#ifdef HAVE_GETPWUID_R - struct passwd pwd_r; - size_t len_r = 200; - char *buf_r = (char *) _Jv_AllocBytes (len_r); - - while (buf_r != NULL) - { - int r = getpwuid_adaptor (getpwuid_r, user_id, &pwd_r, - buf_r, len_r, &pwd_entry); - if (r == 0) - break; - else if (r != ERANGE) - { - pwd_entry = NULL; - break; - } - len_r *= 2; - buf_r = (char *) _Jv_AllocBytes (len_r); - } -#else - pwd_entry = getpwuid (user_id); -#endif /* HAVE_GETPWUID_R */ - - if (pwd_entry != NULL) - { - SET ("user.name", pwd_entry->pw_name); - SET ("user.home", pwd_entry->pw_dir); - } -#endif /* HAVE_PWD_H */ -#endif /* NO_GETUID */ - -#ifdef HAVE_GETCWD -#ifdef HAVE_UNISTD_H - /* Use getcwd to set "user.dir". */ - int buflen = 250; - char *buffer = (char *) malloc (buflen); - while (buffer != NULL) - { - if (getcwd (buffer, buflen) != NULL) - { - SET ("user.dir", buffer); - break; - } - if (errno != ERANGE) - break; - buflen = 2 * buflen; - buffer = (char *) realloc (buffer, buflen); - } - if (buffer != NULL) - free (buffer); -#endif /* HAVE_UNISTD_H */ -#endif /* HAVE_GETCWD */ - - // Set user locale properties based on setlocale() -#if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES) - // We let the user choose the locale. However, since Java differs - // from POSIX, we arbitrarily pick LC_MESSAGES as determining the - // Java locale. We can't use LC_ALL because it might return a full - // list of all the settings. If we don't have LC_MESSAGES then we - // just default to `en_US'. - setlocale (LC_ALL, ""); - char *locale = setlocale (LC_MESSAGES, ""); - if (locale && strlen (locale) >= 2) - { - char buf[3]; - buf[2] = '\0'; - // copy the first two chars to user.language - strncpy (buf, locale, 2); - SET ("user.language", buf); - // if the next char is a '_', copy the two after that to user.region - locale += 2; - if (locale[0] == '_') - { - locale++; - strncpy (buf, locale, 2); - SET ("user.region", buf); - } - } - else -#endif /* HAVE_SETLOCALE and HAVE_LC_MESSAGES */ - { - SET ("user.language", "en"); - SET ("user.region", "US"); - } - - // The java extensions directory. - SET ("java.ext.dirs", JAVA_EXT_DIRS); - - // The endorsed directories that libgcj knows about by default. - // This is a way to get other jars into the boot class loader - // without overriding java.endorsed.dirs. - SET ("gnu.gcj.runtime.endorsed.dirs", GCJ_ENDORSED_DIRS); - - // The path to libgcj's boot classes - SET ("sun.boot.class.path", BOOT_CLASS_PATH); - - // If there is a default system database, set it. - SET ("gnu.gcj.precompiled.db.path", LIBGCJ_DEFAULT_DATABASE); - - // Set some properties according to whatever was compiled in with - // `-D'. Important: after this point, the only properties that - // should be set are those which either the user cannot meaningfully - // override, or which augment whatever value the user has provided. - for (int i = 0; i < _Jv_Properties_Count; ++i) - { - const char *s, *p; - // Find the `='. - for (s = p = _Jv_Compiler_Properties[i]; *s && *s != '='; ++s) - ; - jstring name = JvNewStringLatin1 (p, s - p); - jstring val = JvNewStringLatin1 (*s == '=' ? s + 1 : s); - newprops->put (name, val); - } - - // Set the system properties from the user's environment. -#ifndef DISABLE_GETENV_PROPERTIES - if (_Jv_Environment_Properties) - { - size_t i = 0; - - while (_Jv_Environment_Properties[i].key) - { - SET (_Jv_Environment_Properties[i].key, - _Jv_Environment_Properties[i].value); - i++; - } - } -#endif - - // The name used to invoke this process (argv[0] in C). - SET ("gnu.gcj.progname", _Jv_GetSafeArg (0)); - - // Allow platform specific settings and overrides. - _Jv_platform_initProperties (newprops); - - // If java.library.path is set, tell libltdl so we search the new - // directories as well. FIXME: does this work properly on Windows? - String *path = newprops->getProperty(JvNewStringLatin1("java.library.path")); - if (path) - { - char *val = (char *) _Jv_Malloc (JvGetStringUTFLength (path) + 1); - jsize total = JvGetStringUTFRegion (path, 0, path->length(), val); - val[total] = '\0'; - _Jv_SetDLLSearchPath (val); - _Jv_Free (val); - } - else - { - // Set a value for user code to see. - // FIXME: JDK sets this to the actual path used, including - // LD_LIBRARY_PATH, etc. - SET ("java.library.path", ""); - } - - // If java.class.path is still not set then set it according to the - // CLASSPATH environment variable if given. See gij.cc main () and - // prims.cc _Jv_CreateJavaVM () for all the ways this could have - // been set much earlier. - // If CLASSPATH isn't set or if the path is empty fall back to "." - path = newprops->getProperty(JvNewStringLatin1("java.class.path")); - if (!path) - { - char *classpath = getenv("CLASSPATH"); - if (classpath && classpath[0] != 0) - { - path = JvNewStringLatin1 (classpath); - newprops->put(JvNewStringLatin1 ("java.class.path"), path); - } - } - - if (!path || path->length() == 0) - SET ("java.class.path", "."); -} - java::lang::Process * java::lang::Runtime::execInternal (jstringArray cmd, jstringArray env, diff --git a/libjava/java/lang/natSystem.cc b/libjava/java/lang/natSystem.cc index a9dca324f8b..0a4c8b9a0f7 100644 --- a/libjava/java/lang/natSystem.cc +++ b/libjava/java/lang/natSystem.cc @@ -130,19 +130,6 @@ java::lang::System::identityHashCode (jobject obj) return _Jv_HashCode (obj); } -jboolean -java::lang::System::isWordsBigEndian (void) -{ - union - { - long lval; - char cval; - } u; - - u.lval = 1; - return u.cval == 0; -} - jstring java::lang::System::getenv0 (jstring name) {