Skip to contentSkip to conversation

allow multiple symlinks

udev Kay Sievers 1 participant 1 message Dec 9, 2003

lore
Share & tools
lore
#0 lore raw

Here is a patch to allow the creation of multiple symlinks. The names must be separated by a space character.

REPLACE, KERNEL="ttyUSB0", NAME="visor", SYMLINK="first-%n second-%n third-%n"

results in:

Dec  9 05:28:51 pim udev[12019]: create_node: mknod(udev-root/visor, 020666, 188, 0)
Dec  9 05:28:51 pim udev[12019]: create_node: symlink 'udev-root/first-0' to node 'visor' requested
Dec  9 05:28:51 pim udev[12019]: create_node: symlink(./visor, udev-root/first-0)
Dec  9 05:28:51 pim udev[12019]: create_node: symlink 'udev-root/second-0' to node 'visor' requested
Dec  9 05:28:51 pim udev[12019]: create_node: symlink(./visor, udev-root/second-0)
Dec  9 05:28:51 pim udev[12019]: create_node: symlink 'udev-root/third-0' to node 'visor' requested
Dec  9 05:28:51 pim udev[12019]: create_node: symlink(./visor, udev-root/third-0)

thanks,
Kay

test/udev-test.pl +9 -0
diff -Nru a/test/udev-test.pl b/test/udev-test.pl
@@ -217,6 +217,15 @@
 LABEL, BUS="scsi", vendor="IBM-ESXS", NAME="1/2/a/b/node", SYMLINK="1/2/c/d/symlink"
 EOF
 	},
+	{
+		desc     => "multiple symlinks",
+		subsys   => "tty",
+		devpath  => "class/tty/ttyUSB0",
+		expected => "second-0" ,
+		conf     => <<EOF
+REPLACE, KERNEL="ttyUSB0", NAME="visor", SYMLINK="first-%n second-%n third-%n"
+EOF
+	},
 );
 
 # set env
udev-add.c +38 -30

83 lines not on this page · raw message

udev-remove.c +21 -11
diff -Nru a/udev-remove.c b/udev-remove.c
@@ -66,6 +66,8 @@
 static int delete_node(struct udevice *dev)
 {
 	char filename[255];
+	char *symlinks;
+	char *linkname;
 	int retval;
 
 	strncpy(filename, udev_root, sizeof(filename));
@@ -84,17 +86,25 @@
 		delete_path(filename);
 
 	if (*dev->symlink) {
-		strncpy(filename, udev_root, sizeof(filename));
-		strncat(filename, dev->symlink, sizeof(filename));
-		dbg("unlinking symlink '%s'", filename);
-		retval = unlink(filename);
-		if (retval) {
-			dbg("unlink(%s) failed with error '%s'",
-				filename, strerror(errno));
-			return retval;
-		}
-		if (strchr(dev->symlink, '/')) {
-			delete_path(filename);
+		symlinks = dev->symlink;
+		while (1) {
+			linkname = strsep(&symlinks, " ");
+			if (linkname == NULL)
+				break;
+
+			strncpy(filename, udev_root, sizeof(filename));
+			strncat(filename, linkname, sizeof(filename));
+
+			dbg("unlinking symlink '%s'", filename);
+			retval = unlink(filename);
+			if (retval) {
+				dbg("unlink(%s) failed with error '%s'",
+					filename, strerror(errno));
+				return retval;
+			}
+			if (strchr(dev->symlink, '/')) {
+				delete_path(filename);
+			}
 		}
 	}