]> git.wh0rd.org Git - patches.git/blob - mdev.patch
scummvm random work
[patches.git] / mdev.patch
1 diff -Naur busybox.orig/util-linux/Config.in busybox/util-linux/Config.in
2 --- busybox.orig/util-linux/Config.in   2008-03-22 09:11:36 +0000
3 +++ busybox/util-linux/Config.in        2008-03-22 15:25:22 +0000
4 @@ -321,6 +321,13 @@
5  
6           For more information, please see docs/mdev.txt
7  
8 +config FEATURE_MDEV_RENAME_REGEXP
9 +       bool "Support regular expressions substitutions when renaming device"
10 +       default n
11 +       depends on FEATURE_MDEV_RENAME
12 +       help
13 +         Add support for regular expressions substitutions when renaming device.
14 +
15  config FEATURE_MDEV_EXEC
16         bool "Support command execution at device addition/removal"
17         default n
18 diff -Naur busybox.orig/util-linux/mdev.c busybox/util-linux/mdev.c
19 --- busybox.orig/util-linux/mdev.c      2008-03-17 18:23:37 +0000
20 +++ busybox/util-linux/mdev.c   2008-03-22 19:15:10 +0000
21 @@ -21,6 +21,25 @@
22  
23  #define MAX_SYSFS_DEPTH 3 /* prevent infinite loops in /sys symlinks */
24  
25 +#if ENABLE_FEATURE_MDEV_RENAME_REGEXP
26 +static char *strsubst(const char *s, const char *str, regmatch_t *vals)
27 +{
28 +       char *buf = xzalloc(PATH_MAX), *p = buf;
29 +       while (*s) {
30 +               if ('%' == *s) {
31 +                       int i = (*++s-'0');
32 +                       int n = vals[i].rm_eo-vals[i].rm_so;
33 +                       strncpy(p, str+vals[i].rm_so, n);
34 +                       p += n;
35 +               } else {
36 +                       *p++ = *s;
37 +               }
38 +               s++;
39 +       }
40 +       return buf;
41 +}
42 +#endif
43 +
44  /* mknod in /dev based on a path like "/sys/block/hda/hda1" */
45  static void make_device(char *path, int delete)
46  {
47 @@ -70,6 +89,9 @@
48  
49                 while ((vline = line = xmalloc_getline(fp)) != NULL) {
50                         int field;
51 +#if ENABLE_FEATURE_MDEV_RENAME_REGEXP
52 +                       regmatch_t off[10];
53 +#endif
54  
55                         /* A pristine copy for command execution. */
56                         char *orig_line;
57 @@ -98,16 +120,26 @@
58  
59                                         /* Regex to match this device */
60                                         regex_t match;
61 +#if !ENABLE_FEATURE_MDEV_RENAME_REGEXP
62                                         regmatch_t off;
63 +#endif
64                                         int result;
65  
66                                         /* Is this it? */
67                                         xregcomp(&match, val, REG_EXTENDED);
68 +#if ENABLE_FEATURE_MDEV_RENAME_REGEXP
69 +                                       result = regexec(&match, device_name, 10, off, 0);
70 +#else
71                                         result = regexec(&match, device_name, 1, &off, 0);
72 +#endif
73                                         regfree(&match);
74  
75                                         /* If not this device, skip rest of line */
76 +#if ENABLE_FEATURE_MDEV_RENAME_REGEXP
77 +                                       if (result || off[0].rm_so || off[0].rm_eo != strlen(device_name))
78 +#else
79                                         if (result || off.rm_so || off.rm_eo != strlen(device_name))
80 +#endif
81                                                 goto next_line;
82  
83                                 } else if (field == 1) {
84 @@ -144,8 +176,14 @@
85  
86                                         if (*val != '>')
87                                                 ++field;
88 -                                       else
89 +                                       else {
90 +#if ENABLE_FEATURE_MDEV_RENAME_REGEXP
91 +                                               // substitute %1..9 with off[1..9], if any
92 +                                               alias = strsubst(val + 1, device_name, off);
93 +#else
94                                                 alias = xstrdup(val + 1);
95 +#endif
96 +                                       }
97  
98                                 }
99  
100 @@ -209,6 +247,21 @@
101                                 char *dest;
102  
103                                 temp = strrchr(alias, '/');
104 +#if ENABLE_FEATURE_MDEV_RENAME_REGEXP
105 +                               // directory given ->
106 +                               if (temp && temp[1] == '\0') {
107 +                                       // make it
108 +                                       bb_make_directory(alias, 0755, FILEUTILS_RECUR);
109 +                                       // compose device new location
110 +                                       dest = concat_path_file(alias, device_name);
111 +                               // filename given ->
112 +                               } else {
113 +                                       // save it
114 +                                       dest = xstrdup(alias);
115 +                                       // create parent directories
116 +                                       bb_make_directory(dirname(alias), 0755, FILEUTILS_RECUR);
117 +                               }
118 +#else
119                                 if (temp) {
120                                         if (temp[1] != '\0')
121                                                 /* given a file name, so rename it */
122 @@ -217,7 +270,7 @@
123                                         dest = concat_path_file(alias, device_name);
124                                 } else
125                                         dest = alias;
126 -
127 +#endif
128                                 rename(device_name, dest); // TODO: xrename?
129                                 symlink(dest, device_name);
130