X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=namedev.c;h=bed328f6464351fd7cced6226c64d6d927f41e9d;hb=bc434511310a5bbbc5fe3783a9204b204ef05500;hp=41480d50c02c0553061c5ece7ce55aedfc86f897;hpb=8f43a65e4f0b545d705cc4cf9f31fa336b0cf8f3;p=elogind.git diff --git a/namedev.c b/namedev.c index 41480d50c..bed328f64 100644 --- a/namedev.c +++ b/namedev.c @@ -45,6 +45,7 @@ #define TYPE_TOPOLOGY "TOPOLOGY" #define TYPE_REPLACE "REPLACE" #define TYPE_CALLOUT "CALLOUT" +#define CALLOUT_MAXARG 8 static LIST_HEAD(config_device_list); @@ -286,7 +287,7 @@ static int namedev_init_config(void) /* ID="id" */ temp2 = strsep(&temp, ","); - retval = get_value("id", &temp, &temp3); + retval = get_value("ID", &temp, &temp3); if (retval) break; strfieldcpy(dev.id, temp3); @@ -314,7 +315,7 @@ static int namedev_init_config(void) /* PLACE="place" */ temp2 = strsep(&temp, ","); - retval = get_value("place", &temp, &temp3); + retval = get_value("PLACE", &temp, &temp3); if (retval) break; strfieldcpy(dev.place, temp3); @@ -353,18 +354,18 @@ static int namedev_init_config(void) /* number type */ dev.type = CALLOUT; - /* PROGRAM="executable" */ - retval = get_value("PROGRAM", &temp, &temp3); + /* BUS="bus" */ + retval = get_value("BUS", &temp, &temp3); if (retval) break; - strfieldcpy(dev.exec_program, temp3); + strfieldcpy(dev.bus, temp3); - /* BUS="bus" */ + /* PROGRAM="executable" */ temp2 = strsep(&temp, ","); - retval = get_value("BUS", &temp, &temp3); + retval = get_value("PROGRAM", &temp, &temp3); if (retval) break; - strfieldcpy(dev.bus, temp3); + strfieldcpy(dev.exec_program, temp3); /* ID="id" */ temp2 = strsep(&temp, ","); @@ -479,6 +480,9 @@ static int exec_callout(struct config_device *dev, char *value, int len) 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); @@ -496,7 +500,22 @@ static int exec_callout(struct config_device *dev, char *value, int len) /* 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("to 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); @@ -523,6 +542,7 @@ static int exec_callout(struct config_device *dev, char *value, int len) strncpy(value, buffer, len); } } + dbg("callout returned '%s'", value); close(fds[0]); res = wait(&status); if (res < 0) {