1 // Copyright 2013 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.
5 #include "chrome/browser/extensions/api/music_manager_private/device_id.h"
10 #include "base/file_util.h"
11 #include "base/files/file_enumerator.h"
12 #include "base/files/file_path.h"
13 #include "content/public/browser/browser_thread.h"
17 const char kDiskByUuidDirectoryName[] = "/dev/disk/by-uuid";
18 const char* kDeviceNames[] = { "sda1", "hda1", "dm-0" };
20 // Map from device name to disk uuid
21 typedef std::map<base::FilePath, base::FilePath> DiskEntries;
23 void GetDiskUuid(const extensions::api::DeviceId::IdCallback& callback) {
24 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::FILE));
26 DiskEntries disk_uuids;
28 base::FileEnumerator files(base::FilePath(kDiskByUuidDirectoryName),
30 base::FileEnumerator::FILES);
32 base::FilePath file_path = files.Next();
33 if (file_path.empty())
36 base::FilePath target_path;
37 if (!file_util::ReadSymbolicLink(file_path, &target_path))
40 base::FilePath device_name = target_path.BaseName();
41 base::FilePath disk_uuid = file_path.BaseName();
42 disk_uuids[device_name] = disk_uuid;
45 // Look for first device name matching an entry of |kDeviceNames|.
47 for (size_t i = 0; i < arraysize(kDeviceNames); i++) {
48 DiskEntries::iterator it =
49 disk_uuids.find(base::FilePath(kDeviceNames[i]));
50 if (it != disk_uuids.end()) {
51 DVLOG(1) << "Returning uuid: \"" << it->second.value()
52 << "\" for device \"" << it->first.value() << "\"";
53 result = it->second.value();
58 // Log failure (at most once) for diagnostic purposes.
59 static bool error_logged = false;
60 if (result.empty() && !error_logged) {
62 LOG(ERROR) << "Could not find appropriate disk uuid.";
63 for (DiskEntries::iterator it = disk_uuids.begin();
64 it != disk_uuids.end(); ++it) {
65 LOG(ERROR) << " DeviceID=" << it->first.value() << ", uuid="
66 << it->second.value();
70 content::BrowserThread::PostTask(
71 content::BrowserThread::UI,
73 base::Bind(callback, result));
78 namespace extensions {
81 // Linux: Look for disk uuid
83 void DeviceId::GetMachineId(const IdCallback& callback) {
84 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
86 content::BrowserThread::PostTask(
87 content::BrowserThread::FILE,
89 base::Bind(GetDiskUuid, callback));
93 } // namespace extensions