Module Name:    src
Committed By:   kre
Date:           Mon Aug 13 22:13:02 UTC 2018

Modified Files:
        src/bin/sh: redir.c

Log Message:
NFC:  DEBUG (compile time) mode only change:
        Add some extra redirection (fd manipulation) tracing.
While here, some white space fixes, and very minor KNF.


To generate a diff of this commit:
cvs rdiff -u -r1.59 -r1.60 src/bin/sh/redir.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/redir.c
diff -u src/bin/sh/redir.c:1.59 src/bin/sh/redir.c:1.60
--- src/bin/sh/redir.c:1.59	Wed Nov 15 09:21:48 2017
+++ src/bin/sh/redir.c	Mon Aug 13 22:13:02 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: redir.c,v 1.59 2017/11/15 09:21:48 kre Exp $	*/
+/*	$NetBSD: redir.c,v 1.60 2018/08/13 22:13:02 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.59 2017/11/15 09:21:48 kre Exp $");
+__RCSID("$NetBSD: redir.c,v 1.60 2018/08/13 22:13:02 kre Exp $");
 #endif
 #endif /* not lint */
 
@@ -148,11 +148,17 @@ free_rl(struct redirtab *rt, int reset)
 		rn = rl->next;
 		if (rl->orig == 0)
 			fd0_redirected--;
+		VTRACE(DBG_REDIR, ("popredir %d%s: %s",
+		    rl->orig, rl->orig==0 ? " (STDIN)" : "",
+		    reset ? "" : "no reset\n"));
 		if (reset) {
-			if (rl->into < 0)
+			if (rl->into < 0) {
+				VTRACE(DBG_REDIR, ("closed\n"));
 				close(rl->orig);
-			else
+			} else {
+				VTRACE(DBG_REDIR, ("from %d\n", rl->into));
 				movefd(rl->into, rl->orig);
+			}
 		}
 		ckfree(rl);
 	}
@@ -162,6 +168,7 @@ free_rl(struct redirtab *rt, int reset)
 STATIC void
 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));
 
 	rl->next = rt->renamed;
@@ -188,11 +195,13 @@ redirect(union node *redir, int flags)
 	int fd;
 	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;
 	if (flags & REDIR_PUSH) {
-		/* We don't have to worry about REDIR_VFORK here, as
+		/*
+		 * We don't have to worry about REDIR_VFORK here, as
 		 * flags & REDIR_PUSH is never true if REDIR_VFORK is set.
 		 */
 		sv = ckmalloc(sizeof (struct redirtab));
@@ -202,6 +211,7 @@ redirect(union node *redir, int flags)
 	}
 	for (n = redir ; n ; n = n->nfile.next) {
 		fd = n->nfile.fd;
+		VTRACE(DBG_REDIR, ("redir %d (max=%d) ", fd, max_user_fd));
 		if (fd > max_user_fd)
 			max_user_fd = fd;
 		renumber_sh_fd(sh_fd(fd));
@@ -211,6 +221,7 @@ redirect(union node *redir, int flags)
 			/* make sure it stays open */
 			if (fcntl(fd, F_SETFD, 0) < 0)
 				error("fd %d: %s", fd, strerror(errno));
+			VTRACE(DBG_REDIR, ("!cloexec\n"));
 			continue;
 		}
 
@@ -240,8 +251,10 @@ redirect(union node *redir, int flags)
 			if (i >= 0)
 				(void)fcntl(i, F_SETFD, FD_CLOEXEC);
 			fd_rename(sv, fd, i);
+			VTRACE(DBG_REDIR, ("saved as %d ", i));
 			INTON;
 		}
+		VTRACE(DBG_REDIR, ("%s\n", fd == 0 ? "STDIN" : ""));
 		if (fd == 0)
 			fd0_redirected++;
 		openredirect(n, memory, flags);
@@ -307,6 +320,8 @@ openredirect(union node *redir, char mem
 				errno = EEXIST;
 				goto ecreate;
 			}
+			VTRACE(DBG_REDIR, ("openredirect(>| '%s') -> %d",
+			    fname, f));
 			break;
 		}
 		/* FALLTHROUGH */
@@ -343,8 +358,8 @@ openredirect(union node *redir, char mem
 		return;
 	case NHERE:
 	case NXHERE:
-		f = openhere(redir);
 		VTRACE(DBG_REDIR, ("openredirect: %d<<...", fd));
+		f = openhere(redir);
 		break;
 	default:
 		abort();
@@ -367,10 +382,10 @@ openredirect(union node *redir, char mem
 
 	INTON;
 	return;
-ecreate:
+ ecreate:
 	exerrno = 1;
 	error("cannot create %s: %s", fname, errmsg(errno, E_CREAT));
-eopen:
+ eopen:
 	exerrno = 1;
 	error("cannot open %s: %s", fname, errmsg(errno, E_OPEN));
 }
@@ -397,6 +412,7 @@ openhere(const union node *redir)
 			goto out;
 		}
 	}
+	VTRACE(DBG_REDIR, (" forking [%d,%d]\n", pip[0], pip[1]));
 	if (forkshell(NULL, NULL, FORK_NOJOB) == 0) {
 		close(pip[0]);
 		signal(SIGINT, SIG_IGN);
@@ -412,8 +428,10 @@ openhere(const union node *redir)
 			expandhere(redir->nhere.doc, pip[1]);
 		_exit(0);
 	}
-out:
+	VTRACE(DBG_REDIR, ("openhere (closing %d)", pip[1]));
+ out:
 	close(pip[1]);
+	VTRACE(DBG_REDIR, (" (pipe fd=%d)", pip[0]));
 	return pip[0];
 }
 
@@ -505,7 +523,7 @@ copyfd(int from, int to, int cloexec)
  * rename fd from to be fd to (closing from).
  * close-on-exec is never set on 'to' (unless
  * from==to and it was set on from) - ie: a no-op
- * returns to (or errors() if an error occurs).  
+ * returns to (or errors() if an error occurs).
  *
  * This is mostly used for rearranging the
  * results from pipe().
@@ -796,7 +814,7 @@ parseflags(char *s, int *p, int *n)
 		default:
 			error("Missing +/- indicator before flag %s", s-1);
 		}
-			
+
 		len = strlen(s);
 		for (fn = nv; fn->name; fn++)
 			if (len >= fn->minch && strncmp(s,fn->name,len) == 0) {

Reply via email to