summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkay.sievers@vrfy.org <kay.sievers@vrfy.org>2004-02-28 06:53:25 -0800
committerGreg KH <gregkh@suse.de>2005-04-26 21:34:29 -0700
commit63ead27c228f9306f175b14a49df2415d09ece10 (patch)
tree4300d8569ade0841f9d8df9fd8cbdeae8df43893
parente408796e91e89a3fa50d1b8dc964f07fd439d865 (diff)
[PATCH] udev - activate formt length attribute
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.
-rw-r--r--namedev.c10
-rw-r--r--test/udev-test.pl9
-rw-r--r--udev.88
3 files changed, 22 insertions, 5 deletions
diff --git a/namedev.c b/namedev.c
index c9232fa2aa..505264554d 100644
--- 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);
}
}
diff --git a/test/udev-test.pl b/test/udev-test.pl
index a3bf768fe3..6b7f515442 100644
--- a/test/udev-test.pl
+++ b/test/udev-test.pl
@@ -194,6 +194,15 @@ 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
+ },
+ {
desc => "old style SYSFS_ attribute",
subsys => "block",
devpath => "block/sda",
diff --git a/udev.8 b/udev.8
index 8f0060580d..e449ef8dbb 100644
--- 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