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