// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "sync/util/get_session_name_mac.h" #import <SystemConfiguration/SCDynamicStoreCopySpecific.h> #include <sys/sysctl.h> #include "base/mac/scoped_cftyperef.h" #include "base/strings/string_util.h" #include "base/strings/sys_string_conversions.h" namespace syncer { namespace internal { std::string GetHardwareModelName() { // Do not use NSHost currentHost, as it's very slow. http://crbug.com/138570 SCDynamicStoreContext context = { 0, NULL, NULL, NULL }; base::ScopedCFTypeRef<SCDynamicStoreRef> store(SCDynamicStoreCreate( kCFAllocatorDefault, CFSTR("chrome_sync"), NULL, &context)); base::ScopedCFTypeRef<CFStringRef> machine_name( SCDynamicStoreCopyLocalHostName(store.get())); if (machine_name.get()) return base::SysCFStringRefToUTF8(machine_name.get()); // Fall back to get computer name. base::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 } // namespace syncer