summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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