]> git.lizzy.rs Git - plan9front.git/blob - sys/src/9/port/auth.c
kernel: use 64-bit virtual entry point for expanded header, document behaviour in...
[plan9front.git] / sys / src / 9 / port / auth.c
1 #include        "u.h"
2 #include        "../port/lib.h"
3 #include        "mem.h"
4 #include        "dat.h"
5 #include        "fns.h"
6 #include        "../port/error.h"
7
8 #include        <authsrv.h>
9
10 char    *eve;
11 char    hostdomain[DOMLEN];
12
13 /*
14  *  return true if current user is eve
15  */
16 int
17 iseve(void)
18 {
19         return strcmp(eve, up->user) == 0;
20 }
21
22 uintptr
23 sysfversion(va_list list)
24 {
25         int msize, arglen, fd;
26         char *vers;
27         Chan *c;
28
29         fd = va_arg(list, int);
30         msize = va_arg(list, int);
31         vers = va_arg(list, char*);
32         arglen = va_arg(list, int);
33         validaddr((uintptr)vers, arglen, 1);
34         /* check there's a NUL in the version string */
35         if(arglen <= 0 || memchr(vers, 0, arglen) == nil)
36                 error(Ebadarg);
37         c = fdtochan(fd, ORDWR, 0, 1);
38         if(waserror()){
39                 cclose(c);
40                 nexterror();
41         }
42         msize = mntversion(c, vers, msize, arglen);
43         cclose(c);
44         poperror();
45         return msize;
46 }
47
48 uintptr
49 sys_fsession(va_list list)
50 {
51         int fd;
52         char *str;
53         uint len;
54
55         /* deprecated; backwards compatibility only */
56         fd = va_arg(list, int);
57         str = va_arg(list, char*);
58         len = va_arg(list, uint);
59         if(len == 0)
60                 error(Ebadarg);
61         validaddr((uintptr)str, len, 1);
62         *str = '\0';
63         USED(fd);
64         return 0;
65 }
66
67 uintptr
68 sysfauth(va_list list)
69 {
70         Chan *c, *ac;
71         char *aname;
72         int fd;
73
74         fd = va_arg(list, int);
75         aname = va_arg(list, char*);
76         validaddr((uintptr)aname, 1, 0);
77         aname = validnamedup(aname, 1);
78         if(waserror()){
79                 free(aname);
80                 nexterror();
81         }
82         c = fdtochan(fd, ORDWR, 0, 1);
83         if(waserror()){
84                 cclose(c);
85                 nexterror();
86         }
87
88         ac = mntauth(c, aname);
89         /* at this point ac is responsible for keeping c alive */
90         poperror();     /* c */
91         cclose(c);
92         poperror();     /* aname */
93         free(aname);
94
95         if(waserror()){
96                 cclose(ac);
97                 nexterror();
98         }
99
100         /* always mark it close on exec */
101         fd = newfd(ac, OCEXEC);
102         if(fd < 0)
103                 error(Enofd);
104         poperror();     /* ac */
105
106         return (uintptr)fd;
107 }
108
109 /*
110  *  called by devcons() for user device
111  *
112  *  anyone can become none
113  */
114 long
115 userwrite(char *a, int n)
116 {
117         if(n!=4 || strncmp(a, "none", 4)!=0)
118                 error(Eperm);
119         procsetuser("none");
120         return n;
121 }
122
123 /*
124  *  called by devcons() for host owner/domain
125  *
126  *  writing hostowner also sets user
127  */
128 long
129 hostownerwrite(char *a, int n)
130 {
131         char buf[KNAMELEN];
132
133         if(!iseve())
134                 error(Eperm);
135         if(n <= 0)
136                 error(Ebadarg);
137         if(n >= sizeof buf)
138                 error(Etoolong);
139         memmove(buf, a, n);
140         buf[n] = 0;
141
142         renameuser(eve, buf);
143         srvrenameuser(eve, buf);
144         shrrenameuser(eve, buf);
145         kstrdup(&eve, buf);
146         procsetuser(buf);
147         return n;
148 }
149
150 long
151 hostdomainwrite(char *a, int n)
152 {
153         char buf[DOMLEN];
154
155         if(!iseve())
156                 error(Eperm);
157         if(n <= 0 || n >= DOMLEN)
158                 error(Ebadarg);
159         memset(buf, 0, DOMLEN);
160         strncpy(buf, a, n);
161         if(buf[0] == 0)
162                 error(Ebadarg);
163         memmove(hostdomain, buf, DOMLEN);
164         return n;
165 }