xref: /plan9/sys/src/cmd/aquarela/smbcomdelete.c (revision 8ccd4a6360d974db7bd7bbd4f37e7018419ea908)
1 #include "headers.h"
2 #include <String.h>
3 
4 int
smbremovefile(SmbTree * t,char * dir,char * name)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
smbcomdelete(SmbSession * s,SmbHeader * h,uchar * pdata,SmbBuffer * b)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 }
77