xref: /plan9/sys/src/cmd/aquarela/smbtrans2client.c (revision 8ccd4a6360d974db7bd7bbd4f37e7018419ea908)
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