< prev index next >

src/java.base/macosx/native/libjava/java_props_macosx.c

Print this page


   1 /*
   2  * Copyright (c) 1998, 2015, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.  Oracle designates this
   8  * particular file as subject to the "Classpath" exception as provided
   9  * by Oracle in the LICENSE file that accompanied this code.
  10  *
  11  * This code is distributed in the hope that it will be useful, but WITHOUT
  12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14  * version 2 for more details (a copy is included in the LICENSE file that
  15  * accompanied this code).
  16  *
  17  * You should have received a copy of the GNU General Public License version
  18  * 2 along with this work; if not, write to the Free Software Foundation,
  19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20  *
  21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any
  23  * questions.
  24  */
  25 
  26 #include <dlfcn.h>
  27 #include <sys/socket.h>
  28 #include <netinet/in.h>
  29 #include <arpa/inet.h>

  30 
  31 #include <Security/AuthSession.h>
  32 #include <CoreFoundation/CoreFoundation.h>
  33 #include <SystemConfiguration/SystemConfiguration.h>
  34 #include <Foundation/Foundation.h>
  35 
  36 #include "java_props_macosx.h"
  37 
  38 // need dlopen/dlsym trick to avoid pulling in JavaRuntimeSupport before libjava.dylib is loaded
  39 static void *getJRSFramework() {
  40     static void *jrsFwk = NULL;
  41 #ifndef STATIC_BUILD
  42 // JavaRuntimeSupport doesn't support static Java runtimes
  43     if (jrsFwk == NULL) {
  44        jrsFwk = dlopen("/System/Library/Frameworks/JavaVM.framework/Frameworks/JavaRuntimeSupport.framework/JavaRuntimeSupport", RTLD_LAZY | RTLD_LOCAL);
  45     }
  46 #endif
  47     return jrsFwk;
  48 }
  49 
  50 char *getPosixLocale(int cat) {
  51     char *lc = setlocale(cat, NULL);
  52     if ((lc == NULL) || (strcmp(lc, "C") == 0)) {
  53         lc = getenv("LANG");
  54     }
  55     if (lc == NULL) return NULL;
  56     return strdup(lc);
  57 }
  58 
  59 #define LOCALEIDLENGTH  128
  60 char *getMacOSXLocale(int cat) {
  61     switch (cat) {
  62     case LC_MESSAGES:
  63         {
  64             void *jrsFwk = getJRSFramework();
  65             if (jrsFwk == NULL) return NULL;
  66 
  67             char *(*JRSCopyPrimaryLanguage)() = dlsym(jrsFwk, "JRSCopyPrimaryLanguage");
  68             char *primaryLanguage = JRSCopyPrimaryLanguage ? JRSCopyPrimaryLanguage() : NULL;
  69             if (primaryLanguage == NULL) return NULL;
  70 
  71             char *(*JRSCopyCanonicalLanguageForPrimaryLanguage)(char *) = dlsym(jrsFwk, "JRSCopyCanonicalLanguageForPrimaryLanguage");
  72             char *canonicalLanguage = JRSCopyCanonicalLanguageForPrimaryLanguage ?  JRSCopyCanonicalLanguageForPrimaryLanguage(primaryLanguage) : NULL;
  73             free (primaryLanguage);
  74 
  75             return canonicalLanguage;














  76         }
  77         break;
  78     default:
  79         {
  80             char localeString[LOCALEIDLENGTH];
  81             if (CFStringGetCString(CFLocaleGetIdentifier(CFLocaleCopyCurrent()),
  82                                    localeString, LOCALEIDLENGTH, CFStringGetSystemEncoding())) {
  83                 return strdup(localeString);
  84             }
  85         }
  86         break;
  87     }
  88 
  89     return NULL;
  90 }
  91 
  92 char *setupMacOSXLocale(int cat) {
  93     char * ret = getMacOSXLocale(cat);
  94 
  95     if (cat == LC_MESSAGES && ret != NULL) {
  96         void *jrsFwk = getJRSFramework();
  97         if (jrsFwk != NULL) {
  98             void (*JRSSetDefaultLocalization)(char *) = dlsym(jrsFwk, "JRSSetDefaultLocalization");
  99             if (JRSSetDefaultLocalization) JRSSetDefaultLocalization(ret);
 100         }
 101     }
 102 
 103     if (ret == NULL) {
 104         return getPosixLocale(cat);
 105     } else {
 106         return ret;
 107     }
 108 }
 109 
 110 int isInAquaSession() {
 111     // environment variable to bypass the aqua session check
 112     char *ev = getenv("AWT_FORCE_HEADFUL");
 113     if (ev && (strncasecmp(ev, "true", 4) == 0)) {
 114         // if "true" then tell the caller we're in an Aqua session without actually checking
 115         return 1;
 116     }
 117     // Is the WindowServer available?
 118     SecuritySessionId session_id;
 119     SessionAttributeBits session_info;
 120     OSStatus status = SessionGetInfo(callerSecuritySession, &session_id, &session_info);
 121     if (status == noErr) {
 122         if (session_info & sessionHasGraphicAccess) {
 123             return 1;
 124         }
 125     }
 126     return 0;
 127 }
 128 








 129 void setOSNameAndVersion(java_props_t *sprops) {
 130     /* Don't rely on JRSCopyOSName because there's no guarantee the value will
 131      * remain the same, or even if the JRS functions will continue to be part of
 132      * Mac OS X.  So hardcode os_name, and fill in os_version if we can.
 133      */
 134     sprops->os_name = strdup("Mac OS X");
 135 
 136     void *jrsFwk = getJRSFramework();
 137     if (jrsFwk != NULL) {
 138         char *(*copyOSVersion)() = dlsym(jrsFwk, "JRSCopyOSVersion");
 139         if (copyOSVersion != NULL) {
 140             sprops->os_version = copyOSVersion();
 141             return;





 142         }



 143     }
 144     sprops->os_version = strdup("Unknown");
 145 }
 146 
 147 
 148 static Boolean getProxyInfoForProtocol(CFDictionaryRef inDict, CFStringRef inEnabledKey, CFStringRef inHostKey, CFStringRef inPortKey, CFStringRef *outProxyHost, int *ioProxyPort) {
 149     /* See if the proxy is enabled. */
 150     CFNumberRef cf_enabled = CFDictionaryGetValue(inDict, inEnabledKey);
 151     if (cf_enabled == NULL) {
 152         return false;
 153     }
 154 
 155     int isEnabled = false;
 156     if (!CFNumberGetValue(cf_enabled, kCFNumberIntType, &isEnabled)) {
 157         return isEnabled;
 158     }
 159 
 160     if (!isEnabled) return false;
 161     *outProxyHost = CFDictionaryGetValue(inDict, inHostKey);
 162 
 163     // If cf_host is null, that means the checkbox is set,
 164     //   but no host was entered. We'll treat that as NOT ENABLED.


   1 /*
   2  * Copyright (c) 1998, 2016, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.  Oracle designates this
   8  * particular file as subject to the "Classpath" exception as provided
   9  * by Oracle in the LICENSE file that accompanied this code.
  10  *
  11  * This code is distributed in the hope that it will be useful, but WITHOUT
  12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14  * version 2 for more details (a copy is included in the LICENSE file that
  15  * accompanied this code).
  16  *
  17  * You should have received a copy of the GNU General Public License version
  18  * 2 along with this work; if not, write to the Free Software Foundation,
  19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20  *
  21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any
  23  * questions.
  24  */
  25 

  26 #include <sys/socket.h>
  27 #include <netinet/in.h>
  28 #include <arpa/inet.h>
  29 #include <objc/objc-runtime.h>
  30 
  31 #include <Security/AuthSession.h>
  32 #include <CoreFoundation/CoreFoundation.h>
  33 #include <SystemConfiguration/SystemConfiguration.h>
  34 #include <Foundation/Foundation.h>
  35 
  36 #include "java_props_macosx.h"
  37 












  38 char *getPosixLocale(int cat) {
  39     char *lc = setlocale(cat, NULL);
  40     if ((lc == NULL) || (strcmp(lc, "C") == 0)) {
  41         lc = getenv("LANG");
  42     }
  43     if (lc == NULL) return NULL;
  44     return strdup(lc);
  45 }
  46 
  47 #define LOCALEIDLENGTH  128
  48 char *getMacOSXLocale(int cat) {
  49     switch (cat) {
  50     case LC_MESSAGES:
  51         {
  52             // get preferred language code
  53             CFArrayRef languages = CFLocaleCopyPreferredLanguages();
  54             if (languages == NULL) {
  55                 return NULL;
  56             }
  57             if (CFArrayGetCount(languages) <= 0) {
  58                 CFRelease(languages);
  59                 return NULL;
  60             }
  61             CFStringRef primaryLanguage = (CFStringRef)CFArrayGetValueAtIndex(languages, 0);
  62             if (primaryLanguage == NULL) {
  63                 CFRelease(languages); // was missing from original patch
  64                 return NULL;
  65             }
  66             char languageString[LOCALEIDLENGTH];
  67             if (CFStringGetCString(primaryLanguage, languageString,
  68                                    LOCALEIDLENGTH, CFStringGetSystemEncoding()) == false) {
  69                 CFRelease(languages);
  70                 return NULL;
  71             }
  72             CFRelease(languages);
  73             if (languageString[2] == '-') {
  74                 // aa-AA into aa_AA
  75                 languageString[2] = '_'; // BCP 47 lang-region --> ISO_639-1
  76             }
  77             return strdup(languageString);
  78         }
  79         break;
  80     default:
  81         {
  82             char localeString[LOCALEIDLENGTH];
  83             if (CFStringGetCString(CFLocaleGetIdentifier(CFLocaleCopyCurrent()),
  84                                    localeString, LOCALEIDLENGTH, CFStringGetSystemEncoding())) {
  85                 return strdup(localeString);
  86             }
  87         }
  88         break;
  89     }
  90 
  91     return NULL;
  92 }
  93 
  94 char *setupMacOSXLocale(int cat) {
  95     char * ret = getMacOSXLocale(cat);
  96 








  97     if (ret == NULL) {
  98         return getPosixLocale(cat);
  99     } else {
 100         return ret;
 101     }
 102 }
 103 
 104 int isInAquaSession() {
 105     // environment variable to bypass the aqua session check
 106     char *ev = getenv("AWT_FORCE_HEADFUL");
 107     if (ev && (strncasecmp(ev, "true", 4) == 0)) {
 108         // if "true" then tell the caller we're in an Aqua session without actually checking
 109         return 1;
 110     }
 111     // Is the WindowServer available?
 112     SecuritySessionId session_id;
 113     SessionAttributeBits session_info;
 114     OSStatus status = SessionGetInfo(callerSecuritySession, &session_id, &session_info);
 115     if (status == noErr) {
 116         if (session_info & sessionHasGraphicAccess) {
 117             return 1;
 118         }
 119     }
 120     return 0;
 121 }
 122 
 123 // 10.9 SDK does not include the NSOperatingSystemVersion struct.
 124 // For now, create our own
 125 typedef struct {
 126         NSInteger majorVersion;
 127         NSInteger minorVersion;
 128         NSInteger patchVersion;
 129 } OSVerStruct;
 130 
 131 void setOSNameAndVersion(java_props_t *sprops) {
 132     /* Don't rely on JRSCopyOSName because there's no guarantee the value will
 133      * remain the same, or even if the JRS functions will continue to be part of
 134      * Mac OS X.  So hardcode os_name, and fill in os_version if we can.
 135      */
 136     sprops->os_name = strdup("Mac OS X");
 137     
 138     char *osVersionCStr = NULL;
 139     // Mac OS 10.9 includes the [NSProcessInfo operatingSystemVersion] function,
 140     // but it's not in the 10.9 SDK.  So, call it via objc_msgSend_stret.
 141     if ([[NSProcessInfo processInfo] respondsToSelector:@selector(operatingSystemVersion)]) {
 142         OSVerStruct (*procInfoFn)(id rec, SEL sel) = (OSVerStruct(*)(id, SEL))objc_msgSend_stret;
 143         OSVerStruct osVer = procInfoFn([NSProcessInfo processInfo],
 144                                        @selector(operatingSystemVersion));
 145         NSString *nsVerStr = [NSString stringWithFormat:@"%ld.%ld.%ld",
 146                 (long)osVer.majorVersion, (long)osVer.minorVersion, (long)osVer.patchVersion];
 147         // Copy out the char*
 148         osVersionCStr = strdup([nsVerStr UTF8String]);
 149     }
 150 
 151     if (osVersionCStr == NULL) {
 152         osVersionCStr = strdup("Unknown");
 153     }
 154     sprops->os_version = osVersionCStr;
 155 }
 156 
 157 
 158 static Boolean getProxyInfoForProtocol(CFDictionaryRef inDict, CFStringRef inEnabledKey, CFStringRef inHostKey, CFStringRef inPortKey, CFStringRef *outProxyHost, int *ioProxyPort) {
 159     /* See if the proxy is enabled. */
 160     CFNumberRef cf_enabled = CFDictionaryGetValue(inDict, inEnabledKey);
 161     if (cf_enabled == NULL) {
 162         return false;
 163     }
 164 
 165     int isEnabled = false;
 166     if (!CFNumberGetValue(cf_enabled, kCFNumberIntType, &isEnabled)) {
 167         return isEnabled;
 168     }
 169 
 170     if (!isEnabled) return false;
 171     *outProxyHost = CFDictionaryGetValue(inDict, inHostKey);
 172 
 173     // If cf_host is null, that means the checkbox is set,
 174     //   but no host was entered. We'll treat that as NOT ENABLED.


< prev index next >