From: azarah@nosferatu.za.org Date: Tue, 30 Dec 2003 09:33:35 +0000 (-0800) Subject: [PATCH] make symlink work properly if there is already a file in its place X-Git-Tag: 012~14 X-Git-Url: https://err.no/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=3f09184b43dfd8b27fb05786a789f392de18bfca;p=systemd [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. --- diff --git a/udev-add.c b/udev-add.c index 2f72613e..802d85b5 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)