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