123456789101112131415161718192021222324252627282930313233343536373839404142434445 |
- #include "headers.h"
- SmbProcessResult
- smbcomrename(SmbSession *s, SmbHeader *h, uchar *, SmbBuffer *b)
- {
- int rv;
- char *oldpath, *newpath;
- char *olddir, *newdir;
- char *oldname, *newname;
- uchar oldfmt, newfmt;
- Dir d;
- SmbProcessResult pr;
- if (h->wordcount != 1)
- return SmbProcessResultFormat;
- if (!smbbuffergetb(b, &oldfmt) || oldfmt != 0x04 || !smbbuffergetstring(b, h, SMB_STRING_PATH, &oldpath)
- || !smbbuffergetb(b, &newfmt) || newfmt != 0x04 || !smbbuffergetstring(b, h, SMB_STRING_PATH, &newpath))
- return SmbProcessResultFormat;
- smblogprint(h->command, "smbcomrename: %s to %s\n", oldpath, newpath);
- smbpathsplit(oldpath, &olddir, &oldname);
- smbpathsplit(newpath, &newdir, &newname);
- if (strcmp(olddir, newdir) != 0) {
- smblogprint(h->command, "smbcomrename: directories differ\n");
- goto noaccess;
- }
- memset(&d, 0xff, sizeof(d));
- d.uid = d.gid = d.muid = nil;
- d.name = newname;
- rv = dirwstat(oldpath, &d);
- if (rv < 0) {
- smblogprint(h->command, "smbcomrename failed: %r\n");
- noaccess:
- smbseterror(s, ERRDOS, ERRnoaccess);
- pr = SmbProcessResultError;
- }
- else
- pr = smbbufferputack(s->response, h, &s->peerinfo);
- free(oldpath);
- free(olddir);
- free(oldname);
- free(newpath);
- free(newdir);
- free(newname);
- return pr;
- }
|