From 3f09184b43dfd8b27fb05786a789f392de18bfca Mon Sep 17 00:00:00 2001 From: "azarah@nosferatu.za.org" Date: Tue, 30 Dec 2003 01:33:35 -0800 Subject: [PATCH] [PATCH] make symlink work properly if there is already a file in its place 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 | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/udev-add.c b/udev-add.c index 2f72613ea9..802d85b5b0 100644 --- a/udev-add.c +++ b/udev-add.c @@ -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)