+2005-04-25 Archie Cobbs <archie@dellroad.org>
+
+ * java/lang/Throwable.java: simplify initializing cause in constructor
+
+2005-04-25 Michael Koch <konqueror@gmx.de>
+
+ * 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 <roman@kennke.org>
* javax/swing/plaf/basic/BasicScrollBarUI.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 \
## 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 \
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 \
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 \
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 \
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 \
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 \
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 \
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)
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) \
-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)
@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@
--- /dev/null
+/* 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 <code>setProperties(null)</code>.
+ */
+ 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();
+}
--- /dev/null
+// 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 <config.h>
+#include <platform.h>
+
+#include <stdlib.h>
+#include <errno.h>
+
+#ifdef HAVE_PWD_H
+#include <pwd.h>
+#endif
+
+#ifdef HAVE_UNAME
+#include <sys/utsname.h>
+#endif
+
+#ifdef HAVE_LOCALE_H
+#include <locale.h>
+#endif
+
+#ifdef HAVE_LANGINFO_H
+#include <langinfo.h>
+#endif
+
+#include <gcj/cni.h>
+#include <jvm.h>
+#include <java-props.h>
+#include <gnu/classpath/SystemProperties.h>
+#include <java/lang/String.h>
+#include <jni.h>
+
+#ifdef USE_LTDL
+#include <ltdl.h>
+
+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 <typename T_uid, typename T_passwd, typename T_buf, typename T_len>
+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 <typename T_uid, typename T_passwd, typename T_buf, typename T_len>
+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 <typename T_uid, typename T_passwd, typename T_buf, typename T_len>
+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;
+}
+
/* 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.
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;
*/
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);
}
/**
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();
{
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];
-
}
/**
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");
}
}
*/
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)}.
- *
- * <p>These properties MUST include:
- * <dl>
- * <dt>java.version <dd>Java version number
- * <dt>java.vendor <dd>Java vendor specific string
- * <dt>java.vendor.url <dd>Java vendor URL
- * <dt>java.home <dd>Java installation directory
- * <dt>java.vm.specification.version <dd>VM Spec version
- * <dt>java.vm.specification.vendor <dd>VM Spec vendor
- * <dt>java.vm.specification.name <dd>VM Spec name
- * <dt>java.vm.version <dd>VM implementation version
- * <dt>java.vm.vendor <dd>VM implementation vendor
- * <dt>java.vm.name <dd>VM implementation name
- * <dt>java.specification.version <dd>Java Runtime Environment version
- * <dt>java.specification.vendor <dd>Java Runtime Environment vendor
- * <dt>java.specification.name <dd>Java Runtime Environment name
- * <dt>java.class.version <dd>Java class version number
- * <dt>java.class.path <dd>Java classpath
- * <dt>java.library.path <dd>Path for finding Java libraries
- * <dt>java.io.tmpdir <dd>Default temp file path
- * <dt>java.compiler <dd>Name of JIT to use
- * <dt>java.ext.dirs <dd>Java extension path
- * <dt>os.name <dd>Operating System Name
- * <dt>os.arch <dd>Operating System Architecture
- * <dt>os.version <dd>Operating System Version
- * <dt>file.separator <dd>File separator ("/" on Unix)
- * <dt>path.separator <dd>Path separator (":" on Unix)
- * <dt>line.separator <dd>Line separator ("\n" on Unix)
- * <dt>user.name <dd>User account name
- * <dt>user.home <dd>User home directory
- * <dt>user.dir <dd>User's current working directory
- * </dl>
- *
- * @param p the Properties object to insert the system properties into
- */
- static native void insertSystemProperties(Properties p);
} // class Runtime
/* 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.
package java.lang;
-import gnu.classpath.Configuration;
+import gnu.classpath.SystemProperties;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
// 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 <code>setProperties(null)</code>.
- */
- static
- {
- // Note that this loadLibrary() takes precedence over the one in Object,
- // since Object.<clinit> is waiting for System.<clinit> 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
* @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
SecurityManager sm = Runtime.securityManager; // Be thread-safe.
if (sm != null)
sm.checkPropertiesAccess();
- return properties;
+ return SystemProperties.getProperties();
}
/**
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);
}
/**
sm.checkPropertyAccess(key);
else if (key.length() == 0)
throw new IllegalArgumentException("key can't be empty");
- return properties.getProperty(key);
+ return SystemProperties.getProperty(key);
}
/**
SecurityManager sm = Runtime.securityManager; // Be thread-safe.
if (sm != null)
sm.checkPropertyAccess(key);
- return properties.getProperty(key, def);
+ return SystemProperties.getProperty(key, def);
}
/**
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)
{
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);
}
* check may be performed, <code>checkLink</code>. This just calls
* <code>Runtime.getRuntime().load(filename)</code>.
*
+ * <p>
+ * 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
* check may be performed, <code>checkLink</code>. This just calls
* <code>Runtime.getRuntime().load(filename)</code>.
*
+ * <p>
+ * 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
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.
*
package java.lang;
+import gnu.classpath.SystemProperties;
+
import java.io.PrintStream;
import java.io.PrintWriter;
import java.io.Serializable;
public Throwable(String message, Throwable cause)
{
this(message);
- initCause(cause);
+ this.cause = cause;
}
/**
*/
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
#include <gnu/gcj/runtime/FileDeleter.h>
#include <gnu/gcj/runtime/FinalizerThread.h>
#include <java/io/File.h>
-#include <java/util/Properties.h>
#include <java/util/TimeZone.h>
#include <java/lang/StringBuffer.h>
#include <java/lang/Process.h>
#endif
#include <errno.h>
-#ifdef HAVE_UNAME
-#include <sys/utsname.h>
-#endif
-
#ifdef HAVE_LOCALE_H
#include <locale.h>
#endif
return data.result;
}
-void
-_Jv_SetDLLSearchPath (const char *path)
-{
- lt_dlsetsearchpath (path);
-}
-
#else
void *
return NULL;
}
-void
-_Jv_SetDLLSearchPath (const char *)
-{
- // Nothing.
-}
-
#endif /* USE_LTDL */
\f
// 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 <typename T_uid, typename T_passwd, typename T_buf, typename T_len>
-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 <typename T_uid, typename T_passwd, typename T_buf, typename T_len>
-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 <typename T_uid, typename T_passwd, typename T_buf, typename T_len>
-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,
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)
{