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 } 77