ibcs2_socksys.h revision 3584
1/*-
2 * Copyright (c) 1994 Mostyn Lewis
3 * All rights reserved.
4 *
5 * This software is based on code which is:
6 * Copyright (c) 1994  Mike Jagdis (jaggy@purplet.demon.co.uk)
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 * 1. Redistributions of source code must retain the above copyright
12 *    notice, this list of conditions and the following disclaimer
13 *    in this position and unchanged.
14 * 2. Redistributions in binary form must reproduce the above copyright
15 *    notice, this list of conditions and the following disclaimer in the
16 *    documentation and/or other materials provided with the distribution.
17 * 3. The name of the author may not be used to endorse or promote products
18 *    derived from this software withough specific prior written permission
19 *
20 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
21 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
22 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
23 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
24 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
25 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
29 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 *
31 *	$Id: ibcs2_socksys.h,v 1.2 1994/10/13 23:10:58 sos Exp $
32 */
33
34#define	SS_DEBUG
35
36struct ss_call {
37	int	arg[7];
38};
39
40/* Alien socket */
41struct alien_sockaddr {
42	unsigned short	sa_family;	/* address family, AF_xxx       */
43	char		sa_data[14];	/* 14 bytes of protocol address */
44};
45
46struct alien_in_addr {
47        unsigned long int	s_addr;
48};
49
50#define	__ALIEN_SOCK_SIZE__	16	/* sizeof(struct alien_sockaddr)*/
51struct alien_sockaddr_in {
52  short int		sin_family;	/* Address family               */
53  unsigned short int	sin_port;	/* Port number                  */
54  struct alien_in_addr	sin_addr;	/* Internet address             */
55  unsigned char         __filling[__ALIEN_SOCK_SIZE__ - sizeof(short int) -
56                        sizeof(unsigned short int) - sizeof(struct alien_in_addr)];
57};
58
59struct sgdomarg {
60	char *name;
61	int namelen;
62};
63
64struct lstatarg {
65	char *fname;
66	void *statb;
67};
68
69struct socknewproto {
70	int	family;	/* address family (AF_INET, etc.) */
71	int	type;	/* protocol type (SOCK_STREAM, etc.) */
72	int	proto;	/* per family proto number */
73	dev_t	dev;	/* major/minor to use (must be a clone) */
74	int	flags;	/* protosw flags */
75};
76
77/* System type ordinals */
78#define	SS_FREEBSD	0
79#define	SS_SYSVR4	1
80#define	SS_SYSVR3	2
81#define	SS_SCO_32	3
82#define	SS_WYSE_321	4
83#define	SS_ISC		5
84#define	SS_LINUX	6
85
86
87/* Socksys macros */
88#define	IOCTL(cmd) \
89  if(error = ss_IOCTL(fp, cmd, arg, p))\
90	return(error);
91#define	SYSCALL(number,conv_arg,indicator) \
92  if(error = ss_SYSCALL(number,conv_arg,indicator,arg,p,retval))\
93	return(error);
94#define	SYSCALL_N(number,conv_arg,indicator) \
95  arg = (caddr_t)(((int *)arg) - 1);\
96  if(error = ss_SYSCALL(number,conv_arg,indicator,arg,p,retval))\
97	return(error);
98#define	SYSCALLX(number,arg)	(*sysent[number].sy_call)(p, (caddr_t)arg, retval)
99#define	SYSCALL_RETURN(number)	SYSCALL(number) ; IBCS2_MAGIC_RETURN
100
101/* Socksys commands */
102#define  CMD_SO_ACCEPT		1
103#define  CMD_SO_BIND		2
104#define  CMD_SO_CONNECT		3
105#define  CMD_SO_GETPEERNAME	4
106#define  CMD_SO_GETSOCKNAME	5
107#define  CMD_SO_GETSOCKOPT	6
108#define  CMD_SO_LISTEN		7
109#define  CMD_SO_RECV		8
110#define  CMD_SO_RECVFROM	9
111#define  CMD_SO_SEND		10
112#define  CMD_SO_SENDTO		11
113#define  CMD_SO_SETSOCKOPT	12
114#define  CMD_SO_SHUTDOWN	13
115#define  CMD_SO_SOCKET		14
116#define  CMD_SO_SELECT		15
117#define  CMD_SO_GETIPDOMAIN	16
118#define  CMD_SO_SETIPDOMAIN	17
119#define  CMD_SO_ADJTIME		18
120#define  CMD_SO_SETREUID	19
121#define  CMD_SO_SETREGID	20
122#define  CMD_SO_GETTIME		21
123#define  CMD_SO_SETTIME		22
124#define  CMD_SO_GETITIMER	23
125#define  CMD_SO_SETITIMER	24
126
127#define  CMD_SO_SS_DEBUG	255
128
129/* socksys ioctls */
130#define	SS_IOCPARM_MASK		0x7f		/* parameters must be < 128 bytes */
131#define	SS_IOC_VOID		0x20000000	/* no parameters */
132#define	SS_IOC_OUT		0x40000000	/* copy out parameters */
133#define	SS_IOC_IN		0x80000000	/* copy in parameters */
134#define	SS_IOC_INOUT		(SS_IOC_IN|SS_IOC_OUT)
135
136#define	SS_IO(x,y)		(SS_IOC_VOID|(x<<8)|y)
137#define	SS_IOR(x,y,t)		(SS_IOC_OUT|((sizeof(t)&SS_IOCPARM_MASK)<<16)|(x<<8)|y)
138#define	SS_IOW(x,y,t)		(SS_IOC_IN|((sizeof(t)&SS_IOCPARM_MASK)<<16)|(x<<8)|y)
139#define	SS_IOWR(x,y,t)		(SS_IOC_INOUT|((sizeof(t)&SS_IOCPARM_MASK)<<16)|(x<<8)|y)
140
141#define SS_SIOCSHIWAT		SS_IOW ('S', 1, int) /* set high watermark */
142#define SS_SIOCGHIWAT		SS_IOR ('S', 2, int) /* get high watermark */
143#define SS_SIOCSLOWAT		SS_IOW ('S', 3, int) /* set low watermark */
144#define SS_SIOCGLOWAT		SS_IOR ('S', 4, int) /* get low watermark */
145#define SS_SIOCATMARK		SS_IOR ('S', 5, int) /* at oob mark? */
146#define SS_SIOCSPGRP		SS_IOW ('S', 6, int) /* set process group */
147#define SS_SIOCGPGRP		SS_IOR ('S', 7, int) /* get process group */
148#define SS_FIONREAD		SS_IOR ('S', 8, int)
149#define SS_FIONBIO		SS_IOW ('S', 9, int)
150#define SS_FIOASYNC		SS_IOW ('S', 10, int)
151#define SS_SIOCPROTO		SS_IOW ('S', 11, struct socknewproto) /* link proto */
152#define SS_SIOCGETNAME		SS_IOR ('S', 12, struct sockaddr) /* getsockname */
153#define SS_SIOCGETPEER		SS_IOR ('S', 13,struct sockaddr) /* getpeername */
154#define SS_IF_UNITSEL		SS_IOW ('S', 14, int)/* set unit number */
155#define SS_SIOCXPROTO		SS_IO  ('S', 15)     /* empty proto table */
156
157#define	SS_SIOCADDRT		SS_IOW ('R', 9, struct ortentry) /* add route */
158#define	SS_SIOCDELRT		SS_IOW ('R', 10, struct ortentry)/* delete route */
159
160#define	SS_SIOCSIFADDR		SS_IOW ('I', 11, struct ifreq)/* set ifnet address */
161#define	SS_SIOCGIFADDR		SS_IOWR('I', 12, struct ifreq)/* get ifnet address */
162#define	SS_SIOCSIFDSTADDR	SS_IOW ('I', 13, struct ifreq)/* set p-p address */
163#define	SS_SIOCGIFDSTADDR	SS_IOWR('I', 14,struct ifreq) /* get p-p address */
164#define	SS_SIOCSIFFLAGS		SS_IOW ('I', 15, struct ifreq)/* set ifnet flags */
165#define	SS_SIOCGIFFLAGS		SS_IOWR('I', 16, struct ifreq)/* get ifnet flags */
166#define	SS_SIOCGIFCONF		SS_IOWR('I', 17, struct ifconf)/* get ifnet list */
167
168#define	SS_SIOCSIFMTU		SS_IOW ('I', 21, struct ifreq)/* get if_mtu */
169#define	SS_SIOCGIFMTU		SS_IOWR('I', 22, struct ifreq)/* set if_mtu */
170
171#define SS_SIOCIFDETACH		SS_IOW ('I', 26, struct ifreq)/* detach interface */
172#define SS_SIOCGENPSTATS	SS_IOWR('I', 27, struct ifreq)/* get ENP stats */
173
174#define SS_SIOCX25XMT		SS_IOWR('I', 29, struct ifreq)/* start a slp proc in x25if */
175#define SS_SIOCX25RCV		SS_IOWR('I', 30, struct ifreq)/* start a slp proc in x25if */
176#define SS_SIOCX25TBL		SS_IOWR('I', 31, struct ifreq)/* xfer lun table to kernel */
177
178#define	SS_SIOCGIFBRDADDR	SS_IOWR('I', 32, struct ifreq)/* get broadcast addr */
179#define	SS_SIOCSIFBRDADDR	SS_IOW ('I', 33, struct ifreq)/* set broadcast addr */
180#define	SS_SIOCGIFNETMASK	SS_IOWR('I', 34, struct ifreq)/* get net addr mask */
181#define	SS_SIOCSIFNETMASK	SS_IOW ('I', 35, struct ifreq)/* set net addr mask */
182#define	SS_SIOCGIFMETRIC	SS_IOWR('I', 36, struct ifreq)/* get IF metric */
183#define	SS_SIOCSIFMETRIC	SS_IOW ('I', 37, struct ifreq)/* set IF metric */
184
185#define	SS_SIOCSARP		SS_IOW ('I', 38, struct arpreq)/* set arp entry */
186#define	SS_SIOCGARP		SS_IOWR('I', 39, struct arpreq)/* get arp entry */
187#define	SS_SIOCDARP		SS_IOW ('I', 40, struct arpreq)/* delete arp entry */
188
189#define SS_SIOCSIFNAME		SS_IOW ('I', 41, struct ifreq)/* set interface name */
190#define	SS_SIOCGIFONEP		SS_IOWR('I', 42, struct ifreq)/* get 1-packet parms */
191#define	SS_SIOCSIFONEP		SS_IOW ('I', 43, struct ifreq)/* set 1-packet parms */
192
193#define SS_SIOCGENADDR		SS_IOWR('I', 65, struct ifreq)/* Get ethernet addr */
194
195#define SS_SIOCSOCKSYS		SS_IOW ('I', 66, struct ss_call)/* ss syscall */
196
197
198/*
199 *	NFS/NIS has a pseudo device called /dev/nfsd which may accept ioctl
200 *	calls. /dev/nfsd is linked to /dev/socksys.
201 */
202
203#define NIOCNFSD	1
204#define NIOCOLDGETFH	2
205#define NIOCASYNCD	3
206#define NIOCSETDOMNAM	4
207#define NIOCGETDOMNAM	5
208#define NIOCCLNTHAND	6
209#define NIOCEXPORTFS	7
210#define NIOCGETFH	8
211#define NIOCLSTAT	9
212
213
214/*
215 *	noso
216 */
217
218#define	SO_ORDREL	0xff02
219#define	SO_IMASOCKET	0xff03
220#define	SO_PROTOTYPE	0xff04
221/* Check below */
222#define SO_NO_CHECK	11
223#define SO_PRIORITY	12
224
225/*
226 *	convert
227 */
228
229/* Structure conversion indicators */
230
231#define	SS_STRUCT_ARPREQ	1
232#define	SS_STRUCT_IFCONF	2
233#define	SS_STRUCT_IFREQ		3
234#define	SS_STRUCT_ORTENTRY	4
235#define	SS_STRUCT_SOCKADDR	5
236#define	SS_STRUCT_SOCKNEWPROTO	6
237
238#define	SS_ALIEN_TO_NATIVE	1
239#define	SS_NATIVE_TO_ALIEN	2
240
241struct whatever {
242	int from, to;
243	unsigned char *conversion;
244	unsigned char all_the_same;
245	struct whatever *more;
246};
247
248
249extern struct whatever *af_whatevers[];
250extern struct whatever *type_whatevers[];
251extern struct whatever *sopt_whatevers[];
252extern struct whatever *struct_whatevers[];
253
254extern int ss_convert(struct whatever **what, int *this, int otherwise);
255extern int ss_convert_struct(char *alien, int indicator, int direction);
256
257/*
258 *	convert af
259 */
260
261
262static struct whatever af_whatevers_all[] =  {
263	{ 0, 2, NULL, 0, 0 },
264	{ -1 }
265};
266
267
268struct whatever *af_whatevers[] = {
269	NULL,			/* FreeBSD */
270	af_whatevers_all,	/* SysVR4 */
271	af_whatevers_all,	/* SysVR3 */
272	af_whatevers_all,	/* SCO 3.2.[24] */
273	af_whatevers_all,	/* Wyse Unix V/386 3.2.1 */
274	af_whatevers_all,	/* ISC */
275	af_whatevers_all	/* Linux */
276};
277
278/*
279 *	convert sopt
280 */
281
282static struct whatever sopt_whatevers_all[] =  {
283	{ 0x0001, 0x0001, (char *)SO_DEBUG, 0, 0 },
284	{ 0x0002, 0x0002, (char *)SO_ACCEPTCONN, 0, 0 },
285	{ 0x0004, 0x0004, (char *)SO_REUSEADDR, 0, 0 },
286	{ 0x0008, 0x0008, (char *)SO_KEEPALIVE, 0, 0 },
287	{ 0x0010, 0x0010, (char *)SO_DONTROUTE, 0, 0 },
288	{ 0x0020, 0x0020, (char *)SO_BROADCAST, 0, 0 },
289	{ 0x0040, 0x0040, (char *)SO_USELOOPBACK, 0, 0 },
290	{ 0x0080, 0x0080, (char *)SO_LINGER, 0, 0 },
291	{ 0x0100, 0x0100, (char *)SO_OOBINLINE, 0, 0 },
292	{ 0x0200, 0x0200, (char *)SO_ORDREL, 0, 0 },
293	{ 0x0400, 0x0400, (char *)SO_IMASOCKET, 0, 0 },
294	{ 0x1001, 0x1001, (char *)SO_SNDBUF, 0, 0 },
295	{ 0x1002, 0x1001, (char *)SO_RCVBUF, 0, 0 },
296	{ 0x1003, 0x1001, (char *)SO_SNDLOWAT, 0, 0 },
297	{ 0x1004, 0x1001, (char *)SO_RCVLOWAT, 0, 0 },
298	{ 0x1005, 0x1001, (char *)SO_SNDTIMEO, 0, 0 },
299	{ 0x1006, 0x1001, (char *)SO_RCVTIMEO, 0, 0 },
300	{ 0x1007, 0x1001, (char *)SO_ERROR, 0, 0 },
301	{ 0x1008, 0x1001, (char *)SO_TYPE, 0, 0 },
302	{ 0x1009, 0x1001, (char *)SO_PROTOTYPE, 0, 0 },
303	{ -1 }
304};
305
306
307struct whatever *sopt_whatevers[] = {
308	NULL,			/* FreeBSD */
309	sopt_whatevers_all,	/* SysVR4 */
310	sopt_whatevers_all,	/* SysVR3 */
311	sopt_whatevers_all,	/* SCO 3.2.[24] */
312	sopt_whatevers_all,	/* Wyse Unix V/386 3.2.1 */
313	sopt_whatevers_all,	/* ISC */
314	sopt_whatevers_all	/* Linux */
315};
316
317/*
318 *	convert struct
319 */
320
321static struct whatever struct_whatever_typeI_ranges[] = {
322	{ 11, 16, (char *)SS_STRUCT_IFREQ	, 1, 0 }, /* OK */
323	{ 17, 17, (char *)SS_STRUCT_IFCONF	, 1, 0 }, /* OK */
324	{ 21, 22, (char *)SS_STRUCT_IFREQ	, 1, 0 }, /* SIZE OK */
325	{ 26, 27, (char *)SS_STRUCT_IFREQ	, 1, 0 }, /* SIZE OK */
326	{ 29, 37, (char *)SS_STRUCT_IFREQ	, 1, 0 }, /* SIZE OK */
327	{ 38, 40, (char *)SS_STRUCT_ARPREQ	, 1, 0 }, /* OK */
328	{ 41, 43, (char *)SS_STRUCT_IFREQ	, 1, 0 }, /* SIZE OK */
329	{ 65, 65, (char *)SS_STRUCT_IFREQ	, 1, 0 }, /* SIZE OK */
330	{ -1 }
331};
332
333static struct whatever struct_whatever_typeR_ranges[] = {
334	{ 9,  10, (char *)SS_STRUCT_ORTENTRY	, 1, 0 }, /* SIZE OK */
335	{ -1 }
336};
337
338static struct whatever struct_whatever_typeS_ranges[] = {
339	{ 1,  10, 0				, 1, 0 },
340	{ 11, 11, (char *)SS_STRUCT_SOCKNEWPROTO, 1, 0 }, /* NO SUPPORT */
341	{ 12, 13, (char *)SS_STRUCT_SOCKADDR	, 1, 0 }, /* len and family */
342	{ 14, 15, 0				, 1, 0 },
343	{ -1 }
344};
345
346static struct whatever struct_whatevers_all[] = {
347	{ 'I', 'I', 0, 0, struct_whatever_typeI_ranges },
348	{ 'R', 'R', 0, 0, struct_whatever_typeR_ranges },
349	{ 'S', 'S', 0, 0, struct_whatever_typeS_ranges },
350	{ -1 }
351};
352
353struct whatever *struct_whatevers[] = {
354	struct_whatevers_all,	/* FreeBSD */
355	struct_whatevers_all,	/* SysVR4 */
356	struct_whatevers_all,	/* SysVR3 */
357	struct_whatevers_all,	/* SCO 3.2.[24] */
358	struct_whatevers_all,	/* Wyse Unix V/386 3.2.1 */
359	struct_whatevers_all,	/* ISC */
360	struct_whatevers_all	/* Linux */
361};
362
363int ss_struct_native_sizes[] = {
364	sizeof(struct arpreq),
365	sizeof(struct ifconf),
366	sizeof(struct ifreq),
367	sizeof(struct rtentry),
368	sizeof(struct sockaddr),
369	sizeof(struct socknewproto)
370};
371
372/*
373 *	convert type
374 */
375
376static char type_conversion_SysVr4_range1[] = {
377	SOCK_DGRAM,
378	SOCK_STREAM,
379	0,
380	SOCK_RAW,
381	SOCK_RDM,
382	SOCK_SEQPACKET
383};
384
385static struct whatever type_whatevers_SysVr4[] = {
386	{ 1, 6, type_conversion_SysVr4_range1, 0 },
387	{ -1 }
388};
389
390struct whatever *type_whatevers[] = {
391	NULL,			/* FreeBSD */
392	type_whatevers_SysVr4,	/* SysVR4 */
393	NULL,			/* SysVR3 */
394	NULL,			/* SCO 3.2.[24] */
395	NULL,			/* Wyse Unix V/386 3.2.1 */
396	NULL,			/* ISC */
397	NULL			/* Linux */
398};
399