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:
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 */