chiark / gitweb /
[PATCH] udev - activate formt length attribute
authorkay.sievers@vrfy.org <kay.sievers@vrfy.org>
Sat, 28 Feb 2004 14:53:25 +0000 (06:53 -0800)
committerGreg KH <gregkh@suse.de>
Wed, 27 Apr 2005 04:34:29 +0000 (21:34 -0700)
We carried the the old callout part selector syntax for two releases
now after it was replaced by the new %c{1} syntax. So here we remove
the old syntax and use the code to possibly specify the maximum count
of chars to insert into the string. It will work with all of our format
chars.
I don't know if somebody will use it, but the code is already there :)

's%3s{vendor}' returns "IBM" now, instead of "IBM-ESXS".

Also added is a test for it and a few words in the man page.

namedev.c
test/udev-test.pl
udev.8

index c9232fa2aa66705edf3f0e86737e88716f1f6f12..505264554db3b041b18d31fddb2ef2cffdfd528c 100644 (file)
--- a/namedev.c
+++ b/namedev.c
@@ -220,7 +220,7 @@ static void apply_format(struct udevice *udev, char *string, size_t maxsize,
        char *pos2;
        char *pos3;
        char *attr;
-       int num;
+       int len;
        int i;
        char c;
        struct sysfs_attribute *tmpattr;
@@ -232,7 +232,7 @@ static void apply_format(struct udevice *udev, char *string, size_t maxsize,
                if (pos != NULL) {
                        pos[0] = '\0';
                        tail = pos+1;
-                       num = get_format_len(&tail);
+                       len = get_format_len(&tail);
                        c = tail[0];
                        strfieldcpy(temp, tail+1);
                        tail = temp;
@@ -274,7 +274,7 @@ static void apply_format(struct udevice *udev, char *string, size_t maxsize,
                        if (strlen(udev->program_result) == 0)
                                break;
                        /* get part part of the result string */
-                       i = num; /* num syntax is deprecated and will be removed  */
+                       i = 0;
                        if (attr != NULL)
                                i = atoi(attr);
                        if (i > 0) {
@@ -317,6 +317,10 @@ static void apply_format(struct udevice *udev, char *string, size_t maxsize,
                        dbg("unknown substitution type '%%%c'", c);
                        break;
                }
+               /* truncate to specified length */
+               if (len > 0)
+                       pos[len] = '\0';
+
                strnfieldcat(string, tail, maxsize);
        }
 }
index a3bf768fe3d1d71cd69c6a4781e62620c3150ff4..6b7f515442531b102b29f80164637a9edcd8fef9 100644 (file)
@@ -191,6 +191,15 @@ EOF
                expected => "Major:8:minor:3:kernelnumber:3:bus:0:0:0:0" ,
                conf     => <<EOF
 BUS="scsi", PLACE="0:0:0:0", NAME="Major:%M:minor:%m:kernelnumber:%n:bus:%b"
+EOF
+       },
+       {
+               desc     => "test NAME substitution chars (with length limit)",
+               subsys   => "block",
+               devpath  => "block/sda/sda3",
+               expected => "M8-m3-n3-b0:0-sIBM" ,
+               conf     => <<EOF
+BUS="scsi", PLACE="0:0:0:0", NAME="M%M-m%m-n%n-b%3b-s%3s{vendor}"
 EOF
        },
        {
diff --git a/udev.8 b/udev.8
index 8f0060580d7c13e3c94bc966ebd3ae617a2906b7..e449ef8dbb37c95c228db215aed830bd33fbb445 100644 (file)
--- a/udev.8
+++ b/udev.8
@@ -209,7 +209,7 @@ fields support simple printf-like string substitution:
 .TP
 .B %n
 The "kernel number" of the device.
-for example, 'sda3' has a "kernel number" of '3'
+For example, 'sda3' has a "kernel number" of '3'.
 .TP
 .B %k
 The "kernel name" for the device.
@@ -239,7 +239,11 @@ my be selected by specifying the part number as a attribute:
 The content of a sysfs attribute.
 .TP
 .B %%
-The '%' char itself.
+The '%' character itself.
+.P
+The count of charcters to insert may be limited by specifying
+the format length value. For example, '%3s{file}' will only insert
+the first three characters of the sysfs attribute.
 .P
 .RI "A sample " udev.rules " might look like this:"
 .sp