From 3d150dfb28efbaf0b25f154fb8955c47d606c3d5 Mon Sep 17 00:00:00 2001 From: "kay.sievers@vrfy.org" Date: Sun, 7 Dec 2003 09:12:07 -0800 Subject: [PATCH] experimental (very simple) SYMLINK creation > > here is a experimental symlink creation patch - for discussion, > > in which direction we should go. > > It is possible now to define SYMLINK= after the NAME= in udev.rules. > > The link is relative to the node, but the path is not optimized now > > if the node and the link are in the same nested directory. > > Only one link is supported, cause i need to sleep now :) > > > > 06-simple-symlink-creation.diff > > simple symlink creation > > reorganized udev-remove to have access to the symlink field > > subdir creation/removal are functions now > > udev-test.pl tests for link creation/removal Here is a new version with relative link target path optimization an better tests in udev-test.pl: LABEL, BUS="scsi", vendor="IBM-ESXS", NAME="1/2/a/b/node", SYMLINK="1/2/c/d/symlink" Dec 7 06:48:34 pim udev[13789]: create_node: symlink 'udev-root/1/2/c/d/symlink' to node '1/2/a/b/node' requested Dec 7 06:48:34 pim udev[13789]: create_path: created 'udev-root/1/2/c' Dec 7 06:48:34 pim udev[13789]: create_path: created 'udev-root/1/2/c/d' Dec 7 06:48:34 pim udev[13789]: create_node: symlink(../../a/b/node, udev-root/1/2/c/d/symlink) --- namedev_parse.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 47 insertions(+), 11 deletions(-) (limited to 'namedev_parse.c') diff --git a/namedev_parse.c b/namedev_parse.c index 5cb3a3eb1d..b5d0d64b9d 100644 --- a/namedev_parse.c +++ b/namedev_parse.c @@ -213,10 +213,16 @@ int namedev_init_rules(void) break; strfieldcpy(dev.name, temp3); + /* SYMLINK="name" */ + temp2 = strsep(&temp, ","); + retval = get_value("SYMLINK", &temp, &temp3); + if (retval == 0) + strfieldcpy(dev.symlink, temp3); + dbg_parse("LABEL name='%s', bus='%s', " - "sysfs_file='%s', sysfs_value='%s'", + "sysfs_file='%s', sysfs_value='%s', symlink='%s'", dev.name, dev.bus, dev.sysfs_file, - dev.sysfs_value); + dev.sysfs_value, dev.symlink); } if (strcasecmp(temp2, TYPE_NUMBER) == 0) { @@ -243,8 +249,14 @@ int namedev_init_rules(void) break; strfieldcpy(dev.name, temp3); - dbg_parse("NUMBER name='%s', bus='%s', id='%s'", - dev.name, dev.bus, dev.id); + /* SYMLINK="name" */ + temp2 = strsep(&temp, ","); + retval = get_value("SYMLINK", &temp, &temp3); + if (retval == 0) + strfieldcpy(dev.symlink, temp3); + + dbg_parse("NUMBER name='%s', bus='%s', id='%s', symlink='%s'", + dev.name, dev.bus, dev.id, dev.symlink); } if (strcasecmp(temp2, TYPE_TOPOLOGY) == 0) { @@ -271,8 +283,15 @@ int namedev_init_rules(void) break; strfieldcpy(dev.name, temp3); - dbg_parse("TOPOLOGY name='%s', bus='%s', place='%s'", - dev.name, dev.bus, dev.place); + /* SYMLINK="name" */ + temp2 = strsep(&temp, ","); + retval = get_value("SYMLINK", &temp, &temp3); + if (retval == 0) + strfieldcpy(dev.symlink, temp3); + + dbg_parse("TOPOLOGY name='%s', bus='%s', " + "place='%s', symlink='%s'", + dev.name, dev.bus, dev.place, dev.symlink); } if (strcasecmp(temp2, TYPE_REPLACE) == 0) { @@ -291,9 +310,17 @@ int namedev_init_rules(void) if (retval) break; strfieldcpy(dev.name, temp3); - dbg_parse("REPLACE name='%s', kernel_name='%s'", - dev.name, dev.kernel_name); + + /* SYMLINK="name" */ + temp2 = strsep(&temp, ","); + retval = get_value("SYMLINK", &temp, &temp3); + if (retval == 0) + strfieldcpy(dev.symlink, temp3); + + dbg_parse("REPLACE name='%s', kernel_name='%s', symlink='%s'", + dev.name, dev.kernel_name, dev.symlink); } + if (strcasecmp(temp2, TYPE_CALLOUT) == 0) { /* number type */ dev.type = CALLOUT; @@ -324,8 +351,17 @@ int namedev_init_rules(void) if (retval) break; strfieldcpy(dev.name, temp3); - dbg_parse("CALLOUT name='%s', program='%s'", - dev.name, dev.exec_program); + + /* SYMLINK="name" */ + temp2 = strsep(&temp, ","); + retval = get_value("SYMLINK", &temp, &temp3); + if (retval == 0) + strfieldcpy(dev.symlink, temp3); + + dbg_parse("CALLOUT name='%s', bus='%s', program='%s', " + "id='%s', symlink='%s'", + dev.name, dev.bus, dev.exec_program, + dev.id, dev.symlink); } retval = add_config_dev(&dev); @@ -414,7 +450,7 @@ int namedev_init_permissions(void) dev.mode); retval = add_perm_dev(&dev); if (retval) { - dbg("add_config_dev returned with error %d", retval); + dbg("add_perm_dev returned with error %d", retval); goto exit; } } -- cgit v1.2.3-54-g00ecf