aboutsummaryrefslogtreecommitdiff
path: root/bin
diff options
context:
space:
mode:
authorJilles Tjoelker <jilles@FreeBSD.org>2017-05-16 21:54:51 +0000
committerJilles Tjoelker <jilles@FreeBSD.org>2017-05-16 21:54:51 +0000
commit5183ddf2ed56519b669320095ed00528a71a9393 (patch)
treed488776e26a534db8a0cf336c81229ce672f22c4 /bin
parent7a377fbeb1b2e2fcfb726d2c9fca568dbbc9c2be (diff)
Notes
Diffstat (limited to 'bin')
-rw-r--r--bin/sh/eval.c7
-rw-r--r--bin/sh/output.c17
-rw-r--r--bin/sh/output.h4
3 files changed, 15 insertions, 13 deletions
diff --git a/bin/sh/eval.c b/bin/sh/eval.c
index e09549295f66..f637cfab5fd9 100644
--- a/bin/sh/eval.c
+++ b/bin/sh/eval.c
@@ -1080,8 +1080,8 @@ evalcommand(union node *cmd, int flags, struct backcmd *backcmd)
#endif
mode = (cmdentry.u.index == EXECCMD)? 0 : REDIR_PUSH;
if (flags == EV_BACKCMD) {
- memout.nleft = 0;
memout.nextc = memout.buf;
+ memout.bufend = memout.buf;
memout.bufsize = 64;
mode |= REDIR_BACKQ;
}
@@ -1134,8 +1134,11 @@ cmddone:
exitshell(exitstatus);
if (flags == EV_BACKCMD) {
backcmd->buf = memout.buf;
- backcmd->nleft = memout.nextc - memout.buf;
+ backcmd->nleft = memout.buf != NULL ?
+ memout.nextc - memout.buf : 0;
memout.buf = NULL;
+ memout.nextc = NULL;
+ memout.bufend = NULL;
}
if (cmdentry.u.index != EXECCMD)
popredir();
diff --git a/bin/sh/output.c b/bin/sh/output.c
index 2f9fc925d88c..64d311f0c2d6 100644
--- a/bin/sh/output.c
+++ b/bin/sh/output.c
@@ -71,9 +71,9 @@ __FBSDID("$FreeBSD$");
static int doformat_wr(void *, const char *, int);
-struct output output = {NULL, 0, NULL, OUTBUFSIZ, 1, 0};
-struct output errout = {NULL, 0, NULL, 256, 2, 0};
-struct output memout = {NULL, 0, NULL, 0, MEM_OUT, 0};
+struct output output = {NULL, NULL, NULL, OUTBUFSIZ, 1, 0};
+struct output errout = {NULL, NULL, NULL, 256, 2, 0};
+struct output memout = {NULL, NULL, NULL, 0, MEM_OUT, 0};
struct output *out1 = &output;
struct output *out2 = &errout;
@@ -214,20 +214,19 @@ emptyoutbuf(struct output *dest)
INTOFF;
dest->buf = ckmalloc(dest->bufsize);
dest->nextc = dest->buf;
- dest->nleft = dest->bufsize;
+ dest->bufend = dest->buf + dest->bufsize;
INTON;
} else if (dest->fd == MEM_OUT) {
- offset = dest->bufsize;
+ offset = dest->nextc - dest->buf;
INTOFF;
dest->bufsize <<= 1;
dest->buf = ckrealloc(dest->buf, dest->bufsize);
- dest->nleft = dest->bufsize - offset;
+ dest->bufend = dest->buf + dest->bufsize;
dest->nextc = dest->buf + offset;
INTON;
} else {
flushout(dest);
}
- dest->nleft--;
}
@@ -248,7 +247,6 @@ flushout(struct output *dest)
if (xwrite(dest->fd, dest->buf, dest->nextc - dest->buf) < 0)
dest->flags |= OUTPUT_ERR;
dest->nextc = dest->buf;
- dest->nleft = dest->bufsize;
}
@@ -258,8 +256,9 @@ freestdout(void)
INTOFF;
if (output.buf) {
ckfree(output.buf);
+ output.nextc = NULL;
output.buf = NULL;
- output.nleft = 0;
+ output.bufend = NULL;
}
INTON;
}
diff --git a/bin/sh/output.h b/bin/sh/output.h
index 21cbba1efa58..f43a60cc2aaa 100644
--- a/bin/sh/output.h
+++ b/bin/sh/output.h
@@ -40,7 +40,7 @@
struct output {
char *nextc;
- int nleft;
+ char *bufend;
char *buf;
int bufsize;
short fd;
@@ -75,7 +75,7 @@ void fmtstr(char *, int, const char *, ...) __printflike(3, 4);
void doformat(struct output *, const char *, va_list) __printflike(2, 0);
int xwrite(int, const char *, int);
-#define outc(c, file) (--(file)->nleft < 0? (emptyoutbuf(file), *(file)->nextc++ = (c)) : (*(file)->nextc++ = (c)))
+#define outc(c, file) ((file)->nextc == (file)->bufend ? (emptyoutbuf(file), *(file)->nextc++ = (c)) : (*(file)->nextc++ = (c)))
#define out1c(c) outc(c, out1);
#define out2c(c) outcslow(c, out2);