tVarious fixes. - plan9port - [fork] Plan 9 from user space
 (HTM) git clone git://src.adamsgaard.dk/plan9port
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 669250d159e93a6933afa4cd25f410af801515ec
 (DIR) parent 5a82f26e50fbfbb3090b4cf839decf012637a00e
 (HTM) Author: rsc <devnull@localhost>
       Date:   Wed,  3 Dec 2003 22:50:48 +0000
       
       Various fixes.
       
               B - fixed usage, DISPLAY :0 vs :0.0
               9term - fixed various terminal things
               rc - notice traps in Read
               _p9dir - only run disk code for disks
               dirread - getdirentries on FreeBSD and Linux
                       are different w.r.t. meaning of off.
               notify - set up so signals interrupt system calls
               bprint - use bfmt.
       
       Diffstat:
         M bin/B                               |       6 +++++-
         M include/bio.h                       |       4 +++-
         M src/cmd/9term/9term.c               |      67 ++++++++++++++++++++++---------
         M src/cmd/9term/FreeBSD.c             |       3 +--
         M src/cmd/rc/plan9ish.c               |      16 +++++++++++-----
         M src/lib9/_p9dir.c                   |      32 ++++++++++++++++++++++++++++++-
         M src/lib9/dirread.c                  |      11 ++---------
         M src/lib9/notify.c                   |      11 ++++++-----
         M src/libbio/bcat.c                   |       4 ++++
         M src/libbio/bprint.c                 |      28 ++++++++++------------------
         M src/libbio/mkfile                   |       5 +++--
       
       11 files changed, 124 insertions(+), 63 deletions(-)
       ---
 (DIR) diff --git a/bin/B b/bin/B
       t@@ -2,7 +2,7 @@
        
        if [ $# -eq 0 ]
        then
       -        echo 'usage: B cmd...' 2>&1
       +        echo 'usage: B file...' 2>&1
                exit 1
        fi
        
       t@@ -10,6 +10,10 @@ if [ "x$DISPLAY" = "x" ]
        then
                sam="/tmp/.sam.$USER"
        else
       +        if [ "$DISPLAY" = ":0" ]
       +        then
       +                DISPLAY=:0.0
       +        fi
                sam="/tmp/.sam.$USER.$DISPLAY"
        fi
        
 (DIR) diff --git a/include/bio.h b/include/bio.h
       t@@ -30,7 +30,7 @@ struct        Biobuf
                int        icount;                /* neg num of bytes at eob */
                int        ocount;                /* num of bytes at bob */
                int        rdline;                /* num of bytes after rdline */
       -        int        runesize;                /* num of bytes of last getrune */
       +        int        runesize;        /* num of bytes of last getrune */
                int        state;                /* r/w/inactive */
                int        fid;                /* open file */
                int        flag;                /* magic if malloc'ed */
       t@@ -59,6 +59,8 @@ struct        Biobuf
        
        int        Bbuffered(Biobuf*);
        Biobuf*        Bfdopen(int, int);
       +int        Bfmtinit(Fmt*, Biobuf*);
       +int        Bfmtflush(Fmt*);
        int        Bfildes(Biobuf*);
        int        Bflush(Biobuf*);
        int        Bgetc(Biobuf*);
 (DIR) diff --git a/src/cmd/9term/9term.c b/src/cmd/9term/9term.c
       t@@ -108,7 +108,6 @@ threadmain(int argc, char *argv[])
        
                draw(screen, screen->r, cols[BACK], nil, ZP);
                geom();
       -
                loop();
        }
        
       t@@ -118,7 +117,7 @@ hangupnote(void *a, char *msg)
                if(getpid() != mainpid)
                        noted(NDFLT);
                if(strcmp(msg, "hangup") == 0 && rcpid != 0){
       -                postnote(PNPROC, rcpid, "hangup");
       +                postnote(PNGROUP, rcpid, "hangup");
                        noted(NDFLT);
                }
                noted(NDFLT);
       t@@ -206,9 +205,13 @@ doreshape(void)
                scrdraw();
        }
        
       +struct winsize ows;
       +
        void
        geom(void)
        {
       +        struct winsize ws;
       +        Point p;
                Rectangle r;
        
                r = screen->r;
       t@@ -223,6 +226,18 @@ geom(void)
                t.f->maxtab = maxtab*stringwidth(font, "0");
                fill();
                updatesel();
       +
       +        p = stringsize(font, "0");
       +        if(p.x == 0 || p.y == 0)
       +                return;
       +
       +        ws.ws_row = Dy(r)/p.y;
       +        ws.ws_col = Dx(r)/p.x;
       +        ws.ws_xpixel = Dx(r);
       +        ws.ws_ypixel = Dy(r);
       +        if(ws.ws_row != ows.ws_row || ws.ws_col != ows.ws_col)
       +        if(ioctl(rcfd[0], TIOCSWINSZ, &ws) < 0)
       +                fprint(2, "ioctl: %r\n");
        }
        
        void
       t@@ -422,6 +437,7 @@ void
        key(Rune r)
        {
                char buf[1];
       +        uint sig;
        
                if(r == 0)
                        return;
       t@@ -472,12 +488,9 @@ key(Rune r)
                case 0x7F:        /* DEL: send interrupt */
                        t.qh = t.q0 = t.q1 = t.nr;
                        show(t.q0);
       -                buf[0] = 0x7f;
       -                if(write(rcfd[1], buf, 1) < 0)
       -                        exits(0);
       -                /* get rc to print prompt */
       -//                r = '\n';
       -//                paste(&r, 1, 1);
       +                sig = 2; /* SIGINT */
       +                if(ioctl(rcfd[0], TIOCSIG, &sig) < 0)
       +                        fprint(2, "sending interrupt: %r\n");
                        break;
                case 0x08:        /* ^H: erase character */
                case 0x15:        /* ^U: erase line */
       t@@ -543,7 +556,10 @@ consready(void)
                for(i=t.qh; i<t.nr; i++){
                        c = t.r[i];
                        if(c=='\n' || c=='\004')
       +{
       +fprint(2, "ready %d\n", c);
                                return 1;
       +}
                }
                return 0;
        }
       t@@ -561,6 +577,7 @@ consread(void)
        
                        n = sizeof(buf);
                        p = buf;
       +                c = 0;
                        while(n >= UTFmax && (t.qh<t.nr || t.nraw > 0)) {
                                if(t.qh == t.nr){
                                        width = runetochar(p, &t.raw[0]);
       t@@ -571,18 +588,17 @@ consread(void)
                                c = *p;
                                p += width;
                                n -= width;
       -                        if(!rawon && (c == '\n' || c == '\004')) {
       -                                if(c == '\004')
       -                                        p--;
       +                        if(!rawon && (c == '\n' || c == '\004'))
                                        break;
       -                        }
                        }
       -                if(n < UTFmax && t.qh<t.nr && t.r[t.qh]=='\004')
       -                        t.qh++;
       -                /* put in control-d when doing a zero length write */
       -                if(p == buf)
       -                        *p++ = '\004';
       -                if(write(rcfd[1], buf, p-buf) < 0)
       +                /* take out control-d when not doing a zero length write */
       +                n = p-buf;
       +                if(n > 1 && c == '\004')
       +{
       +fprint(2, "remove 004\n");
       +                        n--;
       +}
       +                if(write(rcfd[1], buf, n) < 0)
                                exits(0);
        /*                mallocstats(); */
                }
       t@@ -1138,19 +1154,32 @@ rcstart(int fd[2])
                argv[1] = "-i";
                argv[2] = 0;
        
       -        getpts(fd, slave);
       +        /*
       +         * fd0 is slave (tty), fd1 is master (pty)
       +         */
       +        fd[0] = fd[1] = -1;
       +        if(getpts(fd, slave) < 0)
       +                fprint(2, "getpts: %r\n");
       +
                switch(pid = fork()) {
                case 0:
                        putenv("TERM=9term");
                        close(fd[1]);
                        setsid();
       +        //        tcsetpgrp(0, pid);
                        sfd = open(slave, ORDWR);
       +                fprint(2, "slave %s\n", slave);
       +                if(sfd < 0)
       +                        fprint(2, "open %s: %r\n", slave);
       +                if(ioctl(sfd, TIOCSCTTY, 0) < 0)
       +                        fprint(2, "ioctl TIOCSCTTY: %r\n");
                //        ioctl(sfd, I_PUSH, "ptem");
                //        ioctl(sfd, I_PUSH, "ldterm");
                        dup(sfd, 0);
                        dup(sfd, 1);
                        dup(sfd, 2);
                        execvp(argv[0], argv);
       +                _exits("oops");
                        break;
                case -1:
                        fatal("proc failed: %r");
 (DIR) diff --git a/src/cmd/9term/FreeBSD.c b/src/cmd/9term/FreeBSD.c
       t@@ -13,6 +13,5 @@ getchildwd(int pid, char *wdir, int bufn)
        int
        getpts(int fd[], char *slave)
        {
       -        openpty(&fd[1], &fd[0], slave, 0, 0);
       -        return 0;
       +        return openpty(&fd[1], &fd[0], slave, 0, 0);
        }
 (DIR) diff --git a/src/cmd/rc/plan9ish.c b/src/cmd/rc/plan9ish.c
       t@@ -392,10 +392,12 @@ void
        notifyf(void *unused0, char *s)
        {
                int i;
       -        for(i=0;syssigname[i];i++) if(strncmp(s, syssigname[i], strlen(syssigname[i]))==0){
       -                if(strncmp(s, "sys: ", 5)!=0) interrupted=1;
       -                goto Out;
       -        }
       +        for(i=0;syssigname[i];i++)
       +                if(strncmp(s, syssigname[i], strlen(syssigname[i]))==0){
       +                        if(strncmp(s, "sys: ", 5)!=0) interrupted=1;
       +                        goto Out;
       +                }
       +
                pfmt(err, "rc: note: %s\n", s);
                noted(NDFLT);
                return;
       t@@ -423,7 +425,11 @@ long Write(int fd, char *buf, long cnt)
        }
        long Read(int fd, char *buf, long cnt)
        {
       -        return read(fd, buf, cnt);
       +        int i;
       +
       +        i = read(fd, buf, cnt);
       +        if(ntrap) dotrap();
       +        return i;
        }
        long Seek(int fd, long cnt, long whence)
        {
 (DIR) diff --git a/src/lib9/_p9dir.c b/src/lib9/_p9dir.c
       t@@ -10,6 +10,36 @@
        
        #if defined(__FreeBSD__)
        #include <sys/disklabel.h>
       +static int diskdev[] = {
       +        151,        /* aacd */
       +        116,        /* ad */
       +        157,        /* ar */
       +        118,        /* afd */
       +        133,        /* amrd */
       +        13,        /* da */
       +        102,        /* fla */
       +        109,        /* idad */
       +        95,        /* md */
       +        131,        /* mlxd */
       +        168,        /* pst */
       +        147,        /* twed */
       +        43,        /* vn */
       +        3,        /* wd */
       +        87,        /* wfd */
       +};
       +static int
       +isdisk(struct stat *st)
       +{
       +        int i, dev;
       +
       +        if(!S_ISCHR(st->st_mode))
       +                return 0;
       +        dev = major(st->st_rdev);
       +        for(i=0; i<nelem(diskdev); i++)
       +                if(diskdev[i] == dev)
       +                        return 1;
       +        return 0;
       +}
        #define _HAVEDISKLABEL
        #endif
        
       t@@ -108,7 +138,7 @@ _p9dir(struct stat *st, char *name, Dir *d, char **str, char *estr)
        
                        /* fetch real size for disks */
        #ifdef _HAVEDISKLABEL
       -                if(S_ISCHR(st->st_mode)){
       +                if(isdisk(st)){
                                int fd, n;
                                struct disklabel lab;
        
 (DIR) diff --git a/src/lib9/dirread.c b/src/lib9/dirread.c
       t@@ -10,7 +10,6 @@ extern int _p9dir(struct stat*, char*, Dir*, char**, char*);
        static int
        mygetdents(int fd, struct dirent *buf, int n)
        {
       -        ssize_t nn;
                off_t off;
        
                off = p9seek(fd, 0, 1);
       t@@ -23,14 +22,8 @@ mygetdents(int fd, struct dirent *buf, int n)
        static int
        mygetdents(int fd, struct dirent *buf, int n)
        {
       -        ssize_t nn;
                long off;
       -
       -        off = p9seek(fd, 0, 1);
       -        nn = getdirentries(fd, (void*)buf, n, &off);
       -        if(nn > 0)
       -                p9seek(fd, off, 0);
       -        return nn;
       +        return getdirentries(fd, (void*)buf, n, &off);
        }
        #elif defined(__sun__)
        static int
       t@@ -38,7 +31,7 @@ mygetdents(int fd, struct dirent *buf, int n)
        {
                return getdents(fd, (void*)buf, n);
        }
       -#endif        
       +#endif
        
        static int
        countde(char *p, int n)
 (DIR) diff --git a/src/lib9/notify.c b/src/lib9/notify.c
       t@@ -13,7 +13,7 @@ static int sigs[] = {
                SIGQUIT,
                SIGILL,
                SIGTRAP,
       -        SIGABRT,
       +/*        SIGABRT,        */
        #ifdef SIGEMT
                SIGEMT,
        #endif
       t@@ -63,16 +63,17 @@ int
        notify(void (*f)(void*, char*))
        {
                int i;
       -        void (*sf)(int);
       +        struct sigaction sa;
        
       +        memset(&sa, 0, sizeof sa);
                if(f == nil)
       -                sf = SIG_DFL;
       +                sa.sa_handler = SIG_DFL;
                else{
                        notifyf = f;
       -                sf = notifysigf;
       +                sa.sa_handler = notifysigf;
                }
                for(i=0; i<nelem(sigs); i++)
       -                signal(sigs[i], sf);
       +                sigaction(sigs[i], &sa, 0);
                return 0;
        }
        
 (DIR) diff --git a/src/libbio/bcat.c b/src/libbio/bcat.c
       t@@ -22,8 +22,12 @@ main(int argc, char **argv)
        {
                int i;
                Biobuf b, *bp;
       +        Fmt fmt;
        
                Binit(&bout, 1, O_WRONLY);
       +        Bfmtinit(&fmt, &bout);
       +        fmtprint(&fmt, "hello, world\n");
       +        Bfmtflush(&fmt);
        
                if(argc == 1){
                        Binit(&b, 0, O_RDONLY);
 (DIR) diff --git a/src/libbio/bprint.c b/src/libbio/bprint.c
       t@@ -4,25 +4,17 @@
        int
        Bprint(Biobuf *bp, char *fmt, ...)
        {
       -        va_list        ap;
       -        char *ip, *ep, *out;
       +        va_list args;
       +        Fmt f;
                int n;
        
       -        ep = (char*)bp->ebuf;
       -        ip = ep + bp->ocount;
       -        va_start(ap, fmt);
       -        out = vseprint(ip, ep, fmt, ap);
       -        va_end(ap);
       -        if(out == 0 || out >= ep-5) {
       -                Bflush(bp);
       -                ip = ep + bp->ocount;
       -                va_start(ap, fmt);
       -                out = vseprint(ip, ep, fmt, ap);
       -                va_end(ap);
       -                if(out >= ep-5)
       -                        return Beof;
       -        }
       -        n = out-ip;
       -        bp->ocount += n;
       +        if(Bfmtinit(&f, bp) < 0)
       +                return -1;
       +        va_start(args, fmt);
       +        f.args = args;
       +        n = dofmt(&f, fmt);
       +        va_end(args);
       +        if(n > 0 && Bfmtflush(&f) < 0)
       +                return -1;
                return n;
        }
 (DIR) diff --git a/src/libbio/mkfile b/src/libbio/mkfile
       t@@ -7,6 +7,7 @@ OFILES=\
                bbuffered.$O\
                bfildes.$O\
                bflush.$O\
       +        bfmt.$O\
                bgetc.$O\
                bgetd.$O\
                binit.$O\
       t@@ -26,6 +27,6 @@ HFILES=\
        
        <$PLAN9/src/mksyslib
        
       -bcat: bcat.$O $LIB
       -        $CC -o bcat bcat.$O -L$PLAN9/lib -lbio -lfmt -lutf
       +bcat: bcat.$O $PLAN9/lib/$LIB
       +        $LD -o bcat bcat.$O -lbio -lfmt -lutf