summaryrefslogtreecommitdiff
path: root/sys/src/cmd/aquarela/smbtree.c
diff options
context:
space:
mode:
authorTaru Karttunen <taruti@taruti.net>2011-03-30 15:46:40 +0300
committerTaru Karttunen <taruti@taruti.net>2011-03-30 15:46:40 +0300
commite5888a1ffdae813d7575f5fb02275c6bb07e5199 (patch)
treed8d51eac403f07814b9e936eed0c9a79195e2450 /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-xsys/src/cmd/aquarela/smbtree.c73
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;
+}