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