From mboxrd@z Thu Jan 1 00:00:00 1970 From: Kay Sievers Date: Sat, 13 Dec 2003 15:47:48 +0000 Subject: Re: udev.rules.devfs + symlinks & a question MIME-Version: 1 Content-Type: multipart/mixed; boundary="liOOAslEiF7prFVr" Message-Id: List-Id: References: In-Reply-To: To: linux-hotplug@vger.kernel.org --liOOAslEiF7prFVr Content-Type: text/plain; charset=us-ascii Content-Disposition: inline On Sat, Dec 13, 2003 at 02:17:22AM +0100, Svetoslav Slavtchev wrote: > can a callout return several strings? > NAME="%c1", SYMLINK="%c2 %c3" > > no i don't think this can be done with a callout script Try this patch if you like, to get special parts of the callout output. This beast works now: CALLOUT, BUS="scsi", PROGRAM="/bin/echo -n node link1 link2", ID="node *", NAME="%1c", SYMLINK="%2c %3c" The callout returned string is separated by spaces and is addressed by the "len" value of the 'c' format char. Since we support symlinks, this my be useful for other uses of callout too. good luck, Kay 02-get-part-of-callout-return-string.diff introduce 'len number' for format chars the first use is 'c'-the callout return to select a part of the output string like: CALLOUT, BUS="scsi", PROGRAM="/bin/echo -n node link1 link2", ID="node *", NAME="%1c", SYMLINK="%2c %3c" (note: first part is requested by len=1, len=0 will return the whole string) add a test to udev-test.pl --liOOAslEiF7prFVr Content-Type: text/plain; charset=us-ascii Content-Disposition: inline; filename="02-get-part-of-callout-return-string.diff" diff -Nru a/namedev.c b/namedev.c --- a/namedev.c Sat Dec 13 16:19:27 2003 +++ b/namedev.c Sat Dec 13 16:19:27 2003 @@ -200,15 +200,30 @@ static void apply_format(struct udevice *udev, unsigned char *string) { char name[NAME_SIZE]; + char temp[NAME_SIZE]; + char *tail; char *pos; + char *pos2; + char *pos3; + int num; while (1) { + num = 0; pos = strchr(string, '%'); if (pos) { - strfieldcpy(name, pos+2); - *pos = 0x00; - switch (pos[1]) { + *pos = '\0'; + tail = pos+1; + if (isdigit(tail[0])) { + num = (int) strtoul(&pos[1], &tail, 10); + if (tail == NULL) { + dbg("format parsing error '%s'", pos+1); + break; + } + } + strfieldcpy(name, tail+1); + + switch (tail[0]) { case 'b': if (strlen(udev->bus_id) == 0) break; @@ -241,8 +256,24 @@ case 'c': if (strlen(udev->callout_value) == 0) break; - strcat(pos, udev->callout_value); - dbg("substitute callout output '%s'", udev->callout_value); + if (num) { + /* get part of return string */ + strncpy(temp, udev->callout_value, sizeof(temp)); + pos2 = temp; + while (num) { + num--; + pos3 = strsep(&pos2, " "); + if (pos3 == NULL) { + dbg("requested part of callout string not found"); + break; + } + } + strcat(pos, pos3); + dbg("substitute partial callout output '%s'", pos3); + } else { + strcat(pos, udev->callout_value); + dbg("substitute callout output '%s'", udev->callout_value); + } break; default: dbg("unknown substitution type '%%%c'", pos[1]); diff -Nru a/test/udev-test.pl b/test/udev-test.pl --- a/test/udev-test.pl Sat Dec 13 16:19:27 2003 +++ b/test/udev-test.pl Sat Dec 13 16:19:27 2003 @@ -153,6 +153,15 @@ EOF }, { + desc => "callout program substitution (numbered part of)", + subsys => "block", + devpath => "block/sda/sda3", + expected => "link1" , + conf => < "devfs disk naming substitution", subsys => "block", devpath => "block/sda", --liOOAslEiF7prFVr-- ------------------------------------------------------- This SF.net email is sponsored by: IBM Linux Tutorials. Become an expert in LINUX or just sharpen your skills. Sign up for IBM's Free Linux Tutorials. Learn everything from the bash shell to sys admin. Click now! http://ads.osdn.com/?ad_id=1278&alloc_id=3371&op=click _______________________________________________ Linux-hotplug-devel mailing list http://linux-hotplug.sourceforge.net Linux-hotplug-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linux-hotplug-devel