--- ../udev/namedev.c 2003-11-19 12:56:50.000000000 +0100 +++ namedev.c 2003-11-20 16:41:49.000000000 +0100 @@ -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); @@ -480,6 +481,9 @@ pid_t pid; int value_set = 0; char buffer[256]; + char *arg; + char *args[CALLOUT_MAXARG]; + int i; dbg("callout to %s\n", dev->exec_program); retval = pipe(fds); @@ -499,7 +503,22 @@ */ 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; i++) { + args[i] = strsep(&arg, " "); + if (args[i] == NULL) + break; + } + if (args[i]) { + dbg("to many args"); + 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); @@ -528,6 +547,7 @@ strncpy(value, buffer, len); } } + dbg("callout returned '%s'", value); close(fds[0]); res = wait(&status); if (res < 0) {