1 #include "headers.h" 2 3 int 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