xref: /plan9/sys/src/cmd/aquarela/smbcomdir.c (revision 8ccd4a6360d974db7bd7bbd4f37e7018419ea908)
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