18ccd4a63SDavid du Colombier #include "headers.h"
28ccd4a63SDavid du Colombier
38ccd4a63SDavid du Colombier SmbProcessResult
smbcomcreatedirectory(SmbSession * s,SmbHeader * h,uchar *,SmbBuffer * b)48ccd4a63SDavid du Colombier smbcomcreatedirectory(SmbSession *s, SmbHeader *h, uchar *, SmbBuffer *b)
58ccd4a63SDavid du Colombier {
68ccd4a63SDavid du Colombier int fd;
78ccd4a63SDavid du Colombier char *path;
89b004bddSDavid du Colombier char *fullpath = nil;
9*3e5d0078SDavid du Colombier SmbTree *t;
108ccd4a63SDavid du Colombier uchar fmt;
118ccd4a63SDavid du Colombier
128ccd4a63SDavid du Colombier if (h->wordcount != 0)
138ccd4a63SDavid du Colombier return SmbProcessResultFormat;
148ccd4a63SDavid du Colombier if (!smbbuffergetb(b, &fmt) || fmt != 0x04 || !smbbuffergetstring(b, h, SMB_STRING_PATH, &path))
158ccd4a63SDavid du Colombier return SmbProcessResultFormat;
168ccd4a63SDavid du Colombier smblogprint(h->command, "smbcomcreatedirectory: %s\n", path);
17*3e5d0078SDavid du Colombier t = smbidmapfind(s->tidmap, h->tid);
18*3e5d0078SDavid du Colombier if (t == nil) {
19*3e5d0078SDavid du Colombier smbseterror(s, ERRSRV, ERRinvtid);
20*3e5d0078SDavid du Colombier return SmbProcessResultError;
21*3e5d0078SDavid du Colombier }
22*3e5d0078SDavid du Colombier smbstringprint(&fullpath, "%s%s", t->serv->path, path);
239b004bddSDavid du Colombier fd = create(fullpath, OREAD, DMDIR | 0775);
248ccd4a63SDavid du Colombier if (fd < 0) {
258ccd4a63SDavid du Colombier smblogprint(h->command, "smbcomcreatedirectory failed: %r\n");
268ccd4a63SDavid du Colombier smbseterror(s, ERRDOS, ERRnoaccess);
278ccd4a63SDavid du Colombier free(path);
288ccd4a63SDavid du Colombier return SmbProcessResultError;
298ccd4a63SDavid du Colombier }
308ccd4a63SDavid du Colombier close(fd);
319b004bddSDavid du Colombier free(fullpath);
328ccd4a63SDavid du Colombier free(path);
338ccd4a63SDavid du Colombier return smbbufferputack(s->response, h, &s->peerinfo);
348ccd4a63SDavid du Colombier }
35