#include "headers.h" typedef struct DisconnectData { SmbSession *s; SmbTree *t; } DisconnectData; static void smbtreefree(SmbTree **tp) { SmbTree *t = *tp; if (t) { smbserviceput(t->serv); free(t); *tp = nil; } } static void closesearch(void *magic, void *a) { SmbSearch *search = a; DisconnectData *d = magic; if (search->t == d->t) smbsearchclose(d->s, search); } static void closefile(void *magic, void *a) { SmbFile *f = a; DisconnectData *d = magic; if (f->t == d->t) smbfileclose(d->s, f); } void smbtreedisconnect(SmbSession *s, SmbTree *t) { if (t) { DisconnectData data; smblogprintif(smbglobals.log.tids, "smbtreedisconnect: 0x%.4ux\n", t->id); data.s = s; data.t = t; smbserviceput(t->serv); smbidmapapply(s->sidmap, closesearch, &data); smbidmapapply(s->fidmap, closefile, &data); smbidmapremove(s->tidmap, t); smbtreefree(&t); } } void smbtreedisconnectbyid(SmbSession *s, ushort id) { smbtreedisconnect(s, smbidmapfind(s->tidmap, id)); } SmbTree * smbtreeconnect(SmbSession *s, SmbService *serv) { SmbTree *t; if (s->tidmap == nil) s->tidmap = smbidmapnew(); t = smbemallocz(sizeof(*t), 1); smbidmapadd(s->tidmap, t); t->serv = serv; smbserviceget(serv); smblogprintif(smbglobals.log.tids, "smbtreeconnect: 0x%.4ux\n", t->id); return t; }