scummvm random work
[patches.git] / mdev.patch
CommitLineData
5e993f12 1diff -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
18diff -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