12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- #include "headers.h"
- #include <String.h>
- int
- smbremovefile(SmbTree *t, char *dir, char *name)
- {
- String *s;
- int rv;
- s = s_new();
- s_append(s, t->serv->path);
- s_append(s, "/");
- if (dir) {
- s_append(s, dir);
- s_append(s, "/");
- }
- s_append(s, name);
- rv = remove(s_to_c(s));
- s_free(s);
- return rv;
- }
- SmbProcessResult
- smbcomdelete(SmbSession *s, SmbHeader *h, uchar *pdata, SmbBuffer *b)
- {
- SmbProcessResult pr;
- ushort sattr;
- uchar 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%.4ux\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;
- }
|