chiark / gitweb /
[PATCH] add volume_id support to the udev.spec file
[elogind.git] / namedev.c
index 7b70f8bcdfd40dea8f19dd23e23fe01a655d8666..b3a2a8ae4b0bcb2bf0eb62955d47f71bf57153d8 100644 (file)
--- a/namedev.c
+++ b/namedev.c
@@ -32,6 +32,9 @@
 #include <time.h>
 #include <sys/wait.h>
 #include <sys/stat.h>
+#ifndef __KLIBC__
+#include <sys/sysinfo.h>
+#endif
 
 #include "libsysfs/sysfs/libsysfs.h"
 #include "list.h"
@@ -196,23 +199,21 @@ static void apply_format(struct udevice *udev, char *string, size_t maxsize,
        struct sysfs_attribute *tmpattr;
 
        pos = string;
-
        while (1) {
-               pos = strchr(string, '%');
-               if (pos != NULL) {
-                       pos[0] = '\0';
-                       tail = pos+1;
-                       len = get_format_len(&tail);
-                       c = tail[0];
-                       strfieldcpy(temp, tail+1);
-                       tail = temp;
-               } else {
+               pos = strchr(pos, '%');
+               if (pos == NULL)
                        break;
-               }
-               dbg("format=%c, string='%s', tail='%s'",c , string, tail);
 
+               pos[0] = '\0';
+               tail = pos+1;
+               len = get_format_len(&tail);
+               c = tail[0];
+               strfieldcpy(temp, tail+1);
+               tail = temp;
+               dbg("format=%c, string='%s', tail='%s'",c , string, tail);
                attr = get_format_attribute(&tail);
 
+
                switch (c) {
                case 'b':
                        if (strlen(udev->bus_id) == 0)
@@ -283,6 +284,7 @@ static void apply_format(struct udevice *udev, char *string, size_t maxsize,
                        break;
                case '%':
                        strfieldcatmax(string, "%", maxsize);
+                       pos++;
                        break;
                default:
                        dbg("unknown substitution type '%%%c'", c);
@@ -454,7 +456,7 @@ static int execute_program(char *path, char *value, int len)
                        retval = -1;
                }
 
-               if (i > 0 && value[i] == '\n')
+               if (i > 0 && value[i-1] == '\n')
                        i--;
                value[i] = '\0';
                dbg("result is '%s'", value);
@@ -776,6 +778,7 @@ int namedev_name_device(struct sysfs_class_device *class_dev, struct udevice *ud
        struct sysfs_device *sysfs_device = NULL;
        struct config_device *dev;
        struct perm_device *perm;
+       struct sysinfo info;
        char *pos;
 
        udev->mode = 0;
@@ -837,33 +840,29 @@ int namedev_name_device(struct sysfs_class_device *class_dev, struct udevice *ud
                        }
                }
        }
-
-       /* no rule was found for the net device */
-       if (udev->type == 'n') {
-               dbg("no name for net device '%s' configured", udev->kernel_name);
-               return -1;
-       }
-
        /* no rule was found so we use the kernel name */
        strfieldcpy(udev->name, udev->kernel_name);
-       goto done;
+       if (udev->type == 'n')
+               goto done;
+       else
+               goto perms;
 
 found:
        apply_format(udev, udev->name, sizeof(udev->name), class_dev, sysfs_device);
+       strfieldcpy(udev->config_file, dev->config_file);
+       udev->config_line = dev->config_line;
 
        if (udev->type == 'n')
-               return 0;
+               goto done;
 
        udev->partitions = dev->partitions;
-       strfieldcpy(udev->config_file, dev->config_file);
-       udev->config_line = dev->config_line;
 
        /* get permissions given in rule */
        set_empty_perms(udev, dev->mode,
                              dev->owner,
                              dev->group);
 
-done:
+perms:
        /* get permissions given in config file or set defaults */
        perm = find_perm(udev->name);
        if (perm != NULL) {
@@ -879,8 +878,10 @@ done:
        dbg("name, '%s' is going to have owner='%s', group='%s', mode = %#o",
            udev->name, udev->owner, udev->group, udev->mode);
 
+done:
        /* store time of action */
-       udev->config_time = time(NULL);
+       sysinfo(&info);
+       udev->config_uptime = info.uptime;
 
        return 0;
 }