smdev

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

commit 77c9b9042ba0f9f0c2fff715dbac21535bcea202
parent 265d727f2d1caa61e8336b3a36f9e176aa57f5d6
Author: sin <sin@2f30.org>
Date:   Wed, 21 Aug 2013 15:46:59 +0100

Clean up path parsing

Diffstat:
Msmdev.c | 85++++++++++++++++++++++++++++++++++---------------------------------------------
1 file changed, 37 insertions(+), 48 deletions(-)

diff --git a/smdev.c b/smdev.c @@ -73,8 +73,8 @@ create_dev(const char *path) struct passwd *pw; struct group *gr; char buf[BUFSIZ], *p; - char tmppath[PATH_MAX], devpath[PATH_MAX]; - char *devname; + const char *devname; + char origdevname[PATH_MAX]; int maj, min, type; int i, ret; @@ -82,24 +82,21 @@ create_dev(const char *path) if (!p) return -1; p++; - devname = strdup(p); - if (!devname) - eprintf("strdup:"); - snprintf(devpath, sizeof(devpath), "/dev/%s", devname); - - snprintf(tmppath, sizeof(tmppath), "%s/dev", path); - ret = devtomajmin(tmppath, &maj, &min); - if (ret < 0) { - free(devname); + devname = p; + snprintf(origdevname, sizeof(origdevname), "/dev/%s", devname); + + snprintf(buf, sizeof(buf), "%s/dev", path); + ret = devtomajmin(buf, &maj, &min); + if (ret < 0) return -1; - } snprintf(buf, sizeof(buf), "%d:%d", maj, min); type = devtype(buf); - if (type < 0) { - free(devname); + if (type < 0) return -1; - } + + if (chdir("/dev") < 0) + eprintf("chdir /dev:"); for (i = 0; i < LEN(Rules); i++) { Rule = &Rules[i]; @@ -107,48 +104,42 @@ create_dev(const char *path) if (matchrule(Rule, devname) < 0) continue; - /* Create the dev paths if necessary */ if (Rule->path) { - switch (Rule->path[0]) { - case '=': - if (Rule->path[strlen(Rule->path) - 1] == '/') { - snprintf(devpath, sizeof(devpath), "/dev/%s", &Rule->path[1]); - umask(022); - if (mkpath(devpath, 0755) < 0) - eprintf("mkdir %s:", devpath); - umask(0); - strcat(devpath, devname); - } else { - snprintf(devpath, sizeof(devpath), - "/dev/%s", &Rule->path[1]); - } - break; - case '>': - fprintf(stderr, "Unsupported path '%s' for target '%s'\n", - Rule->path, Rule->devregex); - break; - default: - eprintf("Invalid path '%s'\n", Rule->path); + if (Rule->path[strlen(Rule->path) - 1] == '/') { + umask(022); + if (mkpath(&Rule->path[1], 0755) < 0) + eprintf("mkdir %s:", &Rule->path[1]); + umask(0); + if (chdir(&Rule->path[1]) < 0) + eprintf("chdir %s:", &Rule->path[1]); + } else { + devname = &Rule->path[1]; } } /* Create the actual dev nodes */ - ret = mknod(devpath, Rules[i].mode | type, makedev(maj, min)); + ret = mknod(devname, Rules[i].mode | type, makedev(maj, min)); if (ret < 0 && errno != EEXIST) - eprintf("mknod %s:", devpath); + eprintf("mknod %s:", devname); pw = getpwnam(Rules[i].user); if (!pw) eprintf("getpwnam %s:", Rules[i].user); gr = getgrnam(Rules[i].group); if (!gr) eprintf("getgrnam %s:", Rules[i].group); - ret = chown(devpath, pw->pw_uid, gr->gr_gid); + ret = chown(devname, pw->pw_uid, gr->gr_gid); if (ret < 0) - eprintf("chown %s:", devpath); + eprintf("chown %s:", devname); + + /* Create the symlinks */ + if (Rule->path && Rule->path[0] == '>') { + snprintf(buf, sizeof(buf), "%s%s", &Rule->path[1], devname); + if (symlink(buf, origdevname)) + eprintf("symlink %s -> %s:", + origdevname, buf); + } /* Export the needed environment */ - if (chdir("/dev") < 0) - eprintf("chdir /dev:"); snprintf(buf, sizeof(buf), "SMDEV=%s", devname); if (putenv(buf) < 0) eprintf("putenv:"); @@ -161,21 +152,19 @@ create_dev(const char *path) break; case '$': case '*': + default: fprintf(stderr, "Unsupported command '%s' for target '%s'\n", Rule->cmd, Rule->devregex); break; - default: - eprintf("Invalid command '%s'\n", Rule->cmd); } } - if (chdir(path) < 0) - eprintf("chdir %s:", path); - break; } - free(devname); + if (chdir(path) < 0) + eprintf("chdir %s:", path); + return 0; }