1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "sync/util/get_session_name_mac.h"
6
7#import <SystemConfiguration/SCDynamicStoreCopySpecific.h>
8#include <sys/sysctl.h>
9
10#include "base/mac/scoped_cftyperef.h"
11#include "base/strings/string_util.h"
12#include "base/strings/sys_string_conversions.h"
13
14namespace syncer {
15namespace internal {
16
17std::string GetHardwareModelName() {
18  // Do not use NSHost currentHost, as it's very slow. http://crbug.com/138570
19  SCDynamicStoreContext context = { 0, NULL, NULL, NULL };
20  base::ScopedCFTypeRef<SCDynamicStoreRef> store(SCDynamicStoreCreate(
21      kCFAllocatorDefault, CFSTR("chrome_sync"), NULL, &context));
22  base::ScopedCFTypeRef<CFStringRef> machine_name(
23      SCDynamicStoreCopyLocalHostName(store.get()));
24  if (machine_name.get())
25    return base::SysCFStringRefToUTF8(machine_name.get());
26
27  // Fall back to get computer name.
28  base::ScopedCFTypeRef<CFStringRef> computer_name(
29      SCDynamicStoreCopyComputerName(store.get(), NULL));
30  if (computer_name.get())
31    return base::SysCFStringRefToUTF8(computer_name.get());
32
33  // If all else fails, return to using a slightly nicer version of the
34  // hardware model.
35  char modelBuffer[256];
36  size_t length = sizeof(modelBuffer);
37  if (!sysctlbyname("hw.model", modelBuffer, &length, NULL, 0)) {
38    for (size_t i = 0; i < length; i++) {
39      if (IsAsciiDigit(modelBuffer[i]))
40        return std::string(modelBuffer, 0, i);
41    }
42    return std::string(modelBuffer, 0, length);
43  }
44  return "Unknown";
45}
46
47}  // namespace internal
48}  // namespace syncer
49