Return to BSD News archive
Path: sserve!newshost.anu.edu.au!munnari.oz.au!news.Hawaii.Edu!ames!agate!howland.reston.ans.net!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.questions
Subject: Re: Tk/Tcl problems! (!!!!! kern_execve.c patch alert ******)
Date: 15 Jul 1993 17:24:44 GMT
Organization: I.Physikalisches Institut RWTH-Aachen
Lines: 368
Distribution: world
Message-ID: <2243ss$579@urmel.informatik.rwth-aachen.de>
References: <CA5AF4.1Bw@cosy.sbg.ac.at>
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
In article <CA5AF4.1Bw@cosy.sbg.ac.at>, peter@cosy.sbg.ac.at (Peter Burgstaller) writes:
>Hi folks!
>
>I have compiled tk3.2 and tcl6.7 for my 386bsd system. I had to
>eliminate the setenv and putenv reimplementations in tclEnv.c
^^^^^^ ^^^^^
You will need these and leave them as they are otherwise TK/TCL won't
work in many situations.
>in order to compile the whole stuff. I got some warnings but
>you know who cares so I ran some applications but
>the line
>#!/usr/local/bin/wish -f
>doesn't work for me. I always get wish up but nothing else.
See kern_execve.c patch below.
I hope this patch works on top of a 0.2.4 patched systemand it makes it's way into the patchkit so we finally get rid of this everlasting #!/bin/wish -f problem.
>However if I start a prog with
>wish -f prog.tcl then everything works fine.
>
>My question is: Has anybody encountered the same problem
>and if so has anybody solfed it??
>I already posted in comp.lang.tcl but the guys there don't have
>a working answer!
>
>- Thanks to yall!
>
>- Peter
>--
>/--------------------------------------------------------\
>| Peter Burgstaller| Student of Computerscience |
>| (peter@cosy.sbg.ac.at)| in Salzburg, Austria (Europe) |
>| "So Long, and Thanks for All the Fish" (Douglas Adams) |
>\--------------------------------------------------------/
>
--Chris
Christoph P. U. Kukulies
kuku@acds.physik.rwth-aachen.de
*** Error code 1
---------------------------- cut here -------------------------------
*** /sys/kern/kern_execve.c Fri Jun 25 09:50:29 1993
--- kern_execve.c Mon Jun 28 11:37:40 1993
***************
*** 55,69 ****
* CURRENT PATCH LEVEL: 6 00165
* -------------------- ----- ----------------------
*
! * 05 Aug 92 Paul Kranenburg Fixed #! as a magic number
! * 29 Jul 92 Mark Tinguely Fixed execute permission enforcement
* 15 Aug 92 Terry Lambert Fixed CMOS RAM size bug
! * 12 Dec 92 Julians Elischer Place argc into user address space
! * correctly
! * 10 Apr 93 Yoval Yarom Fix for busy text on executables
! * 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
*/
#include "param.h"
--- 55,71 ----
* CURRENT PATCH LEVEL: 6 00165
* -------------------- ----- ----------------------
*
! * 05 Aug 92 Paul Kranenburg Fixed #! as a magic number
! * 29 Jul 92 Mark Tinguely Fixed execute permission enforcement
* 15 Aug 92 Terry Lambert Fixed CMOS RAM size bug
! * 12 Dec 92 Julians Elischer Place argc into user address space
! * correctly
! * 10 Apr 93 Yoval Yarom Fix for busy text on executables
! * 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
! * 28 Jun 93 Chris Kukulies fix for #!/wish -f to be handled
! * properly.
*/
#include "param.h"
***************
*** 114,120 ****
struct vattr attr;
struct vmspace *vs;
caddr_t newframe;
! char shellname[MAXINTERP]; /* 05 Aug 92*/
union {
char ex_shell[MAXINTERP]; /* #! and interpreter name */
struct exec ex_hdr;
--- 116,123 ----
struct vattr attr;
struct vmspace *vs;
caddr_t newframe;
! char shellname[MAXINTERP];
! char rest_of_line[MAXINTERP];
union {
char ex_shell[MAXINTERP]; /* #! and interpreter name */
struct exec ex_hdr;
***************
*** 128,159 ****
ndp->ni_segflg = UIO_USERSPACE;
ndp->ni_dirp = uap->fname;
! again: /* 05 Aug 92*/
ndp->ni_nameiop = LOOKUP | LOCKLEAF | FOLLOW | SAVENAME;
/* is it there? */
if (rv = namei(ndp, p))
return (rv);
!
! if (ndp->ni_vp->v_writecount) { /* don't exec if file is busy */
! rv = EBUSY;
! goto exec_fail;
! }
/* does it have any attributes? */
rv = VOP_GETATTR(ndp->ni_vp, &attr, p->p_ucred, p);
if (rv)
goto exec_fail;
! if (ndp->ni_vp->v_mount->mnt_flag & MNT_NOEXEC) { /* no exec on fs ?*/
rv = EACCES;
goto exec_fail;
}
/* is it executable, and a regular file? */
! if ((ndp->ni_vp->v_mount->mnt_flag & MNT_NOEXEC) || /* 29 Jul 92*/
! (VOP_ACCESS(ndp->ni_vp, VEXEC, p->p_ucred, p)) ||
! ((attr.va_mode & 0111) == 0) ||
! (attr.va_type != VREG)) {
rv = EACCES;
goto exec_fail;
}
--- 131,162 ----
ndp->ni_segflg = UIO_USERSPACE;
ndp->ni_dirp = uap->fname;
! again:
ndp->ni_nameiop = LOOKUP | LOCKLEAF | FOLLOW | SAVENAME;
/* is it there? */
if (rv = namei(ndp, p))
return (rv);
!
! if (ndp->ni_vp->v_writecount) { /* don't exec if file is busy */
! rv = EBUSY;
! goto exec_fail;
! }
/* does it have any attributes? */
rv = VOP_GETATTR(ndp->ni_vp, &attr, p->p_ucred, p);
if (rv)
goto exec_fail;
! if (ndp->ni_vp->v_mount->mnt_flag & MNT_NOEXEC) {/* no exec on fs ? */
rv = EACCES;
goto exec_fail;
}
/* is it executable, and a regular file? */
! if ((ndp->ni_vp->u_mount_mnt_flag & MNT_NOEXEC) || /* 29 Jul 92*/
! (VOP_ACCESS(ndp->ni_vp,VEXEC,p->p_ucred,p)) ||
! ((attr.va_mode & 0111) == 0 ||
! attr.va_type != VREG)) {
rv = EACCES;
goto exec_fail;
}
***************
*** 162,170 ****
* Step 2. Does the file contain a format we can
* understand and execute
*
- * XXX 05 Aug 92
* Read in first few bytes of file for segment sizes, magic number:
! * ZMAGIC = demand paged RO text
* Also an ASCII line beginning with #! is
* the file name of a ``shell'' and arguments may be prepended
* to the argument list if given here.
--- 165,172 ----
* Step 2. Does the file contain a format we can
* understand and execute
*
* Read in first few bytes of file for segment sizes, magic number:
! * ZMAGIC = demand paged RO text
* Also an ASCII line beginning with #! is
* the file name of a ``shell'' and arguments may be prepended
* to the argument list if given here.
***************
*** 177,189 ****
/* big enough to hold a header? */
if (rv)
goto exec_fail;
- if (exdata.ex_hdr.a_text != 0 && (ndp->ni_vp->v_flag & VTEXT) == 0 &&
- ndp->ni_vp->v_writecount != 0) {
- rv = ETXTBSY;
- goto exec_fail;
- }
-
/* ... that we recognize? */
rv = ENOEXEC;
--- 179,191 ----
/* big enough to hold a header? */
if (rv)
goto exec_fail;
+
+ if (exdata.ex_hdr.a_text != 0 && (ndp->ni_vp->v_flag & VTEXT) == 0 &&
+ ndp->ni_vp->v_writecount != 0) {
+ rv = ETXTBSY;
+ goto exec_fail;
+
/* ... that we recognize? */
rv = ENOEXEC;
***************
*** 207,213 ****
if (*cp == '\t')
*cp = ' ';
}
! cp = &exdata.ex_shell[2]; /* get shell interpreter name */
while (*cp == ' ')
cp++;
--- 209,215 ----
if (*cp == '\t')
*cp = ' ';
}
! cp = &exdata.ex_shell[2]; /* get shell interpreter name */
while (*cp == ' ')
cp++;
***************
*** 215,226 ****
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);
! ndp->ni_dirp = shellname; /* find shell interpreter */
ndp->ni_segflg = UIO_SYSSPACE;
goto again;
}
--- 217,238 ----
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 */
! }
! else
! indir = 1;
vput(ndp->ni_vp);
FREE(ndp->ni_pnbuf, M_NAMEI);
! ndp->ni_dirp = shellname; /* find shell interpreter */
ndp->ni_segflg = UIO_SYSSPACE;
goto again;
}
***************
*** 227,234 ****
/* sanity check "ain't not such thing as a sanity clause" -groucho */
rv = ENOMEM;
! if (/*exdata.ex_hdr.a_text == 0 || */ exdata.ex_hdr.a_text > MAXTSIZ ||
! exdata.ex_hdr.a_text % NBPG || exdata.ex_hdr.a_text > attr.va_size)
goto exec_fail;
if (exdata.ex_hdr.a_data == 0 || exdata.ex_hdr.a_data > DFLDSIZ
--- 239,246 ----
/* sanity check "ain't not such thing as a sanity clause" -groucho */
rv = ENOMEM;
! if (/*exdata.ex_hdr.a_text == 0 || */ exdata.ex_hdr.a_text > MAXTSIZ
! || exdata.ex_hdr.a_text % NBPG || exdata.ex_hdr.a_text > attr.va_size)
goto exec_fail;
if (exdata.ex_hdr.a_data == 0 || exdata.ex_hdr.a_data > DFLDSIZ
***************
*** 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) {
--- 301,307 ----
/* 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,323 ****
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
argument with scripts */
}
--- 321,340 ----
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
argument with scripts */
}
***************
*** 489,496 ****
p->p_regs[SP] = (unsigned) (argbuf - 1);
setregs(p, exdata.ex_hdr.a_entry);
! ndp->ni_vp->v_flag |= VTEXT; /* mark vnode pure text */
!
vput(ndp->ni_vp);
FREE(ndp->ni_pnbuf, M_NAMEI);
--- 506,513 ----
p->p_regs[SP] = (unsigned) (argbuf - 1);
setregs(p, exdata.ex_hdr.a_entry);
! ndp->ni_up->v_flag |= VTEXT;
!
vput(ndp->ni_vp);
FREE(ndp->ni_pnbuf, M_NAMEI);