ARG_MAX
| Shells
| portability
| permissions
| UUOC
| ancient
| -
| ../Various
| HOME
$()
vs )
| IFS
| using siginfo
| nanosleep
| line charset
| locale
Here are extracts from Dynix 3.2.0 kern_exec.c:
/* $Copyright: $ * Copyright (c) 1984, 1985, 1986, 1987, 1988, 1989, 1990 * Sequent Computer Systems, Inc. All rights reserved. * * This software is furnished under a license and may be used * only in accordance with the terms of that license and with the * inclusion of the above copyright notice. This software may not * be provided or otherwise made available to, or used by, any * other person. No title to or ownership of the software is * hereby transferred. */ #ifndef lint static char rcsid[] = "$Header: kern_exec.c 2.29 90/06/03 $"; #endif [...] execve() { register nc; register char *cp; register struct buf *bp; register struct execa *uap; int na, ne, ucp, ap, cc, len, error; int indir, uid, gid; char *execnamep; struct vnode *vp; struct ofile_tab *oft = NULL; struct exec_vattr vattr; daddr_t bno; struct pathname pn; char *sharg; char cfarg[SHSIZE]; union { char ex_shell[SHSIZE]; struct exec ex_exec; } exdata; int resid; [...] /* * Read in first few bytes of file for segment sizes, ux_mag: * ZMAGIC = default zero at zero demand paged RO text * XMAGIC = invalid page at zero 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. * * SHELL NAMES ARE LIMITED IN LENGTH. * * ONLY ONE ARGUMENT MAY BE PASSED TO THE SHELL FROM * THE ASCII LINE. * [...] /* * If file header doesn't have a standard magic number, see if * it's a "#!" file. getxfile() checks format of header further. */ if (exdata.ex_exec.a_magic!=ZMAGIC && exdata.ex_exec.a_magic!=XMAGIC) { if (exdata.ex_shell[0] != '#' || exdata.ex_shell[1] != '!' || indir) { u.u_error = ENOEXEC; goto bad; } cp = &exdata.ex_shell[2]; /* skip "#!" */ while (cp < &exdata.ex_shell[SHSIZE]) { if (*cp == '\t') *cp = ' '; else if (*cp == '\n') { *cp = '\0'; break; } cp++; } if (*cp != '\0') { u.u_error = ENOEXEC; goto bad; } cp = &exdata.ex_shell[2]; while (*cp == ' ') cp++; execnamep = cp; while (*cp && *cp != ' ') cp++; sharg = NULL; if (*cp) { *cp++ = '\0'; while (*cp == ' ') cp++; if (*cp) { bcopy((caddr_t)cp, (caddr_t)cfarg, SHSIZE); sharg = cfarg; } } indir = 1; VN_PUT(vp); u.u_error = lookupname(execnamep, UIOSEG_KERNEL, FOLLOW_LINK, (struct vnode **)0, &vp); if (u.u_error) { vp = (struct vnode *)0; goto bad; } if (u.u_error = exec_getattr(vp, &vattr)) goto bad; /* * Disallow setuid/setgid on shell scripts. They provide * a well-known security hole, and were flagged for * deletion in the 3.0.17 release notes. */ if (suid_script == 0) { uid = u.u_uid; gid = u.u_gid; } goto again; } [...]