dbg("substitute kernel number '%s'", udev->kernel_number);
break;
case 'm':
- sprintf(pos, "%u", udev->minor);
+ strnintcat(string, udev->minor, maxsize);
dbg("substitute minor number '%u'", udev->minor);
break;
- case 'M':
- sprintf(pos, "%u", udev->major);
+ case 'M':
+ strnintcat(string, udev->major, maxsize);
dbg("substitute major number '%u'", udev->major);
break;
case 'c':
case 0:
/* child */
close(STDOUT_FILENO);
- dup(fds[1]); /* dup write side of pipe to STDOUT */
+
+ /* dup write side of pipe to STDOUT */
+ dup(fds[1]);
+
+ /* copy off our path to use incase we have too many args */
+ strnfieldcpy(buffer, path, sizeof(buffer));
+
if (strchr(path, ' ')) {
/* exec with arguments */
pos = path;
break;
}
if (args[i]) {
- dbg("too many args - %d", i);
- args[i] = NULL;
+ dbg("too many args - %d, using subshell instead '%s'", i, buffer);
+ retval = execl("/bin/sh", "sh", "-c", buffer, NULL);
+ } else {
+ dbg("execute program '%s'", path);
+ retval = execv(args[0], args);
}
- retval = execv(args[0], args);
} else {
retval = execv(path, main_argv);
}
- dbg("child execve failed");
+ info(FIELD_PROGRAM " execution of '%s' failed", path);
exit(1);
case -1:
dbg("fork failed");