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