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