Index: sync/util/get_session_name_mac.mm |
diff --git a/sync/util/get_session_name_mac.mm b/sync/util/get_session_name_mac.mm |
index b8eb25e3e94d12f3842699e11211c793f2d7c22c..7f5940b5a040d9c7cf63cb58df5ff58d377719a4 100644 |
--- a/sync/util/get_session_name_mac.mm |
+++ b/sync/util/get_session_name_mac.mm |
@@ -5,8 +5,10 @@ |
#include "sync/util/get_session_name_mac.h" |
#import <SystemConfiguration/SCDynamicStoreCopySpecific.h> |
+#include <sys/sysctl.h> |
#include "base/mac/scoped_cftyperef.h" |
+#include "base/string_util.h" |
#include "base/sys_string_conversions.h" |
namespace syncer { |
@@ -16,10 +18,31 @@ std::string GetHardwareModelName() { |
// Do not use NSHost currentHost, as it's very slow. http://crbug.com/138570 |
SCDynamicStoreContext context = { 0, NULL, NULL, NULL }; |
base::mac::ScopedCFTypeRef<SCDynamicStoreRef> store( |
- SCDynamicStoreCreate(kCFAllocatorDefault, CFSTR("policy_subsystem"), |
+ SCDynamicStoreCreate(kCFAllocatorDefault, CFSTR("chrome_sync"), |
NULL, &context)); |
- CFStringRef machine_name = SCDynamicStoreCopyLocalHostName(store.get()); |
- return base::SysCFStringRefToUTF8(machine_name); |
+ base::mac::ScopedCFTypeRef<CFStringRef> machine_name( |
+ SCDynamicStoreCopyLocalHostName(store.get())); |
+ if (machine_name.get()) |
+ return base::SysCFStringRefToUTF8(machine_name.get()); |
+ |
+ // Fall back to get computer name. |
+ base::mac::ScopedCFTypeRef<CFStringRef> computer_name( |
+ SCDynamicStoreCopyComputerName(store.get(), NULL)); |
+ if (computer_name.get()) |
+ return base::SysCFStringRefToUTF8(computer_name.get()); |
+ |
+ // If all else fails, return to using a slightly nicer version of the |
+ // hardware model. |
+ char modelBuffer[256]; |
+ size_t length = sizeof(modelBuffer); |
+ if (!sysctlbyname("hw.model", modelBuffer, &length, NULL, 0)) { |
+ for (size_t i = 0; i < length; i++) { |
+ if (IsAsciiDigit(modelBuffer[i])) |
+ return std::string(modelBuffer, 0, i); |
+ } |
+ return std::string(modelBuffer, 0, length); |
+ } |
+ return "Unknown"; |
} |
} // namespace internal |