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
#include <String.h>
3
 
4
int
5
smbremovefile(SmbTree *t, char *dir, char *name)
6
{
7
	String *s;
8
	int rv;
9
	s = s_new();
10
	s_append(s, t->serv->path);
11
	s_append(s, "/");
12
	if (dir) {
13
		s_append(s, dir);
14
		s_append(s, "/");
15
	}
16
	s_append(s, name);
17
	rv = remove(s_to_c(s));
18
	s_free(s);
19
	return rv;
20
}
21
 
22
SmbProcessResult
23
smbcomdelete(SmbSession *s, SmbHeader *h, uchar *pdata, SmbBuffer *b)
24
{
25
	SmbProcessResult pr;
26
	ushort sattr;
27
	uchar fmt;
28
	char *pattern = nil;
29
	char *dir = nil;
30
	char *name = nil;
31
	Reprog *r = nil;
32
	SmbTree *t;
33
	int x, count;
34
	SmbDirCache *dc = nil;
35
 
36
	if (h->wordcount != 1)
37
		return SmbProcessResultFormat;
38
	sattr = smbnhgets(pdata);
39
	if (!smbbuffergetb(b, &fmt) || fmt != 0x04
40
		|| !smbbuffergetstring(b, h, SMB_STRING_PATH, &pattern))
41
		return SmbProcessResultFormat;
42
	smblogprint(SMB_COM_DELETE, "searchattributes: 0x%.4ux\npattern:%s\n", sattr, pattern);
43
	smbpathsplit(pattern, &dir, &name);
44
	t = smbidmapfind(s->tidmap, h->tid);
45
	if (t == nil) {
46
		smbseterror(s, ERRSRV, ERRinvtid);
47
		pr = SmbProcessResultError;
48
		goto done;
49
	}
50
	dc = smbmkdircache(t, dir);
51
	if (dc == nil) {
52
		pr = SmbProcessResultMisc;
53
		goto done;
54
	}
55
	r = smbmkrep(name);
56
	count = 0;
57
	for (x = 0; x < dc->n; x++) {
58
		if (!smbmatch(dc->buf[x].name, r))
59
			continue;
60
		if (smbremovefile(t, dir, dc->buf[x].name) == 0)
61
			count++;
62
	}
63
	if (count == 0) {
64
		smbseterror(s, ERRDOS, ERRnoaccess);
65
		pr = SmbProcessResultError;
66
	}
67
	else
68
		pr = smbbufferputack(s->response,h, &s->peerinfo);
69
done:
70
	free(pattern);
71
	free(dir);
72
	free(name);
73
	smbdircachefree(&dc);
74
	free(r);
75
	return pr;
76
}