]> git.lizzy.rs Git - plan9front.git/blob - sys/src/9/port/auth.c
pc kernel: fix wrong simd exception mask (fixes go bootstrap)
[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         fd = newfd(ac);
101         if(fd < 0)
102                 error(Enofd);
103         poperror();     /* ac */
104
105         /* always mark it close on exec */
106         ac->flag |= CCEXEC;
107         return (uintptr)fd;
108 }
109
110 /*
111  *  called by devcons() for user device
112  *
113  *  anyone can become none
114  */
115 long
116 userwrite(char *a, int n)
117 {
118         if(n!=4 || strncmp(a, "none", 4)!=0)
119                 error(Eperm);
120         kstrdup(&up->user, "none");
121         up->basepri = PriNormal;
122         return n;
123 }
124
125 /*
126  *  called by devcons() for host owner/domain
127  *
128  *  writing hostowner also sets user
129  */
130 long
131 hostownerwrite(char *a, int n)
132 {
133         char buf[128];
134
135         if(!iseve())
136                 error(Eperm);
137         if(n <= 0 || n >= sizeof buf)
138                 error(Ebadarg);
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         kstrdup(&up->user, buf);
147         up->basepri = PriNormal;
148         return n;
149 }
150
151 long
152 hostdomainwrite(char *a, int n)
153 {
154         char buf[DOMLEN];
155
156         if(!iseve())
157                 error(Eperm);
158         if(n <= 0 || n >= DOMLEN)
159                 error(Ebadarg);
160         memset(buf, 0, DOMLEN);
161         strncpy(buf, a, n);
162         if(buf[0] == 0)
163                 error(Ebadarg);
164         memmove(hostdomain, buf, DOMLEN);
165         return n;
166 }