]> err.no Git - systemd/commitdiff
[PATCH] make symlink work properly if there is already a file in its place
authorazarah@nosferatu.za.org <azarah@nosferatu.za.org>
Tue, 30 Dec 2003 09:33:35 +0000 (01:33 -0800)
committerGreg KH <gregkh@suse.de>
Wed, 27 Apr 2005 04:13:12 +0000 (21:13 -0700)
If a file that is not a symlink (node, socket, fifo, etc) already
exist where udev need to create a symlink, symlink() fails.  This
patch basically test for an existing file, and unlink it.

udev-add.c

index 2f72613ea9fca7918b77908fd413e7d1d357cbde..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;
@@ -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)