xref: /plan9/sys/src/cmd/aquarela/smbclientopen.c (revision 8ccd4a6360d974db7bd7bbd4f37e7018419ea908)
1*8ccd4a63SDavid du Colombier #include "headers.h"
2*8ccd4a63SDavid du Colombier 
3*8ccd4a63SDavid du Colombier int
smbclientopen(SmbClient * c,ushort mode,char * name,uchar * errclassp,ushort * errorp,ushort * fidp,ushort * attrp,ulong * mtimep,ulong * sizep,ushort * accessallowedp,char ** errmsgp)4*8ccd4a63SDavid du Colombier smbclientopen(SmbClient *c, ushort mode, char *name, uchar *errclassp, ushort *errorp,
5*8ccd4a63SDavid du Colombier 	ushort *fidp, ushort *attrp, ulong *mtimep, ulong *sizep, ushort *accessallowedp, char **errmsgp)
6*8ccd4a63SDavid du Colombier {
7*8ccd4a63SDavid du Colombier 	SmbBuffer *b;
8*8ccd4a63SDavid du Colombier 	SmbHeader h;
9*8ccd4a63SDavid du Colombier 	ulong bytecountfixup;
10*8ccd4a63SDavid du Colombier 	long n;
11*8ccd4a63SDavid du Colombier 	uchar *pdata;
12*8ccd4a63SDavid du Colombier 	ushort bytecount;
13*8ccd4a63SDavid du Colombier 
14*8ccd4a63SDavid du Colombier 	b = smbbuffernew(65535);
15*8ccd4a63SDavid du Colombier 	h = c->protoh;
16*8ccd4a63SDavid du Colombier 	h.tid = c->sharetid;
17*8ccd4a63SDavid du Colombier 	h.command = SMB_COM_OPEN;
18*8ccd4a63SDavid du Colombier 	h.wordcount = 2;
19*8ccd4a63SDavid du Colombier 	smbbufferputheader(b, &h, &c->peerinfo);
20*8ccd4a63SDavid du Colombier 	smbbufferputs(b, mode);
21*8ccd4a63SDavid du Colombier 	smbbufferputs(b, 0);
22*8ccd4a63SDavid du Colombier 	bytecountfixup = smbbufferwriteoffset(b);
23*8ccd4a63SDavid du Colombier 	smbbufferputs(b, 0);
24*8ccd4a63SDavid du Colombier 	smbbufferputb(b, 4);
25*8ccd4a63SDavid du Colombier 	smbbufferputstring(b, &c->peerinfo, SMB_STRING_REVPATH, name);
26*8ccd4a63SDavid du Colombier 	smbbufferfixuprelatives(b, bytecountfixup);
27*8ccd4a63SDavid du Colombier 	nbsswrite(c->nbss, smbbufferreadpointer(b), smbbufferwriteoffset(b));
28*8ccd4a63SDavid du Colombier 	smbbufferreset(b);
29*8ccd4a63SDavid du Colombier 	n = nbssread(c->nbss, smbbufferwritepointer(b), smbbufferwritespace(b));
30*8ccd4a63SDavid du Colombier 	if (n < 0) {
31*8ccd4a63SDavid du Colombier 		smbstringprint(errmsgp, "read error: %r");
32*8ccd4a63SDavid du Colombier 		smbbufferfree(&b);
33*8ccd4a63SDavid du Colombier 		return 0;
34*8ccd4a63SDavid du Colombier 	}
35*8ccd4a63SDavid du Colombier 	smbbuffersetreadlen(b, n);
36*8ccd4a63SDavid du Colombier 	if (!smbbuffergetandcheckheader(b, &h, h.command, 7, &pdata, &bytecount, errmsgp)) {
37*8ccd4a63SDavid du Colombier 		smbbufferfree(&b);
38*8ccd4a63SDavid du Colombier 		return 0;
39*8ccd4a63SDavid du Colombier 	}
40*8ccd4a63SDavid du Colombier 	if (h.errclass) {
41*8ccd4a63SDavid du Colombier 		*errclassp = h.errclass;
42*8ccd4a63SDavid du Colombier 		*errorp = h.error;
43*8ccd4a63SDavid du Colombier 		smbbufferfree(&b);
44*8ccd4a63SDavid du Colombier 		return 0;
45*8ccd4a63SDavid du Colombier 	}
46*8ccd4a63SDavid du Colombier 	*fidp = smbnhgets(pdata); pdata += 2;
47*8ccd4a63SDavid du Colombier 	*attrp = smbnhgets(pdata); pdata += 2;
48*8ccd4a63SDavid du Colombier 	*mtimep = smbnhgetl(pdata); pdata += 4;
49*8ccd4a63SDavid du Colombier 	*sizep = smbnhgets(pdata); pdata += 4;
50*8ccd4a63SDavid du Colombier 	*accessallowedp = smbnhgets(pdata);
51*8ccd4a63SDavid du Colombier 	return 1;
52*8ccd4a63SDavid du Colombier }
53*8ccd4a63SDavid du Colombier 
54