chiark / gitweb /
[PATCH] add IGNORE rule type
[elogind.git] / udev-add.c
index ba5c864165234e83b9072bb4a349cdb7b46f37d4..802d85b5b07d408fe612b41398b2416abc061a73 100644 (file)
@@ -100,6 +100,7 @@ static int create_path(char *file)
 
 static int create_node(struct udevice *dev)
 {
+       struct stat stats;
        char filename[255];
        char linktarget[255];
        char *linkname;
@@ -193,7 +194,7 @@ static int create_node(struct udevice *dev)
                symlinks = dev->symlink;
                while (1) {
                        linkname = strsep(&symlinks, " ");
-                       if (linkname == NULL)
+                       if (linkname == NULL || linkname[0] == '\0')
                                break;
 
                        strncpy(filename, udev_root, sizeof(filename));
@@ -221,6 +222,16 @@ static int create_node(struct udevice *dev)
                                strcpy(linktarget, "./");
                        strcat(linktarget, &dev->name[tail]);
 
+                       /* unlink existing non-directories to ensure that our symlink
+                        * is created */
+                       if (lstat(filename, &stats) == 0) {
+                               if ((stats.st_mode & S_IFMT) != S_IFDIR) {
+                                       if (unlink(filename))
+                                               dbg("unlink(%s) failed with error '%s'",
+                                                   filename, strerror(errno));
+                               }
+                       }
+
                        dbg("symlink(%s, %s)", linktarget, filename);
                        retval = symlink(linktarget, filename);
                        if (retval)