Ensure runcmd handling is done based on the current event - smdev - suckless mdev
 (HTM) git clone git://git.suckless.org/smdev
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 47d91161ece9e1c8e2dbc976c4903871858437e1
 (DIR) parent 306560e3dbc8602dfbd44bc5c4abdd650fc4fdaa
 (HTM) Author: sin <sin@2f30.org>
       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(-)
       ---
 (DIR) 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",