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
iseve(void)17 iseve(void)
18 {
19 return strcmp(eve, up->user) == 0;
20 }
21
22 void
sysfversion(Ar0 * ar0,va_list list)23 sysfversion(Ar0* ar0, va_list list)
24 {
25 Chan *c;
26 char *version;
27 int fd;
28 u32int msize;
29 usize nversion;
30
31 /*
32 * int fversion(int fd, int bufsize, char *version, int nversion);
33 * should be
34 * usize fversion(int fd, u32int msize, char *version, usize nversion);
35 */
36 fd = va_arg(list, int);
37 msize = va_arg(list, u32int);
38 version = va_arg(list, char*);
39 nversion = va_arg(list, usize);
40 version = validaddr(version, nversion, 1);
41 /* check there's a NUL in the version string */
42 if(nversion == 0 || memchr(version, 0, nversion) == nil)
43 error(Ebadarg);
44
45 c = fdtochan(fd, ORDWR, 0, 1);
46 if(waserror()){
47 cclose(c);
48 nexterror();
49 }
50
51 ar0->u = mntversion(c, msize, version, nversion);
52
53 cclose(c);
54 poperror();
55 }
56
57 void
sys_fsession(Ar0 * ar0,va_list list)58 sys_fsession(Ar0* ar0, va_list list)
59 {
60 int fd;
61 char *trbuf;
62
63 /*
64 * int fsession(int fd, char trbuf[TICKREQLEN]);
65 *
66 * Deprecated; backwards compatibility only.
67 */
68 fd = va_arg(list, int);
69 trbuf = va_arg(list, char*);
70
71 USED(fd);
72 trbuf = validaddr(trbuf, 1, 1);
73 *trbuf = '\0';
74
75 ar0->i = 0;
76 }
77
78 void
sysfauth(Ar0 * ar0,va_list list)79 sysfauth(Ar0* ar0, va_list list)
80 {
81 Chan *c, *ac;
82 char *aname;
83 int fd;
84
85 /*
86 * int fauth(int fd, char *aname);
87 */
88 fd = va_arg(list, int);
89 aname = va_arg(list, char*);
90
91 aname = validaddr(aname, 1, 0);
92 aname = validnamedup(aname, 1);
93 if(waserror()){
94 free(aname);
95 nexterror();
96 }
97 c = fdtochan(fd, ORDWR, 0, 1);
98 if(waserror()){
99 cclose(c);
100 nexterror();
101 }
102
103 ac = mntauth(c, aname);
104 /* at this point ac is responsible for keeping c alive */
105 cclose(c);
106 poperror(); /* c */
107 free(aname);
108 poperror(); /* aname */
109
110 if(waserror()){
111 cclose(ac);
112 nexterror();
113 }
114
115 fd = newfd(ac);
116 if(fd < 0)
117 error(Enofd);
118 poperror(); /* ac */
119
120 /* always mark it close on exec */
121 ac->flag |= CCEXEC;
122
123 ar0->i = fd;
124 }
125
126 /*
127 * called by devcons() for user device
128 *
129 * anyone can become none
130 */
131 long
userwrite(char * a,long n)132 userwrite(char* a, long n)
133 {
134 if(n != 4 || strncmp(a, "none", 4) != 0)
135 error(Eperm);
136 kstrdup(&up->user, "none");
137 up->basepri = PriNormal;
138
139 return n;
140 }
141
142 /*
143 * called by devcons() for host owner/domain
144 *
145 * writing hostowner also sets user
146 */
147 long
hostownerwrite(char * a,long n)148 hostownerwrite(char* a, long n)
149 {
150 char buf[128];
151
152 if(!iseve())
153 error(Eperm);
154 if(n <= 0 || n >= sizeof buf)
155 error(Ebadarg);
156 memmove(buf, a, n);
157 buf[n] = 0;
158
159 renameuser(eve, buf);
160 kstrdup(&eve, buf);
161 kstrdup(&up->user, buf);
162 up->basepri = PriNormal;
163
164 return n;
165 }
166
167 long
hostdomainwrite(char * a,long n)168 hostdomainwrite(char* a, long n)
169 {
170 char buf[DOMLEN];
171
172 if(!iseve())
173 error(Eperm);
174 if(n >= DOMLEN)
175 error(Ebadarg);
176 memset(buf, 0, DOMLEN);
177 strncpy(buf, a, n);
178 if(buf[0] == 0)
179 error(Ebadarg);
180 memmove(hostdomain, buf, DOMLEN);
181
182 return n;
183 }
184