Subversion Repositories planix.SVN

Rev

Rev 2 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 1
#include "headers.h"
2
 
3
typedef struct DisconnectData {
4
	SmbSession *s;
5
	SmbTree *t;
6
} DisconnectData;
7
 
8
static void
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
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
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
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
54
smbtreedisconnectbyid(SmbSession *s, ushort id)
55
{
56
	smbtreedisconnect(s, smbidmapfind(s->tidmap, id));
57
}
58
 
59
SmbTree *
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
}