mirror of
https://github.com/sheumann/hush.git
synced 2024-12-22 14:30:31 +00:00
mdev: provide $SUBSYSTEM (by Vladimir)
function old new delta make_device 1265 1340 +75 dirAction 14 60 +46 mdev_main 676 695 +19 ------------------------------------------------------------------------------ (add/remove: 0/0 grow/shrink: 3/0 up/down: 140/0) Total: 140 bytes
This commit is contained in:
parent
0b791d9a97
commit
065c714791
@ -14,10 +14,12 @@
|
|||||||
|
|
||||||
struct globals {
|
struct globals {
|
||||||
int root_major, root_minor;
|
int root_major, root_minor;
|
||||||
|
char *subsystem;
|
||||||
};
|
};
|
||||||
#define G (*(struct globals*)&bb_common_bufsiz1)
|
#define G (*(struct globals*)&bb_common_bufsiz1)
|
||||||
#define root_major (G.root_major)
|
#define root_major (G.root_major)
|
||||||
#define root_minor (G.root_minor)
|
#define root_minor (G.root_minor)
|
||||||
|
#define subsystem (G.subsystem)
|
||||||
|
|
||||||
/* Prevent infinite loops in /sys symlinks */
|
/* Prevent infinite loops in /sys symlinks */
|
||||||
#define MAX_SYSFS_DEPTH 3
|
#define MAX_SYSFS_DEPTH 3
|
||||||
@ -111,7 +113,7 @@ static void make_device(char *path, int delete)
|
|||||||
/* If we have config file, look up user settings */
|
/* If we have config file, look up user settings */
|
||||||
while (config_read(parser, tokens, 4, 3, "# \t", PARSE_NORMAL)) {
|
while (config_read(parser, tokens, 4, 3, "# \t", PARSE_NORMAL)) {
|
||||||
regmatch_t off[1 + 9*ENABLE_FEATURE_MDEV_RENAME_REGEXP];
|
regmatch_t off[1 + 9*ENABLE_FEATURE_MDEV_RENAME_REGEXP];
|
||||||
char *val;
|
char *val = tokens[0];
|
||||||
|
|
||||||
/* Fields: regex uid:gid mode [alias] [cmd] */
|
/* Fields: regex uid:gid mode [alias] [cmd] */
|
||||||
|
|
||||||
@ -134,10 +136,15 @@ static void make_device(char *path, int delete)
|
|||||||
} else { /* ... or regex to match device name */
|
} else { /* ... or regex to match device name */
|
||||||
regex_t match;
|
regex_t match;
|
||||||
int result;
|
int result;
|
||||||
|
const char *dev_name_or_subsystem = device_name;
|
||||||
|
if ('/' == val[0] && subsystem) {
|
||||||
|
dev_name_or_subsystem = subsystem;
|
||||||
|
val++;
|
||||||
|
}
|
||||||
|
|
||||||
/* Is this it? */
|
/* Is this it? */
|
||||||
xregcomp(&match, tokens[0], REG_EXTENDED);
|
xregcomp(&match, val, REG_EXTENDED);
|
||||||
result = regexec(&match, device_name, ARRAY_SIZE(off), off, 0);
|
result = regexec(&match, dev_name_or_subsystem, ARRAY_SIZE(off), off, 0);
|
||||||
regfree(&match);
|
regfree(&match);
|
||||||
|
|
||||||
//bb_error_msg("matches:");
|
//bb_error_msg("matches:");
|
||||||
@ -151,7 +158,7 @@ static void make_device(char *path, int delete)
|
|||||||
/* If not this device, skip rest of line */
|
/* If not this device, skip rest of line */
|
||||||
/* (regexec returns whole pattern as "range" 0) */
|
/* (regexec returns whole pattern as "range" 0) */
|
||||||
if (result || off[0].rm_so
|
if (result || off[0].rm_so
|
||||||
|| ((int)off[0].rm_eo != (int)strlen(device_name))
|
|| ((int)off[0].rm_eo != (int)strlen(dev_name_or_subsystem))
|
||||||
) {
|
) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -276,10 +283,14 @@ static void make_device(char *path, int delete)
|
|||||||
#if ENABLE_FEATURE_MDEV_EXEC
|
#if ENABLE_FEATURE_MDEV_EXEC
|
||||||
if (command) {
|
if (command) {
|
||||||
/* setenv will leak memory, use putenv/unsetenv/free */
|
/* setenv will leak memory, use putenv/unsetenv/free */
|
||||||
char *s = xasprintf("MDEV=%s", device_name);
|
char *s = xasprintf("%s=%s", "MDEV", device_name);
|
||||||
|
char *s1 = xasprintf("%s=%s", "SUBSYSTEM", subsystem);
|
||||||
putenv(s);
|
putenv(s);
|
||||||
|
putenv(s1);
|
||||||
if (system(command) == -1)
|
if (system(command) == -1)
|
||||||
bb_perror_msg_and_die("can't run '%s'", command);
|
bb_perror_msg_and_die("can't run '%s'", command);
|
||||||
|
unsetenv("SUBSYSTEM");
|
||||||
|
free(s1);
|
||||||
unsetenv("MDEV");
|
unsetenv("MDEV");
|
||||||
free(s);
|
free(s);
|
||||||
free(command);
|
free(command);
|
||||||
@ -326,6 +337,13 @@ static int FAST_FUNC dirAction(const char *fileName UNUSED_PARAM,
|
|||||||
void *userData UNUSED_PARAM,
|
void *userData UNUSED_PARAM,
|
||||||
int depth)
|
int depth)
|
||||||
{
|
{
|
||||||
|
/* Extract device subsystem -- the name of the directory under /sys/class/ */
|
||||||
|
if (1 == depth) {
|
||||||
|
subsystem = strrchr(fileName, '/');
|
||||||
|
if (subsystem)
|
||||||
|
subsystem++;
|
||||||
|
}
|
||||||
|
|
||||||
return (depth >= MAX_SYSFS_DEPTH ? SKIP : TRUE);
|
return (depth >= MAX_SYSFS_DEPTH ? SKIP : TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -445,13 +463,14 @@ int mdev_main(int argc UNUSED_PARAM, char **argv)
|
|||||||
char *env_path;
|
char *env_path;
|
||||||
|
|
||||||
/* Hotplug:
|
/* Hotplug:
|
||||||
* env ACTION=... DEVPATH=... [SEQNUM=...] mdev
|
* env ACTION=... DEVPATH=... SUBSYSTEM=... [SEQNUM=...] mdev
|
||||||
* ACTION can be "add" or "remove"
|
* ACTION can be "add" or "remove"
|
||||||
* DEVPATH is like "/block/sda" or "/class/input/mice"
|
* DEVPATH is like "/block/sda" or "/class/input/mice"
|
||||||
*/
|
*/
|
||||||
action = getenv("ACTION");
|
action = getenv("ACTION");
|
||||||
env_path = getenv("DEVPATH");
|
env_path = getenv("DEVPATH");
|
||||||
if (!action || !env_path)
|
subsystem = getenv("SUBSYSTEM");
|
||||||
|
if (!action || !env_path /*|| !subsystem*/)
|
||||||
bb_show_usage();
|
bb_show_usage();
|
||||||
fw = getenv("FIRMWARE");
|
fw = getenv("FIRMWARE");
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user