smdev

suckless mdev
git clone git://git.2f30.org/smdev.git
Log | Files | Refs | README | LICENSE

commit 4edeed89d479ba3a582913a577fbe315d53464fc
parent 47d91161ece9e1c8e2dbc976c4903871858437e1
Author: sin <sin@2f30.org>
Date:   Fri, 23 Aug 2013 10:33:16 +0100

Factor out path parsing

Diffstat:
smdev.c | 91+++++++++++++++++++++++++++++++++++++++++++-------------------------------------
1 file changed, 49 insertions(+), 42 deletions(-)

diff --git a/smdev.c b/smdev.c @@ -40,6 +40,8 @@ static struct pregentry { static int dohotplug(void); static int matchrule(int ruleidx, char *devname); static void runrule(struct Event *ev, struct Rule *Rule); +static void parsepath(struct Rule *Rule, char *devpath, size_t sz, + char *devname); static int createdev(struct Event *ev); static void populatedev(const char *path); @@ -168,6 +170,49 @@ runrule(struct Event *ev, struct Rule *Rule) } } +static void +parsepath(struct Rule *Rule, char *devpath, size_t sz, + char *devname) +{ + char buf[BUFSIZ], *p; + char *dirc, *basec; + + if (Rule->path[0] != '=' && Rule->path[0] != '>') + eprintf("Invalid path '%s'\n", Rule->path); + + p = strchr(&Rule->path[1], '/'); + if (p) { + if (Rule->path[strlen(Rule->path) - 1] == '/') { + snprintf(buf, sizeof(buf), "/dev/%s", + &Rule->path[1]); + snprintf(devpath, sz, "/dev/%s%s", + &Rule->path[1], devname); + } else { + dirc = strdup(&Rule->path[1]); + if (!dirc) + eprintf("strdup:"); + snprintf(buf, sizeof(buf), "/dev/%s", dirname(dirc)); + free(dirc); + + basec = strdup(&Rule->path[1]); + if (!basec) + eprintf("strdup:"); + strlcpy(devname, basename(basec), sizeof(devname)); + free(basec); + + snprintf(devpath, sz, "%s/%s", + buf, devname); + } + umask(022); + if (mkpath(buf, 0755) < 0) + eprintf("mkdir %s:", buf); + umask(0); + } else { + strlcpy(devname, &Rule->path[1], sizeof(devname)); + snprintf(devpath, sz, "/dev/%s", devname); + } +} + static int createdev(struct Event *ev) { @@ -176,10 +221,9 @@ createdev(struct Event *ev) struct group *gr; char devpath[PATH_MAX]; char devname[PATH_MAX]; - char *dirc, *basec; char buf[BUFSIZ]; int type; - int i, j; + int i; snprintf(buf, sizeof(buf), "%d:%d", ev->maj, ev->min); type = devtype(buf); @@ -194,46 +238,9 @@ createdev(struct Event *ev) if (matchrule(i, devname) < 0) continue; - if (Rule->path) { - if (Rule->path[0] != '=' && Rule->path[0] != '>') - eprintf("Invalid path '%s'\n", Rule->path); - - for (j = 1; Rule->path[j]; j++) { - if (Rule->path[j] != '/') - continue; - if (Rule->path[strlen(Rule->path) - 1] == '/') { - snprintf(buf, sizeof(buf), "/dev/%s", - &Rule->path[1]); - snprintf(devpath, sizeof(devpath), "/dev/%s%s", - &Rule->path[1], devname); - } else { - dirc = strdup(&Rule->path[1]); - if (!dirc) - eprintf("strdup:"); - snprintf(buf, sizeof(buf), "/dev/%s", dirname(dirc)); - free(dirc); - - basec = strdup(&Rule->path[1]); - if (!basec) - eprintf("strdup:"); - strlcpy(devname, basename(basec), sizeof(devname)); - free(basec); - - snprintf(devpath, sizeof(devpath), "%s/%s", - buf, devname); - } - umask(022); - if (mkpath(buf, 0755) < 0) - eprintf("mkdir %s:", buf); - umask(0); - break; - } - - if (!Rule->path[j]) { - strlcpy(devname, &Rule->path[1], sizeof(devname)); - snprintf(devpath, sizeof(devpath), "/dev/%s", devname); - } - } + if (Rule->path) + parsepath(Rule, devpath, sizeof(devpath), + devname); /* Create the actual dev nodes */ if (mknod(devpath, Rules[i].mode | type,