diff options
author | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
---|---|---|
committer | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
commit | e5888a1ffdae813d7575f5fb02275c6bb07e5199 (patch) | |
tree | d8d51eac403f07814b9e936eed0c9a79195e2450 /sys/src/cmd/aquarela/smbclientopen.c |
Import sources from 2011-03-30 iso image
Diffstat (limited to 'sys/src/cmd/aquarela/smbclientopen.c')
-rwxr-xr-x | sys/src/cmd/aquarela/smbclientopen.c | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/sys/src/cmd/aquarela/smbclientopen.c b/sys/src/cmd/aquarela/smbclientopen.c new file mode 100755 index 000000000..86b6e01b8 --- /dev/null +++ b/sys/src/cmd/aquarela/smbclientopen.c @@ -0,0 +1,53 @@ +#include "headers.h" + +int +smbclientopen(SmbClient *c, ushort mode, char *name, uchar *errclassp, ushort *errorp, + ushort *fidp, ushort *attrp, ulong *mtimep, ulong *sizep, ushort *accessallowedp, char **errmsgp) +{ + SmbBuffer *b; + SmbHeader h; + ulong bytecountfixup; + long n; + uchar *pdata; + ushort bytecount; + + b = smbbuffernew(65535); + h = c->protoh; + h.tid = c->sharetid; + h.command = SMB_COM_OPEN; + h.wordcount = 2; + smbbufferputheader(b, &h, &c->peerinfo); + smbbufferputs(b, mode); + smbbufferputs(b, 0); + bytecountfixup = smbbufferwriteoffset(b); + smbbufferputs(b, 0); + smbbufferputb(b, 4); + smbbufferputstring(b, &c->peerinfo, SMB_STRING_REVPATH, name); + smbbufferfixuprelatives(b, bytecountfixup); + nbsswrite(c->nbss, smbbufferreadpointer(b), smbbufferwriteoffset(b)); + smbbufferreset(b); + n = nbssread(c->nbss, smbbufferwritepointer(b), smbbufferwritespace(b)); + if (n < 0) { + smbstringprint(errmsgp, "read error: %r"); + smbbufferfree(&b); + return 0; + } + smbbuffersetreadlen(b, n); + if (!smbbuffergetandcheckheader(b, &h, h.command, 7, &pdata, &bytecount, errmsgp)) { + smbbufferfree(&b); + return 0; + } + if (h.errclass) { + *errclassp = h.errclass; + *errorp = h.error; + smbbufferfree(&b); + return 0; + } + *fidp = smbnhgets(pdata); pdata += 2; + *attrp = smbnhgets(pdata); pdata += 2; + *mtimep = smbnhgetl(pdata); pdata += 4; + *sizep = smbnhgets(pdata); pdata += 4; + *accessallowedp = smbnhgets(pdata); + return 1; +} + |