SmbProcessResult smbcomdelete(SmbSession *s, SmbHeader *h, uint8_t *pdata, SmbBuffer *b) { SmbProcessResult pr; uint16_t sattr; uint8_t fmt; char *pattern = nil; char *dir = nil; char *name = nil; Reprog *r = nil; SmbTree *t; int x, count; SmbDirCache *dc = nil; if (h->wordcount != 1) return SmbProcessResultFormat; sattr = smbnhgets(pdata); if (!smbbuffergetb(b, &fmt) || fmt != 0x04 || !smbbuffergetstring(b, h, SMB_STRING_PATH, &pattern)) return SmbProcessResultFormat; smblogprint(SMB_COM_DELETE, "searchattributes: 0x%.4x\npattern:%s\n", sattr, pattern); smbpathsplit(pattern, &dir, &name); t = smbidmapfind(s->tidmap, h->tid); if (t == nil) { smbseterror(s, ERRSRV, ERRinvtid); pr = SmbProcessResultError; goto done; } dc = smbmkdircache(t, dir); if (dc == nil) { pr = SmbProcessResultMisc; goto done; } r = smbmkrep(name); count = 0; for (x = 0; x < dc->n; x++) { if (!smbmatch(dc->buf[x].name, r)) continue; if (smbremovefile(t, dir, dc->buf[x].name) == 0) count++; } if (count == 0) { smbseterror(s, ERRDOS, ERRnoaccess); pr = SmbProcessResultError; } else pr = smbbufferputack(s->response,h, &s->peerinfo); done: free(pattern); free(dir); free(name); smbdircachefree(&dc); free(r); return pr; }
static void populate(SmbSession *s, SmbDirCache *dc, Reprog *r, ushort informationlevel, ushort flags, ushort scount, ushort *ep, ulong *nameoffsetp) { ushort e; ulong nameoffset; e = 0; nameoffset = 0; while (dc->i < dc->n && e < scount) { ulong backup; int rv; if (!smbmatch(dc->buf[dc->i].name, r)) { dc->i++; continue; } rv = 0; backup = smbbufferwriteoffset(s->transaction.out.data); switch (informationlevel) { case SMB_INFO_STANDARD: if (flags & SMB_FIND_RETURN_RESUME_KEYS) { if (!smbbufferputl(s->transaction.out.data, dc->i)) { rv = 0; break; } } rv = standardflatten(s, s->transaction.out.data, dc->buf + dc->i, &nameoffset); break; case SMB_FIND_FILE_BOTH_DIRECTORY_INFO: rv = findbothflatten(s->transaction.out.data, &s->peerinfo, dc->buf + dc->i, dc->i, &nameoffset); break; } if (rv == 0) { smbbufferwritebackup(s->transaction.out.data, backup); break; } dc->i++; e++; } *ep = e; *nameoffsetp = nameoffset; }