summaryrefslogtreecommitdiff
path: root/glom.c
diff options
context:
space:
mode:
authorByron Rakitzis <byron@archone.tamu.edu>1994-03-07 00:00:01 +0000
committerToby Goodwin <toby@paccrat.org>2015-05-16 21:22:09 +0100
commita076248389c82276e079756bee26c011b03f70f2 (patch)
tree9d22c48c75bcd778f30cbb2e37b6dff6abb4f1d2 /glom.c
parent6bb38f6a01dbf4bbd584e038ceace0a00faa27bb (diff)
beta: rc-1.5betadev1
Diffstat (limited to 'glom.c')
-rw-r--r--glom.c20
1 files changed, 13 insertions, 7 deletions
diff --git a/glom.c b/glom.c
index a82183c..d0b1705 100644
--- a/glom.c
+++ b/glom.c
@@ -3,6 +3,7 @@
#include <sys/types.h>
#include <sys/stat.h>
#include <signal.h>
+#include <errno.h>
#include "rc.h"
#if !defined(S_IFIFO) && !defined(DEVFD)
#define NOCMDARG
@@ -68,11 +69,11 @@ extern List *concat(List *s1, List *s2) {
} else {
r->m = nalloc(z);
if (s1->m == NULL)
- clear(r->m, x);
+ memzero(r->m, x);
else
memcpy(r->m, s1->m, x);
if (s2->m == NULL)
- clear(&r->m[x], y);
+ memzero(&r->m[x], y);
else
memcpy(&r->m[x], s2->m, y);
r->m[z] = 0;
@@ -183,7 +184,7 @@ static List *bqinput(List *ifs, int fd) {
char isifs[256];
int n, state; /* a simple FSA is used to read in data */
- clear(isifs, sizeof isifs);
+ memzero(isifs, sizeof isifs);
for (isifs['\0'] = TRUE; ifs != NULL; ifs = ifs->n)
for (s = ifs->w; *s != '\0'; s++)
isifs[*(unsigned char *)s] = TRUE;
@@ -209,8 +210,12 @@ static List *bqinput(List *ifs, int fd) {
if ((n = rc_read(fd, end, remain)) <= 0) {
if (n == 0)
/* break */ break;
- uerror("backquote read");
- rc_error(NULL);
+ else if (errno == EINTR)
+ return NULL; /* interrupted, wait for subproc */
+ else {
+ uerror("backquote read");
+ rc_error(NULL);
+ }
}
remain -= n;
for (bufend = &end[n]; end < bufend; end++)
@@ -218,6 +223,7 @@ static List *bqinput(List *ifs, int fd) {
if (!isifs[*(unsigned char *)end]) {
state = 1;
r->w = end;
+ r->m = NULL;
}
} else {
if (isifs[*(unsigned char *)end]) {
@@ -252,7 +258,6 @@ static List *backq(Node *ifs, Node *n) {
rc_error(NULL);
}
if ((pid = rc_fork()) == 0) {
- setsigdefaults(FALSE);
mvfd(p[1], 1);
close(p[0]);
redirq = NULL;
@@ -264,7 +269,8 @@ static List *backq(Node *ifs, Node *n) {
close(p[0]);
rc_wait4(pid, &sp, TRUE);
statprint(-1, sp);
- SIGCHK;
+ varassign("bqstatus", word(strstatus(sp), NULL), FALSE);
+ sigchk();
return bq;
}