URI: 
       reverted have*fork.c to erik's unlimited allocation to work better together with werc posts - 9base - revived minimalist port of Plan 9 userland to Unix
  HTML git clone git://git.suckless.org/9base
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit 0ad0bc437baae7672db4a3975d5b8c716202939c
   DIR parent 38702511c5203e487776932e6ebdb1c0a9e80a67
  HTML Author: Anselm R Garbe <anselm@garbe.us>
       Date:   Wed,  5 Jan 2011 08:33:42 +0000
       
       reverted have*fork.c to erik's unlimited allocation to work better together with werc posts
       Diffstat:
         M config.mk                           |       2 +-
         M rc/havefork.c                       |      72 +++++++++++++------------------
         M rc/haventfork.c                     |      38 +++++++++++++++++++++++--------
       
       3 files changed, 59 insertions(+), 53 deletions(-)
       ---
   DIR diff --git a/config.mk b/config.mk
       @@ -4,7 +4,7 @@
        PREFIX      = /usr/local/plan9
        MANPREFIX   = ${PREFIX}/share/man
        
       -VERSION     = 6
       +VERSION     = 7
        OBJTYPE     = 386
        #OBJTYPE     = arm
        #OBJTYPE     = x86_64
   DIR diff --git a/rc/havefork.c b/rc/havefork.c
       @@ -1,9 +1,3 @@
       -#include <u.h>
       -#include <signal.h>
       -#if defined(PLAN9PORT) && defined(__sun__)
       -#        define BSD_COMP        /* sigh.  for TIOCNOTTY */
       -#endif
       -#include <sys/ioctl.h>
        #include "rc.h"
        #include "getflags.h"
        #include "exec.h"
       @@ -16,7 +10,6 @@ void
        Xasync(void)
        {
                int null = open("/dev/null", 0);
       -        int tty;
                int pid;
                char npid[10];
                if(null<0){
       @@ -30,33 +23,7 @@ Xasync(void)
                        break;
                case 0:
                        clearwaitpids();
       -                /*
       -                 * I don't know what the right thing to do here is,
       -                 * so this is all experimentally determined.
       -                 * If we just dup /dev/null onto 0, then running
       -                 * ssh foo & will reopen /dev/tty, try to read a password,
       -                 * get a signal, and repeat, in a tight loop, forever.
       -                 * Arguably this is a bug in ssh (it behaves the same
       -                 * way under bash as under rc) but I'm fixing it here 
       -                 * anyway.  If we dissociate the process from the tty,
       -                 * then it won't be able to open /dev/tty ever again.
       -                 * The SIG_IGN on SIGTTOU makes writing the tty
       -                 * (via fd 1 or 2, for example) succeed even though 
       -                 * our pgrp is not the terminal's controlling pgrp.
       -                 */
       -                if((tty = open("/dev/tty", OREAD)) >= 0){
       -                        /*
       -                         * Should make reads of tty fail, writes succeed.
       -                         */
       -                        signal(SIGTTIN, SIG_IGN);
       -                        signal(SIGTTOU, SIG_IGN);
       -                        ioctl(tty, TIOCNOTTY);
       -                        close(tty);
       -                }
       -                if(isatty(0))
       -                        pushredir(ROPEN, null, 0);
       -                else
       -                        close(null);
       +                pushredir(ROPEN, null, 0);
                        start(runq->code, runq->pc+1, runq->local);
                        runq->ret = 0;
                        break;
       @@ -104,21 +71,31 @@ Xpipe(void)
                }
        }
        
       +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;
       +}
       +
        /*
         * Who should wait for the exit from the fork?
         */
       +enum { Stralloc = 100, };
       +
        void
        Xbackq(void)
        {
       -        char wd[8193];
       -        int c;
       -        char *s, *ewd=&wd[8192], *stop;
       +        int c, l, pid;
       +        int pfd[2];
       +        char *s, *wd, *ewd, *stop;
                struct io *f;
                var *ifs = vlook("ifs");
                word *v, *nextv;
       -        int pfd[2];
       -        int pid;
       -        stop = ifs->val?ifs->val->word:"";
       +
       +        stop = ifs->val? ifs->val->word: "";
                if(pipe(pfd)<0){
                        Xerror("can't make pipe");
                        return;
       @@ -139,10 +116,16 @@ Xbackq(void)
                        addwaitpid(pid);
                        close(pfd[PWR]);
                        f = openfd(pfd[PRD]);
       -                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);
       @@ -155,6 +138,8 @@ Xbackq(void)
                                *s='\0';
                                v = newword(wd, v);
                        }
       +                if(wd)
       +                        efree(wd);
                        closeio(f);
                        Waitfor(pid, 0);
                        /* v points to reversed arglist -- reverse it onto argv */
       @@ -254,4 +239,4 @@ execforkexec(void)
                }
                addwaitpid(pid);
                return pid;
       -}
       +}
       +\ No newline at end of file
   DIR diff --git a/rc/haventfork.c b/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 */
       @@ -190,7 +209,7 @@ execforkexec(void)
        
                for(path = searchpath(runq->argv->words->word);path;path = path->next){
                        nc = strlen(path->word);
       -                if(nc<sizeof(file)){
       +                if(nc < sizeof file - 1){        /* 1 for / */
                                strcpy(file, path->word);
                                if(file[0]){
                                        strcat(file, "/");
       @@ -208,4 +227,4 @@ execforkexec(void)
                }
                free(argv);
                return -1;
       -}
       +}
       +\ No newline at end of file