diff options
author | rsc <devnull@localhost> | 2003-12-11 17:50:28 +0000 |
---|---|---|
committer | rsc <devnull@localhost> | 2003-12-11 17:50:28 +0000 |
commit | b3994ec5c78e6c18885079b58abb7fb997899c3f (patch) | |
tree | d4ead391f5ebd1554cc5ecfba69130e750de67bb /src/lib9/getns.c | |
parent | 32f69c36e0eec1227934bbd34854bfebd88686f2 (diff) | |
download | plan9port-b3994ec5c78e6c18885079b58abb7fb997899c3f.tar.gz plan9port-b3994ec5c78e6c18885079b58abb7fb997899c3f.tar.bz2 plan9port-b3994ec5c78e6c18885079b58abb7fb997899c3f.zip |
More files related to user-level file servers.
Also add acme!
Diffstat (limited to 'src/lib9/getns.c')
-rw-r--r-- | src/lib9/getns.c | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/src/lib9/getns.c b/src/lib9/getns.c new file mode 100644 index 00000000..29bc857c --- /dev/null +++ b/src/lib9/getns.c @@ -0,0 +1,74 @@ +#include <u.h> +#include <libc.h> +#include <ctype.h> + +/* + * Absent other hints, it works reasonably well to use + * the X11 display name as the name space identifier. + * This is how sam's B has worked since the early days. + * Since most programs using name spaces are also using X, + * this still seems reasonable. Terminal-only sessions + * can set $NAMESPACE. + */ +static char* +nsfromdisplay(void) +{ + int fd; + Dir *d; + char *disp, *p; + + if((disp = getenv("DISPLAY")) == nil){ + werrstr("$DISPLAY not set"); + return nil; + } + + /* canonicalize: xxx:0.0 => xxx:0 */ + p = strrchr(disp, ':'); + if(p){ + p++; + while(isdigit((uchar)*p)) + p++; + if(strcmp(p, ".0") == 0) + *p = 0; + } + + p = smprint("/tmp/ns.%s.%s", getuser(), disp); + free(disp); + if(p == nil){ + werrstr("out of memory"); + return p; + } + if((fd=create(p, OREAD, DMDIR|0700)) >= 0){ + close(fd); + return p; + } + if((d = dirstat(p)) == nil){ + free(d); + werrstr("stat %s: %r", p); + free(p); + return nil; + } + if((d->mode&0777) != 0700 || strcmp(d->uid, getuser()) != 0){ + werrstr("bad name space dir %s", p); + free(p); + free(d); + return nil; + } + free(d); + return p; +} + +char* +getns(void) +{ + char *ns; + + ns = getenv("NAMESPACE"); + if(ns == nil) + ns = nsfromdisplay(); + if(ns == nil){ + werrstr("$NAMESPACE not set, %r"); + return nil; + } + return ns; +} |