Blame


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>
4 b3994ec5 2003-12-11 devnull
5 ca786c9f 2006-06-12 devnull static int
6 ca786c9f 2006-06-12 devnull isme(char *uid)
7 ca786c9f 2006-06-12 devnull {
8 ca786c9f 2006-06-12 devnull int n;
9 ca786c9f 2006-06-12 devnull char *p;
10 ca786c9f 2006-06-12 devnull
11 ca786c9f 2006-06-12 devnull n = strtol(uid, &p, 10);
12 ca786c9f 2006-06-12 devnull if(*p == 0 && p > uid)
13 ca786c9f 2006-06-12 devnull return n == getuid();
14 ca786c9f 2006-06-12 devnull return strcmp(getuser(), uid) == 0;
15 ca786c9f 2006-06-12 devnull }
16 b3994ec5 2003-12-11 devnull /*
17 b3994ec5 2003-12-11 devnull * Absent other hints, it works reasonably well to use
18 b3994ec5 2003-12-11 devnull * the X11 display name as the name space identifier.
19 b3994ec5 2003-12-11 devnull * This is how sam's B has worked since the early days.
20 b3994ec5 2003-12-11 devnull * Since most programs using name spaces are also using X,
21 b3994ec5 2003-12-11 devnull * this still seems reasonable. Terminal-only sessions
22 b3994ec5 2003-12-11 devnull * can set $NAMESPACE.
23 b3994ec5 2003-12-11 devnull */
24 b3994ec5 2003-12-11 devnull static char*
25 b3994ec5 2003-12-11 devnull nsfromdisplay(void)
26 b3994ec5 2003-12-11 devnull {
27 b3994ec5 2003-12-11 devnull int fd;
28 b3994ec5 2003-12-11 devnull Dir *d;
29 b3994ec5 2003-12-11 devnull char *disp, *p;
30 b3994ec5 2003-12-11 devnull
31 b3994ec5 2003-12-11 devnull if((disp = getenv("DISPLAY")) == nil){
32 e113e0a4 2008-06-30 rsc #ifdef __APPLE__
33 e113e0a4 2008-06-30 rsc // Might be running native GUI on OS X.
34 e113e0a4 2008-06-30 rsc disp = strdup(":0.0");
35 e113e0a4 2008-06-30 rsc if(disp == nil)
36 e113e0a4 2008-06-30 rsc return nil;
37 e113e0a4 2008-06-30 rsc #else
38 b3994ec5 2003-12-11 devnull werrstr("$DISPLAY not set");
39 b3994ec5 2003-12-11 devnull return nil;
40 e113e0a4 2008-06-30 rsc #endif
41 b3994ec5 2003-12-11 devnull }
42 b3994ec5 2003-12-11 devnull
43 b3994ec5 2003-12-11 devnull /* canonicalize: xxx:0.0 => xxx:0 */
44 b3994ec5 2003-12-11 devnull p = strrchr(disp, ':');
45 b3994ec5 2003-12-11 devnull if(p){
46 b3994ec5 2003-12-11 devnull p++;
47 b3994ec5 2003-12-11 devnull while(isdigit((uchar)*p))
48 b3994ec5 2003-12-11 devnull p++;
49 b3994ec5 2003-12-11 devnull if(strcmp(p, ".0") == 0)
50 b3994ec5 2003-12-11 devnull *p = 0;
51 b3994ec5 2003-12-11 devnull }
52 fa325e9b 2020-01-10 cross
53 83ab7d88 2007-11-27 rsc /* turn /tmp/launch/:0 into _tmp_launch_:0 (OS X 10.5) */
54 83ab7d88 2007-11-27 rsc for(p=disp; *p; p++)
55 83ab7d88 2007-11-27 rsc if(*p == '/')
56 83ab7d88 2007-11-27 rsc *p = '_';
57 b3994ec5 2003-12-11 devnull
58 b3994ec5 2003-12-11 devnull p = smprint("/tmp/ns.%s.%s", getuser(), disp);
59 b3994ec5 2003-12-11 devnull free(disp);
60 b3994ec5 2003-12-11 devnull if(p == nil){
61 b3994ec5 2003-12-11 devnull werrstr("out of memory");
62 b3994ec5 2003-12-11 devnull return p;
63 b3994ec5 2003-12-11 devnull }
64 b3994ec5 2003-12-11 devnull if((fd=create(p, OREAD, DMDIR|0700)) >= 0){
65 b3994ec5 2003-12-11 devnull close(fd);
66 b3994ec5 2003-12-11 devnull return p;
67 b3994ec5 2003-12-11 devnull }
68 b3994ec5 2003-12-11 devnull if((d = dirstat(p)) == nil){
69 b3994ec5 2003-12-11 devnull free(d);
70 b3994ec5 2003-12-11 devnull werrstr("stat %s: %r", p);
71 b3994ec5 2003-12-11 devnull free(p);
72 b3994ec5 2003-12-11 devnull return nil;
73 b3994ec5 2003-12-11 devnull }
74 ca786c9f 2006-06-12 devnull if((d->mode&0777) != 0700 || !isme(d->uid)){
75 b3994ec5 2003-12-11 devnull werrstr("bad name space dir %s", p);
76 b3994ec5 2003-12-11 devnull free(p);
77 b3994ec5 2003-12-11 devnull free(d);
78 b3994ec5 2003-12-11 devnull return nil;
79 b3994ec5 2003-12-11 devnull }
80 b3994ec5 2003-12-11 devnull free(d);
81 b3994ec5 2003-12-11 devnull return p;
82 b3994ec5 2003-12-11 devnull }
83 b3994ec5 2003-12-11 devnull
84 b3994ec5 2003-12-11 devnull char*
85 b3994ec5 2003-12-11 devnull getns(void)
86 b3994ec5 2003-12-11 devnull {
87 b3994ec5 2003-12-11 devnull char *ns;
88 b3994ec5 2003-12-11 devnull
89 b3994ec5 2003-12-11 devnull ns = getenv("NAMESPACE");
90 b3994ec5 2003-12-11 devnull if(ns == nil)
91 b3994ec5 2003-12-11 devnull ns = nsfromdisplay();
92 b3994ec5 2003-12-11 devnull if(ns == nil){
93 b3994ec5 2003-12-11 devnull werrstr("$NAMESPACE not set, %r");
94 b3994ec5 2003-12-11 devnull return nil;
95 b3994ec5 2003-12-11 devnull }
96 b3994ec5 2003-12-11 devnull return ns;
97 b3994ec5 2003-12-11 devnull }