blob: 425960fb3c148698ebd558515d498e7d2211b82c [file] [log] [blame]
/* source: xioopts.h */
/* Copyright Gerhard Rieger and contributors (see file CHANGES) */
/* Published under the GNU General Public License V.2, see file COPYING */
#ifndef __xioopts_h_included
#define __xioopts_h_included 1
#define ODESC_END ((void *)0) /* indicates end of actual option array */
#define ODESC_DONE ((void *)-1) /* indicates that option has been applied */
#define ODESC_ERROR ODESC_DONE /* maybe later */
#define XIO_OFFSETOF(x) ((size_t)&((xiosingle_t *)0)->x)
#define XIO_SIZEOF(x) (sizeof(((struct single *)0)->x))
/* atomic structure for use in the option search table; keep compatible with
struct wordent! */
struct optname {
const char *name;
const struct optdesc *desc;
} ;
/* keep consistent with xiohelp.c:optiontypenames[] ! */
enum e_types {
TYPE_CONST, /* keyword means a fix value - implies int type */
TYPE_BIN, /* raw binary data, length determined by data */
TYPE_BOOL, /* value is 0 or 1 (no-value is interpreted as 1) */
TYPE_BYTE, /* unsigned char */
TYPE_INT, /* int */
TYPE_LONG, /* long */
TYPE_STRING, /* char * */
TYPE_NAME = TYPE_STRING,
TYPE_FILENAME = TYPE_STRING,
TYPE_PTRDIFF, /* ptrdiff_t */
TYPE_SHORT, /* short */
TYPE_SIZE_T, /* size_t */
TYPE_SOCKADDR, /* struct sockaddr * */
TYPE_UINT, /* unsigned int */
TYPE_ULONG, /* unsigned long */
TYPE_USHORT, /* unsigned short */
TYPE_2BYTE = TYPE_USHORT,
TYPE_MODET, /* representation of mode_t */
TYPE_GIDT, /* representation of gid_t */
TYPE_UIDT, /* representation of uid_t */
/*TYPE_FLAG,*/
TYPE_INT3, /* int[3] */
TYPE_TIMEVAL, /* struct timeval: {long;long;}, seconds and microsec. */
TYPE_TIMESPEC, /* struct timespec: {time_t;long;}, seconds and nanosec. */
TYPE_DOUBLE, /* double */
TYPE_STRING_NULL, /* char *; string or NULL */
TYPE_LONGLONG, /* long long */
TYPE_OFF32, /* off_t */
TYPE_OFF64, /* off64_t */
TYPE_INT_INT, /* 2 parameters: first is int, second is int */
TYPE_INT_INTP, /* 2 parameters: first is int, second is int* */
TYPE_INT_BIN, /* 2 parameters: first is int, second is binary */
TYPE_INT_STRING, /* 2 parameters: first is int, second is req string */
TYPE_INT_INT_INT, /* 3 params: first and second are int, 3rd is int */
TYPE_INT_INT_BIN, /* 3 params: first and second are int, 3rd is binary */
TYPE_INT_INT_STRING, /* 3 params: first and second are int, 3rd is string */
TYPE_INT_INT_GENERIC, /* 3 params: first and second are int, 3rd is specified by value (dalan syntax) */
TYPE_IP4NAME, /* IPv4 hostname or address */
#if HAVE_STRUCT_LINGER
TYPE_LINGER, /* struct linger */
#endif /* HAVE_STRUCT_LINGER */
#if HAVE_STRUCT_IP_MREQ || HAVE_STRUCT_IP_MREQN
TYPE_IP_MREQN, /* for struct ip_mreq or struct ip_mreqn */
#endif
#if HAVE_STRUCT_IP_MREQ_SOURCE
TYPE_IP_MREQ_SOURCE, /* for struct ip_mreq_source */
#endif
TYPE_GENERIC, /* type is determined from (text) data provided (dalan syntax) */
} ;
enum e_func {
OFUNC_NONE, /* no function - should not occur */
OFUNC_FLAG, /* no function, but bitposition, only with bool; arg1 is mask */
OFUNC_FLAG_PATTERN, /* no function, but bitpattern: arg1 is pattern, arg2 is mask */
OFUNC_SEEK32, /* lseek(): arg1 is whence (SEEK_SET etc.) */
OFUNC_SEEK64, /* lseek64(): arg1 is whence (SEEK_SET etc.) */
OFUNC_FCNTL, /* fcntl(, ): arg1 is cmd */
OFUNC_IOCTL, /* ioctl(): arg1 of option description is request, arg2
is int setrequest */
OFUNC_IOCTL_MASK_LONG, /* arg1 is getrequest, arg2 is setrequest:
ioctl(arg1, ); |= arg3; ioctl(arg2, ); */
OFUNC_IOCTL_GENERIC, /* generic ioctl() (request on cmdline) */
OFUNC_SOCKOPT, /* setsockopt() */
OFUNC_SOCKOPT_APPEND,/* getsockopt(), append data, setsockopt() */
OFUNC_SOCKOPT_GENERIC,/* generic setsockopt() (level, optname on cmdline) */
OFUNC_FLOCK, /* flock() */
OFUNC_TERMIO, /* termio() ? */
OFUNC_SPEC, /* special, i.e. no generalizable function call */
OFUNC_OFFSET, /* put a value into xiofile struct; major is offset */
OFUNC_OFFSET_MASKS, /* !!! */
/*OFUNC_APPL,*/ /* special, i.e. application must know which f. */
OFUNC_EXT, /* with extended file descriptors only */
OFUNC_TERMIOS_FLAG, /* a flag in struct termios: major..tcflag, minor..bit
*/
OFUNC_TERMIOS_PATTERN, /* a multibit: major..tcflag, minor..pattern,
arg3..mask */
OFUNC_TERMIOS_VALUE, /* a variable value: major..tcflag, minor..mask, arg3..shift */
OFUNC_TERMIOS_CHAR, /* a termios functional character: major..c_cc index */
OFUNC_TERMIOS_SPEED, /* termios c_ispeed etc on FreeBSD */
OFUNC_TERMIOS_SPEC, /* termios combined modes */
OFUNC_SIGNAL, /* a signal that should be passed to child process */
OFUNC_RESOLVER, /* a bit position used on _res.options */
OFUNC_IFFLAG, /* interface flag: locical-or a 1bit mask */
# define ENABLE_OFUNC
# include "xio-streams.h" /* push a POSIX STREAMS module */
# undef ENABLE_OFUNC
} ;
/* for simpler handling of option-to-connection-type relations we define
groups. to keep the search for options simple, we allow each option to
belong to at most one group only. (we have a dummy GROUP_NONE for those
that don't want to belong to any...)
The caller of parseopts() specifies per bitpatter a set of groups where it
accepts options from.
*/
/*- the group bits are:
- 000ooooo 00000000 000000uf 0000ssss
- ooooo: more detailed description to ssss (e.g., socket family)
- ssss: the type of stream, as in stat.h: S_IF...
- f: has a named entry in the file system
- u: has user and group
*/
/* keep consistent with xiohelp.c:addressgroupnames[] ! */
/* a dummy group */
#define GROUP_NONE 0x00000000
#define GROUP_FD 0x00000001 /* everything applyable to a fd */
#define GROUP_FIFO 0x00000002
#define GROUP_CHR 0x00000004
#define GROUP_BLK 0x00000008
#define GROUP_REG 0x00000010
#define GROUP_FILE GROUP_REG
#define GROUP_SOCKET 0x00000020
#define GROUP_READLINE 0x00000040
#define GROUP_NAMED 0x00000100 /* file system entry */
#define GROUP_OPEN 0x00000200 /* flags for open() */
#define GROUP_EXEC 0x00000400 /* program or script execution */
#define GROUP_FORK 0x00000800 /* communication with forked process */
#define GROUP_LISTEN 0x00001000 /* socket in listening mode */
/* 0x00002000 */
#define GROUP_CHILD 0x00004000 /* autonom child process */
#define GROUP_RETRY 0x00008000 /* when open/connect etc. fails */
#define GROUP_TERMIOS 0x00010000
#define GROUP_RANGE 0x00020000 /* differs from GROUP_LISTEN */
#define GROUP_PTY 0x00040000 /* address pty or exec...,pty */
#define GROUP_PARENT 0x00080000 /* for parent of communicating child */
#define GROUP_SOCK_UNIX 0x00100000
#define GROUP_SOCK_IP4 0x00200000
#define GROUP_SOCK_IP6 0x00400000
#define GROUP_SOCK_IP (GROUP_SOCK_IP4|GROUP_SOCK_IP6)
#define GROUP_INTERFACE 0x00800000
#define GROUP_TUN GROUP_INTERFACE
#define GROUP_IP_UDP 0x01000000
#define GROUP_IP_TCP 0x02000000
#define GROUP_IPAPP (GROUP_IP_UDP|GROUP_IP_TCP|GROUP_IP_SCTP) /* true: indicates one of UDP, TCP, SCTP */
#define GROUP_IP_SOCKS4 0x04000000
#define GROUP_OPENSSL 0x08000000
#define GROUP_PROCESS 0x10000000 /* a process related option */
#define GROUP_APPL 0x20000000 /* option handled by data loop */
#define GROUP_HTTP 0x40000000 /* any HTTP client */
#define GROUP_IP_SCTP 0x80000000
#define GROUP_ANY (GROUP_PROCESS|GROUP_APPL)
#define GROUP_ALL 0xffffffff
/* no IP multicasts, no error queue yet */
/* the only reason for keeping this enum sorted is to help detecting name
conflicts. */
/* optcode's */
enum e_optcode {
OPT_ADDRESS_FAMILY = 1,
/* these are not alphabetically, I know... */
OPT_B0, /* termios.c_cflag */
OPT_B50, /* termios.c_cflag */
OPT_B75, /* termios.c_cflag */
OPT_B110, /* termios.c_cflag */
OPT_B134, /* termios.c_cflag */
OPT_B150, /* termios.c_cflag */
OPT_B200, /* termios.c_cflag */
OPT_B300, /* termios.c_cflag */
OPT_B600, /* termios.c_cflag */
OPT_B900, /* termios.c_cflag - HP-UX */
OPT_B1200, /* termios.c_cflag */
OPT_B1800, /* termios.c_cflag */
OPT_B2400, /* termios.c_cflag */
OPT_B3600, /* termios.c_cflag - HP-UX */
OPT_B4800, /* termios.c_cflag */
OPT_B7200, /* termios.c_cflag - HP-UX */
OPT_B9600, /* termios.c_cflag */
OPT_B19200, /* termios.c_cflag */
OPT_B38400, /* termios.c_cflag */
OPT_B57600, /* termios.c_cflag */
OPT_B115200, /* termios.c_cflag */
OPT_B230400, /* termios.c_cflag */
OPT_B460800, /* termios.c_cflag */
OPT_B500000, /* termios.c_cflag */
OPT_B576000, /* termios.c_cflag */
OPT_B921600, /* termios.c_cflag */
OPT_B1000000, /* termios.c_cflag */
OPT_B1152000, /* termios.c_cflag */
OPT_B1500000, /* termios.c_cflag */
OPT_B2000000, /* termios.c_cflag */
OPT_B2500000, /* termios.c_cflag */
OPT_B3000000, /* termios.c_cflag */
OPT_B3500000, /* termios.c_cflag */
OPT_B4000000, /* termios.c_cflag */
OPT_BACKLOG,
OPT_BIND, /* a socket address as character string */
OPT_BRKINT, /* termios.c_iflag */
#ifdef BSDLY
# ifdef BS0
OPT_BS0, /* termios.c_oflag */
# endif
# ifdef BS1
OPT_BS1, /* termios.c_oflag */
# endif
OPT_BSDLY, /* termios.c_oflag */
#endif
OPT_CHROOT, /* chroot() past file system access */
OPT_CHROOT_EARLY, /* chroot() before file system access */
/*OPT_CIBAUD,*/ /* termios.c_cflag */
OPT_CLOCAL, /* termios.c_cflag */
OPT_CLOEXEC,
OPT_CONNECT_TIMEOUT, /* socket connect */
OPT_COOL_WRITE,
OPT_CR, /* customized */
#ifdef CR0
OPT_CR0, /* termios.c_oflag */
#endif
#ifdef CR1
OPT_CR1, /* termios.c_oflag */
#endif
#ifdef CR2
OPT_CR2, /* termios.c_oflag */
#endif
#ifdef CR3
OPT_CR3, /* termios.c_oflag */
#endif
#ifdef CRDLY
OPT_CRDLY, /* termios.c_oflag */
#endif
OPT_CREAD, /* termios.c_cflag */
OPT_CRNL, /* customized */
#ifdef CRTSCTS
OPT_CRTSCTS, /* termios.c_cflag */
#endif
OPT_CS5, /* termios.c_cflag */
OPT_CS6, /* termios.c_cflag */
OPT_CS7, /* termios.c_cflag */
OPT_CS8, /* termios.c_cflag */
OPT_CSIZE, /* termios.c_cflag */
OPT_CSTOPB, /* termios.c_cflag */
OPT_DASH, /* exec() */
OPT_ECHO, /* termios.c_lflag */
OPT_ECHOCTL, /* termios.c_lflag */
OPT_ECHOE, /* termios.c_lflag */
OPT_ECHOK, /* termios.c_lflag */
OPT_ECHOKE, /* termios.c_lflag */
OPT_ECHONL, /* termios.c_lflag */
#ifdef ECHOPRT
OPT_ECHOPRT, /* termios.c_lflag */
#endif
OPT_END_CLOSE, /* xfd.stream.howtoend = END_CLOSE */
OPT_ESCAPE,
OPT_FDIN,
OPT_FDOUT,
#ifdef FFDLY
# ifdef FF0
OPT_FF0, /* termios.c_oflag */
# endif
# ifdef FF1
OPT_FF1, /* termios.c_oflag */
# endif
OPT_FFDLY, /* termios.c_oflag */
#endif
#ifdef FIOSETOWN
OPT_FIOSETOWN, /* asm/sockios.h */
#endif
OPT_FLOCK_EX, /* flock(fd, LOCK_EX) */
OPT_FLOCK_EX_NB, /* flock(fd, LOCK_EX|LOCK_NB) */
OPT_FLOCK_SH, /* flock(fd, LOCK_SH) */
OPT_FLOCK_SH_NB, /* flock(fd, LOCK_SH|LOCK_NB) */
OPT_FLUSHO, /* termios.c_lflag */
/*0 OPT_FORCE,*/
OPT_FOREVER,
OPT_FORK,
OPT_FS_APPEND,
OPT_FS_COMPR,
OPT_FS_DIRSYNC,
OPT_FS_IMMUTABLE,
OPT_FS_JOURNAL_DATA,
OPT_FS_NOATIME,
OPT_FS_NODUMP,
OPT_FS_NOTAIL,
OPT_FS_SECRM,
OPT_FS_SYNC,
OPT_FS_TOPDIR,
OPT_FS_UNRM,
OPT_FTRUNCATE32, /* ftruncate() */
OPT_FTRUNCATE64, /* ftruncate64() */
OPT_F_SETLKW_RD, /* fcntl with struct flock - read-lock, wait */
OPT_F_SETLKW_WR, /* fcntl with struct flock - write-lock, wait */
OPT_F_SETLK_RD, /* fcntl with struct flock - read-lock */
OPT_F_SETLK_WR, /* fcntl with struct flock - write-lock */
OPT_GROUP,
OPT_GROUP_EARLY,
OPT_GROUP_LATE,
OPT_HISTORY_FILE, /* readline history file */
OPT_HUPCL, /* termios.c_cflag */
OPT_ICANON, /* termios.c_lflag */
OPT_ICRNL, /* termios.c_iflag */
OPT_IEXTEN, /* termios.c_lflag */
OPT_IFF_ALLMULTI, /* struct ifreq.ifr_flags */
OPT_IFF_AUTOMEDIA, /* struct ifreq.ifr_flags */
OPT_IFF_BROADCAST, /* struct ifreq.ifr_flags */
OPT_IFF_DEBUG, /* struct ifreq.ifr_flags */
/*OPT_IFF_DYNAMIC,*/ /* struct ifreq.ifr_flags */
OPT_IFF_LOOPBACK, /* struct ifreq.ifr_flags */
OPT_IFF_MASTER, /* struct ifreq.ifr_flags */
OPT_IFF_MULTICAST, /* struct ifreq.ifr_flags */
OPT_IFF_NOARP, /* struct ifreq.ifr_flags */
OPT_IFF_NOTRAILERS, /* struct ifreq.ifr_flags */
OPT_IFF_NO_PI, /* tun: IFF_NO_PI */
OPT_IFF_PORTSEL, /* struct ifreq.ifr_flags */
OPT_IFF_POINTOPOINT, /* struct ifreq.ifr_flags */
OPT_IFF_PROMISC, /* struct ifreq.ifr_flags */
OPT_IFF_RUNNING, /* struct ifreq.ifr_flags */
OPT_IFF_SLAVE, /* struct ifreq.ifr_flags */
OPT_IFF_UP, /* struct ifreq.ifr_flags */
OPT_IGNBRK, /* termios.c_iflag */
OPT_IGNCR, /* termios.c_iflag */
OPT_IGNORECR, /* HTTP */
OPT_IGNOREEOF, /* customized */
OPT_IGNPAR, /* termios.c_iflag */
OPT_IMAXBEL, /* termios.c_iflag */
OPT_INLCR, /* termios.c_iflag */
OPT_INPCK, /* termios.c_iflag */
OPT_INTERVALL,
OPT_IPV6_AUTHHDR,
OPT_IPV6_DSTOPTS,
OPT_IPV6_FLOWINFO,
OPT_IPV6_HOPLIMIT,
OPT_IPV6_HOPOPTS,
OPT_IPV6_JOIN_GROUP,
OPT_IPV6_PKTINFO,
OPT_IPV6_RECVDSTOPTS,
OPT_IPV6_RECVERR,
OPT_IPV6_RECVHOPLIMIT,
OPT_IPV6_RECVHOPOPTS,
OPT_IPV6_RECVPATHMTU,
OPT_IPV6_RECVPKTINFO,
OPT_IPV6_RECVRTHDR,
OPT_IPV6_RECVTCLASS,
OPT_IPV6_RTHDR,
OPT_IPV6_TCLASS,
OPT_IPV6_UNICAST_HOPS,
OPT_IPV6_V6ONLY,
#if 0 /* see Linux: man 7 netlink; probably not what we need yet */
OPT_IO_SIOCGIFNAME,
#endif
OPT_IOCTL_BIN, /* generic ioctl with binary value (pointed to) */
OPT_IOCTL_INT, /* generic ioctl with integer value */
OPT_IOCTL_INTP, /* generic ioctl with integer value (pointed to) */
OPT_IOCTL_STRING, /* generic ioctl with integer value (pointed to) */
OPT_IOCTL_VOID, /* generic ioctl without value */
OPT_IP_ADD_MEMBERSHIP,
OPT_IP_ADD_SOURCE_MEMBERSHIP,
#ifdef IP_HDRINCL
OPT_IP_HDRINCL,
#endif
#ifdef IP_FREEBIND
OPT_IP_FREEBIND,
#endif
#ifdef IP_MTU
OPT_IP_MTU,
#endif
#ifdef IP_MTU_DISCOVER
OPT_IP_MTU_DISCOVER,
#endif
OPT_IP_MULTICAST_IF,
OPT_IP_MULTICAST_LOOP,
OPT_IP_MULTICAST_TTL,
OPT_IP_OPTIONS,
#ifdef IP_PKTINFO
OPT_IP_PKTINFO,
#endif
#ifdef IP_PKTOPTIONS
OPT_IP_PKTOPTIONS,
#endif
OPT_IP_RECVDSTADDR,
#ifdef IP_RECVERR
OPT_IP_RECVERR,
#endif
OPT_IP_RECVIF,
#ifdef IP_RECVOPTS
OPT_IP_RECVOPTS,
#endif
#ifdef IP_RECVTOS
OPT_IP_RECVTOS,
#endif
#ifdef IP_RECVTTL
OPT_IP_RECVTTL,
#endif
#ifdef IP_RETOPTS
OPT_IP_RETOPTS,
#endif
#ifdef IP_ROUTER_ALERT
OPT_IP_ROUTER_ALERT,
#endif
OPT_IP_TOS,
#ifdef IP_TRANSPARENT
OPT_IP_TRANSPARENT,
#endif
OPT_IP_TTL,
OPT_ISIG, /* termios.c_lflag */
OPT_ISPEED, /* termios.c_ispeed */
OPT_ISTRIP, /* termios.c_iflag */
#ifdef IUCLC
OPT_IUCLC, /* termios.c_iflag */
#endif
OPT_IXANY, /* termios.c_iflag */
OPT_IXOFF, /* termios.c_iflag */
OPT_IXON, /* termios.c_iflag */
OPT_ACCEPT_TIMEOUT, /* listening socket */
OPT_LOCKFILE,
OPT_LOWPORT,
OPT_MAX_CHILDREN,
#ifdef NLDLY
# ifdef NL0
OPT_NL0, /* termios.c_oflag */
# endif
# ifdef NL0
OPT_NL1, /* termios.c_oflag */
# endif
OPT_NLDLY, /* termios.c_oflag */
#endif
OPT_NOECHO, /* readline */
OPT_NOFLSH, /* termios.c_lflag */
OPT_NOFORK, /* exec, system */
OPT_NOPROMPT, /* readline */
OPT_NULL_EOF, /* receiving empty packet triggers EOF */
#ifdef OCRNL
OPT_OCRNL, /* termios.c_oflag */
#endif
#ifdef OFDEL
OPT_OFDEL, /* termios.c_oflag */
#endif
#ifdef OFILL
OPT_OFILL, /* termios.c_oflag */
#endif
#ifdef OLCUC
OPT_OLCUC, /* termios.c_oflag */
#endif
OPT_ONLCR, /* termios.c_oflag */
#ifdef ONLRET
OPT_ONLRET, /* termios.c_oflag */
#endif
#ifdef ONOCR
OPT_ONOCR, /* termios.c_oflag */
#endif
#if HAVE_OPENPTY
OPT_OPENPTY,
#endif
OPT_OPENSSL_CAFILE,
OPT_OPENSSL_CAPATH,
OPT_OPENSSL_CERTIFICATE,
OPT_OPENSSL_CIPHERLIST,
OPT_OPENSSL_COMMONNAME,
#if OPENSSL_VERSION_NUMBER >= 0x00908000L
OPT_OPENSSL_COMPRESS,
#endif
OPT_OPENSSL_DHPARAM,
OPT_OPENSSL_EGD,
OPT_OPENSSL_FIPS,
OPT_OPENSSL_KEY,
OPT_OPENSSL_MAX_PROTO_VERSION,
OPT_OPENSSL_METHOD,
OPT_OPENSSL_MIN_PROTO_VERSION,
OPT_OPENSSL_NO_SNI,
OPT_OPENSSL_PSEUDO,
OPT_OPENSSL_SNIHOST,
OPT_OPENSSL_VERIFY,
OPT_OPOST, /* termios.c_oflag */
OPT_OSPEED, /* termios.c_ospeed */
OPT_O_APPEND,
#ifdef O_ASYNC
OPT_O_ASYNC,
#endif
OPT_O_BINARY, /* Cygwin */
OPT_O_CREATE,
#ifdef O_DEFER
OPT_O_DEFER,
#endif
#ifdef O_DELAY
OPT_O_DELAY,
#endif
#ifdef O_DIRECT
OPT_O_DIRECT,
#endif
#ifdef O_DIRECTORY
OPT_O_DIRECTORY,
#endif
#ifdef O_DSYNC
OPT_O_DSYNC,
#endif
OPT_O_EXCL,
#ifdef O_LARGEFILE
OPT_O_LARGEFILE,
#endif
#if defined(O_NDELAY) && (!defined(O_NONBLOCK) || O_NDELAY != O_NONBLOCK)
OPT_O_NDELAY,
#endif
OPT_O_NOATIME,
OPT_O_NOCTTY,
#ifdef O_NOFOLLOW
OPT_O_NOFOLLOW,
#endif
OPT_O_NOINHERIT, /* Cygwin */
OPT_O_NONBLOCK,
#ifdef O_NSHARE
OPT_O_NSHARE,
#endif
#ifdef O_PRIV
OPT_O_PRIV,
#endif
OPT_O_RDONLY, /* open() */
OPT_O_RDWR, /* open() */
#ifdef O_RSHARE
OPT_O_RSHARE,
#endif
#ifdef O_RSYNC
OPT_O_RSYNC,
#endif
#ifdef O_SYNC
OPT_O_SYNC,
#endif
OPT_O_TEXT, /* Cygwin */
OPT_O_TRUNC, /* open(): O_TRUNC */
OPT_O_WRONLY, /* open() */
OPT_PARENB, /* termios.c_cflag */
OPT_PARMRK, /* termios.c_iflag */
OPT_PARODD, /* termios.c_cflag */
OPT_PATH,
#ifdef PENDIN
OPT_PENDIN, /* termios.c_lflag */
#endif
OPT_PERM,
OPT_PERM_EARLY,
OPT_PERM_LATE,
OPT_PIPES,
/*OPT_PORT,*/
OPT_PROMPT, /* readline */
OPT_PROTOCOL, /* 6=TCP, 17=UDP */
OPT_PROTOCOL_FAMILY, /* 1=PF_UNIX, 2=PF_INET, 10=PF_INET6 */
OPT_PROXYPORT,
OPT_PROXY_AUTHORIZATION,
OPT_PROXY_AUTHORIZATION_FILE,
OPT_PROXY_RESOLVE,
#if HAVE_DEV_PTMX || HAVE_DEV_PTC
OPT_PTMX,
#endif
OPT_PTY,
OPT_PTY_INTERVALL,
OPT_PTY_WAIT_SLAVE,
OPT_RANGE, /* restrict client socket address */
OPT_RAW, /* termios */
OPT_READBYTES,
OPT_RES_AAONLY, /* resolver(3) */
OPT_RES_DEBUG, /* resolver(3) */
OPT_RES_DEFNAMES, /* resolver(3) */
OPT_RES_DNSRCH, /* resolver(3) */
OPT_RES_IGNTC, /* resolver(3) */
OPT_RES_PRIMARY, /* resolver(3) */
OPT_RES_RECURSE, /* resolver(3) */
OPT_RES_STAYOPEN, /* resolver(3) */
OPT_RES_USEVC, /* resolver(3) */
OPT_RETRY,
OPT_SANE, /* termios */
OPT_SCTP_MAXSEG,
OPT_SCTP_MAXSEG_LATE,
OPT_SCTP_NODELAY,
OPT_SEEK32_CUR,
OPT_SEEK32_END,
OPT_SEEK32_SET,
OPT_SEEK64_CUR,
OPT_SEEK64_END,
OPT_SEEK64_SET,
OPT_SETGID,
OPT_SETGID_EARLY,
OPT_SETPGID,
OPT_SETSID,
OPT_SETSOCKOPT_BIN,
OPT_SETSOCKOPT_INT,
OPT_SETSOCKOPT_LISTEN,
OPT_SETSOCKOPT_STRING,
OPT_SETUID,
OPT_SETUID_EARLY,
OPT_SHUT_CLOSE,
OPT_SHUT_DOWN,
OPT_SHUT_NONE,
OPT_SHUT_NULL, /* send 0 bytes on shutdown */
OPT_SIGHUP,
OPT_SIGINT,
OPT_SIGQUIT,
#ifdef SIOCSPGRP
OPT_SIOCSPGRP,
#endif
#ifdef SO_ACCEPTCONN
OPT_SO_ACCEPTCONN,
#endif /* SO_ACCEPTCONN */
#ifdef SO_ATTACH_FILTER
OPT_SO_ATTACH_FILTER,
#endif
#ifdef SO_AUDIT /* AIX 4.3.3 */
OPT_SO_AUDIT,
#endif /* SO_AUDIT */
#ifdef SO_BINDTODEVICE
OPT_SO_BINDTODEVICE,
#endif
OPT_SO_BROADCAST,
#ifdef SO_BSDCOMPAT
OPT_SO_BSDCOMPAT,
#endif
#ifdef SO_CKSUMRECV
OPT_SO_CKSUMRECV,
#endif /* SO_CKSUMRECV */
OPT_SO_DEBUG,
#ifdef SO_DETACH_FILTER
OPT_SO_DETACH_FILTER,
#endif
#ifdef SO_DGRAM_ERRIND
OPT_SO_DGRAM_ERRIND,
#endif
#ifdef SO_DONTLINGER
OPT_SO_DONTLINGER,
#endif
OPT_SO_DONTROUTE,
OPT_SO_ERROR,
OPT_SO_KEEPALIVE,
#ifdef SO_KERNACCEPT /* AIX 4.3.3 */
OPT_SO_KERNACCEPT,
#endif /* SO_KERNACCEPT */
OPT_SO_LINGER,
#ifdef SO_NO_CHECK
OPT_SO_NO_CHECK,
#endif
#ifdef SO_NOREUSEADDR /* AIX 4.3.3 */
OPT_SO_NOREUSEADDR,
#endif /* SO_NOREUSEADDR */
OPT_SO_OOBINLINE,
#ifdef SO_PASSCRED
OPT_SO_PASSCRED,
#endif
#ifdef SO_PEERCRED
OPT_SO_PEERCRED,
#endif
#ifdef SO_PRIORITY
OPT_SO_PRIORITY,
#endif
OPT_SO_PROTOTYPE,
OPT_SO_RCVBUF,
OPT_SO_RCVBUF_LATE,
#ifdef SO_RCVLOWAT
OPT_SO_RCVLOWAT,
#endif
OPT_SO_REUSEADDR,
#ifdef SO_REUSEPORT
OPT_SO_REUSEPORT,
#endif /* defined(SO_REUSEPORT) */
#ifdef SO_SECURITY_AUTHENTICATION
OPT_SO_SECURITY_AUTHENTICATION,
#endif
#ifdef SO_SECURITY_ENCRYPTION_NETWORK
OPT_SO_SECURITY_ENCRYPTION_NETWORK,
#endif
#ifdef SO_SECURITY_ENCRYPTION_TRANSPORT
OPT_SO_SECURITY_ENCRYPTION_TRANSPORT,
#endif
OPT_SO_SNDBUF,
OPT_SO_SNDBUF_LATE,
#ifdef SO_SNDLOWAT
OPT_SO_SNDLOWAT,
#endif
OPT_SO_TIMESTAMP, /* Linux */
OPT_SO_TYPE,
#ifdef SO_USELOOPBACK
OPT_SO_USELOOPBACK,
#endif /* SO_USELOOPBACK */
#ifdef SO_USE_IFBUFS
OPT_SO_USE_IFBUFS,
#endif /* SO_USE_IFBUFS */
#if 1 || defined(WITH_SOCKS4)
OPT_SOCKSPORT,
OPT_SOCKSUSER,
#endif
OPT_SOURCEPORT,
OPT_STDERR, /* with exec, system */
# define ENABLE_OPTCODE
# include "xio-streams.h"
# undef ENABLE_OPTCODE
OPT_SUBSTUSER_EARLY,
OPT_SUBSTUSER,
#if defined(HAVE_SETGRENT) && defined(HAVE_GETGRENT) && defined(HAVE_ENDGRENT)
OPT_SUBSTUSER_DELAYED,
#endif
OPT_SYMBOLIC_LINK, /* with pty */
#ifdef TABDLY
# ifdef TAB0
OPT_TAB0, /* termios.c_oflag */
# endif
# ifdef TAB1
OPT_TAB1, /* termios.c_oflag */
# endif
# ifdef TAB2
OPT_TAB2, /* termios.c_oflag */
# endif
# ifdef TAB3
OPT_TAB3, /* termios.c_oflag */
# endif
OPT_TABDLY, /* termios.c_oflag */
#endif
OPT_TCPWRAPPERS, /* libwrap */
OPT_TCPWRAP_ETC, /* libwrap */
OPT_TCPWRAP_HOSTS_ALLOW_TABLE, /* libwrap */
OPT_TCPWRAP_HOSTS_DENY_TABLE, /* libwrap */
OPT_TCP_ABORT_THRESHOLD, /* HP-UX */
OPT_TCP_CONN_ABORT_THRESHOLD, /* HP-UX */
#ifdef TCP_CORK
OPT_TCP_CORK,
#endif
#ifdef TCP_DEFER_ACCEPT
OPT_TCP_DEFER_ACCEPT, /* Linux 2.4.0 */
#endif
#ifdef TCP_INFO
OPT_TCP_INFO, /* Linux 2.4.0 */
#endif
#ifdef TCP_KEEPCNT
OPT_TCP_KEEPCNT, /* Linux 2.4.0 */
#endif
#ifdef TCP_KEEPIDLE
OPT_TCP_KEEPIDLE, /* Linux 2.4.0 */
#endif
OPT_TCP_KEEPINIT, /* OSF1 */
#ifdef TCP_KEEPINTVL
OPT_TCP_KEEPINTVL, /* Linux 2.4.0 */
#endif
#ifdef TCP_LINGER2
OPT_TCP_LINGER2, /* Linux 2.4.0 */
#endif
#ifdef TCP_MAXSEG
OPT_TCP_MAXSEG,
OPT_TCP_MAXSEG_LATE,
#endif
OPT_TCP_MD5SIG, /* FreeBSD */
#ifdef TCP_NODELAY
OPT_TCP_NODELAY,
#endif
OPT_TCP_NOOPT, /* FreeBSD */
OPT_TCP_NOPUSH, /* FreeBSD */
OPT_TCP_PAWS, /* OSF1 */
#ifdef TCP_QUICKACK
OPT_TCP_QUICKACK, /* Linux 2.4 */
#endif
#ifdef TCP_RFC1323
OPT_TCP_RFC1323, /* AIX 4.3.3 */
#endif
OPT_TCP_SACKENA, /* OSF1 */
OPT_TCP_SACK_DISABLE, /* OpenBSD */
OPT_TCP_SIGNATURE_ENABLE, /* OpenBSD */
#ifdef TCP_STDURG
OPT_TCP_STDURG, /* AIX 4.3.3; Linux: see man 7 tcp */
#endif
#ifdef TCP_SYNCNT
OPT_TCP_SYNCNT, /* Linux 2.4.0 */
#endif
OPT_TCP_TSOPTENA, /* OSF1 */
#ifdef TCP_WINDOW_CLAMP
OPT_TCP_WINDOW_CLAMP, /* Linux 2.4.0 */
#endif
OPT_TERMIOS_CFMAKERAW, /* termios.cfmakeraw() */
OPT_TERMIOS_RAWER,
OPT_TIOCSCTTY,
OPT_TOSTOP, /* termios.c_lflag */
OPT_TUN_DEVICE, /* tun: /dev/net/tun ... */
OPT_TUN_NAME, /* tun: tun0 */
OPT_TUN_TYPE, /* tun: tun|tap */
OPT_UMASK,
OPT_UNIX_TIGHTSOCKLEN, /* UNIX domain sockets */
OPT_UNLINK,
OPT_UNLINK_CLOSE,
OPT_UNLINK_EARLY,
OPT_UNLINK_LATE,
OPT_USER,
OPT_USER_EARLY,
OPT_USER_LATE,
#ifdef VDISCARD
OPT_VDISCARD, /* termios.c_cc */
#endif
OPT_VDSUSP, /* termios.c_cc - HP-UX */
OPT_VEOF, /* termios.c_cc */
OPT_VEOL, /* termios.c_cc */
OPT_VEOL2, /* termios.c_cc */
OPT_VERASE, /* termios.c_cc */
OPT_VINTR, /* termios.c_cc */
OPT_VKILL, /* termios.c_cc */
OPT_VLNEXT, /* termios.c_cc */
OPT_VMIN, /* termios.c_cc */
OPT_VQUIT, /* termios.c_cc */
OPT_VREPRINT, /* termios.c_cc */
OPT_VSTART, /* termios.c_cc */
OPT_VSTOP, /* termios.c_cc */
OPT_VSUSP, /* termios.c_cc */
OPT_VSWTC, /* termios.c_cc */
OPT_VTIME, /* termios.c_cc */
#ifdef VTDLY
# ifdef VT0
OPT_VT0, /* termios.c_oflag */
# endif
# ifdef VT1
OPT_VT1, /* termios.c_oflag */
# endif
OPT_VTDLY, /* termios.c_oflag */
#endif
#ifdef VWERASE
OPT_VWERASE, /* termios.c_cc */
#endif
OPT_WAITLOCK,
#ifdef XCASE
OPT_XCASE, /* termios.c_lflag */
#endif
#if defined(TABDLY) && defined(XTABS)
OPT_XTABS, /* termios.c_oflag */
#endif
OPT_nocomma /* make aix xlc happy, no trailing comma */
} ;
/* keep consistent with xiohelp.c:optionphasenames ! */
enum e_phase {
PH_ALL, /* not for option definitions; use in apply funcs to
say "all phases" */
PH_INIT, /* retrieving info from original state */
PH_EARLY, /* before any other processing */
PH_PREOPEN, /* before file descriptor is created/opened */
PH_OPEN, /* during filesystem entry creation/open */
PH_PASTOPEN, /* past filesystem entry creation/open */
PH_PRESOCKET, /* before socket call */
PH_SOCKET, /* for socket call */
PH_PASTSOCKET, /* after socket call */
PH_PREBIGEN, /* before socketpair() pipe() openpty() */
PH_BIGEN, /* during socketpair() pipe() openpty() */
PH_PASTBIGEN, /* past socketpair() pipe() openpty() */
PH_FD, /* soon after FD creation or identification */
PH_PREBIND, /* before socket bind() */
PH_BIND, /* during socket bind() ? */
PH_PASTBIND, /* past socket bind() - for client and server sockets! */
PH_PRELISTEN, /* before socket listen() */
PH_LISTEN, /* during socket listen() ? */
PH_PASTLISTEN, /* after socket listen() */
PH_PRECONNECT, /* before socket connect() */
PH_CONNECT, /* during socket connect() ? */
PH_PASTCONNECT, /* after socket connect() */
PH_PREACCEPT, /* before socket accept() */
PH_ACCEPT, /* during socket accept() ? */
PH_PASTACCEPT, /* after socket accept() */
PH_CONNECTED, /* for sockets, after connect() or accept() */
PH_PREFORK, /* before fork() (with both listen and exec!) */
PH_FORK, /* during fork() (with both listen and exec!) */
PH_PASTFORK, /* after fork() (with both listen and exec!) */
PH_LATE, /* FD is ready, before start of data loop */
PH_LATE2, /* FD is ready, dropping privileges */
PH_PREEXEC, /* before exec() or system() */
PH_EXEC, /* during exec() or system() */
PH_SPEC /* specific to situation, not fix */
} ;
/* atomic structure to describe the syntax and more important semantics of an
option */
struct optdesc {
const char *defname; /* default name */
const char *nickname; /* usual name */
enum e_optcode optcode; /* short form of option name */
unsigned int group;
enum e_phase phase; /* when this option is to be used */
enum e_types type; /* the data type as expected on input, and stored */
enum e_func func; /* which function can apply this option, e.g. ioctl(),
getsockopt(), or just a bit pattern */
int major; /* major id for func: level (SOL_...) for setsockopt(),
request for ioctl() */
int minor; /* minor id for func: SO_..., IP_..., */
long arg3;
} ;
extern bool xioopts_ignoregroups;
extern const struct optname optionnames[];
extern int retropt_bool(struct opt *opts, int optcode, bool *result);
extern int retropt_short(struct opt *opts, int optcode, short *result);
extern int retropt_ushort(struct opt *opts, int optcode, unsigned short *result);
extern int retropt_int(struct opt *opts, int optcode, int *result);
extern int retropt_uint(struct opt *opts, int optcode, unsigned int *result);
extern int retropt_long(struct opt *opts, int optcode, long *result);
extern int retropt_ulong(struct opt *opts, int optcode, unsigned long *result);
extern int retropt_flag(struct opt *opts, int optcode, flags_t *result);
extern int retropt_string(struct opt *opts, int optcode, char **result);
extern int retropt_timespec(struct opt *opts, int optcode, struct timespec *result);
extern int retropt_bind(struct opt *opts,
int af,
int socktype,
int ipproto,
struct sockaddr *sa,
socklen_t *salen,
int feats, /* TCP etc: 1..address allowed,
3..address and port allowed */
unsigned long res_opts0, unsigned long res_opts1);
extern int applyopts(int fd, struct opt *opts, enum e_phase phase);
extern int applyopts2(int fd, struct opt *opts, unsigned int from,
unsigned int to);
extern int applyopts_flags(struct opt *opts, int group, flags_t *result);
extern int applyopts_cloexec(int fd, struct opt *opts);
extern int applyopts_early(const char *path, struct opt *opts);
extern int applyopts_fchown(int fd, struct opt *opts);
extern int applyopts_single(struct single *fd, struct opt *opts, enum e_phase phase);
extern int applyopts_offset(struct single *xfd, struct opt *opts);
extern int applyopts_signal(struct single *xfd, struct opt *opts);
extern int _xio_openlate(struct single *fd, struct opt *opts);
extern int parseopts(const char **a, unsigned int groups, struct opt **opts);
extern int parseopts_table(const char **a, unsigned int groups,
struct opt **opts,
const struct optname optionnames[], size_t optionnum);
extern const struct opt *searchopt(const struct opt *opts, unsigned int groups, enum e_phase from, enum e_phase to,
enum e_func func);
extern struct opt *copyopts(const struct opt *opts, unsigned int groups);
extern struct opt *moveopts(struct opt *opts, unsigned int groups);
extern int leftopts(const struct opt *opts);
extern int showleft(const struct opt *opts);
extern int groupbits(int fd);
extern int _groupbits(mode_t mode);
extern int dropopts(struct opt *opts, unsigned int phase);
extern int dropopts2(struct opt *opts, unsigned int from, unsigned int to);
#if HAVE_BASIC_UID_T==1
# define retropt_uid(o,c,r) retropt_short(o,c,r)
#elif HAVE_BASIC_UID_T==2
# define retropt_uid(o,c,r) retropt_ushort(o,c,r)
#elif HAVE_BASIC_UID_T==3
# define retropt_uid(o,c,r) retropt_int(o,c,r)
#elif HAVE_BASIC_UID_T==4
# define retropt_uid(o,c,r) retropt_uint(o,c,r)
#elif HAVE_BASIC_UID_T==5
# define retropt_uid(o,c,r) retropt_long(o,c,r)
#elif HAVE_BASIC_UID_T==6
# define retropt_uid(o,c,r) retropt_ulong(o,c,r)
#else
# error "HAVE_BASIC_UID_T is out of range: " HAVE_BASIC_UID_T
#endif
#if HAVE_BASIC_GID_T==1
# define retropt_gid(o,c,r) retropt_short(o,c,r)
#elif HAVE_BASIC_GID_T==2
# define retropt_gid(o,c,r) retropt_ushort(o,c,r)
#elif HAVE_BASIC_GID_T==3
# define retropt_gid(o,c,r) retropt_int(o,c,r)
#elif HAVE_BASIC_GID_T==4
# define retropt_gid(o,c,r) retropt_uint(o,c,r)
#elif HAVE_BASIC_GID_T==5
# define retropt_gid(o,c,r) retropt_long(o,c,r)
#elif HAVE_BASIC_GID_T==6
# define retropt_gid(o,c,r) retropt_ulong(o,c,r)
#else
# error "HAVE_BASIC_GID_T is out of range: " HAVE_BASIC_GID_T
#endif
#if HAVE_BASIC_MODE_T==1
# define retropt_mode(o,c,r) retropt_short(o,c,r)
#elif HAVE_BASIC_MODE_T==2
# define retropt_mode(o,c,r) retropt_ushort(o,c,r)
#elif HAVE_BASIC_MODE_T==3
# define retropt_mode(o,c,r) retropt_int(o,c,r)
#elif HAVE_BASIC_MODE_T==4
# define retropt_mode(o,c,r) retropt_uint(o,c,r)
#elif HAVE_BASIC_MODE_T==5
# define retropt_mode(o,c,r) retropt_long(o,c,r)
#elif HAVE_BASIC_MODE_T==6
# define retropt_mode(o,c,r) retropt_ulong(o,c,r)
#else
# error "HAVE_BASIC_MODE_T is out of range: " HAVE_BASIC_MODE_T
#endif
#endif /* !defined(__xioopts_h_included) */