diff options
author | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
---|---|---|
committer | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
commit | e5888a1ffdae813d7575f5fb02275c6bb07e5199 (patch) | |
tree | d8d51eac403f07814b9e936eed0c9a79195e2450 /sys/src/cmd/aquarela/smbtree.c |
Import sources from 2011-03-30 iso image
Diffstat (limited to 'sys/src/cmd/aquarela/smbtree.c')
-rwxr-xr-x | sys/src/cmd/aquarela/smbtree.c | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/sys/src/cmd/aquarela/smbtree.c b/sys/src/cmd/aquarela/smbtree.c new file mode 100755 index 000000000..da4c3ba0f --- /dev/null +++ b/sys/src/cmd/aquarela/smbtree.c @@ -0,0 +1,73 @@ +#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; +} |