diff options
author | Guy Harris <guy@alum.mit.edu> | 2012-09-19 22:41:11 +0000 |
---|---|---|
committer | Guy Harris <guy@alum.mit.edu> | 2012-09-19 22:41:11 +0000 |
commit | b5d6160447cc53a5be566ba4c341d6c948098f13 (patch) | |
tree | d2a7161b2882ee6badcbf81d54c60ea7175fb614 /version_info.c | |
parent | ace4a357aa0016ff9b536fedfbcafed972e1cde5 (diff) |
Try ServerVersion.plist first, and use ProductName as the OS name; that
means we report the server as such (and means that if Apple calls it
Shiny Happy Puppy X in the future, we'll report it as such...).
svn path=/trunk/; revision=45013
Diffstat (limited to 'version_info.c')
-rw-r--r-- | version_info.c | 109 |
1 files changed, 69 insertions, 40 deletions
diff --git a/version_info.c b/version_info.c index 3b6a7afe2f..8d3c276ea6 100644 --- a/version_info.c +++ b/version_info.c @@ -220,11 +220,13 @@ get_string_from_dictionary(CFPropertyListRef dict, CFStringRef key) static gboolean get_os_x_version_info(GString *str) { + static const char server_version_plist_path[] = + "/System/Library/CoreServices/ServerVersion.plist"; static const char system_version_plist_path[] = "/System/Library/CoreServices/SystemVersion.plist"; - CFURLRef system_version_plist_file_url; - CFReadStreamRef system_version_plist_stream; - CFDictionaryRef system_version_dict; + CFURLRef version_plist_file_url; + CFReadStreamRef version_plist_stream; + CFDictionaryRef version_dict; char *string; /* @@ -234,72 +236,99 @@ get_os_x_version_info(GString *str) * Alas, Gestalt() is deprecated in Mountain Lion, so the build * fails if you treat deprecation warnings as fatal. I don't * know of any replacement API, so we fall back on reading - * /System/Library/CoreServices/SystemVersion.plist + * /System/Library/CoreServices/ServerVersion.plist if it + * exists, otherwise /System/Library/CoreServices/SystemVersion.plist, * and using ProductUserVisibleVersion. We also get the build - * version from ProductBuildVersion. - * - * XXX - on OS X Server, do we need to read the server plist in - * /System/Library/CoreServices/ServerVersion.plist - i.e., if - * it exists, use it rather than SystemVersion.plist? + * version from ProductBuildVersion and the product name from + * ProductName. */ - system_version_plist_file_url = CFURLCreateFromFileSystemRepresentation(NULL, - system_version_plist_path, sizeof system_version_plist_path - 1, + version_plist_file_url = CFURLCreateFromFileSystemRepresentation(NULL, + server_version_plist_path, sizeof server_version_plist_path - 1, false); - if (system_version_plist_file_url == NULL) - return FALSE; - system_version_plist_stream = CFReadStreamCreateWithFile(NULL, - system_version_plist_file_url); - CFRelease(system_version_plist_file_url); - if (system_version_plist_stream == NULL) + if (version_plist_file_url == NULL) return FALSE; - if (!CFReadStreamOpen(system_version_plist_stream)) { - CFRelease(system_version_plist_stream); + version_plist_stream = CFReadStreamCreateWithFile(NULL, + version_plist_file_url); + CFRelease(version_plist_file_url); + if (version_plist_stream == NULL) return FALSE; + if (!CFReadStreamOpen(version_plist_stream)) { + CFRelease(version_plist_stream); + + /* + * Try SystemVersion.plist. + */ + version_plist_file_url = CFURLCreateFromFileSystemRepresentation(NULL, + system_version_plist_path, sizeof system_version_plist_path - 1, + false); + if (version_plist_file_url == NULL) + return FALSE; + version_plist_stream = CFReadStreamCreateWithFile(NULL, + version_plist_file_url); + CFRelease(version_plist_file_url); + if (version_plist_stream == NULL) + return FALSE; + if (!CFReadStreamOpen(version_plist_stream)) { + CFRelease(version_plist_stream); + return FALSE; + } } #ifdef HAVE_CFPROPERTYLISTCREATEWITHSTREAM - system_version_dict = CFPropertyListCreateWithStream(NULL, - system_version_plist_stream, 0, kCFPropertyListImmutable, + version_dict = CFPropertyListCreateWithStream(NULL, + version_plist_stream, 0, kCFPropertyListImmutable, NULL, NULL); #else - system_version_dict = CFPropertyListCreateFromStream(NULL, - system_version_plist_stream, 0, kCFPropertyListImmutable, + version_dict = CFPropertyListCreateFromStream(NULL, + version_plist_stream, 0, kCFPropertyListImmutable, NULL, NULL); #endif - if (system_version_dict == NULL) + if (version_dict == NULL) return FALSE; - if (CFGetTypeID(system_version_dict) != CFDictionaryGetTypeID()) { + if (CFGetTypeID(version_dict) != CFDictionaryGetTypeID()) { /* This is *supposed* to be a dictionary. Punt. */ - CFRelease(system_version_dict); - CFReadStreamClose(system_version_plist_stream); - CFRelease(system_version_plist_stream); + CFRelease(version_dict); + CFReadStreamClose(version_plist_stream); + CFRelease(version_plist_stream); return FALSE; } + /* Get the product name string. */ + string = get_string_from_dictionary(version_dict, + CFSTR("ProductName")); + if (string == NULL) { + CFRelease(version_dict); + CFReadStreamClose(version_plist_stream); + CFRelease(version_plist_stream); + return FALSE; + } + g_string_append_printf(str, "%s", string); + g_free(string); + /* Get the OS version string. */ - string = get_string_from_dictionary(system_version_dict, + string = get_string_from_dictionary(version_dict, CFSTR("ProductUserVisibleVersion")); if (string == NULL) { - CFRelease(system_version_dict); - CFReadStreamClose(system_version_plist_stream); - CFRelease(system_version_plist_stream); + CFRelease(version_dict); + CFReadStreamClose(version_plist_stream); + CFRelease(version_plist_stream); return FALSE; } - g_string_append_printf(str, "OS X %s", string); + g_string_append_printf(str, " %s", string); g_free(string); /* Get the build string */ - string = get_string_from_dictionary(system_version_dict, + string = get_string_from_dictionary(version_dict, CFSTR("ProductBuildVersion")); if (string == NULL) { - CFRelease(system_version_dict); - CFReadStreamClose(system_version_plist_stream); - CFRelease(system_version_plist_stream); + CFRelease(version_dict); + CFReadStreamClose(version_plist_stream); + CFRelease(version_plist_stream); return FALSE; } g_string_append_printf(str, ", build %s", string); g_free(string); - CFRelease(system_version_dict); - CFReadStreamClose(system_version_plist_stream); - CFRelease(system_version_plist_stream); + CFRelease(version_dict); + CFReadStreamClose(version_plist_stream); + CFRelease(version_plist_stream); return TRUE; } #endif |