Factor out cmd execution to runcmd() - smdev - suckless mdev
 (HTM) git clone git://git.suckless.org/smdev
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 58018dfb567aa80dc11bd81446fce1764ad628aa
 (DIR) parent cf0ac2f526b5e82d94a1cd02428ebd8bfb5cb00b
 (HTM) Author: sin <sin@2f30.org>
       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(-)
       ---
 (DIR) 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;
                }