X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=udev%2Fudev-event.c;h=7591d5e314b3693fa55d903dbbf6582aef843147;hp=212ccc795073511c6b0b47111b60fb233642993c;hb=52934a60c447ae78873b07a01b7fa25e60c86fe4;hpb=28460195c2ae90892bf556aff2b80705a8f37795 diff --git a/udev/udev-event.c b/udev/udev-event.c index 212ccc795..7591d5e31 100644 --- a/udev/udev-event.c +++ b/udev/udev-event.c @@ -38,10 +38,10 @@ struct udev_event *udev_event_new(struct udev_device *dev) event = calloc(1, sizeof(struct udev_event)); if (event == NULL) return NULL; + event->mode = 0600; event->dev = dev; event->udev = udev_device_get_udev(dev); udev_list_init(&event->run_list); - event->mode = 0660; dbg(event->udev, "allocated event %p\n", event); return event; } @@ -111,7 +111,7 @@ size_t udev_event_apply_format(struct udev_event *event, const char *src, char * s = dest; l = size; - while (1) { + for (;;) { enum subst_type type = SUBST_UNKNOWN; char attrbuf[UTIL_PATH_SIZE]; char *attr = NULL; @@ -380,7 +380,7 @@ subst: minor(udev_device_get_devnum(dev))); if (event->tmp_node == NULL) break; - udev_node_mknod(dev, event->tmp_node, makedev(0, 0), 0600, 0, 0); + udev_node_mknod(dev, event->tmp_node, 0600, 0, 0); l = util_strpcpy(&s, l, event->tmp_node); break; } @@ -544,6 +544,7 @@ int udev_event_execute_rules(struct udev_event *event, struct udev_rules *rules) if (strcmp(udev_device_get_action(dev), "remove") == 0) { udev_device_read_db(dev); udev_device_delete_db(dev); + udev_device_tag_index(dev, NULL, false); if (major(udev_device_get_devnum(dev)) != 0) udev_watch_end(event->udev, dev); @@ -577,6 +578,7 @@ int udev_event_execute_rules(struct udev_event *event, struct udev_rules *rules) /* delete stale db file */ udev_device_delete_db(dev); + udev_device_tag_index(dev, NULL, false); /* remember old name */ udev_device_add_property(dev, "INTERFACE_OLD", udev_device_get_sysname(dev)); @@ -615,43 +617,38 @@ int udev_event_execute_rules(struct udev_event *event, struct udev_rules *rules) } } - if (event->name == NULL) { - /* things went wrong */ + if (event->name == NULL || event->name[0] == '\0') { udev_device_delete_db(dev); + udev_device_tag_index(dev, NULL, false); udev_device_unref(event->dev_db); err = -ENOMEM; + err(event->udev, "no node name, something went wrong, ignoring\n"); goto out; } + if (udev_device_get_knodename(dev) != NULL && strcmp(udev_device_get_knodename(dev), event->name) != 0) + err(event->udev, "kernel-provided name '%s' and NAME= '%s' disagree, " + "please use SYMLINK+= or change the kernel to provide the proper name\n", + udev_device_get_knodename(dev), event->name); + /* set device node name */ util_strscpyl(filename, sizeof(filename), udev_get_dev_path(event->udev), "/", event->name, NULL); udev_device_set_devnode(dev, filename); } udev_device_update_db(dev); + udev_device_tag_index(dev, event->dev_db, true); if (major(udev_device_get_devnum(dev)) != 0) { /* remove/update possible left-over symlinks from old database entry */ if (event->dev_db != NULL) udev_node_update_old_links(dev, event->dev_db); - if (event->name[0] != '\0') - err = udev_node_add(dev, event->mode, event->uid, event->gid); - else - info(event->udev, "device node creation suppressed\n"); - - /* remove kernel-created node, if needed */ - if (udev_device_get_knodename(dev) != NULL && strcmp(event->name, udev_device_get_knodename(dev)) != 0) { - struct stat stats; - char filename[UTIL_PATH_SIZE]; - - util_strscpyl(filename, sizeof(filename), udev_get_dev_path(event->udev), "/", udev_device_get_knodename(dev), NULL); - if (lstat(filename, &stats) == 0 && stats.st_rdev == udev_device_get_devnum(dev)) { - info(event->udev, "remove kernel created node '%s'\n", udev_device_get_knodename(dev)); - util_unlink_secure(event->udev, filename); - util_delete_path(event->udev, filename); - } - } + /* change default 0600 to 0660 if a group is assigned */ + if (event->mode == 0600 && event->gid > 0) + event->mode = 0660; + + err = udev_node_add(dev, event->mode, event->uid, event->gid); } udev_device_unref(event->dev_db); @@ -684,7 +681,11 @@ int udev_event_execute_run(struct udev_event *event, const sigset_t *sigmask) udev_event_apply_format(event, cmd, program, sizeof(program)); envp = udev_device_get_properties_envp(event->dev); - if (util_run_program(event->udev, program, envp, NULL, 0, NULL, sigmask) != 0) { + if (event->exec_delay > 0) { + info(event->udev, "delay execution of '%s'\n", program); + sleep(event->exec_delay); + } + if (util_run_program(event->udev, program, envp, NULL, 0, NULL, sigmask, true) != 0) { if (udev_list_entry_get_flags(list_entry)) err = -1; }