1*8ccd4a63SDavid du Colombier #include "headers.h"
2*8ccd4a63SDavid du Colombier
3*8ccd4a63SDavid du Colombier static SmbTransactionMethod smbtransactionmethodrap = {
4*8ccd4a63SDavid du Colombier .encodeprimary = smbtransactionencodeprimary,
5*8ccd4a63SDavid du Colombier .sendrequest = smbtransactionclientsend,
6*8ccd4a63SDavid du Colombier .receiveresponse = smbtransactionclientreceive,
7*8ccd4a63SDavid du Colombier .decoderesponse = smbtransactiondecoderesponse,
8*8ccd4a63SDavid du Colombier };
9*8ccd4a63SDavid du Colombier
10*8ccd4a63SDavid du Colombier int
smbclientrap(SmbClient * c,SmbBuffer * inparam,SmbBuffer * outparam,SmbBuffer * outdata,char ** errmsgp)11*8ccd4a63SDavid du Colombier smbclientrap(SmbClient *c, SmbBuffer *inparam, SmbBuffer *outparam, SmbBuffer *outdata, 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.name = smbglobals.pipelanman;
17*8ccd4a63SDavid du Colombier transaction.in.parameters = smbbufferreadpointer(inparam);
18*8ccd4a63SDavid du Colombier transaction.in.tpcount = smbbufferreadspace(inparam);
19*8ccd4a63SDavid du Colombier transaction.in.maxpcount = smbbufferwritespace(outparam);
20*8ccd4a63SDavid du Colombier transaction.in.maxdcount = smbbufferwritespace(outdata);
21*8ccd4a63SDavid du Colombier transaction.out.parameters = outparam;
22*8ccd4a63SDavid du Colombier transaction.out.data = outdata;
23*8ccd4a63SDavid du Colombier h = c->protoh;
24*8ccd4a63SDavid du Colombier h.tid = c->ipctid;
25*8ccd4a63SDavid du Colombier h.mid = 0;
26*8ccd4a63SDavid du Colombier return smbtransactionexecute(&transaction, &h, &c->peerinfo, c->b, &smbtransactionmethodrap, c, nil, errmsgp);
27*8ccd4a63SDavid du Colombier }
28*8ccd4a63SDavid du Colombier
29*8ccd4a63SDavid du Colombier int
smbnetserverenum2(SmbClient * c,ulong stype,char * domain,int * entriesp,SmbRapServerInfo1 ** sip,char ** errmsgp)30*8ccd4a63SDavid du Colombier smbnetserverenum2(SmbClient *c, ulong stype, char *domain, int *entriesp, SmbRapServerInfo1 **sip, char **errmsgp)
31*8ccd4a63SDavid du Colombier {
32*8ccd4a63SDavid du Colombier int rv;
33*8ccd4a63SDavid du Colombier ushort ec, entries, total, converter;
34*8ccd4a63SDavid du Colombier SmbRapServerInfo1 *si = nil;
35*8ccd4a63SDavid du Colombier SmbBuffer *ipb = smbbuffernew(512);
36*8ccd4a63SDavid du Colombier SmbBuffer *odb = smbbuffernew(65535);
37*8ccd4a63SDavid du Colombier SmbBuffer *opb = smbbuffernew(8);
38*8ccd4a63SDavid du Colombier smbbufferputs(ipb, 104);
39*8ccd4a63SDavid du Colombier smbbufferputstring(ipb, nil, SMB_STRING_ASCII, "WrLehDz");
40*8ccd4a63SDavid du Colombier smbbufferputstring(ipb, nil, SMB_STRING_ASCII, "B16BBDz");
41*8ccd4a63SDavid du Colombier smbbufferputs(ipb, 1);
42*8ccd4a63SDavid du Colombier smbbufferputs(ipb, smbbufferwritespace(odb));
43*8ccd4a63SDavid du Colombier smbbufferputl(ipb, stype);
44*8ccd4a63SDavid du Colombier smbbufferputstring(ipb, nil, SMB_STRING_ASCII, domain);
45*8ccd4a63SDavid du Colombier rv = !smbclientrap(c, ipb, opb, odb, errmsgp);
46*8ccd4a63SDavid du Colombier smbbufferfree(&ipb);
47*8ccd4a63SDavid du Colombier if (rv == 0) {
48*8ccd4a63SDavid du Colombier char *remark, *eremark;
49*8ccd4a63SDavid du Colombier int remarkspace;
50*8ccd4a63SDavid du Colombier int i;
51*8ccd4a63SDavid du Colombier if (!smbbuffergets(opb, &ec)
52*8ccd4a63SDavid du Colombier || !smbbuffergets(opb, &converter)
53*8ccd4a63SDavid du Colombier || !smbbuffergets(opb, &entries)
54*8ccd4a63SDavid du Colombier || !smbbuffergets(opb, &total)) {
55*8ccd4a63SDavid du Colombier smbstringprint(errmsgp, "smbnetserverenum2: not enough return parameters");
56*8ccd4a63SDavid du Colombier rv = -1;
57*8ccd4a63SDavid du Colombier goto done;
58*8ccd4a63SDavid du Colombier }
59*8ccd4a63SDavid du Colombier if (ec != 0) {
60*8ccd4a63SDavid du Colombier rv = ec;
61*8ccd4a63SDavid du Colombier goto done;
62*8ccd4a63SDavid du Colombier }
63*8ccd4a63SDavid du Colombier if (smbbufferreadspace(odb) < entries * 26) {
64*8ccd4a63SDavid du Colombier smbstringprint(errmsgp, "smbnetserverenum2: not enough return data");
65*8ccd4a63SDavid du Colombier rv = -1;
66*8ccd4a63SDavid du Colombier goto done;
67*8ccd4a63SDavid du Colombier }
68*8ccd4a63SDavid du Colombier remarkspace = smbbufferreadspace(odb) - entries * 26;
69*8ccd4a63SDavid du Colombier si = smbemalloc(entries * sizeof(SmbRapServerInfo1) + remarkspace);
70*8ccd4a63SDavid du Colombier remark = (char *)&si[entries];
71*8ccd4a63SDavid du Colombier eremark = remark + remarkspace;
72*8ccd4a63SDavid du Colombier for (i = 0; i < entries; i++) {
73*8ccd4a63SDavid du Colombier ulong offset;
74*8ccd4a63SDavid du Colombier int remarklen;
75*8ccd4a63SDavid du Colombier assert(smbbuffergetbytes(odb, si[i].name, 16));
76*8ccd4a63SDavid du Colombier assert(smbbuffergetb(odb, &si[i].vmaj));
77*8ccd4a63SDavid du Colombier assert(smbbuffergetb(odb, &si[i].vmin));
78*8ccd4a63SDavid du Colombier assert(smbbuffergetl(odb, &si[i].type));
79*8ccd4a63SDavid du Colombier assert(smbbuffergetl(odb, &offset));
80*8ccd4a63SDavid du Colombier offset -= converter;
81*8ccd4a63SDavid du Colombier if (!smbbufferoffsetcopystr(odb, offset, remark, eremark - remark, &remarklen)) {
82*8ccd4a63SDavid du Colombier smbstringprint(errmsgp, "smbnetserverenum2: invalid string offset");
83*8ccd4a63SDavid du Colombier rv = -1;
84*8ccd4a63SDavid du Colombier goto done;
85*8ccd4a63SDavid du Colombier }
86*8ccd4a63SDavid du Colombier si[i].remark = remark;
87*8ccd4a63SDavid du Colombier remark += remarklen;
88*8ccd4a63SDavid du Colombier }
89*8ccd4a63SDavid du Colombier *sip = si;
90*8ccd4a63SDavid du Colombier si = nil;
91*8ccd4a63SDavid du Colombier *entriesp = entries;
92*8ccd4a63SDavid du Colombier }
93*8ccd4a63SDavid du Colombier else
94*8ccd4a63SDavid du Colombier rv = -1;
95*8ccd4a63SDavid du Colombier done:
96*8ccd4a63SDavid du Colombier free(si);
97*8ccd4a63SDavid du Colombier smbbufferfree(&opb);
98*8ccd4a63SDavid du Colombier smbbufferfree(&odb);
99*8ccd4a63SDavid du Colombier return rv;
100*8ccd4a63SDavid du Colombier }
101