diff options
author | azarah@nosferatu.za.org <azarah@nosferatu.za.org> | 2003-12-30 01:33:35 -0800 |
---|---|---|
committer | Greg KH <gregkh@suse.de> | 2005-04-26 21:13:12 -0700 |
commit | 3f09184b43dfd8b27fb05786a789f392de18bfca (patch) | |
tree | f8455b8c75f83cc31778a321688f59609a640899 /udev-add.c | |
parent | 13148857cb880c421711db60ad1785ed8e373906 (diff) |
[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.
Diffstat (limited to 'udev-add.c')
-rw-r--r-- | udev-add.c | 11 |
1 files changed, 11 insertions, 0 deletions
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) |