From: Kay Sievers <kay.sievers@vrfy.org>
To: linux-hotplug@vger.kernel.org
Subject: [udev] allow multiple symlinks
Date: Tue, 09 Dec 2003 04:49:43 +0000 [thread overview]
Message-ID: <marc-linux-hotplug-107094606715335@msgid-missing> (raw)
[-- Attachment #1: Type: text/plain, Size: 852 bytes --]
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
[-- Attachment #2: 02-allow-multiple-symlinks.diff --]
[-- Type: text/plain, Size: 4056 bytes --]
diff -Nru a/test/udev-test.pl b/test/udev-test.pl
--- a/test/udev-test.pl Tue Dec 9 05:30:28 2003
+++ b/test/udev-test.pl Tue Dec 9 05:30:28 2003
@@ -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
diff -Nru a/udev-add.c b/udev-add.c
--- a/udev-add.c Tue Dec 9 05:30:28 2003
+++ b/udev-add.c Tue Dec 9 05:30:28 2003
@@ -102,6 +102,8 @@
{
char filename[255];
char linktarget[255];
+ char *linkname;
+ char *symlinks;
int retval = 0;
uid_t uid = 0;
gid_t gid = 0;
@@ -186,39 +188,45 @@
filename, uid, gid, strerror(errno));
}
-
/* create symlink if requested */
if (*dev->symlink) {
- strncpy(filename, udev_root, sizeof(filename));
- strncat(filename, dev->symlink, sizeof(filename));
- dbg("symlink '%s' to node '%s' requested", filename, dev->name);
- if (strrchr(dev->symlink, '/'))
- create_path(filename);
-
- /* optimize relative link */
- linktarget[0] = '\0';
- i = 0;
- tail = 0;
- while ((dev->name[i] == dev->symlink[i]) && dev->name[i]) {
- if (dev->name[i] == '/')
- tail = i+1;
- i++;
- }
- while (dev->symlink[i]) {
- if (dev->symlink[i] == '/')
- strcat(linktarget, "../");
- i++;
+ symlinks = dev->symlink;
+ while (1) {
+ linkname = strsep(&symlinks, " ");
+ if (linkname == NULL)
+ break;
+
+ strncpy(filename, udev_root, sizeof(filename));
+ strncat(filename, linkname, sizeof(filename));
+ dbg("symlink '%s' to node '%s' requested", filename, dev->name);
+ if (strrchr(linkname, '/'))
+ create_path(filename);
+
+ /* optimize relative link */
+ linktarget[0] = '\0';
+ i = 0;
+ tail = 0;
+ while ((dev->name[i] == linkname[i]) && dev->name[i]) {
+ if (dev->name[i] == '/')
+ tail = i+1;
+ i++;
+ }
+ while (linkname[i]) {
+ if (linkname[i] == '/')
+ strcat(linktarget, "../");
+ i++;
+ }
+
+ if (*linktarget == '\0')
+ strcpy(linktarget, "./");
+ strcat(linktarget, &dev->name[tail]);
+
+ dbg("symlink(%s, %s)", linktarget, filename);
+ retval = symlink(linktarget, filename);
+ if (retval)
+ dbg("symlink(%s, %s) failed with error '%s'",
+ linktarget, filename, strerror(errno));
}
-
- if (*linktarget == '\0')
- strcpy(linktarget, "./");
- strcat(linktarget, &dev->name[tail]);
-
- dbg("symlink(%s, %s)", linktarget, filename);
- retval = symlink(linktarget, filename);
- if (retval)
- dbg("symlink(%s, %s) failed with error '%s'",
- linktarget, filename, strerror(errno));
}
return retval;
diff -Nru a/udev-remove.c b/udev-remove.c
--- a/udev-remove.c Tue Dec 9 05:30:28 2003
+++ b/udev-remove.c Tue Dec 9 05:30:28 2003
@@ -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);
+ }
}
}
next reply other threads:[~2003-12-09 4:49 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2003-12-09 4:49 Kay Sievers [this message]
-- strict thread matches above, loose matches on Subject: below --
2003-12-10 0:47 [udev] allow multiple symlinks Greg KH
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=marc-linux-hotplug-107094606715335@msgid-missing \
--to=kay.sievers@vrfy.org \
--cc=linux-hotplug@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).