diff options
author | Tom Tromey <tromey@redhat.com> | 2002-05-13 20:10:37 +0000 |
---|---|---|
committer | Tom Tromey <tromey@gcc.gnu.org> | 2002-05-13 20:10:37 +0000 |
commit | 86397868159ba8c7ba20d56fdf49f551a512a1f1 (patch) | |
tree | 8d55a2017b3cd999dc25fd24a3e201558e07756e /libjava/java/lang/natRuntime.cc | |
parent | 16133d00586de86b5d77c3b5f5833c6485ca697c (diff) | |
download | gcc-86397868159ba8c7ba20d56fdf49f551a512a1f1.zip gcc-86397868159ba8c7ba20d56fdf49f551a512a1f1.tar.gz gcc-86397868159ba8c7ba20d56fdf49f551a512a1f1.tar.bz2 |
re PR libgcj/6389 (System.getProperty("") should always throw an IllegalArgumentException)
Fixes PR libgcj/6389:
* Makefile.in: Rebuilt.
* Makefile.am (nat_source_files): Added natTimeZone.cc.
* java/util/natTimeZone.cc: New file.
* java/util/TimeZone.java (getDefaultTimeZoneId): New method.
* java/lang/System.java: Merged with Classpath.
* java/lang/Runtime.java: Merged with Classpath.
* java/lang/natSystem.cc (setErr0): Renamed from setErr; don't run
security check.
(setIn0): Renamed from setIn; don't run security check.
(setOut0): Renamed from setOut; don't run security check.
(file_encoding, getpwuid_adaptor, getSystemTimeZone,
init_properties): Moved to natRuntime.cc.
Moved many includes to natRuntime.cc.
(isWordsBigEndian): New method.
* java/lang/natRuntime.cc: Include Long.h, also other includes
previously in natSystem.cc.
(maxMemory): New function.
(exitInternal): Renamed from `_exit'.
(exit): Removed.
(init): Don't set finalize_on_exit.
(exitInternal): Use `finalizeOnExit'.
(file_encoding, getpwuid_adaptor): New functions from
natSystem.cc.
(insertSystemProperties): New method, renamed from
System::init_properties. Don't set user.timezone.
(_load): Don't call checkLink.
(execInternal): New method.
(availableProcessors): Likewise.
(nativeGetLibname): Likewise.
From-SVN: r53429
Diffstat (limited to 'libjava/java/lang/natRuntime.cc')
-rw-r--r-- | libjava/java/lang/natRuntime.cc | 375 |
1 files changed, 365 insertions, 10 deletions
diff --git a/libjava/java/lang/natRuntime.cc b/libjava/java/lang/natRuntime.cc index a566bf4..0783d5b 100644 --- a/libjava/java/lang/natRuntime.cc +++ b/libjava/java/lang/natRuntime.cc @@ -14,14 +14,53 @@ details. */ #include <gcj/cni.h> #include <jvm.h> +#include <java-props.h> +#include <java/lang/Long.h> #include <java/lang/Runtime.h> #include <java/lang/UnknownError.h> #include <java/lang/UnsatisfiedLinkError.h> #include <gnu/gcj/runtime/FileDeleter.h> #include <gnu/gcj/runtime/FinalizerThread.h> +#include <java/util/Properties.h> +#include <java/util/TimeZone.h> +#include <java/lang/StringBuffer.h> +#include <java/lang/Process.h> +#include <java/lang/ConcreteProcess.h> #include <jni.h> +#include "platform.h" + +#ifdef HAVE_PWD_H +#include <pwd.h> +#endif +#include <errno.h> + +#ifdef HAVE_UNAME +#include <sys/utsname.h> +#endif + +#ifdef HAVE_LOCALE_H +#include <locale.h> +#endif + +#ifdef HAVE_LANGINFO_H +#include <langinfo.h> +#endif + +#if TIME_WITH_SYS_TIME +# include <sys/time.h> +# include <time.h> +#else +# if HAVE_SYS_TIME_H +# include <sys/time.h> +# else +# include <time.h> +# endif +#endif + + + #ifdef USE_LTDL #include <ltdl.h> @@ -83,21 +122,16 @@ _Jv_FindSymbolInExecutable (const char *symname) #endif /* USE_LTDL */ -void -java::lang::Runtime::exit (jint status) -{ - checkExit (status); - _exit (status); -} + void -java::lang::Runtime::_exit (jint status) +java::lang::Runtime::exitInternal (jint status) { // Make status right for Unix. This is perhaps strange. if (status < 0 || status > 255) status = 255; - if (finalize_on_exit) + if (finalizeOnExit) _Jv_RunAllFinalizers (); // Delete all files registered with File.deleteOnExit() @@ -122,7 +156,6 @@ void java::lang::Runtime::_load (jstring path, jboolean do_search) { JvSynchronize sync (this); - checkLink (path); using namespace java::lang; #ifdef USE_LTDL jint len = _Jv_GetStringUTFLength (path); @@ -205,7 +238,6 @@ java::lang::Runtime::loadLibraryInternal (jstring lib) void java::lang::Runtime::init (void) { - finalize_on_exit = false; #ifdef USE_LTDL lt_dlinit (); lt_dlhandle self = lt_dlopen (NULL); @@ -226,6 +258,14 @@ java::lang::Runtime::totalMemory (void) return _Jv_GCTotalMemory (); } +jlong +java::lang::Runtime::maxMemory (void) +{ + // We don't have a maximum. FIXME: we might if we ask the GC for + // one. + return Long::MAX_VALUE; +} + void java::lang::Runtime::traceInstructions (jboolean) { @@ -237,3 +277,318 @@ 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. + SET ("java.version", GCJVERSION); + 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", "1.3"); + 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", PREFIX); + + SET ("file.encoding", default_file_encoding); + +#ifdef HAVE_UNAME + struct utsname u; + if (! uname (&u)) + { + SET ("os.name", u.sysname); + SET ("os.arch", u.machine); + SET ("os.version", u.release); + } + 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"); + } + + // Set some properties according to whatever was compiled in with + // `-D'. + for (int i = 0; _Jv_Compiler_Properties[i]; ++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 + + if (_Jv_Jar_Class_Path) + newprops->put(JvNewStringLatin1 ("java.class.path"), + JvNewStringLatin1 (_Jv_Jar_Class_Path)); + else + { + // FIXME: find libgcj.zip and append its path? + char *classpath = ::getenv("CLASSPATH"); + jstring cp = newprops->getProperty (JvNewStringLatin1("java.class.path")); + java::lang::StringBuffer *sb = new java::lang::StringBuffer (); + + if (classpath) + { + sb->append (JvNewStringLatin1 (classpath)); +#ifdef WIN32 + sb->append ((jchar) ';'); +#else + sb->append ((jchar) ':'); +#endif + } + if (cp != NULL) + sb->append (cp); + else + sb->append ((jchar) '.'); + + newprops->put(JvNewStringLatin1 ("java.class.path"), + sb->toString ()); + } + + // Allow platform specific settings and overrides. + _Jv_platform_initProperties (newprops); +} + +java::lang::Process * +java::lang::Runtime::execInternal (jstringArray cmd, + jstringArray env) +{ + return new java::lang::ConcreteProcess (cmd, env); +} + +jint +java::lang::Runtime::availableProcessors (void) +{ + // FIXME: find the real value. + return 1; +} + +jstring +java::lang::Runtime::nativeGetLibname (jstring pathname, jstring libname) +{ + java::lang::StringBuffer *sb = new java::lang::StringBuffer (); + sb->append(pathname); + if (pathname->length() > 0) + { + // FIXME: use platform function here. +#ifdef WIN32 + sb->append ((jchar) '\\'); +#else + sb->append ((jchar) '/'); +#endif + } + + // FIXME: use platform function here. +#ifndef WIN32 + sb->append (JvNewStringLatin1 ("lib")); +#endif + + sb->append(libname); + + // FIXME: use platform function here. +#ifdef WIN32 + sb->append (JvNewStringLatin1 ("dll")); +else + sb->append (JvNewStringLatin1 ("so")); +#endif + + return sb->toString(); +} |