UCB_SCRIPT enhancements in 2.9bsd
Greg Satz
satz at sri-tsc.UUCP
Sun Jul 15 03:37:42 AEST 1984
Subject: the UCB_SCRIPT support code didn't permit flags options
Index: sys/sys/sys1.c 2.9bsd
Description:
The kernel didn't handle flags/options that followed the shells
if UCB_SCRIPT was defined.
Repeat-By:
As the first line in a shell script, insert the line:
#! /bin/csh -f
and try running it. The shell script will return an error
saying it couldn't find the command/script.
Fix:
The code that handles the flags was never copied over from
4.1. Here are the diffs:
*** /tmp/,RCSt1004762 Fri Jul 13 23:54:53 1984
--- sys1.c Thu Jul 12 13:15:39 1984
***************
*** 45,50
#define SCRMAG '#!'
extern int schar();
int uid, gid, indir;
#endif
#ifndef UCB_SYMLINKS
--- 45,51 -----
#define SCRMAG '#!'
extern int schar();
int uid, gid, indir;
+ char *sharg, cfarg[32], cfname[DIRSIZ];
#endif
#ifndef UCB_SYMLINKS
***************
*** 87,93
&& u.u_exdata.ux_mag == SCRMAG
&& u.u_count < sizeof u.u_exdata - sizeof u.u_exdata.ux_mag)
{
- indir++;
cp = (char *) &u.u_exdata + sizeof u.u_exdata.ux_mag;
while (*cp == ' ' && cp < (char *)&u.u_exdata + sizeof u.u_exdata-1)
cp++;
--- 88,93 -----
&& u.u_exdata.ux_mag == SCRMAG
&& u.u_count < sizeof u.u_exdata - sizeof u.u_exdata.ux_mag)
{
cp = (char *) &u.u_exdata + sizeof u.u_exdata.ux_mag;
while (cp < (char *)&u.u_exdata + sizeof u.u_exdata) {
if (*cp == '\t')
***************
*** 89,95
{
indir++;
cp = (char *) &u.u_exdata + sizeof u.u_exdata.ux_mag;
! while (*cp == ' ' && cp < (char *)&u.u_exdata + sizeof u.u_exdata-1)
cp++;
u.u_dirp = cp;
while (cp < (char *) &u.u_exdata + sizeof u.u_exdata - 1
--- 89,101 -----
&& u.u_count < sizeof u.u_exdata - sizeof u.u_exdata.ux_mag)
{
cp = (char *) &u.u_exdata + sizeof u.u_exdata.ux_mag;
! while (cp < (char *)&u.u_exdata + sizeof u.u_exdata) {
! if (*cp == '\t')
! *cp = ' ';
! else if (*cp == '\n') {
! *cp = '\0';
! break;
! }
cp++;
}
if (*cp != '\0') {
***************
*** 91,96
cp = (char *) &u.u_exdata + sizeof u.u_exdata.ux_mag;
while (*cp == ' ' && cp < (char *)&u.u_exdata + sizeof u.u_exdata-1)
cp++;
u.u_dirp = cp;
while (cp < (char *) &u.u_exdata + sizeof u.u_exdata - 1
&& *cp != '\n')
--- 97,110 -----
break;
}
cp++;
+ }
+ if (*cp != '\0') {
+ u.u_error = ENOEXEC;
+ goto bad;
+ }
+ cp = (char *) &u.u_exdata + sizeof u.u_exdata.ux_mag;
+ while (*cp == ' ')
+ cp++;
u.u_dirp = cp;
while (*cp && *cp != ' ')
cp++;
***************
*** 92,99
while (*cp == ' ' && cp < (char *)&u.u_exdata + sizeof u.u_exdata-1)
cp++;
u.u_dirp = cp;
! while (cp < (char *) &u.u_exdata + sizeof u.u_exdata - 1
! && *cp != '\n')
cp++;
*cp = '\0';
iput(ip);
--- 106,112 -----
while (*cp == ' ')
cp++;
u.u_dirp = cp;
! while (*cp && *cp != ' ')
cp++;
sharg = NULL;
if (*cp) {
***************
*** 95,101
while (cp < (char *) &u.u_exdata + sizeof u.u_exdata - 1
&& *cp != '\n')
cp++;
! *cp = '\0';
iput(ip);
#ifndef UCB_SYMLINKS
if ((ip = namei(schar, LOOKUP)) == NULL)
--- 108,125 -----
u.u_dirp = cp;
while (*cp && *cp != ' ')
cp++;
! sharg = NULL;
! if (*cp) {
! *cp++ = '\0';
! while (*cp == ' ')
! cp++;
! if (*cp) {
! bcopy((caddr_t)cp, (caddr_t)cfarg, 32);
! sharg = cfarg;
! }
! }
! bcopy((caddr_t)u.u_dbuf, (caddr_t)cfname, DIRSIZ);
! indir++;
iput(ip);
#ifndef UCB_SYMLINKS
if ((ip = namei(schar, LOOKUP)) == NULL)
***************
*** 126,133
ap = NULL;
#ifdef UCB_SCRIPT
/* insert script path name as first arg */
! if (indir && na == 1)
! ap = uap->fname;
else
#endif
if (uap->argp) {
--- 150,157 -----
ap = NULL;
#ifdef UCB_SCRIPT
/* insert script path name as first arg */
! if (indir && (na == 1 || na == 2 && sharg))
! ap = (int)uap->fname;
else
#endif
if (uap->argp) {
***************
*** 149,154
do {
if (nc >= NCARGS - 1)
u.u_error = E2BIG;
if ((c = fubyte((caddr_t) ap++)) < 0)
u.u_error = EFAULT;
if (u.u_error)
--- 173,183 -----
do {
if (nc >= NCARGS - 1)
u.u_error = E2BIG;
+ #ifdef UCB_SCRIPT
+ if (indir && na == 2 && sharg != NULL)
+ c = *sharg++ & 0377;
+ else
+ #endif
if ((c = fubyte((caddr_t) ap++)) < 0)
u.u_error = EFAULT;
if (u.u_error)
***************
*** 176,181
}
bp = 0;
nc = (nc + NBPW - 1) & ~(NBPW - 1);
#ifndef UCB_SCRIPT
if (getxfile(ip, (na * NBPW) + nc) || u.u_error)
goto bad;
--- 205,214 -----
}
bp = 0;
nc = (nc + NBPW - 1) & ~(NBPW - 1);
+ #ifdef UCB_SCRIPT
+ if (indir)
+ bcopy((caddr_t)cfname, (caddr_t)u.u_dbuf, DIRSIZ);
+ #endif
#ifndef UCB_SCRIPT
if (getxfile(ip, (na * NBPW) + nc) || u.u_error)
goto bad;
***************
*** 180,186
if (getxfile(ip, (na * NBPW) + nc) || u.u_error)
goto bad;
#else
! if (getxfile(ip, (na * NBPW) + nc, uid, gid) || u.u_error)
goto bad;
#endif
--- 213,219 -----
if (getxfile(ip, (na * NBPW) + nc) || u.u_error)
goto bad;
#else
! if (getxfile(ip, (na+4) * NBPW + nc, uid, gid) || u.u_error)
goto bad;
#endif
***************
*** 217,227
#endif
bp->b_flags &= ~B_DELWRI;
cp = mapin(bp);
- #ifdef UCB_SCRIPT
- /* stick in interpreter name for accounting */
- if (indir && nc == 0)
- bcopy(cp, (caddr_t)u.u_dbuf, DIRSIZ);
- #endif
}
subyte((caddr_t)ucp++, (c = *cp++));
nc++;
--- 250,255 -----
#endif
bp->b_flags &= ~B_DELWRI;
cp = mapin(bp);
}
subyte((caddr_t)ucp++, (c = *cp++));
nc++;
More information about the Comp.bugs.2bsd
mailing list