[multiple changes]

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.

From-SVN: r98734
This commit is contained in:
Michael Koch 2005-04-25 19:48:35 +00:00
parent 8efae6bbfa
commit ee141b8822
10 changed files with 641 additions and 554 deletions

View File

@ -1,3 +1,37 @@
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

View File

@ -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 \

View File

@ -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@

View File

@ -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 <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();
}

View File

@ -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 <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;
}

View File

@ -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.&lt;clinit&gt; 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.&lt;clinit&gt; uses a String literal, possibly triggering initialization
* String.&lt;clinit&gt; calls WeakHashMap.&lt;init&gt;, triggering initialization
* AbstractMap, WeakHashMap, WeakHashMap$1 have no dependencies
* String.&lt;clinit&gt; calls CaseInsensitiveComparator.&lt;init&gt;, triggering
* initialization
* CaseInsensitiveComparator has no dependencies
* Object.&lt;clinit&gt; calls System.loadLibrary, triggering initialization
* System.&lt;clinit&gt; calls System.loadLibrary
* System.loadLibrary calls Runtime.getRuntime, triggering initialization
* Runtime.&lt;clinit&gt; calls Properties.&lt;init&gt;, triggering initialization
* Dictionary, Hashtable, and Properties have no dependencies
* Runtime.&lt;clinit&gt; calls VMRuntime.insertSystemProperties, triggering
* initialization of VMRuntime; the VM must make sure that there are
* not any harmful dependencies
* Runtime.&lt;clinit&gt; calls Runtime.&lt;init&gt;
* Runtime.&lt;init&gt; calls StringTokenizer.&lt;init&gt;, 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)}.
*
* <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

View File

@ -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 <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
@ -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, <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
@ -568,6 +498,10 @@ public final class System
* 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
@ -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.
*

View File

@ -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

View File

@ -24,7 +24,6 @@ details. */
#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>
@ -38,10 +37,6 @@ details. */
#endif
#include <errno.h>
#ifdef HAVE_UNAME
#include <sys/utsname.h>
#endif
#ifdef HAVE_LOCALE_H
#include <locale.h>
#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 <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,

View File

@ -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)
{