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