1*8ccd4a63SDavid du Colombier #include "headers.h"
2*8ccd4a63SDavid du Colombier
3*8ccd4a63SDavid du Colombier static SmbTransactionMethod method = {
4*8ccd4a63SDavid du Colombier .encodeprimary = smbtransactionencodeprimary2,
5*8ccd4a63SDavid du Colombier .sendrequest = smbtransactionclientsend,
6*8ccd4a63SDavid du Colombier .receiveresponse = smbtransactionclientreceive,
7*8ccd4a63SDavid du Colombier .decoderesponse = smbtransactiondecoderesponse2,
8*8ccd4a63SDavid du Colombier };
9*8ccd4a63SDavid du Colombier
10*8ccd4a63SDavid du Colombier int
smbclienttrans2(SmbClient * c,uchar scount,ushort * setup,SmbBuffer * inparam,SmbBuffer * outparam,SmbBuffer * outdata,SmbHeader * rh,char ** errmsgp)11*8ccd4a63SDavid du Colombier smbclienttrans2(SmbClient *c, uchar scount, ushort *setup, SmbBuffer *inparam, SmbBuffer *outparam, SmbBuffer *outdata, SmbHeader *rh, char **errmsgp)
12*8ccd4a63SDavid du Colombier {
13*8ccd4a63SDavid du Colombier SmbTransaction transaction;
14*8ccd4a63SDavid du Colombier SmbHeader h;
15*8ccd4a63SDavid du Colombier memset(&transaction, 0, sizeof(transaction));
16*8ccd4a63SDavid du Colombier transaction.in.scount = scount;
17*8ccd4a63SDavid du Colombier transaction.in.setup = setup;
18*8ccd4a63SDavid du Colombier transaction.in.parameters = smbbufferreadpointer(inparam);
19*8ccd4a63SDavid du Colombier transaction.in.tpcount = smbbufferreadspace(inparam);
20*8ccd4a63SDavid du Colombier transaction.in.maxpcount = smbbufferwritespace(outparam);
21*8ccd4a63SDavid du Colombier transaction.in.maxdcount = smbbufferwritespace(outdata);
22*8ccd4a63SDavid du Colombier transaction.out.parameters = outparam;
23*8ccd4a63SDavid du Colombier transaction.out.data = outdata;
24*8ccd4a63SDavid du Colombier h = c->protoh;
25*8ccd4a63SDavid du Colombier h.tid = c->sharetid;
26*8ccd4a63SDavid du Colombier h.mid = 0;
27*8ccd4a63SDavid du Colombier return smbtransactionexecute(&transaction, &h, &c->peerinfo, c->b, &method, c, rh, errmsgp);
28*8ccd4a63SDavid du Colombier }
29*8ccd4a63SDavid du Colombier
30*8ccd4a63SDavid du Colombier int
smbclienttrans2findfirst2(SmbClient * c,ushort searchcount,char * filename,ushort * sidp,ushort * searchcountp,ushort * endofsearchp,SmbFindFileBothDirectoryInfo * ip,char ** errmsgp)31*8ccd4a63SDavid du Colombier smbclienttrans2findfirst2(SmbClient *c, ushort searchcount, char *filename,
32*8ccd4a63SDavid du Colombier ushort *sidp, ushort *searchcountp, ushort *endofsearchp,SmbFindFileBothDirectoryInfo *ip, char **errmsgp)
33*8ccd4a63SDavid du Colombier {
34*8ccd4a63SDavid du Colombier int rv;
35*8ccd4a63SDavid du Colombier ushort setup;
36*8ccd4a63SDavid du Colombier SmbBuffer *inparam;
37*8ccd4a63SDavid du Colombier SmbBuffer *outparam;
38*8ccd4a63SDavid du Colombier SmbBuffer *outdata;
39*8ccd4a63SDavid du Colombier SmbHeader rh;
40*8ccd4a63SDavid du Colombier setup = SMB_TRANS2_FIND_FIRST2;
41*8ccd4a63SDavid du Colombier inparam = smbbuffernew(512);
42*8ccd4a63SDavid du Colombier smbbufferputs(inparam, 0x16);
43*8ccd4a63SDavid du Colombier smbbufferputs(inparam, searchcount);
44*8ccd4a63SDavid du Colombier smbbufferputs(inparam, 7);
45*8ccd4a63SDavid du Colombier smbbufferputs(inparam, SMB_FIND_FILE_BOTH_DIRECTORY_INFO);
46*8ccd4a63SDavid du Colombier smbbufferputl(inparam, 0);
47*8ccd4a63SDavid du Colombier smbbufferputstring(inparam, &c->peerinfo, 0, filename);
48*8ccd4a63SDavid du Colombier outparam = smbbuffernew(10);
49*8ccd4a63SDavid du Colombier outdata = smbbuffernew(65535);
50*8ccd4a63SDavid du Colombier rv = smbclienttrans2(c, 1, &setup, inparam, outparam, outdata, &rh, errmsgp);
51*8ccd4a63SDavid du Colombier smbbufferfree(&inparam);
52*8ccd4a63SDavid du Colombier if (rv) {
53*8ccd4a63SDavid du Colombier ushort eaerroroffset, lastnameoffset;
54*8ccd4a63SDavid du Colombier ulong nextentry;
55*8ccd4a63SDavid du Colombier int i;
56*8ccd4a63SDavid du Colombier
57*8ccd4a63SDavid du Colombier if (!smbbuffergets(outparam, sidp)
58*8ccd4a63SDavid du Colombier || !smbbuffergets(outparam, searchcountp)
59*8ccd4a63SDavid du Colombier || !smbbuffergets(outparam, endofsearchp)
60*8ccd4a63SDavid du Colombier || !smbbuffergets(outparam, &eaerroroffset)
61*8ccd4a63SDavid du Colombier || !smbbuffergets(outparam, &lastnameoffset)) {
62*8ccd4a63SDavid du Colombier smbstringprint(errmsgp, "smbclienttrans2findfirst2: not enough parameters returned");
63*8ccd4a63SDavid du Colombier rv = 0;
64*8ccd4a63SDavid du Colombier goto done;
65*8ccd4a63SDavid du Colombier }
66*8ccd4a63SDavid du Colombier nextentry = 0;
67*8ccd4a63SDavid du Colombier smblogprint(-1, "returned data:\n");
68*8ccd4a63SDavid du Colombier smblogdata(-1, smblogprint, smbbufferreadpointer(outdata), smbbufferreadspace(outdata), 256);
69*8ccd4a63SDavid du Colombier for (i = 0; i < *searchcountp; i++) {
70*8ccd4a63SDavid du Colombier SmbFindFileBothDirectoryInfo *info = ip + i;
71*8ccd4a63SDavid du Colombier ulong neo, filenamelength, easize;
72*8ccd4a63SDavid du Colombier uchar shortnamelength;
73*8ccd4a63SDavid du Colombier if (i && !smbbufferreadskipto(outdata, nextentry)) {
74*8ccd4a63SDavid du Colombier underflow:
75*8ccd4a63SDavid du Colombier smbstringprint(errmsgp, "smbclientrans2findfirst2: not enough data returned");
76*8ccd4a63SDavid du Colombier rv = 0;
77*8ccd4a63SDavid du Colombier goto done;
78*8ccd4a63SDavid du Colombier }
79*8ccd4a63SDavid du Colombier if (!smbbuffergetl(outdata, &neo))
80*8ccd4a63SDavid du Colombier goto underflow;
81*8ccd4a63SDavid du Colombier nextentry = smbbufferreadoffset(outdata) + neo - 4;
82*8ccd4a63SDavid du Colombier print("neo 0x%.8lux\n", neo);
83*8ccd4a63SDavid du Colombier if (!smbbuffergetl(outdata, &info->fileindex)
84*8ccd4a63SDavid du Colombier || !smbbuffergetv(outdata, &info->creationtime)
85*8ccd4a63SDavid du Colombier || !smbbuffergetv(outdata, &info->lastaccesstime)
86*8ccd4a63SDavid du Colombier || !smbbuffergetv(outdata, &info->lastwritetime)
87*8ccd4a63SDavid du Colombier || !smbbuffergetv(outdata, &info->changetime)
88*8ccd4a63SDavid du Colombier || !smbbuffergetv(outdata, &info->endoffile)
89*8ccd4a63SDavid du Colombier || !smbbuffergetv(outdata, &info->allocationsize))
90*8ccd4a63SDavid du Colombier goto underflow;
91*8ccd4a63SDavid du Colombier print("got here\n");
92*8ccd4a63SDavid du Colombier if (!smbbuffergetl(outdata, &info->extfileattributes)
93*8ccd4a63SDavid du Colombier || !smbbuffergetl(outdata, &filenamelength)
94*8ccd4a63SDavid du Colombier || !smbbuffergetl(outdata, &easize)
95*8ccd4a63SDavid du Colombier || !smbbuffergetb(outdata, &shortnamelength)
96*8ccd4a63SDavid du Colombier || !smbbuffergetbytes(outdata, nil, 1)
97*8ccd4a63SDavid du Colombier || !smbbuffergetbytes(outdata, nil, 24)
98*8ccd4a63SDavid du Colombier || !smbbuffergetstring(outdata, &rh, SMB_STRING_REVPATH, &info->filename))
99*8ccd4a63SDavid du Colombier goto underflow;
100*8ccd4a63SDavid du Colombier print("got here as well\n");
101*8ccd4a63SDavid du Colombier }
102*8ccd4a63SDavid du Colombier }
103*8ccd4a63SDavid du Colombier done:
104*8ccd4a63SDavid du Colombier smbbufferfree(&outparam);
105*8ccd4a63SDavid du Colombier smbbufferfree(&outdata);
106*8ccd4a63SDavid du Colombier return rv;
107*8ccd4a63SDavid du Colombier }
108*8ccd4a63SDavid du Colombier
109