int show_sysfs(const char *seat, const char *prefix, unsigned n_columns) { struct udev *udev; struct udev_list_entry *first = NULL; struct udev_enumerate *e; int r; if (n_columns <= 0) n_columns = columns(); if (!prefix) prefix = ""; if (isempty(seat)) seat = "seat0"; udev = udev_new(); if (!udev) return -ENOMEM; e = udev_enumerate_new(udev); if (!e) { r = -ENOMEM; goto finish; } if (!streq(seat, "seat0")) r = udev_enumerate_add_match_tag(e, seat); else r = udev_enumerate_add_match_tag(e, "seat"); if (r < 0) goto finish; r = udev_enumerate_scan_devices(e); if (r < 0) goto finish; first = udev_enumerate_get_list_entry(e); if (first) show_sysfs_one(udev, seat, &first, "/", prefix, n_columns); finish: if (e) udev_enumerate_unref(e); if (udev) udev_unref(udev); return r; }
/* add or remove a ACL for a given uid from all matching devices */ static void apply_acl_to_devices(uid_t uid, int add) { struct udev *udev; struct udev_enumerate *enumerate; struct udev_list_entry *list_entry; /* iterate over all devices tagged with ACL_SET */ udev = udev_new(); enumerate = udev_enumerate_new(udev); udev_enumerate_add_match_tag(enumerate, "udev-acl"); udev_enumerate_scan_devices(enumerate); udev_list_entry_foreach(list_entry, udev_enumerate_get_list_entry(enumerate)) { struct udev_device *device; const char *node; device = udev_device_new_from_syspath(udev_enumerate_get_udev(enumerate), udev_list_entry_get_name(list_entry)); if (device == NULL) continue; node = udev_device_get_devnode(device); if (node == NULL) { udev_device_unref(device); continue; } set_facl(node, uid, add); udev_device_unref(device); } udev_enumerate_unref(enumerate); udev_unref(udev); }
int show_sysfs(const char *seat, const char *prefix, unsigned n_columns) { _cleanup_udev_enumerate_unref_ struct udev_enumerate *e = NULL; _cleanup_udev_unref_ struct udev *udev = NULL; struct udev_list_entry *first = NULL; int r; if (n_columns <= 0) n_columns = columns(); if (!prefix) prefix = ""; if (isempty(seat)) seat = "seat0"; udev = udev_new(); if (!udev) return -ENOMEM; e = udev_enumerate_new(udev); if (!e) return -ENOMEM; if (!streq(seat, "seat0")) r = udev_enumerate_add_match_tag(e, seat); else r = udev_enumerate_add_match_tag(e, "seat"); if (r < 0) return r; r = udev_enumerate_add_match_is_initialized(e); if (r < 0) return r; r = udev_enumerate_scan_devices(e); if (r < 0) return r; first = udev_enumerate_get_list_entry(e); if (first) show_sysfs_one(udev, seat, &first, "/", prefix, n_columns); else printf("%s%s%s\n", prefix, draw_special_char(DRAW_TREE_RIGHT), "(none)"); return r; }
static int manager_enumerate_devices(Manager *m) { struct udev_list_entry *item = NULL, *first = NULL; _cleanup_udev_enumerate_unref_ struct udev_enumerate *e = NULL; int r; assert(m); /* Loads devices from udev and creates seats for them as * necessary */ e = udev_enumerate_new(m->udev); if (!e) return -ENOMEM; r = udev_enumerate_add_match_tag(e, "master-of-seat"); if (r < 0) return r; r = udev_enumerate_add_match_is_initialized(e); if (r < 0) return r; r = udev_enumerate_scan_devices(e); if (r < 0) return r; first = udev_enumerate_get_list_entry(e); udev_list_entry_foreach(item, first) { _cleanup_udev_device_unref_ struct udev_device *d = NULL; int k; d = udev_device_new_from_syspath(m->udev, udev_list_entry_get_name(item)); if (!d) return -ENOMEM; k = manager_process_seat_device(m, d); if (k < 0) r = k; }
int devnode_acl_all(struct udev *udev, const char *seat, bool flush, bool del, uid_t old_uid, bool add, uid_t new_uid) { _cleanup_udev_enumerate_unref_ struct udev_enumerate *e = NULL; struct udev_list_entry *item = NULL, *first = NULL; _cleanup_set_free_free_ Set *nodes = NULL; _cleanup_closedir_ DIR *dir = NULL; struct dirent *dent; Iterator i; char *n; int r; assert(udev); nodes = set_new(&string_hash_ops); if (!nodes) return -ENOMEM; e = udev_enumerate_new(udev); if (!e) return -ENOMEM; if (isempty(seat)) seat = "seat0"; /* We can only match by one tag in libudev. We choose * "uaccess" for that. If we could match for two tags here we * could add the seat name as second match tag, but this would * be hardly optimizable in libudev, and hence checking the * second tag manually in our loop is a good solution. */ r = udev_enumerate_add_match_tag(e, "uaccess"); if (r < 0) return r; r = udev_enumerate_add_match_is_initialized(e); if (r < 0) return r; r = udev_enumerate_scan_devices(e); if (r < 0) return r; first = udev_enumerate_get_list_entry(e); udev_list_entry_foreach(item, first) { _cleanup_udev_device_unref_ struct udev_device *d = NULL; const char *node, *sn; d = udev_device_new_from_syspath(udev, udev_list_entry_get_name(item)); if (!d) return -ENOMEM; sn = udev_device_get_property_value(d, "ID_SEAT"); if (isempty(sn)) sn = "seat0"; if (!streq(seat, sn)) continue; node = udev_device_get_devnode(d); /* In case people mistag devices with nodes, we need to ignore this */ if (!node) continue; n = strdup(node); if (!n) return -ENOMEM; log_debug("Found udev node %s for seat %s", n, seat); r = set_consume(nodes, n); if (r < 0) return r; }
int devnode_acl_all(struct udev *udev, const char *seat, bool flush, bool del, uid_t old_uid, bool add, uid_t new_uid) { struct udev_list_entry *item = NULL, *first = NULL; struct udev_enumerate *e; int r; assert(udev); if (isempty(seat)) seat = "seat0"; e = udev_enumerate_new(udev); if (!e) return -ENOMEM; /* We can only match by one tag in libudev. We choose * "uaccess" for that. If we could match for two tags here we * could add the seat name as second match tag, but this would * be hardly optimizable in libudev, and hence checking the * second tag manually in our loop is a good solution. */ r = udev_enumerate_add_match_tag(e, "uaccess"); if (r < 0) goto finish; r = udev_enumerate_scan_devices(e); if (r < 0) goto finish; first = udev_enumerate_get_list_entry(e); udev_list_entry_foreach(item, first) { struct udev_device *d; const char *node, *sn; d = udev_device_new_from_syspath(udev, udev_list_entry_get_name(item)); if (!d) { r = -ENOMEM; goto finish; } sn = udev_device_get_property_value(d, "ID_SEAT"); if (isempty(sn)) sn = "seat0"; if (!streq(seat, sn)) { udev_device_unref(d); continue; } node = udev_device_get_devnode(d); if (!node) { /* In case people mistag devices with nodes, we need to ignore this */ udev_device_unref(d); continue; } log_debug("Fixing up %s for seat %s...", node, sn); r = devnode_acl(node, flush, del, old_uid, add, new_uid); udev_device_unref(d); if (r < 0) goto finish; } finish: if (e) udev_enumerate_unref(e); return r; }