Module Name: src
Committed By: kre
Date: Sun Nov 10 09:06:25 UTC 2024
Modified Files:
src/bin/sh: eval.c redir.c redir.h sh.1 show.c
Log Message:
Revert the recent change until I can work out how things are broken.
To generate a diff of this commit:
cvs rdiff -u -r1.195 -r1.196 src/bin/sh/eval.c
cvs rdiff -u -r1.74 -r1.75 src/bin/sh/redir.c
cvs rdiff -u -r1.27 -r1.28 src/bin/sh/redir.h
cvs rdiff -u -r1.268 -r1.269 src/bin/sh/sh.1
cvs rdiff -u -r1.57 -r1.58 src/bin/sh/show.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/bin/sh/eval.c
diff -u src/bin/sh/eval.c:1.195 src/bin/sh/eval.c:1.196
--- src/bin/sh/eval.c:1.195 Sun Nov 10 01:22:24 2024
+++ src/bin/sh/eval.c Sun Nov 10 09:06:24 2024
@@ -1,4 +1,4 @@
-/* $NetBSD: eval.c,v 1.195 2024/11/10 01:22:24 kre Exp $ */
+/* $NetBSD: eval.c,v 1.196 2024/11/10 09:06:24 kre Exp $ */
/*-
* Copyright (c) 1993
@@ -37,7 +37,7 @@
#if 0
static char sccsid[] = "@(#)eval.c 8.9 (Berkeley) 6/8/95";
#else
-__RCSID("$NetBSD: eval.c,v 1.195 2024/11/10 01:22:24 kre Exp $");
+__RCSID("$NetBSD: eval.c,v 1.196 2024/11/10 09:06:24 kre Exp $");
#endif
#endif /* not lint */
@@ -658,7 +658,7 @@ evalredir(union node *n, int flags)
handler = savehandler;
e = exception;
- popredir(POPREDIR_UNDO);
+ popredir();
if (PS4 != NULL) {
outxstr(PS4);
/* { */ outxstr("} failed\n");
@@ -681,7 +681,7 @@ evalredir(union node *n, int flags)
}
INTOFF;
handler = savehandler;
- popredir(POPREDIR_UNDO);
+ popredir();
INTON;
if (PS4 != NULL) {
@@ -1251,7 +1251,7 @@ evalcommand(union node *cmd, int flgs, s
shellparam = saveparam;
}
if (saved)
- popredir(POPREDIR_UNDO);
+ popredir();
unreffunc(savefunc);
poplocalvars();
localvars = savelocalvars;
@@ -1296,7 +1296,7 @@ evalcommand(union node *cmd, int flgs, s
shellparam = saveparam;
handler = savehandler;
if (saved)
- popredir(POPREDIR_UNDO);
+ popredir();
INTON;
if (evalskip == SKIPFUNC) {
evalskip = SKIPNONE;
@@ -1311,100 +1311,18 @@ evalcommand(union node *cmd, int flgs, s
case CMDBUILTIN:
VXTRACE(DBG_EVAL, ("builtin command [%d]%s: ", argc,
vforked ? " VF" : ""), trargs(argv));
-
- if (cmdentry.u.bltin == execcmd) {
- char **ap;
-
- /*
- * Work out how we should process redirections
- * on the "exec" command. We need REDIR_KEEP
- * if we must not set close-on-exec, and REDIR_PUSH
- * if we need to be able to undo them (in the
- * exec command, only on some kind of error).
- *
- * Skip "exec" (argv[0]) then examine args.
- *
- * This must be done manually, as nextopt()
- * hasn't been init'd for this command yet.
- * And it won't be until after redirections are done.
- *
- * "exec" currently takes no options (except "--"),
- * but might one day, and this needs to keep working,
- * so do it, kind of, properly.
- *
- * Note in the common cases argv[1] will be NULL
- * (for exec just setting up redirectons) or will
- * not start with a '-' ("exec cmd") so normally
- * this loop will either never start or will break
- * at the first test of the first iteration.
- */
- for (ap = argv + 1; *ap != NULL; ap++) {
-
- if (ap[0][0] != '-')
- break;
-
- if (ap[0][1] == '\0') /* "exec -" */
- break; /* or continue ?? */
-
- if (ap[0][1] == '-' && ap[0][2] == '\0') {
- ap++;
- break;
- }
-
-#if defined(DUMMY_EXAMPLE_CODE) && 0
- /*
- * if options are added to "exec" then
- * any which take an arg (like the common
- * in other shells "-a cmdname") need to
- * be recognised here, lest "cmdname" be
- * thought to be the cmd to exec
- */
-
- for (char *op = ap[0] + 1; *op; op++) {
- switch (*op) {
- case 'a':
- case any others similar:
- /* options needing an optarg */
- if (op[1] == '\0' && ap[1])
- ap++;
- break;
-
- default:
- /* options with no optarg */
- continue;
- }
- break;
- }
-#endif /* DUMMY EXAMPLE CODE */
- }
-
- if (*ap != NULL)
- mode = REDIR_KEEP; /* exec cmd <... */
- else
- mode = 0; /* exec < .... */
-
- /*
- * always save old fd setup in case of error()
- * execcmd() will undo this if no error occurs
- * (that is, in the case the shell has not vanished)
- */
- mode |= REDIR_PUSH;
- } else /* any builtin execpt "exec" */
- mode = REDIR_PUSH;
-
+ mode = (cmdentry.u.bltin == execcmd) ? 0 : REDIR_PUSH;
if (flags == EV_BACKCMD) {
memout.nleft = 0;
memout.nextc = memout.buf;
memout.bufsize = 64;
mode |= REDIR_BACKQ;
}
-
e = -1;
savecmdname = commandname;
savetopfile = getcurrentfile();
savehandler = handler;
temp_path = 0;
-
if (!setjmp(jmploc.loc)) {
handler = &jmploc;
@@ -1477,10 +1395,8 @@ evalcommand(union node *cmd, int flgs, s
popfilesupto(savetopfile);
FORCEINTON;
}
-
if (cmdentry.u.bltin != execcmd)
- popredir(POPREDIR_UNDO);
-
+ popredir();
if (flags == EV_BACKCMD) {
backcmd->buf = memout.buf;
backcmd->nleft = memout.nextc - memout.buf;
@@ -1783,13 +1699,7 @@ truecmd(int argc, char **argv)
int
execcmd(int argc, char **argv)
{
- /*
- * BEWARE: if any options are added here, they must
- * also be added in evalcommand(), look for "DUMMY_EXAMPLE_CODE"
- * for example code for there. Here the options would be
- * processed completely normally.
- */
- (void) nextopt(""); /* ignore a leading "--" */
+ (void) nextopt(NULL); /* ignore a leading "--" */
if (*argptr) {
struct strlist *sp;
@@ -1800,9 +1710,7 @@ execcmd(int argc, char **argv)
for (sp = cmdenviron; sp; sp = sp->next)
setvareq(sp->text, VDOEXPORT|VEXPORT|VSTACK);
shellexec(argptr, environment(), pathval(), 0, 0);
- /* NOTREACHED */
}
- popredir(POPREDIR_PERMANENT); /* make any redirections permanent */
return 0;
}
Index: src/bin/sh/redir.c
diff -u src/bin/sh/redir.c:1.74 src/bin/sh/redir.c:1.75
--- src/bin/sh/redir.c:1.74 Sun Nov 10 05:21:24 2024
+++ src/bin/sh/redir.c Sun Nov 10 09:06:24 2024
@@ -1,4 +1,4 @@
-/* $NetBSD: redir.c,v 1.74 2024/11/10 05:21:24 kre Exp $ */
+/* $NetBSD: redir.c,v 1.75 2024/11/10 09:06:24 kre Exp $ */
/*-
* Copyright (c) 1991, 1993
@@ -37,7 +37,7 @@
#if 0
static char sccsid[] = "@(#)redir.c 8.2 (Berkeley) 5/4/95";
#else
-__RCSID("$NetBSD: redir.c,v 1.74 2024/11/10 05:21:24 kre Exp $");
+__RCSID("$NetBSD: redir.c,v 1.75 2024/11/10 09:06:24 kre Exp $");
#endif
#endif /* not lint */
@@ -70,8 +70,8 @@ __RCSID("$NetBSD: redir.c,v 1.74 2024/11
#include "show.h"
+#define EMPTY -2 /* marks an unused slot in redirtab */
#define CLOSED -1 /* fd was not open before redir */
-
#ifndef PIPE_BUF
# define PIPESIZE 4096 /* amount of buffering in a pipe */
#else
@@ -84,24 +84,17 @@ __RCSID("$NetBSD: redir.c,v 1.74 2024/11
#ifndef F_DUPFD_CLOEXEC
#define F_DUPFD_CLOEXEC F_DUPFD
-#define CLOEXEC(fd) (fcntl((fd), F_SETFD, \
- (fcntl_int)(fcntl((fd), F_GETFD) | FD_CLOEXEC)))
+#define CLOEXEC(fd) (fcntl((fd), F_SETFD, fcntl((fd),F_GETFD) | FD_CLOEXEC))
#else
-#define CLOEXEC(fd) __nothing
+#define CLOEXEC(fd)
#endif
-/* yes, this is correct, bizarre parens and all -- used only as a cast */
-#define fcntl_int void *)(intptr_t
-#undef fcntl_int
-#define fcntl_int int
-
MKINIT
struct renamelist {
struct renamelist *next;
int orig;
int into;
- int cloexec; /* orig had FD_CLOEXEC set (into always does) */
};
MKINIT
@@ -125,10 +118,9 @@ STATIC int fd0_redirected = 0;
* way of user defined fds (normally)
*/
STATIC int big_sh_fd = 0;
-STATIC int biggest_sh_fd = 2;
STATIC const struct renamelist *is_renamed(const struct renamelist *, int);
-STATIC void fd_rename(struct redirtab *, int, int, int);
+STATIC void fd_rename(struct redirtab *, int, int);
STATIC int * saved_redirected_fd(int);
STATIC void free_rl(struct redirtab *, int);
STATIC void openredirect(union node *, char[10], int);
@@ -186,35 +178,15 @@ free_rl(struct redirtab *rt, int reset)
fd0_redirected--;
VTRACE(DBG_REDIR, ("popredir %d%s: %s",
rl->orig, rl->orig==0 ? " (STDIN)" : "",
- reset == 1 ? "" :
- reset == 2 ? "make permanent" :
- "no reset\n"));
-
- switch (reset) {
- case 1:
+ reset ? "" : "no reset\n"));
+ if (reset) {
if (rl->into < 0) {
- VTRACE(DBG_REDIR, (" closed\n"));
+ VTRACE(DBG_REDIR, ("closed\n"));
close(rl->orig);
} else {
- VTRACE(DBG_REDIR,
- (" from %d%s\n", rl->into,
- rl->cloexec ? " (colexec)" : ""));
- copyfd(rl->into, rl->orig, rl->cloexec);
+ VTRACE(DBG_REDIR, ("from %d\n", rl->into));
+ movefd(rl->into, rl->orig);
}
- break;
- case 2:
- if (rl->into < 0) {
- VTRACE(DBG_REDIR, (" was closed\n"));
- /* nothing to do */
- } else {
- VTRACE(DBG_REDIR,
- (" close savefd %d\n", rl->into));
- close(rl->into);
- }
- break;
- default:
- /* nothing to do */
- break;
}
ckfree(rl);
}
@@ -222,22 +194,16 @@ free_rl(struct redirtab *rt, int reset)
}
STATIC void
-fd_rename(struct redirtab *rt, int from, int to, int cloexec)
+fd_rename(struct redirtab *rt, int from, int to)
{
/* XXX someday keep a short list (8..10) of freed renamelists XXX */
struct renamelist *rl = ckmalloc(sizeof(struct renamelist));
- /*
- * Note this list is operated as LIFO so saved fd's are
- * undone in the opposite order to that they were saved
- * (needed to ensure correct results)
- */
rl->next = rt->renamed;
rt->renamed = rl;
rl->orig = from;
rl->into = to;
- rl->cloexec = cloexec;
}
/*
@@ -258,7 +224,6 @@ redirect(union node *redir, int flags)
char memory[10]; /* file descriptors to write to memory */
CTRACE(DBG_REDIR, ("redirect(F=0x%x):%s\n", flags, redir?"":" NONE"));
-
for (i = 10 ; --i >= 0 ; )
memory[i] = 0;
memory[1] = flags & REDIR_BACKQ;
@@ -288,7 +253,7 @@ redirect(union node *redir, int flags)
error("fd %d: %s", fd, strerror(EBADF));
/* redirect from/to same file descriptor */
/* make sure it stays open */
- if (fcntl(fd, F_SETFD, (fcntl_int)0) < 0)
+ if (fcntl(fd, F_SETFD, 0) < 0)
error("fd %d: %s", fd, strerror(errno));
continue;
}
@@ -305,21 +270,13 @@ redirect(union node *redir, int flags)
if ((flags & REDIR_PUSH) && !is_renamed(sv->renamed, fd)) {
int bigfd;
- int cloexec;
-
- cloexec = fcntl(fd, F_GETFD);
- if (cloexec >= 0)
- cloexec &= FD_CLOEXEC;
- else
- cloexec = 0;
INTOFF;
if (big_sh_fd < 10)
find_big_fd();
if ((bigfd = big_sh_fd) < max_user_fd)
bigfd = max_user_fd;
- if ((i = fcntl(fd, F_DUPFD,
- (fcntl_int)(bigfd + 1))) == -1) {
+ if ((i = fcntl(fd, F_DUPFD, bigfd + 1)) == -1) {
switch (errno) {
case EBADF:
i = CLOSED;
@@ -327,13 +284,11 @@ redirect(union node *redir, int flags)
case EMFILE:
case EINVAL:
find_big_fd();
- i = fcntl(fd, F_DUPFD,
- (fcntl_int) big_sh_fd);
+ i = fcntl(fd, F_DUPFD, big_sh_fd);
if (i >= 0)
break;
if (errno == EMFILE || errno == EINVAL)
- i = fcntl(fd, F_DUPFD,
- (fcntl_int) 3);
+ i = fcntl(fd, F_DUPFD, 3);
if (i >= 0)
break;
/* FALLTHRU */
@@ -342,13 +297,10 @@ redirect(union node *redir, int flags)
/* NOTREACHED */
}
}
- if (i > biggest_sh_fd)
- biggest_sh_fd = i;
if (i >= 0)
- (void)fcntl(i, F_SETFD, (fcntl_int) FD_CLOEXEC);
- fd_rename(sv, fd, i, cloexec);
- VTRACE(DBG_REDIR, ("fd %d saved as %d%s ", fd, i,
- cloexec ? "+" : ""));
+ (void)fcntl(i, F_SETFD, FD_CLOEXEC);
+ fd_rename(sv, fd, i);
+ VTRACE(DBG_REDIR, ("fd %d saved as %d ", fd, i));
INTON;
}
VTRACE(DBG_REDIR, ("%s\n", fd == 0 ? "STDIN" : ""));
@@ -392,8 +344,7 @@ openredirect(union node *redir, char mem
VTRACE(DBG_REDIR, ("openredirect(< '%s') -> %d [%#x]",
fname, f, eflags));
if (eflags)
- (void)fcntl(f, F_SETFL,
- (fcntl_int)(fcntl(f, F_GETFL) & ~eflags));
+ (void)fcntl(f, F_SETFL, fcntl(f, F_GETFL, 0) & ~eflags);
break;
case NFROMTO:
fname = redir->nfile.expfname;
@@ -467,9 +418,6 @@ openredirect(union node *redir, char mem
abort();
}
- if (f > biggest_sh_fd)
- biggest_sh_fd = f;
-
cloexec = fd > 2 && (flags & REDIR_KEEP) == 0 && !posix;
if (f != fd) {
VTRACE(DBG_REDIR, (" -> %d", fd));
@@ -483,7 +431,7 @@ openredirect(union node *redir, char mem
}
close(f);
} else if (cloexec)
- (void)fcntl(f, F_SETFD, (fcntl_int) FD_CLOEXEC);
+ (void)fcntl(f, F_SETFD, FD_CLOEXEC);
VTRACE(DBG_REDIR, ("%s\n", cloexec ? " cloexec" : ""));
INTON;
@@ -511,8 +459,6 @@ openhere(const union node *redir)
if (pipe(pip) < 0)
error("Pipe call failed");
- if (pip[1] > biggest_sh_fd)
- biggest_sh_fd = pip[1];
len = strlen(redir->nhere.text);
VTRACE(DBG_REDIR, ("openhere(%p) [%d] \"%.*s\"%s\n", redir, len,
(len < 40 ? len : 40), redir->nhere.text, (len < 40 ? "" : "...")));
@@ -535,7 +481,7 @@ openhere(const union node *redir)
_exit(0);
}
VTRACE(DBG_REDIR, ("openhere (closing %d)", pip[1]));
- out:;
+ out:
close(pip[1]);
VTRACE(DBG_REDIR, (" (pipe fd=%d)", pip[0]));
return pip[0];
@@ -544,21 +490,16 @@ openhere(const union node *redir)
/*
- * if (reset == POPREDIR_UNDO)
- * Undo the effects of the last redirection.
- * else if (reset == POPREDIR_PERMANENT)
- * Make the last redirection permanent
- * else / * reset == POPREDIR_DISCARD * /
- * Just throw away the redirection
+ * Undo the effects of the last redirection.
*/
void
-popredir(int reset)
+popredir(void)
{
struct redirtab *rp = redirlist;
INTOFF;
- free_rl(rp, reset);
+ free_rl(rp, 1);
redirlist = rp->next;
ckfree(rp);
INTON;
@@ -574,7 +515,7 @@ INCLUDE "redir.h"
RESET {
while (redirlist)
- popredir(POPREDIR_UNDO);
+ popredir();
}
SHELLPROC {
@@ -602,7 +543,7 @@ clearredir(int vforked)
for (rp = redirlist ; rp ; rp = rp->next) {
if (!vforked)
- free_rl(rp, POPREDIR_DISCARD);
+ free_rl(rp, 0);
else for (rl = rp->renamed; rl; rl = rl->next)
if (rl->into >= 0)
close(rl->into);
@@ -627,15 +568,11 @@ copyfd(int from, int to, int cloexec)
newfd = dup3(from, to, O_CLOEXEC);
#else
newfd = dup2(from, to);
- fcntl(newfd, F_SETFD,
- (fcntl_int)(fcntl(newfd, F_GETFD) | FD_CLOEXEC));
+ fcntl(newfd, F_SETFD, fcntl(newfd,F_GETFD) | FD_CLOEXEC);
#endif
} else
newfd = dup2(from, to);
- if (newfd > biggest_sh_fd)
- biggest_sh_fd = newfd;
-
return newfd;
}
@@ -651,11 +588,6 @@ copyfd(int from, int to, int cloexec)
int
movefd(int from, int to)
{
- if (from > biggest_sh_fd)
- biggest_sh_fd = from;
- if (to > biggest_sh_fd)
- biggest_sh_fd = to;
-
if (from == to)
return to;
@@ -681,9 +613,7 @@ find_big_fd(void)
last_start++;
for (i = (1 << last_start); i >= 10; i >>= 1) {
- if ((fd = fcntl(0, F_DUPFD, (fcntl_int)(i - 1))) >= 0) {
- if (fd > biggest_sh_fd)
- biggest_sh_fd = fd;
+ if ((fd = fcntl(0, F_DUPFD, i - 1)) >= 0) {
close(fd);
break;
}
@@ -712,10 +642,8 @@ to_upper_fd(int fd)
if (big_sh_fd < 10 || big_sh_fd >= user_fd_limit)
find_big_fd();
do {
- i = fcntl(fd, F_DUPFD_CLOEXEC, (fcntl_int) big_sh_fd);
+ i = fcntl(fd, F_DUPFD_CLOEXEC, big_sh_fd);
if (i >= 0) {
- if (i > biggest_sh_fd)
- biggest_sh_fd = i;
if (fd != i)
close(fd);
VTRACE(DBG_REDIR|DBG_OUTPUT, ("-> %d\n", i));
@@ -731,7 +659,7 @@ to_upper_fd(int fd)
* we certainly do not intend to pass it through exec, even
* if the reassignment failed.
*/
- (void)fcntl(fd, F_SETFD, (fcntl_int) FD_CLOEXEC);
+ (void)fcntl(fd, F_SETFD, FD_CLOEXEC);
VTRACE(DBG_REDIR|DBG_OUTPUT, (" fails ->%d\n", fd));
return fd;
}
@@ -784,20 +712,18 @@ pick_new_fd(int fd)
{
int to;
- to = fcntl(fd, F_DUPFD_CLOEXEC, (fcntl_int) big_sh_fd);
+ to = fcntl(fd, F_DUPFD_CLOEXEC, big_sh_fd);
if (to == -1 && big_sh_fd >= 22)
- to = fcntl(fd, F_DUPFD_CLOEXEC, (fcntl_int) (big_sh_fd / 2));
+ to = fcntl(fd, F_DUPFD_CLOEXEC, big_sh_fd/2);
if (to == -1)
- to = fcntl(fd, F_DUPFD_CLOEXEC, (fcntl_int) (fd + 1));
+ to = fcntl(fd, F_DUPFD_CLOEXEC, fd + 1);
if (to == -1)
- to = fcntl(fd, F_DUPFD_CLOEXEC, (fcntl_int) 10);
+ to = fcntl(fd, F_DUPFD_CLOEXEC, 10);
if (to == -1)
- to = fcntl(fd, F_DUPFD_CLOEXEC, (fcntl_int) 3);
+ to = fcntl(fd, F_DUPFD_CLOEXEC, 3);
if (to == -1)
error("insufficient file descriptors available");
CLOEXEC(to);
- if (to > biggest_sh_fd)
- biggest_sh_fd = to;
return to;
}
@@ -948,11 +874,11 @@ static const struct flgnames {
O_NOFOLLOW|O_CREAT|O_TRUNC|O_EXCL|O_NOCTTY|O_DIRECTORY|O_REGULAR)
static int
-getflags(int fd, int p, int all)
+getflags(int fd, int p)
{
int c, f;
- if (!all && (sh_fd(fd) != NULL || saved_redirected_fd(fd) != NULL)) {
+ if (sh_fd(fd) != NULL || saved_redirected_fd(fd) != NULL) {
if (!p)
return -1;
error("Can't get status for fd=%d (%s)", fd, strerror(EBADF));
@@ -977,7 +903,7 @@ getflags(int fd, int p, int all)
static void
printone(int fd, int p, int verbose, int pfd)
{
- int f = getflags(fd, p, verbose > 1);
+ int f = getflags(fd, p);
const struct flgnames *fn;
if (f == -1)
@@ -1039,7 +965,7 @@ parseflags(char *s, int *p, int *n)
static void
setone(int fd, int pos, int neg, int verbose)
{
- int f = getflags(fd, 1, 0);
+ int f = getflags(fd, 1);
int n, cloexec;
if (f == -1)
@@ -1051,9 +977,7 @@ setone(int fd, int pos, int neg, int ver
if ((neg & O_CLOEXEC) && (f & O_CLOEXEC))
cloexec = 0;
- /* Don't allow O_CLOEXEC on stdin, stdout, or stderr */
- if ((cloexec > 0 && fd <= 2 && (errno = EINVAL)) ||
- (cloexec != -1 && fcntl(fd, F_SETFD, (fcntl_int) cloexec) == -1))
+ if (cloexec != -1 && fcntl(fd, F_SETFD, cloexec) == -1)
error("Can't set status for fd=%d (%s)", fd, strerror(errno));
pos &= ~O_CLOEXEC;
@@ -1062,7 +986,7 @@ setone(int fd, int pos, int neg, int ver
n = f;
n |= pos;
n &= ~neg;
- if (n != f && fcntl(fd, F_SETFL, (fcntl_int)n) == -1)
+ if (n != f && fcntl(fd, F_SETFL, n) == -1)
error("Can't set flags for fd=%d (%s)", fd, strerror(errno));
if (verbose)
printone(fd, 1, verbose, 1);
@@ -1076,17 +1000,8 @@ fdflagscmd(int argc, char *argv[])
char *setflags = NULL;
optreset = 1; optind = 1; /* initialize getopt */
- while ((ch = getopt(argc, argv, ":vs:"
-#ifdef DEBUG
- "V"
-#endif
- )) != -1)
+ while ((ch = getopt(argc, argv, ":vs:")) != -1)
switch ((char)ch) {
-#ifdef DEBUG
- case 'V':
- verbose = 2;
- break;
-#endif
case 'v':
verbose = 1;
break;
@@ -1115,9 +1030,6 @@ fdflagscmd(int argc, char *argv[])
for (i = 0; i <= max_user_fd; i++)
printone(i, 0, verbose, 1);
- if (verbose > 1)
- while (i <= biggest_sh_fd)
- printone(i++, 0, verbose, 1);
} else while ((num = *argv++) != NULL) {
int fd = number(num);
Index: src/bin/sh/redir.h
diff -u src/bin/sh/redir.h:1.27 src/bin/sh/redir.h:1.28
--- src/bin/sh/redir.h:1.27 Sun Nov 10 01:22:24 2024
+++ src/bin/sh/redir.h Sun Nov 10 09:06:24 2024
@@ -1,4 +1,4 @@
-/* $NetBSD: redir.h,v 1.27 2024/11/10 01:22:24 kre Exp $ */
+/* $NetBSD: redir.h,v 1.28 2024/11/10 09:06:24 kre Exp $ */
/*-
* Copyright (c) 1991, 1993
@@ -40,14 +40,9 @@
#define REDIR_VFORK 0x04 /* running under vfork(2), be careful */
#define REDIR_KEEP 0x08 /* don't close-on-exec */
-/* flags passed to popredir and free_rl */
-#define POPREDIR_DISCARD 0 /* just abandon everything */
-#define POPREDIR_UNDO 1 /* undo saved redirects */
-#define POPREDIR_PERMANENT 2 /* keep renamed fd, close saving fd */
-
union node;
void redirect(union node *, int);
-void popredir(int);
+void popredir(void);
int fd0_redirected_p(void);
void clearredir(int);
int movefd(int, int);
Index: src/bin/sh/sh.1
diff -u src/bin/sh/sh.1:1.268 src/bin/sh/sh.1:1.269
--- src/bin/sh/sh.1:1.268 Sun Nov 10 01:22:24 2024
+++ src/bin/sh/sh.1 Sun Nov 10 09:06:24 2024
@@ -1,4 +1,4 @@
-.\" $NetBSD: sh.1,v 1.268 2024/11/10 01:22:24 kre Exp $
+.\" $NetBSD: sh.1,v 1.269 2024/11/10 09:06:24 kre Exp $
.\" Copyright (c) 1991, 1993
.\" The Regents of the University of California. All rights reserved.
.\"
@@ -31,7 +31,7 @@
.\"
.\" @(#)sh.1 8.6 (Berkeley) 5/4/95
.\"
-.Dd November 9, 2024
+.Dd October 14, 2024
.Dt SH 1
.\" everything except c o and s (keep them ordered)
.ds flags abCEeFfhIiLlmnpqruVvXx
@@ -381,7 +381,7 @@ or if it is a pipeline (or simple comman
.Dq \&!
operator.
With pipelines, only the status of the entire pipeline
-(usually generated by the last command it contains)
+(indicated by the last command it contains)
is tested when
.Fl e
is set to determine if the shell should exit.
@@ -640,7 +640,7 @@ opened using the
.Ic exec
built-in command are passed on to utilities executed
.Dq ( yes
-in posix mode, though the POSIX standard does not actually require this),
+in posix mode),
whether a colon (:) terminates the user name in tilde (~) expansions
other than in assignment statements
.Dq ( no
@@ -2771,18 +2771,11 @@ Any redirections on the
.Ic exec
command are marked as permanent, so that they are not undone when the
.Ic exec
-command finishes, which only happens if no
-.Ar command
-was given.
-.Pp
+command finishes.
When the
.Cm posix
option is not set,
-file descriptors created via such redirections,
-when no
-.Ar command
-is present,
-are marked close-on-exec
+file descriptors created via such redirections are marked close-on-exec
(see
.Xr open 2
.Dv O_CLOEXEC
@@ -2794,8 +2787,7 @@ unless the descriptors refer to the stan
output, or error (file descriptors 0, 1, 2).
Traditionally Bourne-like shells
(except
-.Xr ksh 1
-and its close relatives),
+.Xr ksh 1 ) ,
made those file descriptors available to exec'ed processes.
To be assured the close-on-exec setting is off,
redirect the descriptor to (or from) itself,
@@ -2806,30 +2798,11 @@ or by using
.Ic exec
.No as opened it, after the open Pc
to leave the descriptor open in the shell
-and also pass it to all commands invoked subsequently.
+and pass it to all commands invoked subsequently.
Alternatively, see the
.Ic fdflags
-built-in command below, which can set, or clear, this, and other,
+command below, which can set, or clear, this, and other,
file descriptor flags.
-.Pp
-If there is a usage, or redirection, error,
-.Ic exec
-will not exit from an interactive shell,
-but will restore all modified file descriptors
-to the state they had before the
-.Ic exec
-command was issued.
-But note that side effects of any redirections that
-succeeded, such as creating or truncating files, cannot
-be reversed.
-However if a
-.Ar command
-cannot be executed for any reason, even an
-interactive shell will exit.
-Non-interactive shells will exit on any error,
-as
-.Ic exec
-is a special built-in utility.
.\"
.Pp
.It Ic exit Op Ar exitstatus
@@ -3103,10 +3076,6 @@ and
.Cm cloexec .
Unique abbreviations of these names, of at least 2 characters,
may be used on input.
-It is not permitted to set
-.Cm cloexec
-on file descriptors 0, 1, or 2
-.Pq standard input , standard output , and standard error .
See
.Xr fcntl 2
and
Index: src/bin/sh/show.c
diff -u src/bin/sh/show.c:1.57 src/bin/sh/show.c:1.58
--- src/bin/sh/show.c:1.57 Sun Nov 10 01:22:24 2024
+++ src/bin/sh/show.c Sun Nov 10 09:06:24 2024
@@ -1,4 +1,4 @@
-/* $NetBSD: show.c,v 1.57 2024/11/10 01:22:24 kre Exp $ */
+/* $NetBSD: show.c,v 1.58 2024/11/10 09:06:24 kre Exp $ */
/*-
* Copyright (c) 1991, 1993
@@ -39,7 +39,7 @@
#if 0
static char sccsid[] = "@(#)show.c 8.3 (Berkeley) 5/4/95";
#else
-__RCSID("$NetBSD: show.c,v 1.57 2024/11/10 01:22:24 kre Exp $");
+__RCSID("$NetBSD: show.c,v 1.58 2024/11/10 09:06:24 kre Exp $");
#endif
#endif /* not lint */
@@ -163,7 +163,7 @@ opentrace(void)
*/
if (tracefile)
(void) fclose(tracefile); /* also closes tfd */
- tracefile = fdopen(fd, "ae"); /* don't care if it is NULL */
+ tracefile = fdopen(fd, "a"); /* don't care if it is NULL */
if (tracefile) /* except here... */
setlinebuf(tracefile);