diff options
-rw-r--r-- | namedev.c | 41 | ||||
-rw-r--r-- | test/udev-test.pl | 9 |
2 files changed, 45 insertions, 5 deletions
@@ -200,15 +200,30 @@ static void build_kernel_number(struct sysfs_class_device *class_dev, struct ude 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 @@ static void apply_format(struct udevice *udev, unsigned char *string) 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 --git a/test/udev-test.pl b/test/udev-test.pl index 3dfbaa2530..1a35e3da82 100644 --- a/test/udev-test.pl +++ b/test/udev-test.pl @@ -153,6 +153,15 @@ CALLOUT, BUS="scsi", PROGRAM="/bin/echo -n test-%b", ID="test-*", NAME="%c" EOF }, { + desc => "callout program substitution (numbered part of)", + subsys => "block", + devpath => "block/sda/sda3", + expected => "link1" , + conf => <<EOF +CALLOUT, BUS="scsi", PROGRAM="/bin/echo -n node link1 link2", ID="node *", NAME="%1c", SYMLINK="%2c %3c" +EOF + }, + { desc => "devfs disk naming substitution", subsys => "block", devpath => "block/sda", |