Introduction
Introduction Statistics Contact Development Disclaimer Help
Factor out regex matching and re-arrange rule parsing - smdev - suckless mdev
git clone git://git.suckless.org/smdev
Log
Files
Refs
README
LICENSE
---
commit b879ac0c88c4d0bed94a3590c4574848b8206b7d
parent faf4f4295234ab591507c2782b40efbffb74b5c0
Author: sin <[email protected]>
Date: Wed, 21 Aug 2013 10:12:25 +0100
Factor out regex matching and re-arrange rule parsing
Diffstat:
M config.h | 2 +-
M smdev.c | 92 ++++++++++++++++-------------…
2 files changed, 49 insertions(+), 45 deletions(-)
---
diff --git a/config.h b/config.h
@@ -1,5 +1,5 @@
/* See LICENSE file for copyright and license details. */
-struct {
+struct Rule {
const char *devregex;
const char *user;
const char *group;
diff --git a/smdev.c b/smdev.c
@@ -15,6 +15,7 @@
#include "mkpath.h"
#include "util.h"
+static int matchrule(const struct Rule *Rule, const char *devname);
static int create_dev(const char *path);
static void sysrecurse(const char *path);
@@ -47,15 +48,32 @@ main(int argc, char *argv[])
}
static int
+matchrule(const struct Rule *Rule, const char *devname)
+{
+ regex_t match;
+ regmatch_t off;
+ int ret;
+
+ ret = regcomp(&match, Rule->devregex, REG_EXTENDED);
+ if (ret < 0)
+ eprintf("regcomp:");
+
+ ret = regexec(&match, devname, 1, &off, 0);
+ regfree(&match);
+
+ if (ret || off.rm_so || off.rm_eo != strlen(devname))
+ return -1;
+ return 0;
+}
+
+static int
create_dev(const char *path)
{
+ struct Rule *Rule;
struct passwd *pw;
struct group *gr;
- regex_t match;
- regmatch_t off;
- char *regex;
char buf[64], *p;
- char tmppath[PATH_MAX], devpath[PATH_MAX], *dev;
+ char tmppath[PATH_MAX], devpath[PATH_MAX];
char *devname;
int maj, min, type;
int i, ret;
@@ -84,72 +102,58 @@ create_dev(const char *path)
}
for (i = 0; i < LEN(Rules); i++) {
- regex = strdup(Rules[i].devregex);
- if (!regex)
- eprintf("strdup:");
+ Rule = &Rules[i];
- ret = regcomp(&match, regex, REG_EXTENDED);
- if (ret < 0)
- eprintf("regcomp:");
-
- ret = regexec(&match, devname, 1, &off, 0);
- regfree(&match);
- free(regex);
-
- if (ret || off.rm_so || off.rm_eo != strlen(devname))
+ if (matchrule(Rule, devname) < 0)
continue;
- if (Rules[i].cmd) {
- switch (Rules[i].cmd[0]) {
- case '@':
- case '$':
- case '*':
- fprintf(stderr, "Unsupported command '%s' for …
- Rules[i].cmd, Rules[i].devregex);
- break;
- default:
- eprintf("Invalid command '%s'\n", Rules[i].cmd…
- }
- }
-
- dev = devpath;
- if (Rules[i].path) {
- switch (Rules[i].path[0]) {
+ if (Rule->path) {
+ switch (Rule->path[0]) {
case '=':
- if (Rules[i].path[strlen(Rules[i].path) - 1] =…
- snprintf(devpath, sizeof(devpath), "/d…
+ if (Rule->path[strlen(Rule->path) - 1] == '/')…
+ snprintf(devpath, sizeof(devpath), "/d…
if (mkpath(devpath, 0755) < 0)
eprintf("mkdir %s:", devpath);
strcat(devpath, devname);
} else {
snprintf(devpath, sizeof(devpath),
- "/dev/%s", &Rules[i].path[1]);
+ "/dev/%s", &Rule->path[1]);
}
break;
case '>':
fprintf(stderr, "Unsupported path '%s' for tar…
- Rules[i].path, Rules[i].devregex);
+ Rule->path, Rule->devregex);
break;
default:
- eprintf("Invalid path '%s'\n", Rules[i].path);
+ eprintf("Invalid path '%s'\n", Rule->path);
}
}
- ret = mknod(dev, Rules[i].mode | type, makedev(maj, min));
+ ret = mknod(devpath, Rules[i].mode | type, makedev(maj, min));
if (ret < 0 && errno != EEXIST)
- eprintf("mknod %s:", dev);
-
+ eprintf("mknod %s:", devpath);
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(dev, pw->pw_uid, gr->gr_gid);
+ ret = chown(devpath, pw->pw_uid, gr->gr_gid);
if (ret < 0)
- eprintf("chown %s:", dev);
+ eprintf("chown %s:", devpath);
+
+ if (Rule->cmd) {
+ switch (Rule->cmd[0]) {
+ case '@':
+ case '$':
+ case '*':
+ fprintf(stderr, "Unsupported command '%s' for …
+ Rule->cmd, Rule->devregex);
+ return -1;
+ default:
+ eprintf("Invalid command '%s'\n", Rule->cmd);
+ }
+ }
break;
}
You are viewing proxied material from suckless.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.