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