tNo more unrooted paths. - 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 9361131304f39db29b1bec59d881e585035ec93c
 (DIR) parent 6884e49f0c8240d40c82553fd60712a28f140ef3
 (HTM) Author: rsc <devnull@localhost>
       Date:   Fri, 16 Jun 2006 15:55:24 +0000
       
       No more unrooted paths.
       
       Diffstat:
         M src/cmd/acme/acme.c                 |       8 ++++++--
         M src/cmd/acme/look.c                 |      24 +++++++++++++++++++++++-
       
       2 files changed, 29 insertions(+), 3 deletions(-)
       ---
 (DIR) diff --git a/src/cmd/acme/acme.c b/src/cmd/acme/acme.c
       t@@ -276,11 +276,15 @@ readfile(Column *c, char *s)
        {
                Window *w;
                Rune rb[256];
       -        int nb, nr;
       +        int nr;
                Runestr rs;
        
                w = coladd(c, nil, nil, -1);
       -        cvttorunes(s, strlen(s), rb, &nb, &nr, nil);
       +        if(s[0] != '/')
       +                runesnprint(rb, sizeof rb, "%s/%s", wdir, s);
       +        else
       +                runesnprint(rb, sizeof rb, "%s", s);
       +        nr = runestrlen(rb);
                rs = cleanrname(runestr(rb, nr));
                winsetname(w, rs.r, rs.nr);
                textload(&w->body, 0, s, 1);
 (DIR) diff --git a/src/cmd/acme/look.c b/src/cmd/acme/look.c
       t@@ -696,6 +696,7 @@ openfile(Text *t, Expand *e, int newwindow)
                Window *w, *ow;
                int eval, i, n;
                Rune *rp;
       +        Runestr rs;
                uint dummy;
        
                r.q0 = 0;
       t@@ -704,8 +705,29 @@ openfile(Text *t, Expand *e, int newwindow)
                        w = t->w;
                        if(w == nil)
                                return nil;
       -        }else
       +        }else{
                        w = lookfile(e->name, e->nname);
       +                if(w == nil && e->name[0] != '/'){
       +                        /*
       +                         * Unrooted path in new window.
       +                         * This can happen if we type a pwd-relative path
       +                         * in the topmost tag or the column tags.  
       +                         * Most of the time plumber takes care of these,
       +                         * but plumber might not be running or might not
       +                         * be configured to accept plumbed directories.
       +                         * Make the name a full path, just like we would if
       +                         * opening via the plumber.
       +                         */
       +                        n = utflen(wdir)+1+e->nname+1;
       +                        rp = runemalloc(n);
       +                        runesnprint(rp, n, "%s/%.*S", wdir, e->nname, e->name);
       +                        rs = cleanrname(runestr(rp, n-1));
       +                        free(e->name);
       +                        e->name = rs.r;
       +                        e->nname = rs.nr;
       +                        w = lookfile(e->name, e->nname);
       +                }
       +        }
                if(w){
                        if(newwindow==TRUE && !w->isdir)
                                w = coladd(w->col, nil, w, -1);