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