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