]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/ip/cifsd/tree.c
separate MSCHAP(v2) and NTLM(v2) authentication
[plan9front.git] / sys / src / cmd / ip / cifsd / tree.c
1 #include <u.h>
2 #include <libc.h>
3 #include "dat.h"
4 #include "fns.h"
5
6 static void*
7 getid(void **a, int n, int i)
8 {
9         void *p;
10         if(i <= 0 || i > n || (p = a[i-1]) == nil)
11                 return nil;
12         return p;
13 }
14
15 static void
16 setid(void **a, int n, int i, void *p)
17 {
18         assert(i > 0 || i <= n);
19         a[i-1] = p;
20 }
21
22 static int
23 newid(void ***pa, int *pn, void *p)
24 {
25         int i;
26         for(i=0; i < *pn; i++)
27                 if((*pa)[i] == nil)
28                         break;
29         if(i == *pn){
30                 (*pn)++;
31                 if((i % 8) == 0)
32                         *pa = realloc(*pa, (i + 8) * sizeof(p));
33         }
34         (*pa)[i] = p;
35         return i+1;
36 }
37
38 static void **tree;
39 static int ntree;
40
41 static void
42 freetree(Tree *t)
43 {
44         int i;
45
46         if(t == nil)
47                 return;
48         for(i = 0; i < t->nfile; i++)
49                 putfile(t->file[i]);
50         for(i = 0; i < t->nfind; i++)
51                 putfile(t->find[i]);
52         free(t->file);
53         free(t->find);
54         free(t);
55 }
56
57 Tree*
58 connecttree(char *service, char *path, int *perr)
59 {
60         Share *s;
61         Tree *t;
62         int err;
63
64         t = nil;
65         if((s = mapshare(path)) == nil){
66                 err = STATUS_BAD_NETWORK_NAME;
67                 goto out;
68         }
69         if(strcmp(service, "?????") && cistrcmp(service, s->service)){
70                 err = STATUS_BAD_DEVICE_TYPE;
71                 goto out;
72         }
73         t = mallocz(sizeof(*t), 1);
74         t->share = s;
75         t->tid = newid(&tree, &ntree, t);
76         err = 0;
77 out:
78         if(perr)
79                 *perr = err;
80         return t;
81 }
82
83 int
84 disconnecttree(int tid)
85 {
86         Tree *t;
87
88         if((t = gettree(tid)) == nil)
89                 return STATUS_SMB_BAD_TID;
90         setid(tree, ntree, tid, nil);
91         freetree(t);
92         return 0;
93 }
94
95 void
96 logoff(void)
97 {
98         int i;
99
100         for(i=0; i<ntree; i++)
101                 freetree(tree[i]);
102         free(tree);
103         tree = nil;
104         ntree = 0;
105 }
106
107 Tree*
108 gettree(int tid)
109 {
110         Tree *t;
111
112         if(t = getid(tree, ntree, tid))
113                 if(debug)
114                         fprint(2, "tree [%.4x] %s\n", tid, t->share->root);
115         return t;
116 }
117
118 int
119 newfid(Tree *t, File *f)
120 {
121         f->ref++;
122         return newid(&t->file, &t->nfile, f);
123 }
124
125 void
126 delfid(Tree *t, int fid)
127 {
128         File *f;
129
130         if(f = getid(t->file, t->nfile, fid)){
131                 setid(t->file, t->nfile, fid, nil);
132                 putfile(f);
133         }
134 }
135
136 File*
137 getfile(int tid, int fid, Tree **ptree, int *perr)
138 {
139         Tree *t;
140         File *f;
141         int err;
142
143         f = nil;
144         if((t = gettree(tid)) == nil){
145                 err = STATUS_SMB_BAD_TID;
146                 goto out;
147         }
148         if((f = getid(t->file, t->nfile, fid)) == nil){
149                 err = STATUS_SMB_BAD_FID;
150                 goto out;
151         }
152         f->ref++;
153         err = 0;
154         if(debug)
155                 fprint(2, "file [%x] %s\n", fid, f->path);
156 out:
157         if(perr)
158                 *perr = err;
159         if(ptree)
160                 *ptree = t;
161         return f;
162 }
163
164 char*
165 getpath(int tid, char *name, Tree **ptree, int *perr)
166 {
167         Tree *t;
168         char *p;
169         int err;
170
171         if(t = gettree(tid)){
172                 err = 0;
173                 p = conspath(t->share->root, name);
174                 if(debug)
175                         fprint(2, "path %s\n", p);
176         } else {
177                 err = STATUS_SMB_BAD_TID;
178                 p = nil;
179         }
180         if(perr)
181                 *perr = err;
182         if(ptree)
183                 *ptree = t;
184         return p;
185 }
186
187 int
188 newsid(Tree *t, Find *f)
189 {
190         f->ref++;
191         return newid(&t->find, &t->nfind, f);
192 }
193
194 void
195 delsid(Tree *t, int sid)
196 {
197         Find *f;
198
199         if(f = getid(t->find, t->nfind, sid)){
200                 setid(t->find, t->nfind, sid, nil);
201                 putfind(f);
202         }
203 }
204
205 Find*
206 getfind(int tid, int sid, Tree **ptree, int *perr)
207 {
208         Tree *t;
209         Find *f;
210         int err;
211
212         f = nil;
213         if((t = gettree(tid)) == nil){
214                 err = STATUS_SMB_BAD_TID;
215                 goto out;
216         }
217         if((f = getid(t->find, t->nfind, sid)) == nil){
218                 err = STATUS_SMB_BAD_FID;
219                 goto out;
220         }
221         f->ref++;
222         err = 0;
223         if(debug)
224                 fprint(2, "find [%x] %s %s\n", sid, f->base, f->pattern);
225 out:
226         if(perr)
227                 *perr = err;
228         if(ptree)
229                 *ptree = t;
230         return f;
231 }
232
233