1*8ccd4a63SDavid du Colombier #include "headers.h"
2*8ccd4a63SDavid du Colombier
3*8ccd4a63SDavid du Colombier SmbProcessResult
smbcomcheckdirectory(SmbSession * s,SmbHeader * h,uchar *,SmbBuffer * b)4*8ccd4a63SDavid du Colombier smbcomcheckdirectory(SmbSession *s, SmbHeader *h, uchar *, SmbBuffer *b)
5*8ccd4a63SDavid du Colombier {
6*8ccd4a63SDavid du Colombier char *path;
7*8ccd4a63SDavid du Colombier Dir *d;
8*8ccd4a63SDavid du Colombier uchar fmt;
9*8ccd4a63SDavid du Colombier SmbProcessResult pr;
10*8ccd4a63SDavid du Colombier SmbTree *t;
11*8ccd4a63SDavid du Colombier char *fullpath = nil;
12*8ccd4a63SDavid du Colombier
13*8ccd4a63SDavid du Colombier if (!smbcheckwordcount("comcheckdirectory", h, 0))
14*8ccd4a63SDavid du Colombier return SmbProcessResultFormat;
15*8ccd4a63SDavid du Colombier
16*8ccd4a63SDavid du Colombier if (!smbbuffergetb(b, &fmt)
17*8ccd4a63SDavid du Colombier || fmt != 4
18*8ccd4a63SDavid du Colombier || !smbbuffergetstring(b, h, SMB_STRING_PATH, &path))
19*8ccd4a63SDavid du Colombier return SmbProcessResultFormat;
20*8ccd4a63SDavid du Colombier
21*8ccd4a63SDavid du Colombier t = smbidmapfind(s->tidmap, h->tid);
22*8ccd4a63SDavid du Colombier if (t == nil) {
23*8ccd4a63SDavid du Colombier smbseterror(s, ERRSRV, ERRinvtid);
24*8ccd4a63SDavid du Colombier return SmbProcessResultError;
25*8ccd4a63SDavid du Colombier }
26*8ccd4a63SDavid du Colombier
27*8ccd4a63SDavid du Colombier smbstringprint(&fullpath, "%s%s", t->serv->path, path);
28*8ccd4a63SDavid du Colombier smblogprintif(1, "smbcomcheckdirectory: statting %s\n", fullpath);
29*8ccd4a63SDavid du Colombier d = dirstat(fullpath);
30*8ccd4a63SDavid du Colombier
31*8ccd4a63SDavid du Colombier if (d == nil || (d->mode & DMDIR) == 0) {
32*8ccd4a63SDavid du Colombier smbseterror(s, ERRDOS, ERRbadpath);
33*8ccd4a63SDavid du Colombier pr = SmbProcessResultError;
34*8ccd4a63SDavid du Colombier goto done;
35*8ccd4a63SDavid du Colombier }
36*8ccd4a63SDavid du Colombier
37*8ccd4a63SDavid du Colombier if (access(fullpath, AREAD) < 0) {
38*8ccd4a63SDavid du Colombier smbseterror(s, ERRDOS, ERRbadpath);
39*8ccd4a63SDavid du Colombier pr = SmbProcessResultError;
40*8ccd4a63SDavid du Colombier goto done;
41*8ccd4a63SDavid du Colombier }
42*8ccd4a63SDavid du Colombier
43*8ccd4a63SDavid du Colombier pr = smbbufferputack(s->response, h, &s->peerinfo) ? SmbProcessResultReply : SmbProcessResultMisc;
44*8ccd4a63SDavid du Colombier done:
45*8ccd4a63SDavid du Colombier free(fullpath);
46*8ccd4a63SDavid du Colombier free(path);
47*8ccd4a63SDavid du Colombier free(d);
48*8ccd4a63SDavid du Colombier return pr;
49*8ccd4a63SDavid du Colombier }
50