PR143: don't hang with invalid locale
[cacao.git] / src / vm / properties.cpp
index f5b66db4d3b487236a19f6461e24ebd148877eba..c1029c660d602f7c5c399b0c9bbbbeb4177f5949 100644 (file)
@@ -1,6 +1,6 @@
 /* src/vm/properties.cpp - handling commandline properties
 
-   Copyright (C) 1996-2005, 2006, 2007, 2008
+   Copyright (C) 1996-2010
    CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO
 
    This file is part of CACAO.
 #include <string.h>
 #include <time.h>
 #include <unistd.h>
-#include <sys/utsname.h>
 
-#include "mm/memory.h"
+#include "mm/memory.hpp"
 
 #include "native/llni.h"
 
-#include "toolbox/util.h"
-
 #include "vm/class.hpp"
 #include "vm/global.h"
 #include "vm/method.hpp"
@@ -51,6 +48,9 @@
 
 #include "vm/jit/asmpart.h"
 
+#ifdef HAVE_LOCALE_H
+#include <locale.h>
+#endif
 
 /**
  * Constructor fills the properties list with default values.
@@ -317,7 +317,7 @@ Properties::Properties()
        put("java.vm.specification.version", "1.0");
        put("java.vm.specification.vendor", "Sun Microsystems Inc.");
        put("java.vm.specification.name", "Java Virtual Machine Specification");
-       put("java.vm.version", VERSION);
+       put("java.vm.version", VERSION_FULL);
        put("java.vm.vendor", "CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO");
        put("java.vm.name", "CACAO");
 
@@ -335,11 +335,19 @@ Properties::Properties()
                put("java.vm.info", "compiled mode");
        }
 
+       // Get and set java.library.path.
+       const char* java_library_path = os::getenv("LD_LIBRARY_PATH");
+
+       if (java_library_path == NULL)
+               java_library_path = "";
+
+       put("java.library.path", java_library_path);
+
 # if defined(WITH_JAVA_RUNTIME_LIBRARY_GNU_CLASSPATH)
 
        /* Get properties from system. */
 
-       char* cwd      = _Jv_getcwd();
+       char* cwd      = os::getcwd();
 
        char* env_user = os::getenv("USER");
        char* env_home = os::getenv("HOME");
@@ -349,7 +357,7 @@ Properties::Properties()
 
        uname(utsnamebuf);
 
-       put("java.runtime.version", VERSION);
+       put("java.runtime.version", VERSION_FULL);
        put("java.runtime.name", "CACAO");
 
        put("java.specification.version", "1.5");
@@ -364,14 +372,6 @@ Properties::Properties()
 
        put("gnu.classpath.boot.library.path", boot_library_path);
 
-       // Get and set java.library.path.
-       const char* java_library_path = os::getenv("LD_LIBRARY_PATH");
-
-       if (java_library_path == NULL)
-               java_library_path = "";
-
-       put("java.library.path", java_library_path);
-
        put("java.io.tmpdir", "/tmp");
 
 #  if defined(ENABLE_INTRP)
@@ -436,28 +436,33 @@ Properties::Properties()
 
        /* get locale */
 
+       bool use_en_US = true;
        if (env_lang != NULL) {
-               /* get the local stuff from the environment */
-
-               if (strlen(env_lang) <= 2) {
-                       put("user.language", env_lang);
-               }
-               else {
-                       if ((env_lang[2] == '_') && (strlen(env_lang) >= 5)) {
+#if defined(HAVE_SETLOCALE) && defined(HAVE_LC_MESSAGES)
+               /* get the locale stuff from the environment */
+               char *locale;
+
+               if ((locale = setlocale(LC_MESSAGES, ""))) {
+                       int len = strlen(locale);
+                       if (((len >= 5) && (locale[2] == '_')) || len == 2)  {
+                               use_en_US = false;
                                char* lang = MNEW(char, 3);
-                               strncpy(lang, (char*) &env_lang[0], 2);
+                               strncpy(lang, (char*) &locale[0], 2);
                                lang[2] = '\0';
+                               put("user.language", lang);
 
-                               char* country = MNEW(char, 3);
-                               strncpy(country, (char*) &env_lang[3], 2);
-                               country[2] = '\0';
+                               if (len >= 5) {
+                                       char* country = MNEW(char, 3);
+                                       strncpy(country, (char*) &locale[3], 2);
+                                       country[2] = '\0';
 
-                               put("user.language", lang);
-                               put("user.country", country);
+                                       put("user.country", country);
+                               }
                        }
                }
+#endif
        }
-       else {
+       if (use_en_US) {
                /* if no default locale was specified, use `en_US' */
 
                put("user.language", "en");