#define TYPE_TOPOLOGY "TOPOLOGY"
#define TYPE_REPLACE "REPLACE"
#define TYPE_CALLOUT "CALLOUT"
+#define CALLOUT_MAXARG 8
static LIST_HEAD(config_device_list);
/* ID="id" */
temp2 = strsep(&temp, ",");
- retval = get_value("id", &temp, &temp3);
+ retval = get_value("ID", &temp, &temp3);
if (retval)
break;
strfieldcpy(dev.id, temp3);
/* PLACE="place" */
temp2 = strsep(&temp, ",");
- retval = get_value("place", &temp, &temp3);
+ retval = get_value("PLACE", &temp, &temp3);
if (retval)
break;
strfieldcpy(dev.place, temp3);
/* 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, ",");
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("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);
strncpy(value, buffer, len);
}
}
+ dbg("callout returned '%s'", value);
close(fds[0]);
res = wait(&status);
if (res < 0) {