Ensure runcmd handling is done based on the current event - smdev - suckless md… | |
git clone git://git.suckless.org/smdev | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit 47d91161ece9e1c8e2dbc976c4903871858437e1 | |
parent 306560e3dbc8602dfbd44bc5c4abdd650fc4fdaa | |
Author: sin <[email protected]> | |
Date: Fri, 23 Aug 2013 10:28:35 +0100 | |
Ensure runcmd handling is done based on the current event | |
Diffstat: | |
M smdev.c | 52 ++++++++++++++++++-----------… | |
1 file changed, 31 insertions(+), 21 deletions(-) | |
--- | |
diff --git a/smdev.c b/smdev.c | |
@@ -18,20 +18,20 @@ | |
#include "mkpath.h" | |
#include "util.h" | |
+enum action { | |
+ ADD_ACTION, | |
+ REMOVE_ACTION, | |
+ UNKNOWN_ACTION | |
+}; | |
+ | |
struct Event { | |
int min; | |
int maj; | |
- char *action; | |
+ enum action action; | |
char *devpath; | |
char *devname; | |
}; | |
-enum action { | |
- ADD_ACTION, | |
- REMOVE_ACTION, | |
- UNKNOWN_ACTION | |
-}; | |
- | |
static struct pregentry { | |
regex_t preg; | |
int cached; | |
@@ -39,7 +39,7 @@ static struct pregentry { | |
static int dohotplug(void); | |
static int matchrule(int ruleidx, char *devname); | |
-static void runrule(enum action action, struct Rule *Rule); | |
+static void runrule(struct Event *ev, struct Rule *Rule); | |
static int createdev(struct Event *ev); | |
static void populatedev(const char *path); | |
@@ -78,11 +78,11 @@ main(int argc, char *argv[]) | |
} | |
static enum action | |
-mapaction(struct Event *ev) | |
+mapaction(const char *action) | |
{ | |
- if (!strcmp(ev->action, "add")) | |
+ if (!strcmp(action, "add")) | |
return ADD_ACTION; | |
- if (!strcmp(ev->action, "remove")) | |
+ if (!strcmp(action, "remove")) | |
return REMOVE_ACTION; | |
return UNKNOWN_ACTION; | |
} | |
@@ -91,21 +91,23 @@ static int | |
dohotplug(void) | |
{ | |
char *min, *maj; | |
+ char *action; | |
struct Event ev; | |
min = getenv("MINOR"); | |
maj = getenv("MAJOR"); | |
- ev.action = getenv("ACTION"); | |
+ action = getenv("ACTION"); | |
ev.devpath = getenv("DEVPATH"); | |
ev.devname = getenv("DEVNAME"); | |
- if (!min || !maj || !ev.action || !ev.devpath || | |
+ if (!min || !maj || !action || !ev.devpath || | |
!ev.devname) | |
return -1; | |
ev.min = estrtol(min, 10); | |
ev.maj = estrtol(maj, 10); | |
+ ev.action = mapaction(action); | |
- switch (mapaction(&ev)) { | |
+ switch (ev.action) { | |
case ADD_ACTION: | |
return createdev(&ev); | |
default: | |
@@ -140,19 +142,27 @@ matchrule(int ruleidx, char *devname) | |
} | |
static void | |
-runrule(enum action action, struct Rule *Rule) | |
+runrule(struct Event *ev, struct Rule *Rule) | |
{ | |
- if (!Rule->cmd || action == UNKNOWN_ACTION) | |
+ if (!Rule->cmd) | |
return; | |
switch (Rule->cmd[0]) { | |
case '*': | |
- case '@': | |
- if (action == ADD_ACTION) | |
+ switch (ev->action) { | |
+ case ADD_ACTION: | |
system(&Rule->cmd[1]); | |
+ break; | |
+ default: | |
+ eprintf("Unsupported action '%s'\n", | |
+ ev->action); | |
+ } | |
break; | |
- case '$': | |
+ case '@': | |
+ system(&Rule->cmd[1]); | |
break; | |
+ case '$': | |
+ eprintf("Unsupported action '%s'\n", ev->action); | |
default: | |
eprintf("Invalid command '%s'\n", Rule->cmd); | |
} | |
@@ -262,7 +272,7 @@ createdev(struct Event *ev) | |
if (putenv(buf) < 0) | |
eprintf("putenv:"); | |
- runrule(mapaction(ev), Rule); | |
+ runrule(ev, Rule); | |
break; | |
} | |
@@ -279,7 +289,7 @@ populatedev(const char *path) | |
recurse(path, populatedev); | |
if (!strcmp(path, "dev")) { | |
cwd = agetcwd(); | |
- ev.action = "add"; | |
+ ev.action = ADD_ACTION; | |
ev.devpath = cwd + strlen("/sys"); | |
ev.devname = basename(cwd); | |
snprintf(tmppath, sizeof(tmppath), "/sys%s/dev", |