From mboxrd@z Thu Jan 1 00:00:00 1970 From: Kay Sievers Date: Wed, 25 Feb 2004 01:19:44 +0000 Subject: [PATCH] udev - simpler PROGRAM execution with arguments Message-Id: <20040225011944.GA25022@vrfy.org> MIME-Version: 1 Content-Type: multipart/mixed; boundary="UlVJffcvxoiEqYs2" List-Id: To: linux-hotplug@vger.kernel.org --UlVJffcvxoiEqYs2 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline 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 --UlVJffcvxoiEqYs2 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline; filename="04-exec-in-subshell.patch" ===== 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 --UlVJffcvxoiEqYs2-- ------------------------------------------------------- SF.Net is sponsored by: Speed Start Your Linux Apps Now. Build and deploy apps & Web services for Linux with a free DVD software kit from IBM. Click Now! http://ads.osdn.com/?ad_id=1356&alloc_id=3438&op=click _______________________________________________ Linux-hotplug-devel mailing list http://linux-hotplug.sourceforge.net Linux-hotplug-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linux-hotplug-devel