}
}
-static int execute_program(char *path, char *value, int len)
+static int execute_program(const char *path, char *value, int len)
{
int retval;
int count;
pid_t pid;
char *pos;
char arg[PROGRAM_SIZE];
- char *argv[sizeof(arg) / 2];
+ char *argv[(PROGRAM_SIZE / 2) + 1];
int i;
+ strfieldcpy(arg, path);
i = 0;
if (strchr(path, ' ')) {
- strfieldcpy(arg, path);
pos = arg;
while (pos != NULL) {
if (pos[0] == '\'') {
/* don't separate if in apostrophes */
pos++;
argv[i] = strsep(&pos, "\'");
- while (pos[0] == ' ')
+ while (pos && pos[0] == ' ')
pos++;
- } else {
+ } else {
argv[i] = strsep(&pos, " ");
}
dbg("arg[%i] '%s'", i, argv[i]);
i++;
}
+ argv[i] = NULL;
+ dbg("execute '%s' with parsed arguments", arg);
+ } else {
+ argv[0] = arg;
+ argv[1] = main_argv[1];
+ argv[2] = NULL;
+ dbg("execute '%s' with subsystem '%s' argument", arg, argv[1]);
}
- argv[i] = NULL;
retval = pipe(fds);
if (retval != 0) {
switch(pid) {
case 0:
/* child */
- close(STDOUT_FILENO);
-
- /* dup write side of pipe to STDOUT */
- dup(fds[1]);
- if (argv[0] != NULL) {
- dbg("execute '%s' with given arguments", argv[0]);
- retval = execv(argv[0], argv);
- } else {
- dbg("execute '%s' with main argument", path);
- retval = execv(path, main_argv);
- }
+ /* dup2 write side of pipe to STDOUT */
+ dup2(fds[1], STDOUT_FILENO);
+ retval = execv(arg, argv);
info(FIELD_PROGRAM " execution of '%s' failed", path);
exit(1);