summaryrefslogtreecommitdiff
path: root/util-linux/mdev.c
diff options
context:
space:
mode:
Diffstat (limited to 'util-linux/mdev.c')
-rw-r--r--util-linux/mdev.c81
1 files changed, 25 insertions, 56 deletions
diff --git a/util-linux/mdev.c b/util-linux/mdev.c
index dd95229..c61521c 100644
--- a/util-linux/mdev.c
+++ b/util-linux/mdev.c
@@ -25,16 +25,6 @@ struct globals {
/* We use additional 64+ bytes in make_device() */
#define SCRATCH_SIZE 80
-static char *next_field(char *s)
-{
- char *end = skip_non_whitespace(s);
- s = skip_whitespace(end);
- *end = '\0';
- if (*s == '\0')
- s = NULL;
- return s;
-}
-
/* Builds an alias path.
* This function potentionally reallocates the alias parameter.
*/
@@ -104,33 +94,26 @@ static void make_device(char *path, int delete)
type = S_IFBLK;
if (ENABLE_FEATURE_MDEV_CONF) {
- FILE *fp;
- char *line, *val, *next;
- unsigned lineno = 0;
+ parser_t parser;
+ char *tokens[5];
/* If we have config file, look up user settings */
- fp = fopen_or_warn("/etc/mdev.conf", "r");
- if (!fp)
+ if (!config_open(&parser, "/etc/mdev.conf"))
goto end_parse;
- while ((line = xmalloc_fgetline(fp)) != NULL) {
+ while (config_read(&parser, tokens, 4, 3, " \t", '#')) {
regmatch_t off[1+9*ENABLE_FEATURE_MDEV_RENAME_REGEXP];
-
- ++lineno;
- trim(line);
- if (!line[0])
- goto next_line;
+ char *val;
/* Fields: regex uid:gid mode [alias] [cmd] */
/* 1st field: regex to match this device */
- next = next_field(line);
{
regex_t match;
int result;
/* Is this it? */
- xregcomp(&match, line, REG_EXTENDED);
+ xregcomp(&match, tokens[0], REG_EXTENDED);
result = regexec(&match, device_name, ARRAY_SIZE(off), off, 0);
regfree(&match);
@@ -147,7 +130,7 @@ static void make_device(char *path, int delete)
if (result || off[0].rm_so
|| ((int)off[0].rm_eo != (int)strlen(device_name))
) {
- goto next_line;
+ continue;
}
}
@@ -155,15 +138,11 @@ static void make_device(char *path, int delete)
* after parsing the rest of fields */
/* 2nd field: uid:gid - device ownership */
- if (!next) /* field must exist */
- bb_error_msg_and_die("bad line %u", lineno);
- val = next;
- next = next_field(val);
{
struct passwd *pass;
struct group *grp;
- char *str_uid = val;
- char *str_gid = strchrnul(val, ':');
+ char *str_uid = tokens[1];
+ char *str_gid = strchrnul(str_uid, ':');
if (*str_gid)
*str_gid++ = '\0';
@@ -182,33 +161,30 @@ static void make_device(char *path, int delete)
}
/* 3rd field: mode - device permissions */
- if (!next) /* field must exist */
- bb_error_msg_and_die("bad line %u", lineno);
- val = next;
- next = next_field(val);
- mode = strtoul(val, NULL, 8);
+ mode = strtoul(tokens[2], NULL, 8);
+ val = tokens[3];
/* 4th field (opt): >alias */
#if ENABLE_FEATURE_MDEV_RENAME
- if (!next)
+ if (!val)
break;
- if (*next == '>' || *next == '=') {
-#if ENABLE_FEATURE_MDEV_RENAME_REGEXP
+ aliaslink = *val;
+ if (aliaslink == '>' || aliaslink == '=') {
char *s, *p;
unsigned i, n;
-
- aliaslink = *next;
- val = next;
- next = next_field(val);
+ char *a = val;
+ s = strchr(val, ' ');
+ val = (s && s[1]) ? s+1 : NULL;
+#if ENABLE_FEATURE_MDEV_RENAME_REGEXP
/* substitute %1..9 with off[1..9], if any */
n = 0;
- s = val;
+ s = a;
while (*s)
if (*s++ == '%')
n++;
- p = alias = xzalloc(strlen(val) + n * strlen(device_name));
- s = val + 1;
+ p = alias = xzalloc(strlen(a) + n * strlen(device_name));
+ s = a + 1;
while (*s) {
*p = *s;
if ('%' == *s) {
@@ -224,24 +200,20 @@ static void make_device(char *path, int delete)
s++;
}
#else
- aliaslink = *next;
- val = next;
- next = next_field(val);
- alias = xstrdup(val + 1);
+ alias = xstrdup(a + 1);
#endif
}
#endif /* ENABLE_FEATURE_MDEV_RENAME */
/* The rest (opt): command to run */
- if (!next)
+ if (!val)
break;
- val = next;
if (ENABLE_FEATURE_MDEV_EXEC) {
const char *s = "@$*";
const char *s2 = strchr(s, *val);
if (!s2)
- bb_error_msg_and_die("bad line %u", lineno);
+ bb_error_msg_and_die("bad line %u", parser.lineno);
/* Correlate the position in the "@$*" with the delete
* step so that we get the proper behavior:
@@ -255,12 +227,9 @@ static void make_device(char *path, int delete)
}
/* end of field parsing */
break; /* we found matching line, stop */
- next_line:
- free(line);
} /* end of "while line is read from /etc/mdev.conf" */
- free(line); /* in case we used "break" to get here */
- fclose(fp);
+ config_close(&parser);
}
end_parse: