static int exec_list(sd_device_enumerator *e, const char *action, Set *settle_set) { sd_device *d; int r; FOREACH_DEVICE_AND_SUBSYSTEM(e, d) { _cleanup_free_ char *filename = NULL; const char *syspath; if (sd_device_get_syspath(d, &syspath) < 0) continue; if (arg_verbose) printf("%s\n", syspath); if (arg_dry_run) continue; filename = path_join(syspath, "uevent"); if (!filename) return log_oom(); r = write_string_file(filename, action, WRITE_STRING_FILE_DISABLE_BUFFER); if (r < 0) { log_debug_errno(r, "Failed to write '%s' to '%s', ignoring: %m", action, filename); continue; } if (settle_set) { r = set_put_strdup(settle_set, syspath); if (r < 0) return log_oom(); } }
/* handle "[<SUBSYSTEM>/<KERNEL>]<attribute>" format */ int util_resolve_subsys_kernel(const char *string, char *result, size_t maxsize, bool read_value) { char temp[UTIL_PATH_SIZE], *subsys, *sysname, *attr; _cleanup_(sd_device_unrefp) sd_device *dev = NULL; const char *val; int r; if (string[0] != '[') return -EINVAL; strscpy(temp, sizeof(temp), string); subsys = &temp[1]; sysname = strchr(subsys, '/'); if (!sysname) return -EINVAL; sysname[0] = '\0'; sysname = &sysname[1]; attr = strchr(sysname, ']'); if (!attr) return -EINVAL; attr[0] = '\0'; attr = &attr[1]; if (attr[0] == '/') attr = &attr[1]; if (attr[0] == '\0') attr = NULL; if (read_value && !attr) return -EINVAL; r = sd_device_new_from_subsystem_sysname(&dev, subsys, sysname); if (r < 0) return r; if (read_value) { r = sd_device_get_sysattr_value(dev, attr, &val); if (r < 0 && r != -ENOENT) return r; if (r == -ENOENT) result[0] = '\0'; else strscpy(result, maxsize, val); log_debug("value '[%s/%s]%s' is '%s'", subsys, sysname, attr, result); } else { r = sd_device_get_syspath(dev, &val); if (r < 0) return r; strscpyl(result, maxsize, val, attr ? "/" : NULL, attr ?: NULL, NULL); log_debug("path '[%s/%s]%s' is '%s'", subsys, sysname, strempty(attr), result); } return 0; }
/** * udev_device_get_syspath: * @udev_device: udev device * * Retrieve the sys path of the udev device. The path is an * absolute path and starts with the sys mount point. * * Returns: the sys path of the udev device **/ _public_ const char *udev_device_get_syspath(struct udev_device *udev_device) { const char *syspath; int r; assert_return_errno(udev_device, NULL, EINVAL); r = sd_device_get_syspath(udev_device->device, &syspath); if (r < 0) { errno = -r; return NULL; } return syspath; }