chiark / gitweb /
[PATCH] udev - introduce format escape char
authorkay.sievers@vrfy.org <kay.sievers@vrfy.org>
Wed, 14 Jan 2004 02:34:33 +0000 (18:34 -0800)
committerGreg KH <gregkh@suse.de>
Wed, 27 Apr 2005 04:13:16 +0000 (21:13 -0700)
This patch adds a '%' to the format char list, so that a external
program may called with a non expanded '%' like:

  PROGRAM="/bin/date +%%s"

Olaf Hering asked for the feature.
A tricky test is also added :)

namedev.c
test/udev-test.pl

index 6f7bfb6805826085cc0ecaff165f9f5937075251..0e1af9385fac995862570c30bddd9c464f63c287 100644 (file)
--- a/namedev.c
+++ b/namedev.c
@@ -151,20 +151,21 @@ static mode_t get_default_mode(struct sysfs_class_device *class_dev)
 
 static void apply_format(struct udevice *udev, unsigned char *string)
 {
-       char name[NAME_SIZE];
        char temp[NAME_SIZE];
+       char temp1[NAME_SIZE];
        char *tail;
        char *pos;
        char *pos2;
        char *pos3;
        int num;
 
+       pos = string;
        while (1) {
                num = 0;
-               pos = strchr(string, '%');
+               pos = strchr(pos, '%');
 
                if (pos) {
-                       *pos = '\0';
+                       pos[0] = '\0';
                        tail = pos+1;
                        if (isdigit(tail[0])) {
                                num = (int) strtoul(&pos[1], &tail, 10);
@@ -173,7 +174,7 @@ static void apply_format(struct udevice *udev, unsigned char *string)
                                        break;
                                }
                        }
-                       strfieldcpy(name, tail+1);
+                       strfieldcpy(temp, tail+1);
 
                        switch (tail[0]) {
                        case 'b':
@@ -217,8 +218,8 @@ static void apply_format(struct udevice *udev, unsigned char *string)
                                        break;
                                if (num) {
                                        /* get part of return string */
-                                       strncpy(temp, udev->program_result, sizeof(temp));
-                                       pos2 = temp;
+                                       strncpy(temp1, udev->program_result, sizeof(temp1));
+                                       pos2 = temp1;
                                        while (num) {
                                                num--;
                                                pos3 = strsep(&pos2, " ");
@@ -236,11 +237,15 @@ static void apply_format(struct udevice *udev, unsigned char *string)
                                        dbg("substitute result string '%s'", udev->program_result);
                                }
                                break;
+                       case '%':
+                               strcat(pos, "%");
+                               pos++;
+                               break;
                        default:
                                dbg("unknown substitution type '%%%c'", pos[1]);
                                break;
                        }
-                       strcat(string, name);
+                       strcat(string, temp);
                } else
                        break;
        }
index ab27c74c6a5d5d103d4c6c76efe6c909972d11e2..5e5756b6606d20e2a37d76ee7e4057b287c4ab82 100644 (file)
@@ -203,6 +203,15 @@ EOF
                expected => "test-0:0:0:0" ,
                conf     => <<EOF
 BUS="scsi", PROGRAM="/bin/echo -n test-%b", RESULT="test-0:0*", NAME="%c"
+EOF
+       },
+       {
+               desc     => "program with escaped format char (tricky: callout returns format char!)",
+               subsys   => "block",
+               devpath  => "block/sda/sda3",
+               expected => "escape-3" ,
+               conf     => <<EOF
+BUS="scsi", PROGRAM="/bin/echo -n escape-%%n", KERNEL="sda3", NAME="%c"
 EOF
        },
        {