smdev

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

commit 87a607f4331ce9994047eac5b640a1216de892c5
parent 3432f0ce1619b8c0a8d81d87570c5873e3ef01b3
Author: Hiltjo Posthuma <hiltjo@codemadness.org>
Date:   Mon,  7 Apr 2014 17:31:16 +0200

util: readuevent: read uevent file and set environment variables

remove devtomajmin()

Signed-off-by: Hiltjo Posthuma <hiltjo@codemadness.org>

Diffstat:
smdev.c | 24++++++++++++------------
util.h | 2+-
util/dev.c | 43++++++++++++++++++++++++++-----------------
3 files changed, 39 insertions(+), 30 deletions(-)

diff --git a/smdev.c b/smdev.c @@ -53,8 +53,7 @@ static void parsepath(struct rule *rule, struct rulepath *rpath, static int removedev(struct event *ev); static int createdev(struct event *ev); static int doevent(struct event *ev); -static int craftev(struct event *ev, enum action action, - char *sysfspath); +static int craftev(char *sysfspath); static void populatedev(const char *path); static void @@ -352,16 +351,18 @@ doevent(struct event *ev) /* Craft a fake event so the rest of the code can cope */ static int -craftev(struct event *ev, enum action action, char *sysfspath) +craftev(char *sysfspath) { char path[PATH_MAX]; + char *devpath; + + devpath = sysfspath + strlen("/sys"); + snprintf(path, sizeof(path), "/sys%s/uevent", devpath); - ev->action = action; - ev->devpath = sysfspath + strlen("/sys"); - ev->devname = basename(sysfspath); - snprintf(path, sizeof(path), "/sys%s/dev", - ev->devpath); - if (devtomajmin(path, &ev->major, &ev->minor) < 0) + clearenv(); + setenv("ACTION", "add", 1); + setenv("DEVPATH", devpath, 1); + if(readuevent(path) < 0) return -1; return 0; } @@ -370,13 +371,12 @@ static void populatedev(const char *path) { char *cwd; - struct event ev; recurse(path, populatedev); if (strcmp(path, "dev") == 0) { cwd = agetcwd(); - if (!craftev(&ev, ADD_ACTION, cwd)) - doevent(&ev); + if (!craftev(cwd)) + dohotplug(); free(cwd); } } diff --git a/util.h b/util.h @@ -7,7 +7,7 @@ extern char *argv0; char *agetcwd(void); void apathmax(char **, long *); -int devtomajmin(const char *path, int *maj, int *min); +int readuevent(const char *); int devtype(const char *majmin); void enprintf(int, const char *, ...); void eprintf(const char *, ...); diff --git a/util/dev.c b/util/dev.c @@ -3,31 +3,40 @@ #include <fcntl.h> #include <unistd.h> #include <limits.h> +#include <stdlib.h> #include <stdio.h> +#include <string.h> #include "../util.h" -/* Example `path' is /sys/devices/virtual/tty/tty0/dev */ +/* read uevent file and set environment variables */ int -devtomajmin(const char *path, int *maj, int *min) +readuevent(const char *file) { + FILE *fp; + int status = 0; char buf[BUFSIZ]; - int fd; - ssize_t n; + char *p, *name, *value; - fd = open(path, O_RDONLY); - if (fd < 0) - eprintf("open %s:", path); - n = read(fd, buf, sizeof(buf) - 1); - close(fd); - if (n < 0) - eprintf("%s: read error:", path); - if (!n) + if(!(fp = fopen(file, "r"))) return -1; - if (buf[n - 1] == '\n') - buf[n - 1] = '\0'; - buf[n] = '\0'; - sscanf(buf, "%d:%d", maj, min); - return 0; + while(!feof(fp)) { + fgets(buf, sizeof(buf) - 1, fp); + if(ferror(fp)) { + status = -2; + break; + } + if((p = strchr(buf, '\n'))) + *p = '\0'; + if(!(p = strchr(buf, '='))) + continue; + *p = '\0'; + p++; + name = buf; + value = p; + setenv(name, value, 1); + } + fclose(fp); + return status; } /* `majmin' format is maj:min */