if (verify) {
r = readlink_and_canonicalize(_syspath, &syspath);
- if (r == -EINVAL) {
+ if (r == -ENOENT)
+ /* the device does not exist (any more?) */
+ return -ENODEV;
+ else if (r == -EINVAL) {
/* not a symlink */
syspath = canonicalize_file_name(_syspath);
if (!syspath) {
+ if (errno == ENOENT)
+ /* the device does not exist (any more?) */
+ return -ENODEV;
+
log_debug("sd-device: could not canonicalize '%s': %m", _syspath);
return -errno;
}
- /* ignore errors due to the link not being a symlink */
- } else if (r < 0 && r != -EINVAL) {
+ } else if (r < 0) {
log_debug("sd-device: could not get target of '%s': %s", _syspath, strerror(-r));
return r;
}
path = strjoina(syspath, "/uevent");
r = access(path, F_OK);
if (r < 0) {
+ if (errno == ENOENT)
+ /* this is not a valid device */
+ return -ENODEV;
+
log_debug("sd-device: %s does not have an uevent file: %m", syspath);
return -errno;
}
} else {
/* everything else just just needs to be a directory */
- if (!is_dir(syspath, false)) {
- log_debug("sd-device: %s is not a directory", syspath);
- return -EINVAL;
- }
+ if (!is_dir(syspath, false))
+ return -ENODEV;
}
} else {
syspath = strdup(_syspath);
return sd_device_new_from_syspath(ret, syspath);
}
- return -ENOENT;
+ return -ENODEV;
}
int device_set_devtype(sd_device *device, const char *_devtype) {
if (r < 0)
return r;
- /* this si racey, so we might end up with the wrong device */
+ /* this is racey, so we might end up with the wrong device */
if (ifr.ifr_ifindex != ifindex)
return -ENODEV;
return 0;
}
- return -ENOENT;
+ return -ENODEV;
}
_public_ int sd_device_get_parent(sd_device *child, sd_device **ret) {
r = device_set_subsystem(device, "drivers");
else if (path_startswith(device->devpath, "/subsystem/") ||
path_startswith(device->devpath, "/class/") ||
- path_startswith(device->devpath, "/buss/"))
+ path_startswith(device->devpath, "/bus/"))
r = device_set_subsystem(device, "subsystem");
if (r < 0)
- return r;
+ return log_debug_errno(r, "sd-device: could not set subsystem for %s: %m", device->devpath);
device->subsystem_set = true;
}
return 0;
}
-static int device_read_db(sd_device *device) {
+int device_read_db_aux(sd_device *device, bool force) {
_cleanup_free_ char *db = NULL;
char *path;
const char *id, *value;
INVALID_LINE,
} state = PRE_KEY;
- if (device->db_loaded || device->sealed)
+ if (device->db_loaded || (!force && device->sealed))
return 0;
r = device_get_id_filename(device, &id);
return 0;
}
+static int device_read_db(sd_device *device) {
+ return device_read_db_aux(device, false);
+}
+
_public_ int sd_device_get_is_initialized(sd_device *device, int *initialized) {
int r;