tclean up when finished. don't set PLAN9 don't set PLAN9 - 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 1b135a78054e05cd62dfa1a2606f93e3486f2b57
 (DIR) parent e15e6c08203eea8c32e95f42ad16c2aeb7fb65ba
 (HTM) Author: rsc <devnull@localhost>
       Date:   Mon, 19 Apr 2004 23:04:36 +0000
       
       clean up when finished.
       don't set PLAN9
       don't set PLAN9
       
       Diffstat:
         M src/cmd/factotum/mkfile             |       1 -
         M src/cmd/graph/graph.c               |       5 -----
         M src/cmd/graph/mkfile                |       1 -
         M src/cmd/grep/mkfile                 |       1 -
         M src/cmd/gzip/mkfile                 |       1 -
         M src/cmd/hoc/mkfile                  |       1 -
         M src/cmd/mk/mkfile                   |       1 -
         M src/cmd/plot/libplot/mkfile         |       1 -
         M src/cmd/plot/libplot/subr.c         |       1 +
         M src/cmd/plot/mkfile                 |       1 -
         M src/cmd/plumb/mkfile                |       1 -
         M src/cmd/rc/mkfile                   |       1 -
         M src/cmd/rio/mkfile                  |       1 -
         M src/cmd/sam/mkfile                  |       1 -
         M src/cmd/samterm/mkfile              |       1 -
         M src/cmd/spell/mkfile                |       1 -
         M src/cmd/vac/mkfile                  |       1 -
         M src/cmd/venti/mkfile                |       1 -
         M src/lib9/fmt/mkfile                 |       1 -
         M src/lib9/mkfile                     |       1 -
         M src/lib9/utf/mkfile                 |       1 -
         M src/lib9p/mkfile                    |       1 -
         M src/libString/mkfile                |       1 -
         M src/libString/s_parse.c             |       1 +
         M src/libbin/mkfile                   |       1 -
         M src/libbio/mkfile                   |       1 -
         M src/libcomplete/mkfile              |       1 -
         M src/libdraw/chan.c                  |       7 -------
         M src/libdraw/mkfile                  |       1 -
         M src/libflate/mkfile                 |       1 -
         M src/libframe/mkfile                 |       1 -
         M src/libfs/mkfile                    |       1 -
         M src/libhttpd/mkfile                 |       1 -
         M src/libip/mkfile                    |       1 -
         M src/libmach/FreeBSD.c               |     293 ++++++++++++++++++++++++++++++-
         M src/libmach/mkfile                  |       8 ++++++++
         M src/libmp/mkfile                    |       1 -
         M src/libmp/port/mkfile               |       1 -
         M src/libmux/mkfile                   |       1 -
         M src/libplumb/mkfile                 |       1 -
         M src/libregexp/mkfile                |       1 -
         M src/libsec/mkfile                   |       1 -
         M src/libsec/port/mkfile              |       1 -
         M src/libthread/mkfile                |       1 -
         M src/libventi/mkfile                 |       1 -
       
       45 files changed, 294 insertions(+), 60 deletions(-)
       ---
 (DIR) diff --git a/src/cmd/factotum/mkfile b/src/cmd/factotum/mkfile
       t@@ -1,4 +1,3 @@
       -PLAN9=../../..
        <$PLAN9/src/mkhdr
        
        TARG=factotum
 (DIR) diff --git a/src/cmd/graph/graph.c b/src/cmd/graph/graph.c
       t@@ -244,11 +244,6 @@ void limread(struct xy *p, int *argcp, char ***argvp){
        }
        
        int
       -isdigit(char c){
       -        return '0'<=c && c<='9';
       -}
       -
       -int
        numb(float *np, int *argcp, char ***argvp){
                char c;
        
 (DIR) diff --git a/src/cmd/graph/mkfile b/src/cmd/graph/mkfile
       t@@ -1,4 +1,3 @@
       -PLAN9=../../..
        <$PLAN9/src/mkhdr
        
        TARG=graph
 (DIR) diff --git a/src/cmd/grep/mkfile b/src/cmd/grep/mkfile
       t@@ -1,4 +1,3 @@
       -PLAN9=../../..
        <$PLAN9/src/mkhdr
        
        # Calling this grep breaks a LOT.  Like egrep on Linux.
 (DIR) diff --git a/src/cmd/gzip/mkfile b/src/cmd/gzip/mkfile
       t@@ -1,4 +1,3 @@
       -PLAN9=../../..
        <$PLAN9/src/mkhdr
        
        HFILES=\
 (DIR) diff --git a/src/cmd/hoc/mkfile b/src/cmd/hoc/mkfile
       t@@ -1,4 +1,3 @@
       -PLAN9=../../..
        <$PLAN9/src/mkhdr
        
        TARG=hoc
 (DIR) diff --git a/src/cmd/mk/mkfile b/src/cmd/mk/mkfile
       t@@ -1,4 +1,3 @@
       -PLAN9=../../..
        <$PLAN9/src/mkhdr
        
        TARG=mk
 (DIR) diff --git a/src/cmd/plot/libplot/mkfile b/src/cmd/plot/libplot/mkfile
       t@@ -1,4 +1,3 @@
       -PLAN9=../../../..
        <$PLAN9/src/mkhdr
        
        LIB=../libplot.a
 (DIR) diff --git a/src/cmd/plot/libplot/subr.c b/src/cmd/plot/libplot/subr.c
       t@@ -11,6 +11,7 @@ struct penvir  E[9] = {
        { 0., 1024., 0., 0., 1., -1.,1024., -1024., 0., 0., pSMALL, 1., 1, 0.,1, DBlack, DWhite}
        };
        struct penvir *e0 = E, *e1 = &E[1], *esave;
       +int
        bcolor(char *s){
                int c;
                while (*s != NULL) {
 (DIR) diff --git a/src/cmd/plot/mkfile b/src/cmd/plot/mkfile
       t@@ -1,4 +1,3 @@
       -PLAN9=../../..
        <$PLAN9/src/mkhdr
        
        TARG=plot
 (DIR) diff --git a/src/cmd/plumb/mkfile b/src/cmd/plumb/mkfile
       t@@ -1,4 +1,3 @@
       -PLAN9=../../..
        <$PLAN9/src/mkhdr
        
        TARG=plumber plumb
 (DIR) diff --git a/src/cmd/rc/mkfile b/src/cmd/rc/mkfile
       t@@ -1,4 +1,3 @@
       -PLAN9=../../..
        <$PLAN9/src/mkhdr
        YACC=yacc -d
        
 (DIR) diff --git a/src/cmd/rio/mkfile b/src/cmd/rio/mkfile
       t@@ -1,4 +1,3 @@
       -PLAN9=../../..
        <$PLAN9/src/mkhdr
        
        OFILES=\
 (DIR) diff --git a/src/cmd/sam/mkfile b/src/cmd/sam/mkfile
       t@@ -1,4 +1,3 @@
       -PLAN9=../../..
        <$PLAN9/src/mkhdr
        
        TARG=sam
 (DIR) diff --git a/src/cmd/samterm/mkfile b/src/cmd/samterm/mkfile
       t@@ -1,4 +1,3 @@
       -PLAN9=../../..
        <$PLAN9/src/mkhdr
        
        TARG=samterm
 (DIR) diff --git a/src/cmd/spell/mkfile b/src/cmd/spell/mkfile
       t@@ -1,4 +1,3 @@
       -PLAN9=../../..
        <$PLAN9/src/mkhdr
        
        TARG=sprog
 (DIR) diff --git a/src/cmd/vac/mkfile b/src/cmd/vac/mkfile
       t@@ -1,4 +1,3 @@
       -PLAN9=../../..
        <$PLAN9/src/mkhdr
        
        LIBFILES=\
 (DIR) diff --git a/src/cmd/venti/mkfile b/src/cmd/venti/mkfile
       t@@ -1,4 +1,3 @@
       -PLAN9=../../..
        <$PLAN9/src/mkhdr
        
        LIBOFILES=\
 (DIR) diff --git a/src/lib9/fmt/mkfile b/src/lib9/fmt/mkfile
       t@@ -1,4 +1,3 @@
       -PLAN9=../..
        <$PLAN9/src/mkhdr
        
        LIB=libfmt.a
 (DIR) diff --git a/src/lib9/mkfile b/src/lib9/mkfile
       t@@ -1,4 +1,3 @@
       -PLAN9=../..
        <$PLAN9/src/mkhdr
        
        LIB=lib9.a
 (DIR) diff --git a/src/lib9/utf/mkfile b/src/lib9/utf/mkfile
       t@@ -1,4 +1,3 @@
       -PLAN9=../..
        <$PLAN9/src/mkhdr
        
        LIB=libutf.a
 (DIR) diff --git a/src/lib9p/mkfile b/src/lib9p/mkfile
       t@@ -1,4 +1,3 @@
       -PLAN9=../..
        <$PLAN9/src/mkhdr
        
        LIB=lib9p.a
 (DIR) diff --git a/src/libString/mkfile b/src/libString/mkfile
       t@@ -1,4 +1,3 @@
       -PLAN9=../..
        <$PLAN9/src/mkhdr
        
        LIB=libString.a
 (DIR) diff --git a/src/libString/s_parse.c b/src/libString/s_parse.c
       t@@ -2,6 +2,7 @@
        #include <libc.h>
        #include "libString.h"
        
       +#undef isspace
        #define isspace(c) ((c)==' ' || (c)=='\t' || (c)=='\n')
        
        /* Get the next field from a String.  The field is delimited by white space,
 (DIR) diff --git a/src/libbin/mkfile b/src/libbin/mkfile
       t@@ -1,4 +1,3 @@
       -PLAN9=../..
        <$PLAN9/src/mkhdr
        
        LIB=libbin.a
 (DIR) diff --git a/src/libbio/mkfile b/src/libbio/mkfile
       t@@ -1,4 +1,3 @@
       -PLAN9=../..
        <$PLAN9/src/mkhdr
        
        LIB=libbio.a
 (DIR) diff --git a/src/libcomplete/mkfile b/src/libcomplete/mkfile
       t@@ -1,4 +1,3 @@
       -PLAN9=../..
        <$PLAN9/src/mkhdr
        
        LIB=libcomplete.a
 (DIR) diff --git a/src/libdraw/chan.c b/src/libdraw/chan.c
       t@@ -29,13 +29,6 @@ chantostr(char *buf, u32int cc)
                return buf;
        }
        
       -/* avoid pulling in ctype when using with drawterm etc. */
       -static int
       -isspace(char c)
       -{
       -        return c==' ' || c== '\t' || c=='\r' || c=='\n';
       -}
       -
        u32int
        strtochan(char *s)
        {
 (DIR) diff --git a/src/libdraw/mkfile b/src/libdraw/mkfile
       t@@ -1,4 +1,3 @@
       -PLAN9=../..
        <$PLAN9/src/mkhdr
        
        LIB=libdraw.a
 (DIR) diff --git a/src/libflate/mkfile b/src/libflate/mkfile
       t@@ -1,4 +1,3 @@
       -PLAN9=../..
        <$PLAN9/src/mkhdr
        
        LIB=libflate.a
 (DIR) diff --git a/src/libframe/mkfile b/src/libframe/mkfile
       t@@ -1,4 +1,3 @@
       -PLAN9=../..
        <$PLAN9/src/mkhdr
        
        LIB=libframe.a
 (DIR) diff --git a/src/libfs/mkfile b/src/libfs/mkfile
       t@@ -1,4 +1,3 @@
       -PLAN9=../..
        <$PLAN9/src/mkhdr
        
        LIB=libfs.a
 (DIR) diff --git a/src/libhttpd/mkfile b/src/libhttpd/mkfile
       t@@ -1,4 +1,3 @@
       -PLAN9=../..
        <$PLAN9/src/mkhdr
        
        LIB=libhttpd.a
 (DIR) diff --git a/src/libip/mkfile b/src/libip/mkfile
       t@@ -1,4 +1,3 @@
       -PLAN9=../..
        <$PLAN9/src/mkhdr
        
        LIB=libip.a
 (DIR) diff --git a/src/libmach/FreeBSD.c b/src/libmach/FreeBSD.c
       t@@ -1,43 +1,318 @@
        /*
       - * process interface for FreeBSD 
       + * process interface for FreeBSD
       + *
       + * we could be a little more careful about not using
       + * ptrace unless absolutely necessary.  this would let us
       + * look at processes without stopping them.
       + *
       + * I'd like to make this a bit more generic (there's too much
       + * duplication with Linux and presumably other systems),
       + * but ptrace is too damn system-specific.
         */
        
        #include <u.h>
        #include <sys/ptrace.h>
        #include <sys/types.h>
        #include <sys/wait.h>
       +#include <machine/reg.h>
        #include <signal.h>
        #include <errno.h>
        #include <libc.h>
        #include <mach.h>
        #include "ureg386.h"
        
       +Mach *machcpu = &mach386;
       +
       +typedef struct PtraceRegs PtraceRegs;
       +struct PtraceRegs
       +{
       +        Regs r;
       +        int pid;
       +};
       +
       +static int ptracerw(Map*, Seg*, ulong, void*, uint, int);
       +static int ptraceregrw(Regs*, char*, ulong*, int);
       +
        void
       -unmapproc(Map*)
       +unmapproc(Map *map)
        {
       +        int i;
       +
       +        if(map == nil)
       +                return;
       +        for(i=0; i<map->nseg; i++)
       +                while(i<map->nseg && map->seg[i].pid){
       +                        map->nseg--;
       +                        memmove(&map->seg[i], &map->seg[i+1], 
       +                                (map->nseg-i)*sizeof(map->seg[0]));
       +                }
        }
        
        int
       -mapproc(int, Map*, Regs**)
       +mapproc(int pid, Map *map, Regs **rp)
        {
       +        Seg s;
       +        PtraceRegs *r;
       +
       +        if(ptrace(PT_ATTACH, pid, 0, 0) < 0)
       +        if(ptrace(PT_READ_I, pid, 0, 0)<0 && errno!=EINVAL)
       +        if(ptrace(PT_ATTACH, pid, 0, 0) < 0){
       +                werrstr("ptrace attach %d: %r", pid);
       +                return -1;
       +        }
       +
       +        if(ctlproc(pid, "waitanyway") < 0){
       +                ptrace(PT_DETACH, pid, 0, 0);
       +                return -1;
       +        }
       +
       +        memset(&s, 0, sizeof s);
       +        s.base = 0;
       +        s.size = 0xFFFFFFFF;
       +        s.offset = 0;
       +        s.name = "data";
       +        s.file = nil;
       +        s.rw = ptracerw;
       +        s.pid = pid;
       +        if(addseg(map, s) < 0)
       +                return -1;
       +
       +        if((r = mallocz(sizeof(PtraceRegs), 1)) == nil)
       +                return -1;
       +        r->r.rw = ptraceregrw;
       +        r->pid = pid;
       +        *rp = (Regs*)r;
       +        return 0;
        }
        
        int
       -detachproc(int)
       +detachproc(int pid)
        {
       +        return ptrace(PT_DETACH, pid, 0, 0);
        }
        
       -int
       -procnotes(int, char***)
       +static int
       +ptracerw(Map *map, Seg *seg, ulong addr, void *v, uint n, int isr)
        {
       +        int i;
       +        u32int u;
       +        uchar buf[4];
       +
       +        addr += seg->base;
       +        for(i=0; i<n; i+=4){
       +                if(isr){
       +                        errno = 0;
       +                        u = ptrace(PT_READ_D, seg->pid, (char*)addr+i, 0);
       +                        if(errno)
       +                                goto ptraceerr;
       +                        if(n-i >= 4)
       +                                *(u32int*)((char*)v+i) = u;
       +                        else{
       +                                *(u32int*)buf = u;
       +                                memmove((char*)v+i, buf, n-i);
       +                        }
       +                }else{
       +                        if(n-i >= 4)
       +                                u = *(u32int*)((char*)v+i);
       +                        else{
       +                                errno = 0;
       +                                u = ptrace(PT_READ_D, seg->pid, (char*)addr+i, 0);
       +                                if(errno)
       +                                        return -1;
       +                                *(u32int*)buf = u;
       +                                memmove(buf, (char*)v+i, n-i);
       +                                u = *(u32int*)buf;
       +                        }
       +                        if(ptrace(PT_WRITE_D, seg->pid, (char*)addr+i, u) < 0)
       +                                goto ptraceerr;
       +                }
       +        }
       +        return 0;
       +
       +ptraceerr:
       +        werrstr("ptrace: %r");
       +        return -1;
        }
        
       -int
       -ctlproc(int, char*)
       +static char *freebsdregs[] = {
       +        "FS",
       +        "ES",
       +        "DS",
       +        "DI",
       +        "SI",
       +        "BP",
       +        "SP",
       +        "BX",
       +        "DX",
       +        "CX",
       +        "AX",
       +        "TRAP",
       +        "PC",
       +        "CS",
       +        "EFLAGS",
       +        "SP",
       +        "SS",
       +        "GS",
       +};
       +
       +static ulong
       +reg2freebsd(char *reg)
       +{
       +        int i;
       +
       +        for(i=0; i<nelem(freebsdregs); i++)
       +                if(strcmp(freebsdregs[i], reg) == 0)
       +                        return 4*i;
       +        return ~(ulong)0;
       +}
       +
       +static int
       +ptraceregrw(Regs *regs, char *name, ulong *val, int isr)
        {
       +        int pid;
       +        ulong addr;
       +        struct reg mregs;
       +
       +        addr = reg2freebsd(name);
       +        if(~addr == 0){
       +                if(isr){
       +                        *val = ~(ulong)0;
       +                        return 0;
       +                }
       +                werrstr("register not available");
       +                return -1;
       +        }
       +
       +        pid = ((PtraceRegs*)regs)->pid;
       +        if(ptrace(PT_GETREGS, pid, (char*)&mregs, 0) < 0)
       +                return -1;
       +        if(isr)
       +                *val = *(u32int*)((char*)&mregs+addr);
       +        else{
       +                *(u32int*)((char*)&mregs+addr) = *val;
       +                if(ptrace(PT_SETREGS, pid, (char*)&mregs, 0) < 0)
       +                        return -1;
       +        }
       +        return 0;
        }
        
        char*
       -proctextfile(int)
       +proctextfile(int pid)
        {
       +        static char buf[1024], pbuf[128];
       +
       +        snprint(pbuf, sizeof pbuf, "/proc/%d/file", pid);
       +        if(readlink(pbuf, buf, sizeof buf) >= 0)
       +                return buf;
       +        if(access(pbuf, AEXIST) >= 0)
       +                return pbuf;
       +        return nil;
       +}
       +
       +/*
       +
       +  status  The process status.  This file is read-only and returns a single
       +             line containing multiple space-separated fields as follows:
       +
       +             o         command name
       +             o         process id
       +             o         parent process id
       +             o         process group id
       +             o         session id
       +             o         major,minor of the controlling terminal, or -1,-1 if there is
       +                 no controlling terminal.
       +             o         a list of process flags: ctty if there is a controlling ter-
       +                 minal, sldr if the process is a session leader, noflags if
       +                 neither of the other two flags are set.
       +             o         the process start time in seconds and microseconds, comma
       +                 separated.
       +             o         the user time in seconds and microseconds, comma separated.
       +             o         the system time in seconds and microseconds, comma separated.
       +             o         the wait channel message
       +             o         the process credentials consisting of the effective user id
       +                 and the list of groups (whose first member is the effective
       +                 group id) all comma separated.
       +*/
       +
       +int
       +procnotes(int pid, char ***pnotes)
       +{
       +        /* figure out the set of pending notes - how? */
       +        *pnotes = nil;
       +        return 0;
       +}
       +
       +static int
       +isstopped(int pid)
       +{
       +        char buf[1024], *f[12];
       +        int fd, n, nf;
       +
       +        snprint(buf, sizeof buf, "/proc/%d/status", pid);
       +        if((fd = open(buf, OREAD)) < 0)
       +                return 0;
       +        n = read(fd, buf, sizeof buf-1);
       +        close(fd);
       +        if(n <= 0)
       +                return 0;
       +        buf[n] = 0;
       +
       +        if((nf = tokenize(buf, f, nelem(f))) < 11)
       +                return 0;
       +        if(strcmp(f[10], "nochan") == 0)
       +                return 1;
       +        return 0;
       +}
       +
       +#undef waitpid
       +
       +int
       +ctlproc(int pid, char *msg)
       +{
       +        int p, status;
       +
       +        if(strcmp(msg, "hang") == 0){
       +                if(pid == getpid())
       +                        return ptrace(PT_TRACE_ME, 0, 0, 0);
       +                werrstr("can only hang self");
       +                return -1;
       +        }
       +        if(strcmp(msg, "kill") == 0)
       +                return ptrace(PT_KILL, pid, 0, 0);
       +        if(strcmp(msg, "startstop") == 0){
       +                if(ptrace(PT_CONTINUE, pid, 0, 0) < 0)
       +                        return -1;
       +                goto waitstop;
       +        }
       +/*
       +        if(strcmp(msg, "sysstop") == 0){
       +                if(ptrace(PTRACE_SYSCALL, pid, 0, 0) < 0)
       +                        return -1;
       +                goto waitstop;
       +        }
       +*/
       +        if(strcmp(msg, "stop") == 0){
       +                if(kill(pid, SIGSTOP) < 0)
       +                        return -1;
       +                goto waitstop;
       +        }
       +        if(strcmp(msg, "waitanyway") == 0)
       +                goto waitanyway;
       +        if(strcmp(msg, "waitstop") == 0){
       +        waitstop:
       +                if(isstopped(pid))
       +                        return 0;
       +        waitanyway:
       +                for(;;){
       +                        p = waitpid(pid, &status, WUNTRACED);
       +                        if(p <= 0)
       +                                return -1;
       +                        if(WIFEXITED(status) || WIFSTOPPED(status))
       +                                return 0;
       +                }
       +        }
       +        if(strcmp(msg, "start") == 0)
       +                return ptrace(PT_CONTINUE, pid, 0, 0);
       +        werrstr("unknown control message '%s'", msg);
       +        return -1;
        }
 (DIR) diff --git a/src/libmach/mkfile b/src/libmach/mkfile
       t@@ -56,3 +56,11 @@ dwarfdump: dwarfdump.o $LIBDIR/$LIB
        
        nm: nm.o $LIBDIR/$LIB
                $LD -o $target $prereq -l9
       +
       +Linux.$O: ptrace.c
       +FreeBSD.$O: ptrace.c
       +SunOS.$O: nosys.c
       +Darwin.$O: nosys.c
       +OpenBSD.$O: nosys.c
       +NetBSD.$O: nosys.c
       +
 (DIR) diff --git a/src/libmp/mkfile b/src/libmp/mkfile
       t@@ -1,4 +1,3 @@
       -PLAN9=../..
        <$PLAN9/src/mkhdr
        
        DIRS=\
 (DIR) diff --git a/src/libmp/port/mkfile b/src/libmp/port/mkfile
       t@@ -1,4 +1,3 @@
       -PLAN9=../../..
        <$PLAN9/src/mkhdr
        
        LIB=libmp.a
 (DIR) diff --git a/src/libmux/mkfile b/src/libmux/mkfile
       t@@ -1,4 +1,3 @@
       -PLAN9=../..
        <$PLAN9/src/mkhdr
        
        LIB=libmux.a
 (DIR) diff --git a/src/libplumb/mkfile b/src/libplumb/mkfile
       t@@ -1,4 +1,3 @@
       -PLAN9=../..
        <$PLAN9/src/mkhdr
        
        LIB=libplumb.a
 (DIR) diff --git a/src/libregexp/mkfile b/src/libregexp/mkfile
       t@@ -1,4 +1,3 @@
       -PLAN9=../..
        <$PLAN9/src/mkhdr
        
        LIB=libregexp9.a
 (DIR) diff --git a/src/libsec/mkfile b/src/libsec/mkfile
       t@@ -1,4 +1,3 @@
       -PLAN9=../..
        <$PLAN9/src/mkhdr
        
        DIRS=\
 (DIR) diff --git a/src/libsec/port/mkfile b/src/libsec/port/mkfile
       t@@ -1,4 +1,3 @@
       -PLAN9=../../..
        <$PLAN9/src/mkhdr
        
        LIB=libsec.a
 (DIR) diff --git a/src/libthread/mkfile b/src/libthread/mkfile
       t@@ -1,4 +1,3 @@
       -PLAN9=../..
        <$PLAN9/src/mkhdr
        
        LIB=libthread.a
 (DIR) diff --git a/src/libventi/mkfile b/src/libventi/mkfile
       t@@ -1,4 +1,3 @@
       -PLAN9=../..
        <$PLAN9/src/mkhdr
        
        LIB=libventi.a