summaryrefslogtreecommitdiff
path: root/namedev.c
diff options
context:
space:
mode:
authorkay.sievers@vrfy.org <kay.sievers@vrfy.org>2003-11-21 06:48:01 -0800
committerGreg KH <gregkh@suse.de>2005-04-26 21:06:25 -0700
commitbc434511310a5bbbc5fe3783a9204b204ef05500 (patch)
tree0d59b60aa8cdac8fd1677f0c99e22fdf32fec72b /namedev.c
parentcb08e0f2531f910fcd46a24b2fa0eb8049165b02 (diff)
downloadsystemd-bc434511310a5bbbc5fe3783a9204b204ef05500.tar.gz
[PATCH] support arguments in callout exec
here is argument support for CALLOUT exec: CALLOUT, PROGRAM="/bin/echo -n xxx", BUS="usb", ID="xxx", NAME="webcam%n" results in: Nov 20 02:35:20 pim udev[30422]: get_major_minor: found major = 81, minor = 0 Nov 20 02:35:20 pim udev[30422]: exec_callout: callout to /bin/echo -n xxx Nov 20 02:35:20 pim udev[30422]: exec_callout: callout returned 'xxx' Nov 20 02:35:20 pim udev[30422]: get_attr: kernel number appended: 0 The feature is really nice, but the maximum argument count is hard coded to 8.
Diffstat (limited to 'namedev.c')
-rw-r--r--namedev.c22
1 files changed, 21 insertions, 1 deletions
diff --git a/namedev.c b/namedev.c
index 7c8761088f..bed328f646 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);
@@ -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) {