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