From mboxrd@z Thu Jan 1 00:00:00 1970 From: Greg KH Date: Thu, 26 Feb 2004 21:31:56 +0000 Subject: Re: [PATCH] udev - simpler PROGRAM execution with arguments Message-Id: <20040226213156.GG13134@kroah.com> List-Id: References: <20040225011944.GA25022@vrfy.org> In-Reply-To: <20040225011944.GA25022@vrfy.org> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: linux-hotplug@vger.kernel.org On Wed, Feb 25, 2004 at 02:42:09AM +0100, Kay Sievers wrote: > On Wed, 2004-02-25 at 02:34, Patrick Mansfield wrote: > > On Wed, Feb 25, 2004 at 02:19:44AM +0100, Kay Sievers wrote: > > > 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. > > > > But now you depend on /bin/sh, is that acceptable? > > If it's not there, only the PROGRAM call with arguments will fail. > I think there are only few systems without /bin/sh but udev :) Hm, but some initramfs systems will probably not have a /bin/sh. So I've made the following change instead. If we go over our internal limit of arguments then we will call /bin/sh, otherwise we handle it ourselves. This should make the initramfs people happy, and everyone else too. Any complaints? thanks, greg k-h # remove limit of the number of args passed to PROGRAM # # If we go over our internal limit of 7, then we call out to /bin/sh # otherwise we handle it ourself without relying on a shell. diff -Nru a/namedev.c b/namedev.c --- a/namedev.c Thu Feb 26 13:30:02 2004 +++ b/namedev.c Thu Feb 26 13:30:02 2004 @@ -421,7 +421,13 @@ 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; @@ -431,14 +437,16 @@ 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"); diff -Nru a/test/udev-test.pl b/test/udev-test.pl --- a/test/udev-test.pl Thu Feb 26 13:30:02 2004 +++ b/test/udev-test.pl Thu Feb 26 13:30:02 2004 @@ -244,6 +244,15 @@ EOF }, { + desc => "program with lots of arguments", + subsys => "block", + devpath => "block/sda/sda3", + expected => "foo9" , + conf => < "program result substitution (numbered part of)", subsys => "block", devpath => "block/sda/sda3", diff -Nru a/udev.8 b/udev.8 --- a/udev.8 Thu Feb 26 13:30:02 2004 +++ b/udev.8 Thu Feb 26 13:30:02 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 ------------------------------------------------------- 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_id56&alloc_id438&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