1219b2ee8SDavid du Colombier #include "u.h"
2219b2ee8SDavid du Colombier #include "../port/lib.h"
3219b2ee8SDavid du Colombier #include "mem.h"
4219b2ee8SDavid du Colombier #include "dat.h"
5219b2ee8SDavid du Colombier #include "fns.h"
6219b2ee8SDavid du Colombier #include "../port/error.h"
7219b2ee8SDavid du Colombier
89a747e4fSDavid du Colombier #include <authsrv.h>
9219b2ee8SDavid du Colombier
109a747e4fSDavid du Colombier char *eve;
11219b2ee8SDavid du Colombier char hostdomain[DOMLEN];
12219b2ee8SDavid du Colombier
13219b2ee8SDavid du Colombier /*
14219b2ee8SDavid du Colombier * return true if current user is eve
15219b2ee8SDavid du Colombier */
16219b2ee8SDavid du Colombier int
iseve(void)17219b2ee8SDavid du Colombier iseve(void)
18219b2ee8SDavid du Colombier {
197dd7cddfSDavid du Colombier return strcmp(eve, up->user) == 0;
20219b2ee8SDavid du Colombier }
21219b2ee8SDavid du Colombier
22219b2ee8SDavid du Colombier long
sysfversion(ulong * arg)239a747e4fSDavid du Colombier sysfversion(ulong *arg)
24219b2ee8SDavid du Colombier {
259a747e4fSDavid du Colombier char *vers;
269a747e4fSDavid du Colombier uint arglen, m, msize;
27219b2ee8SDavid du Colombier Chan *c;
28219b2ee8SDavid du Colombier
299a747e4fSDavid du Colombier msize = arg[1];
309a747e4fSDavid du Colombier vers = (char*)arg[2];
319a747e4fSDavid du Colombier arglen = arg[3];
329a747e4fSDavid du Colombier validaddr(arg[2], arglen, 1);
339a747e4fSDavid du Colombier /* check there's a NUL in the version string */
349a747e4fSDavid du Colombier if(arglen==0 || memchr(vers, 0, arglen)==0)
359a747e4fSDavid du Colombier error(Ebadarg);
369a747e4fSDavid du Colombier c = fdtochan(arg[0], ORDWR, 0, 1);
37219b2ee8SDavid du Colombier if(waserror()){
387dd7cddfSDavid du Colombier cclose(c);
39219b2ee8SDavid du Colombier nexterror();
40219b2ee8SDavid du Colombier }
41219b2ee8SDavid du Colombier
429a747e4fSDavid du Colombier m = mntversion(c, vers, msize, arglen);
43219b2ee8SDavid du Colombier
447dd7cddfSDavid du Colombier cclose(c);
45219b2ee8SDavid du Colombier poperror();
469a747e4fSDavid du Colombier return m;
479a747e4fSDavid du Colombier }
489a747e4fSDavid du Colombier
499a747e4fSDavid du Colombier long
sys_fsession(ulong * arg)509a747e4fSDavid du Colombier sys_fsession(ulong *arg)
519a747e4fSDavid du Colombier {
529a747e4fSDavid du Colombier /* deprecated; backwards compatibility only */
539a747e4fSDavid du Colombier
549a747e4fSDavid du Colombier if(arg[2] == 0)
559a747e4fSDavid du Colombier error(Ebadarg);
569a747e4fSDavid du Colombier validaddr(arg[1], arg[2], 1);
579a747e4fSDavid du Colombier ((uchar*)arg[1])[0] = '\0';
58219b2ee8SDavid du Colombier return 0;
59219b2ee8SDavid du Colombier }
60219b2ee8SDavid du Colombier
61219b2ee8SDavid du Colombier long
sysfauth(ulong * arg)62219b2ee8SDavid du Colombier sysfauth(ulong *arg)
63219b2ee8SDavid du Colombier {
649a747e4fSDavid du Colombier Chan *c, *ac;
659a747e4fSDavid du Colombier char *aname;
669a747e4fSDavid du Colombier int fd;
67219b2ee8SDavid du Colombier
689a747e4fSDavid du Colombier validaddr(arg[1], 1, 0);
692db064f5SDavid du Colombier aname = validnamedup((char*)arg[1], 1);
702db064f5SDavid du Colombier if(waserror()){
712db064f5SDavid du Colombier free(aname);
722db064f5SDavid du Colombier nexterror();
732db064f5SDavid du Colombier }
749a747e4fSDavid du Colombier c = fdtochan(arg[0], ORDWR, 0, 1);
75219b2ee8SDavid du Colombier if(waserror()){
767dd7cddfSDavid du Colombier cclose(c);
77219b2ee8SDavid du Colombier nexterror();
78219b2ee8SDavid du Colombier }
79219b2ee8SDavid du Colombier
809a747e4fSDavid du Colombier ac = mntauth(c, aname);
815d459b5aSDavid du Colombier /* at this point ac is responsible for keeping c alive */
825d459b5aSDavid du Colombier poperror(); /* c */
83*d1be6b08SDavid du Colombier cclose(c);
842db064f5SDavid du Colombier poperror(); /* aname */
85*d1be6b08SDavid du Colombier free(aname);
865d459b5aSDavid du Colombier
879a747e4fSDavid du Colombier if(waserror()){
889a747e4fSDavid du Colombier cclose(ac);
899a747e4fSDavid du Colombier nexterror();
90219b2ee8SDavid du Colombier }
91219b2ee8SDavid du Colombier
929a747e4fSDavid du Colombier fd = newfd(ac);
939a747e4fSDavid du Colombier if(fd < 0)
949a747e4fSDavid du Colombier error(Enofd);
959a747e4fSDavid du Colombier poperror(); /* ac */
96219b2ee8SDavid du Colombier
979a747e4fSDavid du Colombier /* always mark it close on exec */
989a747e4fSDavid du Colombier ac->flag |= CCEXEC;
99219b2ee8SDavid du Colombier
1009a747e4fSDavid du Colombier return fd;
101219b2ee8SDavid du Colombier }
102219b2ee8SDavid du Colombier
103219b2ee8SDavid du Colombier /*
104219b2ee8SDavid du Colombier * called by devcons() for user device
105219b2ee8SDavid du Colombier *
106219b2ee8SDavid du Colombier * anyone can become none
107219b2ee8SDavid du Colombier */
108219b2ee8SDavid du Colombier long
userwrite(char * a,int n)109219b2ee8SDavid du Colombier userwrite(char *a, int n)
110219b2ee8SDavid du Colombier {
1119a747e4fSDavid du Colombier if(n!=4 || strncmp(a, "none", 4)!=0)
112219b2ee8SDavid du Colombier error(Eperm);
1139a747e4fSDavid du Colombier kstrdup(&up->user, "none");
1147dd7cddfSDavid du Colombier up->basepri = PriNormal;
115219b2ee8SDavid du Colombier return n;
116219b2ee8SDavid du Colombier }
117219b2ee8SDavid du Colombier
118219b2ee8SDavid du Colombier /*
119219b2ee8SDavid du Colombier * called by devcons() for host owner/domain
120219b2ee8SDavid du Colombier *
121219b2ee8SDavid du Colombier * writing hostowner also sets user
122219b2ee8SDavid du Colombier */
123219b2ee8SDavid du Colombier long
hostownerwrite(char * a,int n)124219b2ee8SDavid du Colombier hostownerwrite(char *a, int n)
125219b2ee8SDavid du Colombier {
1269a747e4fSDavid du Colombier char buf[128];
127219b2ee8SDavid du Colombier
128219b2ee8SDavid du Colombier if(!iseve())
129219b2ee8SDavid du Colombier error(Eperm);
1309a747e4fSDavid du Colombier if(n <= 0 || n >= sizeof buf)
131219b2ee8SDavid du Colombier error(Ebadarg);
1329a747e4fSDavid du Colombier memmove(buf, a, n);
1339a747e4fSDavid du Colombier buf[n] = 0;
1349a747e4fSDavid du Colombier
1357dd7cddfSDavid du Colombier renameuser(eve, buf);
1369a747e4fSDavid du Colombier kstrdup(&eve, buf);
1379a747e4fSDavid du Colombier kstrdup(&up->user, buf);
1387dd7cddfSDavid du Colombier up->basepri = PriNormal;
139219b2ee8SDavid du Colombier return n;
140219b2ee8SDavid du Colombier }
141219b2ee8SDavid du Colombier
142219b2ee8SDavid du Colombier long
hostdomainwrite(char * a,int n)143219b2ee8SDavid du Colombier hostdomainwrite(char *a, int n)
144219b2ee8SDavid du Colombier {
145219b2ee8SDavid du Colombier char buf[DOMLEN];
146219b2ee8SDavid du Colombier
147219b2ee8SDavid du Colombier if(!iseve())
148219b2ee8SDavid du Colombier error(Eperm);
149219b2ee8SDavid du Colombier if(n >= DOMLEN)
150219b2ee8SDavid du Colombier error(Ebadarg);
151219b2ee8SDavid du Colombier memset(buf, 0, DOMLEN);
152219b2ee8SDavid du Colombier strncpy(buf, a, n);
153219b2ee8SDavid du Colombier if(buf[0] == 0)
154219b2ee8SDavid du Colombier error(Ebadarg);
155219b2ee8SDavid du Colombier memmove(hostdomain, buf, DOMLEN);
156219b2ee8SDavid du Colombier return n;
157219b2ee8SDavid du Colombier }
158