Factor out cmd execution to runcmd() - smdev - suckless mdev | |
git clone git://git.suckless.org/smdev | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit 58018dfb567aa80dc11bd81446fce1764ad628aa | |
parent cf0ac2f526b5e82d94a1cd02428ebd8bfb5cb00b | |
Author: sin <[email protected]> | |
Date: Thu, 22 Aug 2013 13:20:30 +0100 | |
Factor out cmd execution to runcmd() | |
Diffstat: | |
M smdev.c | 60 ++++++++++++++++++++++-------… | |
1 file changed, 43 insertions(+), 17 deletions(-) | |
--- | |
diff --git a/smdev.c b/smdev.c | |
@@ -23,8 +23,15 @@ struct Event { | |
char *devname; | |
}; | |
+enum action { | |
+ ADD_ACTION, | |
+ REMOVE_ACTION, | |
+ UNKNOWN_ACTION, | |
+}; | |
+ | |
static int dohotplug(void); | |
static int matchrule(struct Rule *Rule, char *devname); | |
+static void runcmd(enum action action, struct Rule *Rule); | |
static int createdev(struct Event *ev); | |
static void populatedev(const char *path); | |
@@ -56,6 +63,16 @@ main(int argc, char *argv[]) | |
return 0; | |
} | |
+static enum action | |
+mapaction(struct Event *ev) | |
+{ | |
+ if (!strcmp(ev->action, "add")) | |
+ return ADD_ACTION; | |
+ if (!strcmp(ev->action, "remove")) | |
+ return REMOVE_ACTION; | |
+ return UNKNOWN_ACTION; | |
+} | |
+ | |
static int | |
dohotplug(void) | |
{ | |
@@ -74,10 +91,13 @@ dohotplug(void) | |
ev.min = estrtol(min, 10); | |
ev.maj = estrtol(maj, 10); | |
- if (!strcmp(ev.action, "add")) | |
+ switch (mapaction(&ev)) { | |
+ case ADD_ACTION: | |
return createdev(&ev); | |
- else | |
- eprintf("Unsupported action '%s'\n", ev.action); | |
+ default: | |
+ eprintf("Unsupported action '%s'\n", | |
+ ev.action); | |
+ } | |
return 0; | |
} | |
@@ -101,6 +121,25 @@ matchrule(struct Rule *Rule, char *devname) | |
return 0; | |
} | |
+static void | |
+runcmd(enum action action, struct Rule *Rule) | |
+{ | |
+ if (!Rule->cmd || action == UNKNOWN_ACTION) | |
+ return; | |
+ | |
+ switch (Rule->cmd[0]) { | |
+ case '*': | |
+ case '@': | |
+ if (action == ADD_ACTION) | |
+ system(&Rule->cmd[1]); | |
+ break; | |
+ case '$': | |
+ break; | |
+ default: | |
+ eprintf("Invalid command '%s'\n", Rule->cmd); | |
+ } | |
+} | |
+ | |
static int | |
createdev(struct Event *ev) | |
{ | |
@@ -179,20 +218,7 @@ createdev(struct Event *ev) | |
if (putenv(buf) < 0) | |
eprintf("putenv:"); | |
- /* Run command hooks for this rule */ | |
- if (Rule->cmd) { | |
- switch (Rule->cmd[0]) { | |
- case '*': | |
- case '@': | |
- system(&Rule->cmd[1]); | |
- break; | |
- case '$': | |
- break; | |
- default: | |
- eprintf("Invalid command '%s'\n", Rule->cmd); | |
- } | |
- } | |
- | |
+ runcmd(mapaction(ev), Rule); | |
break; | |
} | |