From: Yu Watanabe Date: Thu, 25 Oct 2018 01:32:35 +0000 (+0900) Subject: udev-event: move devnode handling logic to a new function X-Git-Tag: v240~453^2~4 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e52eaf5649cd3eb352671989437ea1ed4863f16d;p=thirdparty%2Fsystemd.git udev-event: move devnode handling logic to a new function Also, replace udev_device by sd_device. --- diff --git a/src/udev/udev-event.c b/src/udev/udev-event.c index 1f9e2fea583..14d97f05e7c 100644 --- a/src/udev/udev-event.c +++ b/src/udev/udev-event.c @@ -720,6 +720,57 @@ static int rename_netif(struct udev_event *event) { return 1; } +static int update_devnode(struct udev_event *event) { + sd_device *dev = event->dev->device; + const char *action; + dev_t devnum; + bool apply; + int r; + + r = sd_device_get_devnum(dev, &devnum); + if (r == -ENOENT) + return 0; + if (r < 0) + return log_device_error_errno(dev, r, "Failed to get devnum: %m"); + + /* remove/update possible left-over symlinks from old database entry */ + if (event->dev_db) + (void) udev_node_update_old_links(dev, event->dev_db->device); + + if (!event->owner_set) { + r = device_get_devnode_uid(dev, &event->uid); + if (r < 0 && r != -ENOENT) + return log_device_error_errno(dev, r, "Failed to get devnode UID: %m"); + } + + if (!event->group_set) { + r = device_get_devnode_gid(dev, &event->gid); + if (r < 0 && r != -ENOENT) + return log_device_error_errno(dev, r, "Failed to get devnode GID: %m"); + } + + if (!event->mode_set) { + r = device_get_devnode_mode(dev, &event->mode); + if (r < 0 && r != -ENOENT) + return log_device_error_errno(dev, r, "Failed to get devnode mode: %m"); + if (r == -ENOENT) { + if (event->gid > 0) + /* default 0660 if a group is assigned */ + event->mode = 0660; + else + /* default 0600 */ + event->mode = 0600; + } + } + + r = sd_device_get_property_value(dev, "ACTION", &action); + if (r < 0) + return log_device_error_errno(dev, r, "Failed to get property 'ACTION': %m"); + + apply = streq(action, "add") || event->owner_set || event->group_set || event->mode_set; + return udev_node_add(dev, apply, event->mode, event->uid, event->gid, event->seclabel_list); +} + void udev_event_execute_rules(struct udev_event *event, usec_t timeout_usec, usec_t timeout_warn_usec, Hashmap *properties_list, @@ -760,36 +811,7 @@ void udev_event_execute_rules(struct udev_event *event, properties_list); (void) rename_netif(event); - - if (major(udev_device_get_devnum(dev)) > 0) { - bool apply; - - /* remove/update possible left-over symlinks from old database entry */ - if (event->dev_db != NULL) - udev_node_update_old_links(dev->device, event->dev_db->device); - - if (!event->owner_set) - event->uid = udev_device_get_devnode_uid(dev); - - if (!event->group_set) - event->gid = udev_device_get_devnode_gid(dev); - - if (!event->mode_set) { - if (udev_device_get_devnode_mode(dev) > 0) { - /* kernel supplied value */ - event->mode = udev_device_get_devnode_mode(dev); - } else if (event->gid > 0) { - /* default 0660 if a group is assigned */ - event->mode = 0660; - } else { - /* default 0600 */ - event->mode = 0600; - } - } - - apply = streq(udev_device_get_action(dev), "add") || event->owner_set || event->group_set || event->mode_set; - udev_node_add(dev->device, apply, event->mode, event->uid, event->gid, event->seclabel_list); - } + (void) update_devnode(event); /* preserve old, or get new initialization timestamp */ udev_device_ensure_usec_initialized(event->dev, event->dev_db);