Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(554)

Side by Side Diff: components/storage_monitor/storage_monitor_linux.cc

Issue 674703002: Linux: Dynamically load libudev. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@scoped_udev
Patch Set: rebase to head, which includes third_party/libudev already Created 6 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 // StorageMonitorLinux implementation. 5 // StorageMonitorLinux implementation.
6 6
7 #include "components/storage_monitor/storage_monitor_linux.h" 7 #include "components/storage_monitor/storage_monitor_linux.h"
8 8
9 #include <mntent.h> 9 #include <mntent.h>
10 #include <stdio.h> 10 #include <stdio.h>
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
92 bool result_; 92 bool result_;
93 93
94 DISALLOW_COPY_AND_ASSIGN(ScopedGetDeviceInfoResultRecorder); 94 DISALLOW_COPY_AND_ASSIGN(ScopedGetDeviceInfoResultRecorder);
95 }; 95 };
96 96
97 // Returns the storage partition size of the device specified by |device_path|. 97 // Returns the storage partition size of the device specified by |device_path|.
98 // If the requested information is unavailable, returns 0. 98 // If the requested information is unavailable, returns 0.
99 uint64 GetDeviceStorageSize(const base::FilePath& device_path, 99 uint64 GetDeviceStorageSize(const base::FilePath& device_path,
100 struct udev_device* device) { 100 struct udev_device* device) {
101 // sysfs provides the device size in units of 512-byte blocks. 101 // sysfs provides the device size in units of 512-byte blocks.
102 const std::string partition_size = udev_device_get_sysattr_value( 102 const std::string partition_size = device::udev_device_get_sysattr_value(
103 device, kSizeSysAttr); 103 device, kSizeSysAttr);
104 104
105 // Keep track of device size, to see how often this information is 105 // Keep track of device size, to see how often this information is
106 // unavailable. 106 // unavailable.
107 UMA_HISTOGRAM_BOOLEAN( 107 UMA_HISTOGRAM_BOOLEAN(
108 "RemovableDeviceNotificationsLinux.device_partition_size_available", 108 "RemovableDeviceNotificationsLinux.device_partition_size_available",
109 !partition_size.empty()); 109 !partition_size.empty());
110 110
111 uint64 total_size_in_bytes = 0; 111 uint64 total_size_in_bytes = 0;
112 if (!base::StringToUint64(partition_size, &total_size_in_bytes)) 112 if (!base::StringToUint64(partition_size, &total_size_in_bytes))
113 return 0; 113 return 0;
114 return (total_size_in_bytes <= kuint64max / 512) ? 114 return (total_size_in_bytes <= kuint64max / 512) ?
115 total_size_in_bytes * 512 : 0; 115 total_size_in_bytes * 512 : 0;
116 } 116 }
117 117
118 // Gets the device information using udev library. 118 // Gets the device information using udev library.
119 scoped_ptr<StorageInfo> GetDeviceInfo(const base::FilePath& device_path, 119 scoped_ptr<StorageInfo> GetDeviceInfo(const base::FilePath& device_path,
120 const base::FilePath& mount_point) { 120 const base::FilePath& mount_point) {
121 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); 121 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
122 DCHECK(!device_path.empty()); 122 DCHECK(!device_path.empty());
123 123
124 scoped_ptr<StorageInfo> storage_info; 124 scoped_ptr<StorageInfo> storage_info;
125 125
126 ScopedGetDeviceInfoResultRecorder results_recorder; 126 ScopedGetDeviceInfoResultRecorder results_recorder;
127 127
128 device::ScopedUdevPtr udev_obj(udev_new()); 128 device::ScopedUdevPtr udev_obj(device::udev_new());
129 if (!udev_obj.get()) 129 if (!udev_obj.get())
130 return storage_info.Pass(); 130 return storage_info.Pass();
131 131
132 struct stat device_stat; 132 struct stat device_stat;
133 if (stat(device_path.value().c_str(), &device_stat) < 0) 133 if (stat(device_path.value().c_str(), &device_stat) < 0)
134 return storage_info.Pass(); 134 return storage_info.Pass();
135 135
136 char device_type; 136 char device_type;
137 if (S_ISCHR(device_stat.st_mode)) 137 if (S_ISCHR(device_stat.st_mode))
138 device_type = 'c'; 138 device_type = 'c';
139 else if (S_ISBLK(device_stat.st_mode)) 139 else if (S_ISBLK(device_stat.st_mode))
140 device_type = 'b'; 140 device_type = 'b';
141 else 141 else
142 return storage_info.Pass(); // Not a supported type. 142 return storage_info.Pass(); // Not a supported type.
143 143
144 device::ScopedUdevDevicePtr device( 144 device::ScopedUdevDevicePtr device(
145 udev_device_new_from_devnum(udev_obj.get(), device_type, 145 device::udev_device_new_from_devnum(udev_obj.get(), device_type,
146 device_stat.st_rdev)); 146 device_stat.st_rdev));
147 if (!device.get()) 147 if (!device.get())
148 return storage_info.Pass(); 148 return storage_info.Pass();
149 149
150 base::string16 volume_label = 150 base::string16 volume_label =
151 base::UTF8ToUTF16(GetUdevDevicePropertyValue(device.get(), kLabel)); 151 base::UTF8ToUTF16(GetUdevDevicePropertyValue(device.get(), kLabel));
152 base::string16 vendor_name = 152 base::string16 vendor_name =
153 base::UTF8ToUTF16(GetUdevDevicePropertyValue(device.get(), kVendor)); 153 base::UTF8ToUTF16(GetUdevDevicePropertyValue(device.get(), kVendor));
154 base::string16 model_name = 154 base::string16 model_name =
155 base::UTF8ToUTF16(GetUdevDevicePropertyValue(device.get(), kModel)); 155 base::UTF8ToUTF16(GetUdevDevicePropertyValue(device.get(), kModel));
156 156
157 std::string unique_id = MakeDeviceUniqueId(device.get()); 157 std::string unique_id = MakeDeviceUniqueId(device.get());
158 158
159 // Keep track of device info details to see how often we get invalid values. 159 // Keep track of device info details to see how often we get invalid values.
160 MediaStorageUtil::RecordDeviceInfoHistogram(true, unique_id, volume_label); 160 MediaStorageUtil::RecordDeviceInfoHistogram(true, unique_id, volume_label);
161 161
162 const char* value = 162 const char* value =
163 udev_device_get_sysattr_value(device.get(), kRemovableSysAttr); 163 device::udev_device_get_sysattr_value(device.get(), kRemovableSysAttr);
164 if (!value) { 164 if (!value) {
165 // |parent_device| is owned by |device| and does not need to be cleaned 165 // |parent_device| is owned by |device| and does not need to be cleaned
166 // up. 166 // up.
167 struct udev_device* parent_device = 167 struct udev_device* parent_device =
168 udev_device_get_parent_with_subsystem_devtype(device.get(), 168 device::udev_device_get_parent_with_subsystem_devtype(
169 kBlockSubsystemKey, 169 device.get(),
170 kDiskDeviceTypeKey); 170 kBlockSubsystemKey,
171 value = udev_device_get_sysattr_value(parent_device, kRemovableSysAttr); 171 kDiskDeviceTypeKey);
172 value = device::udev_device_get_sysattr_value(parent_device,
173 kRemovableSysAttr);
172 } 174 }
173 const bool is_removable = (value && atoi(value) == 1); 175 const bool is_removable = (value && atoi(value) == 1);
174 176
175 StorageInfo::Type type = StorageInfo::FIXED_MASS_STORAGE; 177 StorageInfo::Type type = StorageInfo::FIXED_MASS_STORAGE;
176 if (is_removable) { 178 if (is_removable) {
177 if (MediaStorageUtil::HasDcim(mount_point)) 179 if (MediaStorageUtil::HasDcim(mount_point))
178 type = StorageInfo::REMOVABLE_MASS_STORAGE_WITH_DCIM; 180 type = StorageInfo::REMOVABLE_MASS_STORAGE_WITH_DCIM;
179 else 181 else
180 type = StorageInfo::REMOVABLE_MASS_STORAGE_NO_DCIM; 182 type = StorageInfo::REMOVABLE_MASS_STORAGE_NO_DCIM;
181 } 183 }
(...skipping 316 matching lines...) Expand 10 before | Expand all | Expand 10 after
498 mount_priority_map_[mount_device][mount_point] = removable; 500 mount_priority_map_[mount_device][mount_point] = removable;
499 receiver()->ProcessAttach(*storage_info); 501 receiver()->ProcessAttach(*storage_info);
500 } 502 }
501 503
502 StorageMonitor* StorageMonitor::CreateInternal() { 504 StorageMonitor* StorageMonitor::CreateInternal() {
503 const base::FilePath kDefaultMtabPath("/etc/mtab"); 505 const base::FilePath kDefaultMtabPath("/etc/mtab");
504 return new StorageMonitorLinux(kDefaultMtabPath); 506 return new StorageMonitorLinux(kDefaultMtabPath);
505 } 507 }
506 508
507 } // namespace storage_monitor 509 } // namespace storage_monitor
OLDNEW
« no previous file with comments | « chrome/installer/linux/sysroot_scripts/sysroot-creator-wheezy.sh ('k') | components/storage_monitor/udev_util_linux.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698