summaryrefslogtreecommitdiff
path: root/sys/src/cmd/rc/haventfork.c
diff options
context:
space:
mode:
authorstanley lieber <stanley.lieber@gmail.com>2011-04-04 20:22:56 +0000
committerstanley lieber <stanley.lieber@gmail.com>2011-04-04 20:22:56 +0000
commita504af8833847bf82de85c0516dafa8114079388 (patch)
tree886924a03f63cbf4bf193fba0b850ea858ccbbd7 /sys/src/cmd/rc/haventfork.c
parent7c6c5602ad9467681b2e7988e5d5eedfe7f4da5f (diff)
erik's patches to lift 8192 byte word size restriction
Diffstat (limited to 'sys/src/cmd/rc/haventfork.c')
-rw-r--r--sys/src/cmd/rc/haventfork.c35
1 files changed, 27 insertions, 8 deletions
diff --git a/sys/src/cmd/rc/haventfork.c b/sys/src/cmd/rc/haventfork.c
index a5464ba5b..914e85f8c 100644
--- a/sys/src/cmd/rc/haventfork.c
+++ b/sys/src/cmd/rc/haventfork.c
@@ -51,12 +51,23 @@ Xasync(void)
setvar("apid", newword(buf, (word *)0));
}
+char*
+erealloc(char *p, long n)
+{
+ p = realloc(p, n); /* botch, should be Realloc */
+ if(p==0)
+ panic("Can't realloc %d bytes\n", n);
+ return p;
+}
+
+enum { Stralloc = 100, };
+
void
Xbackq(void)
{
- char wd[8193], **argv;
- int c;
- char *s, *ewd=&wd[8192], *stop;
+ char **argv;
+ int c, l;
+ char *s, *wd, *ewd, *stop;
struct io *f;
var *ifs = vlook("ifs");
word *v, *nextv;
@@ -84,14 +95,20 @@ Xbackq(void)
}
f = openfd(pfd[0]);
- s = wd;
+ s = wd = ewd = 0;
v = 0;
while((c=rchr(f))!=EOF){
- if(strchr(stop, c) || s==ewd){
+ if(s==ewd){
+ l = s-wd;
+ wd = erealloc(wd, l+Stralloc);
+ ewd = wd+l+Stralloc-1;
+ s = wd+l;
+ }
+ if(strchr(stop, c)){
if(s!=wd){
*s='\0';
- v=newword(wd, v);
- s=wd;
+ v = newword(wd, v);
+ s = wd;
}
}
else *s++=c;
@@ -100,6 +117,8 @@ Xbackq(void)
*s='\0';
v=newword(wd, v);
}
+ if(wd)
+ efree(wd);
closeio(f);
Waitfor(pid, 1);
/* v points to reversed arglist -- reverse it onto argv */
@@ -208,4 +227,4 @@ execforkexec(void)
}
free(argv);
return -1;
-}
+} \ No newline at end of file