chiark
/
gitweb
/
~ianmdlvl
/
elogind.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
[PATCH] Allow GROUP to have modifiers in it
[elogind.git]
/
dev_d.c
diff --git
a/dev_d.c
b/dev_d.c
index 050df7bbec000440da61582156787425ed155f55..817355af60397c4c4f221a793c860d0b0f859ecd 100644
(file)
--- a/
dev_d.c
+++ b/
dev_d.c
@@
-29,25
+29,20
@@
#include "udev.h"
#include "udev_lib.h"
#include "udev.h"
#include "udev_lib.h"
-#include "udevdb.h"
#include "logging.h"
#include "logging.h"
-#define DEVD_DIR "/etc/dev.d/"
-#define DEVD_SUFFIX ".dev"
-
-static int run_program(char *name)
+static int run_program(const char *filename, void *data)
{
pid_t pid;
int fd;
{
pid_t pid;
int fd;
-
char *argv[3]
;
+
struct udevice *udev = data
;
- dbg("running %s", name);
+ dbg("running %s",
file
name);
pid = fork();
switch (pid) {
case 0:
/* child */
pid = fork();
switch (pid) {
case 0:
/* child */
- udevdb_exit(); /* close udevdb */
fd = open("/dev/null", O_RDWR);
if ( fd >= 0) {
dup2(fd, STDOUT_FILENO);
fd = open("/dev/null", O_RDWR);
if ( fd >= 0) {
dup2(fd, STDOUT_FILENO);
@@
-56,19
+51,15
@@
static int run_program(char *name)
}
close(fd);
}
close(fd);
- argv[0] = name;
- argv[1] = main_argv[1];
- argv[2] = NULL;
-
- execv(name, argv);
+ execl(filename, filename, udev->subsystem, NULL);
dbg("exec of child failed");
dbg("exec of child failed");
- exit(1);
+
_
exit(1);
case -1:
dbg("fork of child failed");
break;
return -1;
default:
case -1:
dbg("fork of child failed");
break;
return -1;
default:
- wait
(NULL
);
+ wait
pid(pid, NULL, 0
);
}
return 0;
}
return 0;
@@
-80,55
+71,44
@@
static int run_program(char *name)
* subsystem/
* default/
*/
* subsystem/
* default/
*/
-void dev_d_
send(struct udevice *dev, const char *subsystem, const char *devpath
)
+void dev_d_
execute(struct udevice *udev, const char *basedir, const char *suffix
)
{
{
- char dirname[256];
- char env_devname[NAME_SIZE];
- char *devname;
+ char dirname[PATH_MAX];
+ char devname[NAME_SIZE];
char *temp;
char *temp;
+ /* skip if UDEV_NO_DEVD is set */
if (udev_dev_d == 0)
return;
if (udev_dev_d == 0)
return;
- memset(env_devname, 0x00, sizeof(env_devname));
- if (dev->type == 'b' || dev->type == 'c') {
- strfieldcpy(env_devname, udev_root);
- strfieldcat(env_devname, dev->name);
- } else if (dev->type == 'n') {
- strfieldcpy(env_devname, dev->name);
- }
+ strfieldcpy(devname, udev->name);
- setenv("DEVPATH", devpath, 1);
- setenv("DEVNAME", env_devname, 1);
- dbg("DEVNAME='%s'", env_devname);
-
- devname = strdup(dev->name);
- if (!devname) {
- dbg("out of memory");
- return;
- }
-
- /* Chop the device name up into pieces based on '/' */
+ /* chop the device name up into pieces based on '/' */
temp = strchr(devname, '/');
while (temp != NULL) {
temp = strchr(devname, '/');
while (temp != NULL) {
-
*temp = 0x00
;
- s
trcpy(dirname, DEVD_DIR
);
-
strfieldcat(dirname, devname)
;
- call_foreach_file(run_program, dirname,
DEVD_SUFFIX
);
+
temp[0] = '\0'
;
+ s
nprintf(dirname, PATH_MAX, "%s/%s", basedir, devname
);
+
dirname[PATH_MAX-1] = '\0'
;
+ call_foreach_file(run_program, dirname,
suffix, udev
);
-
*temp
= '/';
+
temp[0]
= '/';
++temp;
temp = strchr(temp, '/');
}
++temp;
temp = strchr(temp, '/');
}
- strcpy(dirname, DEVD_DIR);
- strfieldcat(dirname, dev->name);
- call_foreach_file(run_program, dirname, DEVD_SUFFIX);
+ if (udev->name[0] != '\0') {
+ snprintf(dirname, PATH_MAX, "%s/%s", basedir, udev->name);
+ dirname[PATH_MAX-1] = '\0';
+ call_foreach_file(run_program, dirname, suffix, udev);
+ }
- strcpy(dirname, DEVD_DIR);
- strfieldcat(dirname, subsystem);
- call_foreach_file(run_program, dirname, DEVD_SUFFIX);
+ if (udev->subsystem[0] != '\0') {
+ snprintf(dirname, PATH_MAX, "%s/%s", basedir, udev->subsystem);
+ dirname[PATH_MAX-1] = '\0';
+ call_foreach_file(run_program, dirname, suffix, udev);
+ }
- strcpy(dirname, DEVD_DIR "default");
- call_foreach_file(run_program, dirname, DEVD_SUFFIX);
+ snprintf(dirname, PATH_MAX, "%s/default", basedir);
+ dirname[PATH_MAX-1] = '\0';
+ call_foreach_file(run_program, dirname, suffix, udev);
}
}