1 b3994ec5 2003-12-11 devnull #include <u.h>
2 b3994ec5 2003-12-11 devnull #include <libc.h>
3 b3994ec5 2003-12-11 devnull #include <ctype.h>
6 b3994ec5 2003-12-11 devnull * Absent other hints, it works reasonably well to use
7 b3994ec5 2003-12-11 devnull * the X11 display name as the name space identifier.
8 b3994ec5 2003-12-11 devnull * This is how sam's B has worked since the early days.
9 b3994ec5 2003-12-11 devnull * Since most programs using name spaces are also using X,
10 b3994ec5 2003-12-11 devnull * this still seems reasonable. Terminal-only sessions
11 b3994ec5 2003-12-11 devnull * can set $NAMESPACE.
13 b3994ec5 2003-12-11 devnull static char*
14 b3994ec5 2003-12-11 devnull nsfromdisplay(void)
18 b3994ec5 2003-12-11 devnull char *disp, *p;
20 b3994ec5 2003-12-11 devnull if((disp = getenv("DISPLAY")) == nil){
21 b3994ec5 2003-12-11 devnull werrstr("$DISPLAY not set");
22 b3994ec5 2003-12-11 devnull return nil;
25 b3994ec5 2003-12-11 devnull /* canonicalize: xxx:0.0 => xxx:0 */
26 b3994ec5 2003-12-11 devnull p = strrchr(disp, ':');
29 b3994ec5 2003-12-11 devnull while(isdigit((uchar)*p))
31 b3994ec5 2003-12-11 devnull if(strcmp(p, ".0") == 0)
35 b3994ec5 2003-12-11 devnull p = smprint("/tmp/ns.%s.%s", getuser(), disp);
36 b3994ec5 2003-12-11 devnull free(disp);
37 b3994ec5 2003-12-11 devnull if(p == nil){
38 b3994ec5 2003-12-11 devnull werrstr("out of memory");
39 b3994ec5 2003-12-11 devnull return p;
41 b3994ec5 2003-12-11 devnull if((fd=create(p, OREAD, DMDIR|0700)) >= 0){
42 b3994ec5 2003-12-11 devnull close(fd);
43 b3994ec5 2003-12-11 devnull return p;
45 b3994ec5 2003-12-11 devnull if((d = dirstat(p)) == nil){
47 b3994ec5 2003-12-11 devnull werrstr("stat %s: %r", p);
49 b3994ec5 2003-12-11 devnull return nil;
51 b3994ec5 2003-12-11 devnull if((d->mode&0777) != 0700 || strcmp(d->uid, getuser()) != 0){
52 b3994ec5 2003-12-11 devnull werrstr("bad name space dir %s", p);
55 b3994ec5 2003-12-11 devnull return nil;
58 b3994ec5 2003-12-11 devnull return p;
62 b3994ec5 2003-12-11 devnull getns(void)
64 b3994ec5 2003-12-11 devnull char *ns;
66 b3994ec5 2003-12-11 devnull ns = getenv("NAMESPACE");
67 b3994ec5 2003-12-11 devnull if(ns == nil)
68 b3994ec5 2003-12-11 devnull ns = nsfromdisplay();
69 b3994ec5 2003-12-11 devnull if(ns == nil){
70 b3994ec5 2003-12-11 devnull werrstr("$NAMESPACE not set, %r");
71 b3994ec5 2003-12-11 devnull return nil;
73 b3994ec5 2003-12-11 devnull return ns;