xref: /plan9/sys/src/cmd/aquarela/smbtree.c (revision 8ccd4a6360d974db7bd7bbd4f37e7018419ea908)
1 #include "headers.h"
2 
3 typedef struct DisconnectData {
4 	SmbSession *s;
5 	SmbTree *t;
6 } DisconnectData;
7 
8 static void
smbtreefree(SmbTree ** tp)9 smbtreefree(SmbTree **tp)
10 {
11 	SmbTree *t = *tp;
12 	if (t) {
13 		smbserviceput(t->serv);
14 		free(t);
15 		*tp = nil;
16 	}
17 }
18 
19 static void
closesearch(void * magic,void * a)20 closesearch(void *magic, void *a)
21 {
22 	SmbSearch *search = a;
23 	DisconnectData *d = magic;
24 	if (search->t == d->t)
25 		smbsearchclose(d->s, search);
26 }
27 
28 static void
closefile(void * magic,void * a)29 closefile(void *magic, void *a)
30 {
31 	SmbFile *f = a;
32 	DisconnectData *d = magic;
33 	if (f->t == d->t)
34 		smbfileclose(d->s, f);
35 }
36 
37 void
smbtreedisconnect(SmbSession * s,SmbTree * t)38 smbtreedisconnect(SmbSession *s, SmbTree *t)
39 {
40 	if (t) {
41 		DisconnectData data;
42 		smblogprintif(smbglobals.log.tids, "smbtreedisconnect: 0x%.4ux\n", t->id);
43 		data.s = s;
44 		data.t = t;
45 		smbserviceput(t->serv);
46 		smbidmapapply(s->sidmap, closesearch, &data);
47 		smbidmapapply(s->fidmap, closefile, &data);
48 		smbidmapremove(s->tidmap, t);
49 		smbtreefree(&t);
50 	}
51 }
52 
53 void
smbtreedisconnectbyid(SmbSession * s,ushort id)54 smbtreedisconnectbyid(SmbSession *s, ushort id)
55 {
56 	smbtreedisconnect(s, smbidmapfind(s->tidmap, id));
57 }
58 
59 SmbTree *
smbtreeconnect(SmbSession * s,SmbService * serv)60 smbtreeconnect(SmbSession *s, SmbService *serv)
61 {
62 	SmbTree *t;
63 
64 	if (s->tidmap == nil)
65 		s->tidmap = smbidmapnew();
66 
67 	t = smbemallocz(sizeof(*t), 1);
68 	smbidmapadd(s->tidmap, t);
69 	t->serv = serv;
70 	smbserviceget(serv);
71 	smblogprintif(smbglobals.log.tids, "smbtreeconnect: 0x%.4ux\n", t->id);
72 	return t;
73 }
74