// trying to use udev first, and if it doesn't work, we fall back to
// reading /sys/block/$devname/device/(vendor/model/serial).
-std::string get_device_id(const std::string& devname)
+std::string get_device_id(const std::string& devname,
+ std::string *err)
{
struct udev_device *dev;
static struct udev *udev;
udev = udev_new();
if (!udev) {
+ if (err) {
+ *err = "udev_new failed";
+ }
return {};
}
dev = udev_device_new_from_subsystem_sysname(udev, "block", devname.c_str());
if (!dev) {
+ if (err) {
+ *err = std::string("udev_device_new_from_subsystem_sysname failed on '")
+ + devname + "'";
+ }
udev_unref(udev);
return {};
}
serial = buf;
}
if (!model.size() || serial.size()) {
+ if (err) {
+ *err = std::string("fallback method has serial '") + serial
+ + "'but no model";
+ }
return {};
}
return false;
}
-std::string get_device_id(const std::string& devname)
+std::string get_device_id(const std::string& devname,
+ std::string *err)
{
// FIXME: implement me for freebsd
+ if (err) {
+ *err = "not implemented for FreeBSD";
+ }
return std::string();
}
return false;
}
-std::string get_device_id(const std::string& devname)
+std::string get_device_id(const std::string& devname,
+ std::string *err)
{
// not implemented
+ if (err) {
+ *err = "not implemented";
+ }
return std::string();
}
extern int get_device_by_path(const char *path, char* partition, char* device, size_t max);
-extern std::string get_device_id(const std::string& devname);
+extern std::string get_device_id(const std::string& devname,
+ std::string *err=0);
extern void get_dm_parents(const std::string& dev, std::set<std::string> *ls);
extern int block_device_run_smartctl(const char *device, int timeout,
std::string *result);