chiark / gitweb /
cdrom_id: Fix state for fresh DVD-RW
[elogind.git] / udev / udev-event.c
index ad6db83aea728b67e8b9e51a5f3fe81cf911d820..7785ad892c308a1b07bee1d8ddab06576e505479 100644 (file)
@@ -38,6 +38,7 @@ 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);
@@ -110,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;
@@ -464,6 +465,7 @@ static int rename_netif(struct udev_event *event)
        int sk;
        struct ifreq ifr;
        int err;
+       char *newdup;
 
        info(event->udev, "changing net interface name from '%s' to '%s'\n",
             udev_device_get_sysname(dev), event->name);
@@ -491,13 +493,16 @@ static int rename_netif(struct udev_event *event)
                }
 
                /* free our own name, another process may wait for us */
-               util_strscpyl(ifr.ifr_newname, IFNAMSIZ, udev_device_get_sysname(dev), "_rename", NULL);
+               newdup = strdup(ifr.ifr_newname);
+               util_strscpyl(ifr.ifr_newname, IFNAMSIZ, udev_device_get_sysname(dev), "-", newdup, NULL);
+               free(newdup);
                err = ioctl(sk, SIOCSIFNAME, &ifr);
                if (err != 0) {
                        err(event->udev, "error changing netif name %s to %s: %m\n",
                            ifr.ifr_name, ifr.ifr_newname);
                        goto exit;
                }
+               rename_netif_kernel_log(ifr);
 
                /* wait 90 seconds for our target to become available */
                util_strscpy(ifr.ifr_name, IFNAMSIZ, ifr.ifr_newname);
@@ -643,12 +648,10 @@ int udev_event_execute_rules(struct udev_event *event, struct udev_rules *rules)
                        if (event->dev_db != NULL)
                                udev_node_update_old_links(dev, event->dev_db);
 
-                       if (event->mode == 0) {
-                               if (event->gid > 0)
-                                       event->mode = 0660;
-                               else
-                                       event->mode = 0600;
-                       }
+                       /* 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);
                }
 
@@ -682,6 +685,10 @@ 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 (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;