Return to BSD News archive
Path: sserve!newshost.anu.edu.au!munnari.oz.au!news.Hawaii.Edu!ames!agate!spool.mu.edu!darwin.sura.net!news.dfn.de!urmel.informatik.rwth-aachen.de!acds.physik.rwth-aachen.de!kuku
From: kuku@acds.physik.rwth-aachen.de (Christoph Kukulies)
Newsgroups: comp.os.386bsd.development
Subject: kern_execve.c patch (repost)
Date: 18 Jul 1993 12:00:39 GMT
Organization: I.Physikalisches Institut RWTH-Aachen
Lines: 123
Distribution: world
Message-ID: <22be17$m5c@urmel.informatik.rwth-aachen.de>
Reply-To: kuku@acds.physik.rwth-aachen.de
NNTP-Posting-Host: acds.physik.rwth-aachen.de
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: 7bit
Someone pointed me to an error I made in a previously posted patch to kern_execve.c. Sorry for the inconvenience I may have caused. Here goes again.
The patch fixes a problem with things like #!/usr/local/wish -f where the -f
has to be passed to the argv[]. Note that the rest of the line is not being
split up into more args. It's taken in toto and put into one argv[].
The patch is supposed to be applied to a 386bsd-0.1-0.2.3-0.2.4 patched system.
--
--Chris
Christoph P. U. Kukulies
kuku@acds.physik.rwth-aachen.de
*** Error code 1
Stop.
----------------------------------- cut here ----------------------------------
*** kern_execve.c.pl7 Mon Jun 28 12:00:04 1993
--- kern_execve.c Sun Jul 18 12:04:33 1993
***************
*** 64,69 ****
--- 64,75 ----
* 20 Apr 93 markie Stop execution of a file open for write
* Rodney W. Grimes Fix date on Yoval Yarom's patch
* 01 Jun 93 Chris Demetriou Completed markie's patch for VTEXT busy
+ * 21 May 93 Christoph P. Kukulies made things like
+ * #!/usr/local/bin/wish -f work
+ * one may additionally increase
+ * MAXINTERP to 80 in
+ * /usr/include/sys/syslimits.
+ *
*/
#include "param.h"
***************
*** 115,120 ****
--- 121,127 ----
struct vmspace *vs;
caddr_t newframe;
char shellname[MAXINTERP]; /* 05 Aug 92*/
+ char rest_of_line[MAXINTERP];
union {
char ex_shell[MAXINTERP]; /* #! and interpreter name */
struct exec ex_hdr;
***************
*** 215,222 ****
while (*cp && *cp != ' ')
*sp++ = *cp++;
*sp = '\0';
- indir = 1; /* indicate this is a script file */
vput(ndp->ni_vp);
FREE(ndp->ni_pnbuf, M_NAMEI);
--- 222,239 ----
while (*cp && *cp != ' ')
*sp++ = *cp++;
*sp = '\0';
+ if(*cp) { /* if there is something following the #!/shell */
+ while ( *cp == ' ' )
+ cp++;
+ sp = rest_of_line;
+ while ( *cp)
+ *sp++ = *cp++;
+ *sp = '\0';
+ indir = 2; /* indicate this is a script file with args*/
+ }
+ else
+ indir = 1; /* indicate this is a script file */
vput(ndp->ni_vp);
FREE(ndp->ni_pnbuf, M_NAMEI);
***************
*** 289,295 ****
/* first, do (shell name if any then) args */
if (indir) {
ep = shellname;
! twice:
if (ep) {
/* did we outgrow initial argbuf, if so, die */
if (argbufp >= (char **)stringbuf) {
--- 306,312 ----
/* first, do (shell name if any then) args */
if (indir) {
ep = shellname;
! threetimes:
if (ep) {
/* did we outgrow initial argbuf, if so, die */
if (argbufp >= (char **)stringbuf) {
***************
*** 309,320 ****
limitonargs -= stringlen;
}
! if (indir) {
! indir = 0;
! /* orginal executable is 1st argument with scripts */
! ep = uap->fname;
! goto twice;
! }
/* terminate in case no more args to script */
suword(argbufp, 0);
if (vectp = uap->argp) vectp++; /* manually doing the first
--- 326,342 ----
limitonargs -= stringlen;
}
! if (indir == 2 ) {
! indir = 1;
! ep = rest_of_line;
! goto threetimes;
! }
! if (indir == 1) {
! indir = 0;
! /* orginal executable is 1st argument with scripts */
! ep = uap->fname;
! goto threetimes;
! }
/* terminate in case no more args to script */
suword(argbufp, 0);
if (vectp = uap->argp) vectp++; /* manually doing the first