linux-hotplug.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] udev - simpler PROGRAM execution with arguments
@ 2004-02-25  1:19 Kay Sievers
  2004-02-25  1:34 ` Patrick Mansfield
                   ` (2 more replies)
  0 siblings, 3 replies; 4+ messages in thread
From: Kay Sievers @ 2004-02-25  1:19 UTC (permalink / raw)
  To: linux-hotplug

[-- Attachment #1: Type: text/plain, Size: 457 bytes --]

While putting the limitations of our PROGRAM execution with arguments in
the man page, I asked myself why we don't simply use a subshell if a space
is found in the PROGRAM key.
It would be possible to use all shell functions like pipe or diversion
and we get rid of the hardcoded argument limit.

Pat, is this fine with you? scsi_id without arguments is still called
directly. As promised, I've added a info() for a failing PROGRAM execution.


thanks,
Kay

[-- Attachment #2: 04-exec-in-subshell.patch --]
[-- Type: text/plain, Size: 1994 bytes --]

===== namedev.c 1.112 vs edited =====
--- 1.112/namedev.c	Wed Feb 25 00:46:55 2004
+++ edited/namedev.c	Wed Feb 25 02:01:54 2004
@@ -405,38 +405,28 @@
 	int value_set = 0;
 	char buffer[256];
 	char *pos;
-	char *args[PROGRAM_MAXARG];
-	int i;
 
-	dbg("executing '%s'", path);
 	retval = pipe(fds);
 	if (retval != 0) {
 		dbg("pipe failed");
 		return -1;
 	}
+
 	pid = fork();
 	switch(pid) {
 	case 0:
 		/* child */
 		close(STDOUT_FILENO);
 		dup(fds[1]);	/* dup write side of pipe to STDOUT */
+
 		if (strchr(path, ' ')) {
-			/* exec with arguments */
-			pos = path;
-			for (i=0; i < PROGRAM_MAXARG-1; i++) {
-				args[i] = strsep(&pos, " ");
-				if (args[i] == NULL)
-					break;
-			}
-			if (args[i]) {
-				dbg("too many args - %d", i);
-				args[i] = NULL;
-			}
-			retval = execv(args[0], args);
+			dbg("execute program in subshell '%s'", path);
+			retval = execl("/bin/sh", "sh", "-c", path, NULL);
 		} else {
+			dbg("execute program '%s'", path);
 			retval = execv(path, main_argv);
 		}
-		dbg("child execve failed");
+		info(FIELD_PROGRAM " execution of '%s' failed", path);
 		exit(1);
 	case -1:
 		dbg("fork failed");
@@ -478,6 +468,7 @@
 			retval = -1;
 		}
 	}
+
 	return retval;
 }
 
===== namedev.h 1.26 vs edited =====
--- 1.26/namedev.h	Thu Feb 19 15:56:44 2004
+++ edited/namedev.h	Wed Feb 25 02:13:54 2004
@@ -48,7 +48,6 @@
 #define ATTR_PARTITIONS		"all_partitions"
 #define PARTITIONS_COUNT	15
 
-#define PROGRAM_MAXARG		10
 #define MAX_SYSFS_PAIRS		5
 
 #define RULEFILE_EXT		".rules"
===== udev.8 1.42 vs edited =====
--- 1.42/udev.8	Wed Feb 25 01:38:29 2004
+++ edited/udev.8	Wed Feb 25 02:04:29 2004
@@ -182,8 +182,7 @@
 .TP
 .B PROGRAM
 Call external program. This key is valid if the program returns successful.
-A few command line options may specified, but shell characters like pipe,
-diversion or similiar options are not available. The environment variables of
+The environment variables of
 .B udev
 are also available for the program.
 .br

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2004-02-26 21:31 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2004-02-25  1:19 [PATCH] udev - simpler PROGRAM execution with arguments Kay Sievers
2004-02-25  1:34 ` Patrick Mansfield
2004-02-25  1:42 ` Kay Sievers
2004-02-26 21:31 ` Greg KH

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).