1*8ccd4a63SDavid du Colombier #include "headers.h"
2*8ccd4a63SDavid du Colombier
3*8ccd4a63SDavid du Colombier typedef struct RapTableEntry RapTableEntry;
4*8ccd4a63SDavid du Colombier
5*8ccd4a63SDavid du Colombier struct RapTableEntry {
6*8ccd4a63SDavid du Colombier char *name;
7*8ccd4a63SDavid du Colombier SmbProcessResult (*procedure)(SmbBuffer *inparam, SmbBuffer *outparam, SmbBuffer *outdata);
8*8ccd4a63SDavid du Colombier };
9*8ccd4a63SDavid du Colombier
10*8ccd4a63SDavid du Colombier typedef int INFOSIZEFN(ushort level, void *data);
11*8ccd4a63SDavid du Colombier typedef int INFOPUTFN(SmbBuffer *b, ushort level, void *data);
12*8ccd4a63SDavid du Colombier typedef int INFOPUTSTRINGSFN(SmbBuffer *b, ushort level, int instance, void *data);
13*8ccd4a63SDavid du Colombier typedef void *INFOENUMERATEFN(void *magic, int i);
14*8ccd4a63SDavid du Colombier
15*8ccd4a63SDavid du Colombier typedef struct InfoMethod {
16*8ccd4a63SDavid du Colombier INFOSIZEFN *size;
17*8ccd4a63SDavid du Colombier INFOPUTFN *put;
18*8ccd4a63SDavid du Colombier INFOPUTSTRINGSFN *putstrings;
19*8ccd4a63SDavid du Colombier INFOENUMERATEFN *enumerate;
20*8ccd4a63SDavid du Colombier } InfoMethod;
21*8ccd4a63SDavid du Colombier
22*8ccd4a63SDavid du Colombier static int
serverinfosize(ushort level,void * data)23*8ccd4a63SDavid du Colombier serverinfosize(ushort level, void *data)
24*8ccd4a63SDavid du Colombier {
25*8ccd4a63SDavid du Colombier SmbServerInfo *si = data;
26*8ccd4a63SDavid du Colombier switch (level) {
27*8ccd4a63SDavid du Colombier case 0:
28*8ccd4a63SDavid du Colombier return 16;
29*8ccd4a63SDavid du Colombier case 1:
30*8ccd4a63SDavid du Colombier return 26 + smbstrlen(si->remark);
31*8ccd4a63SDavid du Colombier default:
32*8ccd4a63SDavid du Colombier return 0;
33*8ccd4a63SDavid du Colombier }
34*8ccd4a63SDavid du Colombier }
35*8ccd4a63SDavid du Colombier
36*8ccd4a63SDavid du Colombier static int
serverinfoput(SmbBuffer * b,ushort level,void * data)37*8ccd4a63SDavid du Colombier serverinfoput(SmbBuffer *b, ushort level, void *data)
38*8ccd4a63SDavid du Colombier {
39*8ccd4a63SDavid du Colombier SmbServerInfo *si = data;
40*8ccd4a63SDavid du Colombier if (!smbbufferputstrn(b, si->name, 16, 1))
41*8ccd4a63SDavid du Colombier return 0;
42*8ccd4a63SDavid du Colombier if (level > 0) {
43*8ccd4a63SDavid du Colombier if (!smbbufferputb(b, si->vmaj)
44*8ccd4a63SDavid du Colombier || !smbbufferputb(b, si->vmin)
45*8ccd4a63SDavid du Colombier || !smbbufferputl(b, si->stype)
46*8ccd4a63SDavid du Colombier || !smbbufferputl(b, 0))
47*8ccd4a63SDavid du Colombier return 0;
48*8ccd4a63SDavid du Colombier }
49*8ccd4a63SDavid du Colombier if (level > 1)
50*8ccd4a63SDavid du Colombier return 0;
51*8ccd4a63SDavid du Colombier return 1;
52*8ccd4a63SDavid du Colombier }
53*8ccd4a63SDavid du Colombier
54*8ccd4a63SDavid du Colombier static int
serverinfoputstrings(SmbBuffer * b,ushort level,int instance,void * data)55*8ccd4a63SDavid du Colombier serverinfoputstrings(SmbBuffer *b, ushort level, int instance, void *data)
56*8ccd4a63SDavid du Colombier {
57*8ccd4a63SDavid du Colombier SmbServerInfo *si = data;
58*8ccd4a63SDavid du Colombier if (level == 1) {
59*8ccd4a63SDavid du Colombier if (!smbbufferfixupabsolutel(b, instance * 26 + 22)
60*8ccd4a63SDavid du Colombier || !smbbufferputstring(b, nil, SMB_STRING_ASCII, si->remark))
61*8ccd4a63SDavid du Colombier return 0;
62*8ccd4a63SDavid du Colombier }
63*8ccd4a63SDavid du Colombier return 1;
64*8ccd4a63SDavid du Colombier }
65*8ccd4a63SDavid du Colombier
66*8ccd4a63SDavid du Colombier static void *
serverinfoenumerate(void * magic,int i)67*8ccd4a63SDavid du Colombier serverinfoenumerate(void *magic, int i)
68*8ccd4a63SDavid du Colombier {
69*8ccd4a63SDavid du Colombier if (magic) {
70*8ccd4a63SDavid du Colombier SmbServerInfo **si = magic;
71*8ccd4a63SDavid du Colombier return si[i];
72*8ccd4a63SDavid du Colombier }
73*8ccd4a63SDavid du Colombier if (i == 0)
74*8ccd4a63SDavid du Colombier return &smbglobals.serverinfo;
75*8ccd4a63SDavid du Colombier return nil;
76*8ccd4a63SDavid du Colombier }
77*8ccd4a63SDavid du Colombier
78*8ccd4a63SDavid du Colombier InfoMethod serverinfo = {
79*8ccd4a63SDavid du Colombier serverinfosize,
80*8ccd4a63SDavid du Colombier serverinfoput,
81*8ccd4a63SDavid du Colombier serverinfoputstrings,
82*8ccd4a63SDavid du Colombier serverinfoenumerate,
83*8ccd4a63SDavid du Colombier };
84*8ccd4a63SDavid du Colombier
85*8ccd4a63SDavid du Colombier static int
shareinfosize(ushort level,void * data)86*8ccd4a63SDavid du Colombier shareinfosize(ushort level, void *data)
87*8ccd4a63SDavid du Colombier {
88*8ccd4a63SDavid du Colombier SmbService *serv = data;
89*8ccd4a63SDavid du Colombier switch (level) {
90*8ccd4a63SDavid du Colombier case 0:
91*8ccd4a63SDavid du Colombier return 13;
92*8ccd4a63SDavid du Colombier case 1:
93*8ccd4a63SDavid du Colombier return 20 + smbstrlen(serv->remark);
94*8ccd4a63SDavid du Colombier case 2:
95*8ccd4a63SDavid du Colombier return 40 + smbstrlen(serv->remark) + smbstrlen(serv->path);
96*8ccd4a63SDavid du Colombier default:
97*8ccd4a63SDavid du Colombier return 0;
98*8ccd4a63SDavid du Colombier }
99*8ccd4a63SDavid du Colombier }
100*8ccd4a63SDavid du Colombier
101*8ccd4a63SDavid du Colombier static int
shareinfoput(SmbBuffer * b,ushort level,void * data)102*8ccd4a63SDavid du Colombier shareinfoput(SmbBuffer *b, ushort level, void *data)
103*8ccd4a63SDavid du Colombier {
104*8ccd4a63SDavid du Colombier SmbService *serv = data;
105*8ccd4a63SDavid du Colombier if (!smbbufferputstrn(b, serv->name, 13, 0))
106*8ccd4a63SDavid du Colombier return 0;
107*8ccd4a63SDavid du Colombier if (level > 0) {
108*8ccd4a63SDavid du Colombier if (!smbbufferputb(b, 0)
109*8ccd4a63SDavid du Colombier || !smbbufferputs(b, serv->stype)
110*8ccd4a63SDavid du Colombier || !smbbufferputl(b, 0))
111*8ccd4a63SDavid du Colombier return 0;
112*8ccd4a63SDavid du Colombier }
113*8ccd4a63SDavid du Colombier if (level > 1) {
114*8ccd4a63SDavid du Colombier if (!smbbufferputs(b, 7)
115*8ccd4a63SDavid du Colombier || !smbbufferputs(b, -1)
116*8ccd4a63SDavid du Colombier || !smbbufferputs(b, serv->ref)
117*8ccd4a63SDavid du Colombier || !smbbufferputl(b, 0)
118*8ccd4a63SDavid du Colombier || !smbbufferfill(b, 0, 10))
119*8ccd4a63SDavid du Colombier return 0;
120*8ccd4a63SDavid du Colombier }
121*8ccd4a63SDavid du Colombier if (level > 2)
122*8ccd4a63SDavid du Colombier return 0;
123*8ccd4a63SDavid du Colombier return 1;
124*8ccd4a63SDavid du Colombier }
125*8ccd4a63SDavid du Colombier
126*8ccd4a63SDavid du Colombier static int
shareinfoputstrings(SmbBuffer * b,ushort level,int instance,void * data)127*8ccd4a63SDavid du Colombier shareinfoputstrings(SmbBuffer *b, ushort level, int instance, void *data)
128*8ccd4a63SDavid du Colombier {
129*8ccd4a63SDavid du Colombier SmbService *serv = data;
130*8ccd4a63SDavid du Colombier switch (level) {
131*8ccd4a63SDavid du Colombier case 0:
132*8ccd4a63SDavid du Colombier break;
133*8ccd4a63SDavid du Colombier case 1:
134*8ccd4a63SDavid du Colombier if (!smbbufferfixupabsolutel(b, instance * 20 + 16)
135*8ccd4a63SDavid du Colombier || !smbbufferputstring(b, nil, SMB_STRING_ASCII, serv->remark))
136*8ccd4a63SDavid du Colombier return 0;
137*8ccd4a63SDavid du Colombier break;
138*8ccd4a63SDavid du Colombier case 2:
139*8ccd4a63SDavid du Colombier if (!smbbufferfixupabsolutel(b, instance * 40 + 16)
140*8ccd4a63SDavid du Colombier || !smbbufferputstring(b, nil, SMB_STRING_ASCII, serv->remark)
141*8ccd4a63SDavid du Colombier || !smbbufferfixupabsolutel(b, instance * 40 + 26)
142*8ccd4a63SDavid du Colombier || !smbbufferputstring(b, nil, SMB_STRING_ASCII, serv->path))
143*8ccd4a63SDavid du Colombier return 0;
144*8ccd4a63SDavid du Colombier break;
145*8ccd4a63SDavid du Colombier default:
146*8ccd4a63SDavid du Colombier return 0;
147*8ccd4a63SDavid du Colombier }
148*8ccd4a63SDavid du Colombier return 1;
149*8ccd4a63SDavid du Colombier }
150*8ccd4a63SDavid du Colombier
151*8ccd4a63SDavid du Colombier static void *
shareinfoenumerate(void *,int i)152*8ccd4a63SDavid du Colombier shareinfoenumerate(void *, int i)
153*8ccd4a63SDavid du Colombier {
154*8ccd4a63SDavid du Colombier SmbService *serv;
155*8ccd4a63SDavid du Colombier for (serv = smbservices; i-- > 0 && serv; serv = serv->next)
156*8ccd4a63SDavid du Colombier ;
157*8ccd4a63SDavid du Colombier return serv;
158*8ccd4a63SDavid du Colombier }
159*8ccd4a63SDavid du Colombier
160*8ccd4a63SDavid du Colombier static InfoMethod shareinfo = {
161*8ccd4a63SDavid du Colombier shareinfosize,
162*8ccd4a63SDavid du Colombier shareinfoput,
163*8ccd4a63SDavid du Colombier shareinfoputstrings,
164*8ccd4a63SDavid du Colombier shareinfoenumerate,
165*8ccd4a63SDavid du Colombier };
166*8ccd4a63SDavid du Colombier
167*8ccd4a63SDavid du Colombier static SmbProcessResult
thingfill(SmbBuffer * outparam,SmbBuffer * outdata,InfoMethod * m,ushort level,void * magic)168*8ccd4a63SDavid du Colombier thingfill(SmbBuffer *outparam, SmbBuffer *outdata, InfoMethod *m, ushort level, void *magic)
169*8ccd4a63SDavid du Colombier {
170*8ccd4a63SDavid du Colombier int sentthings, totalthings;
171*8ccd4a63SDavid du Colombier int i;
172*8ccd4a63SDavid du Colombier int totalbytes;
173*8ccd4a63SDavid du Colombier
174*8ccd4a63SDavid du Colombier sentthings = 0;
175*8ccd4a63SDavid du Colombier totalbytes = 0;
176*8ccd4a63SDavid du Colombier for (i = 0; ; i++) {
177*8ccd4a63SDavid du Colombier int len;
178*8ccd4a63SDavid du Colombier void *thing = (*m->enumerate)(magic, i);
179*8ccd4a63SDavid du Colombier if (thing == nil)
180*8ccd4a63SDavid du Colombier break;
181*8ccd4a63SDavid du Colombier len = (*m->size)(level, thing);
182*8ccd4a63SDavid du Colombier if (totalbytes + len <= smbbufferspace(outdata)) {
183*8ccd4a63SDavid du Colombier assert((*m->put)(outdata, level, thing));
184*8ccd4a63SDavid du Colombier sentthings++;
185*8ccd4a63SDavid du Colombier }
186*8ccd4a63SDavid du Colombier totalbytes += len;
187*8ccd4a63SDavid du Colombier }
188*8ccd4a63SDavid du Colombier totalthings = i;
189*8ccd4a63SDavid du Colombier for (i = 0; i < sentthings; i++) {
190*8ccd4a63SDavid du Colombier void *thing = (*m->enumerate)(magic, i);
191*8ccd4a63SDavid du Colombier assert(thing);
192*8ccd4a63SDavid du Colombier assert((*m->putstrings)(outdata, level, i, thing));
193*8ccd4a63SDavid du Colombier }
194*8ccd4a63SDavid du Colombier if (!smbbufferputs(outparam, sentthings < totalthings ? SMB_RAP_ERROR_MORE_DATA : SMB_RAP_NERR_SUCCESS)
195*8ccd4a63SDavid du Colombier || !smbbufferputs(outparam, 0)
196*8ccd4a63SDavid du Colombier || !smbbufferputs(outparam, totalthings)
197*8ccd4a63SDavid du Colombier || !smbbufferputs(outparam, sentthings))
198*8ccd4a63SDavid du Colombier return SmbProcessResultFormat;
199*8ccd4a63SDavid du Colombier return SmbProcessResultReply;
200*8ccd4a63SDavid du Colombier }
201*8ccd4a63SDavid du Colombier
202*8ccd4a63SDavid du Colombier static SmbProcessResult
onethingfill(SmbBuffer * outparam,SmbBuffer * outdata,InfoMethod * m,ushort level,void * thing)203*8ccd4a63SDavid du Colombier onethingfill(SmbBuffer *outparam, SmbBuffer *outdata, InfoMethod *m, ushort level, void *thing)
204*8ccd4a63SDavid du Colombier {
205*8ccd4a63SDavid du Colombier int moredata;
206*8ccd4a63SDavid du Colombier int totalbytes = (*m->size)(level, thing);
207*8ccd4a63SDavid du Colombier if (totalbytes <= smbbufferspace(outdata)) {
208*8ccd4a63SDavid du Colombier assert((*m->put)(outdata, level, thing));
209*8ccd4a63SDavid du Colombier assert((*m->putstrings)(outdata, level, 0, thing));
210*8ccd4a63SDavid du Colombier moredata = 0;
211*8ccd4a63SDavid du Colombier }
212*8ccd4a63SDavid du Colombier else
213*8ccd4a63SDavid du Colombier moredata = 1;
214*8ccd4a63SDavid du Colombier if (!smbbufferputs(outparam, moredata ? SMB_RAP_ERROR_MORE_DATA : SMB_RAP_NERR_SUCCESS)
215*8ccd4a63SDavid du Colombier || !smbbufferputs(outparam, 0)
216*8ccd4a63SDavid du Colombier || !smbbufferputs(outparam, totalbytes))
217*8ccd4a63SDavid du Colombier return SmbProcessResultFormat;
218*8ccd4a63SDavid du Colombier return SmbProcessResultReply;
219*8ccd4a63SDavid du Colombier }
220*8ccd4a63SDavid du Colombier
221*8ccd4a63SDavid du Colombier static SmbProcessResult
netshareenum(SmbBuffer * inparam,SmbBuffer * outparam,SmbBuffer * outdata)222*8ccd4a63SDavid du Colombier netshareenum(SmbBuffer *inparam, SmbBuffer *outparam, SmbBuffer *outdata)
223*8ccd4a63SDavid du Colombier {
224*8ccd4a63SDavid du Colombier ushort level;
225*8ccd4a63SDavid du Colombier
226*8ccd4a63SDavid du Colombier /* WrLeh */
227*8ccd4a63SDavid du Colombier /* ushort sLevel, RCVBUF pbBuffer, RCVBUFLEN cbBuffer, ENTCOUNT pcEntriesRead, ushort *pcTotalAvail */
228*8ccd4a63SDavid du Colombier
229*8ccd4a63SDavid du Colombier if (!smbbuffergets(inparam, &level))
230*8ccd4a63SDavid du Colombier return SmbProcessResultFormat;
231*8ccd4a63SDavid du Colombier
232*8ccd4a63SDavid du Colombier smblogprintif(smbglobals.log.rap2, "netshareenum(%lud, %lud)\n",
233*8ccd4a63SDavid du Colombier level, smbbufferwritespace(outdata));
234*8ccd4a63SDavid du Colombier
235*8ccd4a63SDavid du Colombier if (level != 1)
236*8ccd4a63SDavid du Colombier return SmbProcessResultFormat;
237*8ccd4a63SDavid du Colombier
238*8ccd4a63SDavid du Colombier return thingfill(outparam, outdata, &shareinfo, level, nil);
239*8ccd4a63SDavid du Colombier }
240*8ccd4a63SDavid du Colombier
241*8ccd4a63SDavid du Colombier static SmbProcessResult
netserverenum2(SmbBuffer * inparam,SmbBuffer * outparam,SmbBuffer * outdata)242*8ccd4a63SDavid du Colombier netserverenum2(SmbBuffer *inparam, SmbBuffer *outparam, SmbBuffer *outdata)
243*8ccd4a63SDavid du Colombier {
244*8ccd4a63SDavid du Colombier ushort level, rbl;
245*8ccd4a63SDavid du Colombier char *domain;
246*8ccd4a63SDavid du Colombier ulong servertype;
247*8ccd4a63SDavid du Colombier SmbProcessResult pr;
248*8ccd4a63SDavid du Colombier SmbServerInfo *si[3];
249*8ccd4a63SDavid du Colombier SmbServerInfo domainsi;
250*8ccd4a63SDavid du Colombier int entries;
251*8ccd4a63SDavid du Colombier
252*8ccd4a63SDavid du Colombier /* WrLehDz
253*8ccd4a63SDavid du Colombier * ushort sLevel, RCVBUF pbBuffer, RCVBUFLEN cbBuffer, ENTCOUNT pcEntriesRead, ushort *pcTotalAvail,
254*8ccd4a63SDavid du Colombier * ulong fServerType, char *pszDomain
255*8ccd4a63SDavid du Colombier */
256*8ccd4a63SDavid du Colombier
257*8ccd4a63SDavid du Colombier if (!smbbuffergets(inparam, &level)
258*8ccd4a63SDavid du Colombier || !smbbuffergets(inparam, &rbl)
259*8ccd4a63SDavid du Colombier || !smbbuffergetl(inparam, &servertype)
260*8ccd4a63SDavid du Colombier || !smbbuffergetstr(inparam, 0, &domain)) {
261*8ccd4a63SDavid du Colombier fmtfail:
262*8ccd4a63SDavid du Colombier pr = SmbProcessResultFormat;
263*8ccd4a63SDavid du Colombier goto done;
264*8ccd4a63SDavid du Colombier }
265*8ccd4a63SDavid du Colombier
266*8ccd4a63SDavid du Colombier smblogprintif(smbglobals.log.rap2, "netserverenum2(%lud, %lud, 0x%.8lux, %s)\n",
267*8ccd4a63SDavid du Colombier level, smbbufferwritespace(outdata), servertype, domain);
268*8ccd4a63SDavid du Colombier
269*8ccd4a63SDavid du Colombier if (level > 1)
270*8ccd4a63SDavid du Colombier goto fmtfail;
271*8ccd4a63SDavid du Colombier
272*8ccd4a63SDavid du Colombier if (servertype == 0xffffffff)
273*8ccd4a63SDavid du Colombier servertype &= ~(SV_TYPE_DOMAIN_ENUM | SV_TYPE_LOCAL_LIST_ONLY);
274*8ccd4a63SDavid du Colombier
275*8ccd4a63SDavid du Colombier if ((servertype & SV_TYPE_LOCAL_LIST_ONLY) != 0 && (servertype & SV_TYPE_DOMAIN_ENUM) == 0)
276*8ccd4a63SDavid du Colombier servertype = SV_TYPE_ALL & ~(SV_TYPE_DOMAIN_ENUM);
277*8ccd4a63SDavid du Colombier
278*8ccd4a63SDavid du Colombier entries = 0;
279*8ccd4a63SDavid du Colombier
280*8ccd4a63SDavid du Colombier if ((servertype & SV_TYPE_SERVER) != 0
281*8ccd4a63SDavid du Colombier && (domain[0] == 0 || cistrcmp(domain, smbglobals.primarydomain) == 0)) {
282*8ccd4a63SDavid du Colombier si[entries++] = &smbglobals.serverinfo;
283*8ccd4a63SDavid du Colombier }
284*8ccd4a63SDavid du Colombier
285*8ccd4a63SDavid du Colombier if ((servertype & SV_TYPE_DOMAIN_ENUM) != 0) {
286*8ccd4a63SDavid du Colombier /* there's only one that I know about */
287*8ccd4a63SDavid du Colombier memset(&domainsi, 0, sizeof(domainsi));
288*8ccd4a63SDavid du Colombier domainsi.name = smbglobals.primarydomain;
289*8ccd4a63SDavid du Colombier domainsi.stype = SV_TYPE_DOMAIN_ENUM;
290*8ccd4a63SDavid du Colombier si[entries++] = &domainsi;
291*8ccd4a63SDavid du Colombier }
292*8ccd4a63SDavid du Colombier si[entries] = 0;
293*8ccd4a63SDavid du Colombier
294*8ccd4a63SDavid du Colombier pr = thingfill(outparam, outdata, &serverinfo, level, si);
295*8ccd4a63SDavid du Colombier
296*8ccd4a63SDavid du Colombier done:
297*8ccd4a63SDavid du Colombier free(domain);
298*8ccd4a63SDavid du Colombier return pr;
299*8ccd4a63SDavid du Colombier }
300*8ccd4a63SDavid du Colombier
301*8ccd4a63SDavid du Colombier static SmbProcessResult
netsharegetinfo(SmbBuffer * inparam,SmbBuffer * outparam,SmbBuffer * outdata)302*8ccd4a63SDavid du Colombier netsharegetinfo(SmbBuffer *inparam, SmbBuffer *outparam, SmbBuffer *outdata)
303*8ccd4a63SDavid du Colombier {
304*8ccd4a63SDavid du Colombier char *netname;
305*8ccd4a63SDavid du Colombier ushort level;
306*8ccd4a63SDavid du Colombier SmbProcessResult pr;
307*8ccd4a63SDavid du Colombier SmbService *serv;
308*8ccd4a63SDavid du Colombier
309*8ccd4a63SDavid du Colombier /*
310*8ccd4a63SDavid du Colombier * zWrLh
311*8ccd4a63SDavid du Colombier * char *pszNetName, ushort sLevel, RCVBUF pbBuffer, RCVBUFLEN cbBuffer, ushort *pcbTotalAvail
312*8ccd4a63SDavid du Colombier */
313*8ccd4a63SDavid du Colombier
314*8ccd4a63SDavid du Colombier if (!smbbuffergetstrinline(inparam, &netname)
315*8ccd4a63SDavid du Colombier || !smbbuffergets(inparam, &level)) {
316*8ccd4a63SDavid du Colombier fmtfail:
317*8ccd4a63SDavid du Colombier pr = SmbProcessResultFormat;
318*8ccd4a63SDavid du Colombier goto done;
319*8ccd4a63SDavid du Colombier }
320*8ccd4a63SDavid du Colombier
321*8ccd4a63SDavid du Colombier smblogprintif(smbglobals.log.rap2, "netsharegetinfo(%s, %lud, %lud)\n",
322*8ccd4a63SDavid du Colombier netname, level, smbbufferwritespace(outdata));
323*8ccd4a63SDavid du Colombier
324*8ccd4a63SDavid du Colombier if (level > 2)
325*8ccd4a63SDavid du Colombier goto fmtfail;
326*8ccd4a63SDavid du Colombier
327*8ccd4a63SDavid du Colombier for (serv = smbservices; serv; serv = serv->next)
328*8ccd4a63SDavid du Colombier if (cistrcmp(serv->name, netname) == 0)
329*8ccd4a63SDavid du Colombier break;
330*8ccd4a63SDavid du Colombier
331*8ccd4a63SDavid du Colombier if (serv == nil) {
332*8ccd4a63SDavid du Colombier smblogprint(-1, "netsharegetinfo: service %s unimplemented\n", netname);
333*8ccd4a63SDavid du Colombier pr = SmbProcessResultUnimp;
334*8ccd4a63SDavid du Colombier goto done;
335*8ccd4a63SDavid du Colombier }
336*8ccd4a63SDavid du Colombier
337*8ccd4a63SDavid du Colombier pr = onethingfill(outparam, outdata, &shareinfo, level, serv);
338*8ccd4a63SDavid du Colombier
339*8ccd4a63SDavid du Colombier done:
340*8ccd4a63SDavid du Colombier return pr;
341*8ccd4a63SDavid du Colombier }
342*8ccd4a63SDavid du Colombier
343*8ccd4a63SDavid du Colombier static SmbProcessResult
netservergetinfo(SmbBuffer * inparam,SmbBuffer * outparam,SmbBuffer * outdata)344*8ccd4a63SDavid du Colombier netservergetinfo(SmbBuffer *inparam, SmbBuffer *outparam, SmbBuffer *outdata)
345*8ccd4a63SDavid du Colombier {
346*8ccd4a63SDavid du Colombier ushort level;
347*8ccd4a63SDavid du Colombier SmbProcessResult pr;
348*8ccd4a63SDavid du Colombier
349*8ccd4a63SDavid du Colombier /* WrLh
350*8ccd4a63SDavid du Colombier * ushort sLevel, RCVBUF pbBuffer, RCVBUFLEN cbBuffer, ushort *pcbTotalAvail
351*8ccd4a63SDavid du Colombier */
352*8ccd4a63SDavid du Colombier
353*8ccd4a63SDavid du Colombier if (!smbbuffergets(inparam, &level)) {
354*8ccd4a63SDavid du Colombier fmtfail:
355*8ccd4a63SDavid du Colombier pr = SmbProcessResultFormat;
356*8ccd4a63SDavid du Colombier goto done;
357*8ccd4a63SDavid du Colombier }
358*8ccd4a63SDavid du Colombier
359*8ccd4a63SDavid du Colombier smblogprintif(smbglobals.log.rap2, "netservergetinfo(%lud, %lud)\n",
360*8ccd4a63SDavid du Colombier level, smbbufferwritespace(outdata));
361*8ccd4a63SDavid du Colombier
362*8ccd4a63SDavid du Colombier if (level > 1)
363*8ccd4a63SDavid du Colombier goto fmtfail;
364*8ccd4a63SDavid du Colombier
365*8ccd4a63SDavid du Colombier pr = onethingfill(outparam, outdata, &shareinfo, level, &smbglobals.serverinfo);
366*8ccd4a63SDavid du Colombier
367*8ccd4a63SDavid du Colombier done:
368*8ccd4a63SDavid du Colombier return pr;
369*8ccd4a63SDavid du Colombier }
370*8ccd4a63SDavid du Colombier
371*8ccd4a63SDavid du Colombier static SmbProcessResult
netwkstagetinfo(SmbBuffer * inparam,SmbBuffer * outparam,SmbBuffer * outdata)372*8ccd4a63SDavid du Colombier netwkstagetinfo(SmbBuffer *inparam, SmbBuffer *outparam, SmbBuffer *outdata)
373*8ccd4a63SDavid du Colombier {
374*8ccd4a63SDavid du Colombier ushort level;
375*8ccd4a63SDavid du Colombier ushort usefulbytes;
376*8ccd4a63SDavid du Colombier SmbProcessResult pr;
377*8ccd4a63SDavid du Colombier int moredata;
378*8ccd4a63SDavid du Colombier
379*8ccd4a63SDavid du Colombier /* WrLh
380*8ccd4a63SDavid du Colombier * ushort sLevel, RCVBUF pbBuffer, RCVBUFLEN cbBuffer, ushort *pcbTotalAvail
381*8ccd4a63SDavid du Colombier */
382*8ccd4a63SDavid du Colombier
383*8ccd4a63SDavid du Colombier if (!smbbuffergets(inparam, &level)) {
384*8ccd4a63SDavid du Colombier fmtfail:
385*8ccd4a63SDavid du Colombier pr = SmbProcessResultFormat;
386*8ccd4a63SDavid du Colombier goto done;
387*8ccd4a63SDavid du Colombier }
388*8ccd4a63SDavid du Colombier
389*8ccd4a63SDavid du Colombier smblogprintif(smbglobals.log.rap2, "netwkstagetinfo(%lud, %lud)\n",
390*8ccd4a63SDavid du Colombier level, smbbufferwritespace(outdata));
391*8ccd4a63SDavid du Colombier
392*8ccd4a63SDavid du Colombier if (level != 10)
393*8ccd4a63SDavid du Colombier goto fmtfail;
394*8ccd4a63SDavid du Colombier
395*8ccd4a63SDavid du Colombier usefulbytes = 22 + smbstrlen(smbglobals.serverinfo.name) + smbstrlen(getuser())
396*8ccd4a63SDavid du Colombier + 3 * smbstrlen(smbglobals.primarydomain);
397*8ccd4a63SDavid du Colombier
398*8ccd4a63SDavid du Colombier moredata = usefulbytes > smbbufferwritespace(outdata);
399*8ccd4a63SDavid du Colombier
400*8ccd4a63SDavid du Colombier assert(smbbufferputl(outdata, 0));
401*8ccd4a63SDavid du Colombier assert(smbbufferputl(outdata, 0));
402*8ccd4a63SDavid du Colombier assert(smbbufferputl(outdata, 0));
403*8ccd4a63SDavid du Colombier assert(smbbufferputb(outdata, smbglobals.serverinfo.vmaj));
404*8ccd4a63SDavid du Colombier assert(smbbufferputb(outdata, smbglobals.serverinfo.vmin));
405*8ccd4a63SDavid du Colombier assert(smbbufferputl(outdata, 0));
406*8ccd4a63SDavid du Colombier assert(smbbufferputl(outdata, 0));
407*8ccd4a63SDavid du Colombier assert(smbbufferfixupabsolutel(outdata, 0));
408*8ccd4a63SDavid du Colombier assert(smbbufferputstring(outdata, nil, SMB_STRING_ASCII, smbglobals.serverinfo.name));
409*8ccd4a63SDavid du Colombier assert(smbbufferfixupabsolutel(outdata, 4));
410*8ccd4a63SDavid du Colombier assert(smbbufferputstring(outdata, nil, SMB_STRING_ASCII, getuser()));
411*8ccd4a63SDavid du Colombier assert(smbbufferfixupabsolutel(outdata, 8));
412*8ccd4a63SDavid du Colombier assert(smbbufferputstring(outdata, nil, SMB_STRING_ASCII, smbglobals.primarydomain));
413*8ccd4a63SDavid du Colombier assert(smbbufferfixupabsolutel(outdata, 14));
414*8ccd4a63SDavid du Colombier assert(smbbufferputstring(outdata, nil, SMB_STRING_ASCII, smbglobals.primarydomain));
415*8ccd4a63SDavid du Colombier assert(smbbufferfixupabsolutel(outdata, 18));
416*8ccd4a63SDavid du Colombier assert(smbbufferputstring(outdata, nil, SMB_STRING_ASCII, smbglobals.primarydomain));
417*8ccd4a63SDavid du Colombier
418*8ccd4a63SDavid du Colombier if (!smbbufferputs(outparam, moredata ? SMB_RAP_ERROR_MORE_DATA : SMB_RAP_NERR_SUCCESS)
419*8ccd4a63SDavid du Colombier || !smbbufferputs(outparam, 0)
420*8ccd4a63SDavid du Colombier || !smbbufferputs(outparam, usefulbytes)) {
421*8ccd4a63SDavid du Colombier pr = SmbProcessResultFormat;
422*8ccd4a63SDavid du Colombier goto done;
423*8ccd4a63SDavid du Colombier }
424*8ccd4a63SDavid du Colombier
425*8ccd4a63SDavid du Colombier pr = SmbProcessResultReply;
426*8ccd4a63SDavid du Colombier
427*8ccd4a63SDavid du Colombier done:
428*8ccd4a63SDavid du Colombier return pr;
429*8ccd4a63SDavid du Colombier }
430*8ccd4a63SDavid du Colombier
431*8ccd4a63SDavid du Colombier static RapTableEntry raptable[] = {
432*8ccd4a63SDavid du Colombier [RapNetShareGetInfo] { "NetShareGetInfo", netsharegetinfo },
433*8ccd4a63SDavid du Colombier [RapNetShareEnum] { "NetShareEnum", netshareenum },
434*8ccd4a63SDavid du Colombier [RapNetServerGetInfo] {"NetServerGetInfo", netservergetinfo },
435*8ccd4a63SDavid du Colombier [RapNetWkstaGetInfo] { "NetWkstaGetInfo", netwkstagetinfo },
436*8ccd4a63SDavid du Colombier [RapNetServerEnum2] { "NetServerEnum2", netserverenum2 },
437*8ccd4a63SDavid du Colombier };
438*8ccd4a63SDavid du Colombier
439*8ccd4a63SDavid du Colombier SmbProcessResult
smbrap2(SmbSession * s)440*8ccd4a63SDavid du Colombier smbrap2(SmbSession *s)
441*8ccd4a63SDavid du Colombier {
442*8ccd4a63SDavid du Colombier char *pstring;
443*8ccd4a63SDavid du Colombier char *dstring;
444*8ccd4a63SDavid du Colombier ushort pno;
445*8ccd4a63SDavid du Colombier RapTableEntry *e;
446*8ccd4a63SDavid du Colombier SmbProcessResult pr;
447*8ccd4a63SDavid du Colombier SmbBuffer *inparam;
448*8ccd4a63SDavid du Colombier
449*8ccd4a63SDavid du Colombier inparam = smbbufferinit(s->transaction.in.parameters, s->transaction.in.parameters, s->transaction.in.tpcount);
450*8ccd4a63SDavid du Colombier if (!smbbuffergets(inparam, &pno)
451*8ccd4a63SDavid du Colombier || !smbbuffergetstrinline(inparam, &pstring)
452*8ccd4a63SDavid du Colombier || !smbbuffergetstrinline(inparam, &dstring)) {
453*8ccd4a63SDavid du Colombier smblogprintif(smbglobals.log.rap2, "smbrap2: not enough parameters\n");
454*8ccd4a63SDavid du Colombier pr = SmbProcessResultFormat;
455*8ccd4a63SDavid du Colombier goto done;
456*8ccd4a63SDavid du Colombier }
457*8ccd4a63SDavid du Colombier if (pno > nelem(raptable) || raptable[pno].name == nil) {
458*8ccd4a63SDavid du Colombier smblogprint(-1, "smbrap2: unsupported procedure %ud\n", pno);
459*8ccd4a63SDavid du Colombier pr = SmbProcessResultUnimp;
460*8ccd4a63SDavid du Colombier goto done;
461*8ccd4a63SDavid du Colombier }
462*8ccd4a63SDavid du Colombier e = raptable + pno;
463*8ccd4a63SDavid du Colombier pr = (*e->procedure)(inparam, s->transaction.out.parameters, s->transaction.out.data);
464*8ccd4a63SDavid du Colombier done:
465*8ccd4a63SDavid du Colombier smbbufferfree(&inparam);
466*8ccd4a63SDavid du Colombier return pr;
467*8ccd4a63SDavid du Colombier }
468