#include "udev_version.h"
#include "namedev.h"
#include "libsysfs/libsysfs.h"
+#include "klibc_fixups.h"
#define TYPE_LABEL "LABEL"
#define TYPE_NUMBER "NUMBER"
#define TYPE_TOPOLOGY "TOPOLOGY"
#define TYPE_REPLACE "REPLACE"
#define TYPE_CALLOUT "CALLOUT"
+#define CALLOUT_MAXARG 8
static LIST_HEAD(config_device_list);
dev->owner, dev->group, dev->mode);
break;
case CALLOUT:
- dbg_parse("CALLOUT name='%s', program='%s', bus='%s', id='%s', "
+ dbg_parse("CALLOUT name='%s', bus='%s', program='%s', id='%s', "
"owner='%s', group='%s', mode=%#o",
- dev->name, dev->exec_program, dev->bus, dev->id,
+ dev->name, dev->bus, dev->exec_program, dev->id,
dev->owner, dev->group, dev->mode);
break;
default:
strfieldcpy(dev.name, temp3);
dbg_parse("LABEL name='%s', bus='%s', "
- "sysfs_file='%s', sysfs_value='%s'",
- dev.name, dev.bus, dev.sysfs_file,
+ "sysfs_file='%s', sysfs_value='%s'",
+ dev.name, dev.bus, dev.sysfs_file,
dev.sysfs_value);
}
/* loop through the whole file */
while (1) {
- /* get a line */
temp = fgets(line, sizeof(line), fd);
if (temp == NULL)
break;
/* parse the line */
temp2 = strsep(&temp, ":");
+ if (!temp2) {
+ dbg("cannot parse line: %s", line);
+ continue;
+ }
strncpy(dev.name, temp2, sizeof(dev.name));
temp2 = strsep(&temp, ":");
+ if (!temp2) {
+ dbg("cannot parse line: %s", line);
+ continue;
+ }
strncpy(dev.owner, temp2, sizeof(dev.owner));
temp2 = strsep(&temp, ":");
+ if (!temp2) {
+ dbg("cannot parse line: %s", line);
+ continue;
+ }
strncpy(dev.group, temp2, sizeof(dev.owner));
dev.mode = strtol(temp, NULL, 8);
pid_t pid;
int value_set = 0;
char buffer[256];
+ char *arg;
+ char *args[CALLOUT_MAXARG];
+ int i;
dbg("callout to '%s'", dev->exec_program);
retval = pipe(fds);
/* child */
close(STDOUT_FILENO);
dup(fds[1]); /* dup write side of pipe to STDOUT */
- retval = execve(dev->exec_program, main_argv, main_envp);
+ if (strchr(dev->exec_program, ' ')) {
+ /* callout with arguments */
+ arg = dev->exec_program;
+ for (i=0; i < CALLOUT_MAXARG-1; i++) {
+ args[i] = strsep(&arg, " ");
+ if (args[i] == NULL)
+ break;
+ }
+ if (args[i]) {
+ dbg("too many args - %d", i);
+ args[i] = NULL;
+ }
+ retval = execve(args[0], args, main_envp);
+ } else {
+ retval = execve(dev->exec_program, main_argv, main_envp);
+ }
if (retval != 0) {
dbg("child execve failed");
exit(1);
strncpy(value, buffer, len);
}
}
+ dbg("callout returned '%s'", value);
close(fds[0]);
res = wait(&status);
if (res < 0) {
char *pos = strchr(udev->name, '%');
char *dig;
char name[NAME_SIZE];
+
if (pos) {
strfieldcpy(name, pos+2);
*pos = 0x00;
if (!sysfs_device)
break;
strcat(udev->name, sysfs_device->bus_id);
- dbg("bus_id inserted: %s",
- sysfs_device->bus_id);
+ dbg("substitute bus_id '%s'", sysfs_device->bus_id);
break;
case 'n':
dig = class_dev->name + strlen(class_dev->name);
dump_dev_list();
return retval;
}
-
-