auth.c - vx32 - Local 9vx git repository for patches.
(HTM) git clone git://r-36.net/vx32
(DIR) Log
(DIR) Files
(DIR) Refs
---
auth.c (2336B)
---
1 #include "u.h"
2 #include "lib.h"
3 #include "mem.h"
4 #include "dat.h"
5 #include "fns.h"
6 #include "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 long
23 sysfversion(uint32 *arg)
24 {
25 char *vers;
26 uint arglen, m, msize;
27 Chan *c;
28
29 msize = arg[1];
30 arglen = arg[3];
31 vers = uvalidaddr(arg[2], arglen, 1);
32 /* check there's a NUL in the version string */
33 if(arglen==0 || memchr(vers, 0, arglen)==0)
34 error(Ebadarg);
35 c = fdtochan(arg[0], ORDWR, 0, 1);
36 if(waserror()){
37 cclose(c);
38 nexterror();
39 }
40
41 m = mntversion(c, vers, msize, arglen);
42
43 cclose(c);
44 poperror();
45 return m;
46 }
47
48 long
49 sys_fsession(uint32 *arg)
50 {
51 /* deprecated; backwards compatibility only */
52
53 if(arg[2] == 0)
54 error(Ebadarg);
55 *(char*)uvalidaddr(arg[1], arg[2], 1) = '\0';
56 return 0;
57 }
58
59 long
60 sysfauth(uint32 *arg)
61 {
62 Chan *c, *ac;
63 char *aname;
64 int fd;
65
66 aname = validnamedup(uvalidaddr(arg[1], 1, 0), 1);
67 if(waserror()){
68 free(aname);
69 nexterror();
70 }
71 c = fdtochan(arg[0], ORDWR, 0, 1);
72 if(waserror()){
73 cclose(c);
74 nexterror();
75 }
76
77 ac = mntauth(c, aname);
78 /* at this point ac is responsible for keeping c alive */
79 cclose(c);
80 poperror(); /* c */
81 free(aname);
82 poperror(); /* aname */
83
84 if(waserror()){
85 cclose(ac);
86 nexterror();
87 }
88
89 fd = newfd(ac);
90 if(fd < 0)
91 error(Enofd);
92 poperror(); /* ac */
93
94 /* always mark it close on exec */
95 ac->flag |= CCEXEC;
96
97 return fd;
98 }
99
100 /*
101 * called by devcons() for user device
102 *
103 * anyone can become none
104 */
105 long
106 userwrite(char *a, int n)
107 {
108 if(n!=4 || strncmp(a, "none", 4)!=0)
109 error(Eperm);
110 kstrdup(&up->user, "none");
111 up->basepri = PriNormal;
112 return n;
113 }
114
115 /*
116 * called by devcons() for host owner/domain
117 *
118 * writing hostowner also sets user
119 */
120 long
121 hostownerwrite(char *a, int n)
122 {
123 char buf[128];
124
125 if(!iseve())
126 error(Eperm);
127 if(n <= 0 || n >= sizeof buf)
128 error(Ebadarg);
129 memmove(buf, a, n);
130 buf[n] = 0;
131
132 renameuser(eve, buf);
133 kstrdup(&eve, buf);
134 kstrdup(&up->user, buf);
135 up->basepri = PriNormal;
136 return n;
137 }
138
139 long
140 hostdomainwrite(char *a, int n)
141 {
142 char buf[DOMLEN];
143
144 if(!iseve())
145 error(Eperm);
146 if(n >= DOMLEN)
147 error(Ebadarg);
148 memset(buf, 0, DOMLEN);
149 strncpy(buf, a, n);
150 if(buf[0] == 0)
151 error(Ebadarg);
152 memmove(hostdomain, buf, DOMLEN);
153 return n;
154 }