7 getid(void **a, int n, int i)
10 if(i <= 0 || i > n || (p = a[i-1]) == nil)
16 setid(void **a, int n, int i, void *p)
18 assert(i > 0 || i <= n);
23 newid(void ***pa, int *pn, void *p)
26 for(i=0; i < *pn; i++)
32 *pa = realloc(*pa, (i + 8) * sizeof(p));
48 for(i = 0; i < t->nfile; i++)
50 for(i = 0; i < t->nfind; i++)
58 connecttree(char *service, char *path, int *perr)
65 if((s = mapshare(path)) == nil){
66 err = STATUS_BAD_NETWORK_NAME;
69 if(strcmp(service, "?????") && cistrcmp(service, s->service)){
70 err = STATUS_BAD_DEVICE_TYPE;
73 t = mallocz(sizeof(*t), 1);
75 t->tid = newid(&tree, &ntree, t);
84 disconnecttree(int tid)
88 if((t = gettree(tid)) == nil)
89 return STATUS_SMB_BAD_TID;
90 setid(tree, ntree, tid, nil);
100 for(i=0; i<ntree; i++)
112 if(t = getid(tree, ntree, tid))
114 fprint(2, "tree [%.4x] %s\n", tid, t->share->root);
119 newfid(Tree *t, File *f)
122 return newid(&t->file, &t->nfile, f);
126 delfid(Tree *t, int fid)
130 if(f = getid(t->file, t->nfile, fid)){
131 setid(t->file, t->nfile, fid, nil);
137 getfile(int tid, int fid, Tree **ptree, int *perr)
144 if((t = gettree(tid)) == nil){
145 err = STATUS_SMB_BAD_TID;
148 if((f = getid(t->file, t->nfile, fid)) == nil){
149 err = STATUS_SMB_BAD_FID;
155 fprint(2, "file [%x] %s\n", fid, f->path);
165 getpath(int tid, char *name, Tree **ptree, int *perr)
171 if(t = gettree(tid)){
173 p = conspath(t->share->root, name);
175 fprint(2, "path %s\n", p);
177 err = STATUS_SMB_BAD_TID;
188 newsid(Tree *t, Find *f)
191 return newid(&t->find, &t->nfind, f);
195 delsid(Tree *t, int sid)
199 if(f = getid(t->find, t->nfind, sid)){
200 setid(t->find, t->nfind, sid, nil);
206 getfind(int tid, int sid, Tree **ptree, int *perr)
213 if((t = gettree(tid)) == nil){
214 err = STATUS_SMB_BAD_TID;
217 if((f = getid(t->find, t->nfind, sid)) == nil){
218 err = STATUS_SMB_BAD_FID;
224 fprint(2, "find [%x] %s %s\n", sid, f->base, f->pattern);