# source: xio.help
# Copyright Gerhard Rieger and contributors (see file CHANGES)

Operating systems:

The options and features described in this document have been implemented (but
not always tested) on the operating systems listed below, unless otherwise
noted:

SuSE 10.1 Linux on x86
Solaris 8 on Sparc with gcc
FreeBSD 6.1 on x86
HP-UX B 11.11 on PA-RISC with gcc

===============================================================================

The following sections describe the syntax and semantics of the socat command
line stream arguments.

Usually a socat stream argument defines a one- or bidirectional stream. There
are two principal forms:
* a single stream. Depending on use of the -u or -U options and implicit
semantics of the stream, such an argument may be resolved to a one- or
twodirectional stream.
* two onedirectional streams, separated by '!!'. An argument of this form
always specifies a twodirectional stream. The first single stream is only used
for reading data, and the second is only used for writing data.


The general structure of a single stream is:
keyword[:required-parameters][,options]

The options part starts with the first ',' of the argument. The required
parameters are separated by ':' from their predecessor. The last required
parameter is terminated by the end of the argument or by the first ',' that
iitroduces the first option. The options are separated with ','. The last
option is terminated by end-of-string or by '!!'.

The are some abbreviations defined that allow to drop the keyword. In these
cases the argument syntax is:
required-parameter[:required-parameters][,options]
The implemented abbreviations are:
short form	canonical form
number		FD:number	# decimal number
path		GOPEN:path	# must must contain at least one '/' and must not contain ':' or ',' and must not start with a decimal digit

===============================================================================


Addresses:

Every address specification starts with a keyword or an abbreviation. These
keywords are case insensitive.
Note: because the option group ANY applies for all addresses, it is not
mentioned explicitely below.


Bidirectional only addresses:
-----------------------------

PIPE
FIFO
ECHO

Opens an unnamed pipe (fifo) where outbound traffic is sent to and inbound
traffic is read from. The special semantics of pipes results in an echo like
behaviour.
Option groups: FD, FIFO (no specific FIFO options are defined yet)


Onedirectional only addresses:
------------------------------

Currently all addresses may be used bidirectional.
Note: for regular files, behaviour when being used bidirectionally is
undefined.


One- and bidirectional addresses:
---------------------------------

STDIO
-  ("minus")

Uses stdin (FD 0) for inbound traffic and/or stdout (FD 1) for outbound traffic
on this address.
Option groups: FD; others dependent on actual types of stdin and stdout (FIFO,
CHR, BLK, REG, and/or SOCKET).


STDIN

Uses stdin for traffic. This might fail for outbound traffic.
Option groups: FD; dependent on actual type of stdin (FIFO, CHR, BLK, REG, or
SOCKET).


STDOUT

Uses stdout for traffic. This might fail for inbound traffic.
Option groups: FD; dependent on actual type of stdout (FIFO, CHR, BLK, REG, or
SOCKET).


STDERR

Uses stdout for traffic. This might fail for inbound traffic.
Option group: FD; dependent on actual types of sterr (FIFO, CHR, BLK, REG, or
SOCKET).


FD:num
num

Uses the already existing file descriptor <num> for traffic.
Option groups: FD; dependent on actual types of file descriptor (FIFO, CHR,
BLK, REG, or SOCKET).


READLINE

Uses the GNU readline function and history capabilies (best known from bash).
It always works on stdin and stdout; if stdio is not a tty, readline does not
seem to work correctly.
Because readline is blocking during line editing, it does not fit well into
socats I/O philosophy. 
socat integrates readline by waiting in the select call as usual; when stdin
reports available data, socat invokes readline(). readline blocks until the
user presses ENTER or EOF. Data on socats other stream is not handling in this
time.
socat controls the ECHO flag of the stdin tty (off during select(), on for
readline()).
When using socat with readline as front end to a service like telnet, POP3 or
an other authenticated service, please note that the password is entered as
ordinary data, thus appears on the screen!
Option groups: FD, READLINE, TERMIOS
Useful options: history-file


OPEN:path

Applies an open() system call to the given path. If the path does not exist a
file is created only if the option create is used; if a file, pipe, or device
with this name already exists it is opened. Open for reading and/or writing
depends on the rw parameter of the xioopen call, or on usage in a socat
argument. If no perm option is used, xioopen uses 600 (which might be modified
by umask then). 
Applying this function to files conforms to the semantics as described by the
open(2) man page.
Opening device files, like /dev/ttyS*, might block until the device gets active
(until some peer is connected)
With existing named pipes (fifos) please note the usual semantics:
Opening the pipe in read/write mode results in an echo service;
Opening the pipe in read mode blocks until a writer opens the pipe (close
by writer gives EOF for the reader); with option nonblock the open call does
not block.
Opening the pipe in write mode blocks until a reader opens the pipe (close
by reader gives "broken pipe" error on next write); with option nonblock the
open call terminates with error "no such device or address" in absence of a
reader. 
Opening a named UNIX stream socket with or without a listening peer might
succeed depending on the operating system, but 
the resulting file descriptor erronously reports available data immediately,
and the following read() or write() call always fails with "invalid
argument". Even worse, while such a filesystem entry is identified as socket by
"file" command and by fstat(), getsockopt() after open() gives error "Socket operation on non-socket".
Use GOPEN for reasonable behaviour!
Option groups: FD, OPEN, NAMED, and specific for data object type (FILE, FIFO,
CHRDEV+TERMIOS, BLKDEV, or SOCKET).


GOPEN:path
path

"Generic open". Tries to open the given path in a smarter way. If the path
exists and is a socket, it is connected to; if connecting fails,
socat assumes a datagram socket and later uses sendto() calls for data
transfer.
If the path exists and is not a socket, it is opened:
in RDONLY environment for reading from position 0,
in WRONLY environment for appending (O_APPEND),
in RDWR env. for reading and/or writing starting from position 0.
If the path does not exist:
in RDONLY environment this is an error
in WRONLY environment the file is created (O_CREAT)
in RDWR env. for reading and/or writing starting from position 0.
However, these flags may be overriden by user supplied options
(e.g., "append=0")
Option groups: FD, NAMED, and specific for data object type (FILE, FIFO,
CHRDEV+TERMIOS, BLKDEV, or SOCKET).


CREATE:path
CREAT:path

Opens the named file with creat(). With UNIX semantics, this address is just a
variation of the OPEN address, see there for more details.
Note: The creat() system call does not create a completely new file, but
inherits some properties of the old file if it exists, e.g. permissions. Use
option "unlink-early" to remove the old entry before.
Option groups: FD, NAMED, FILE
Useful options: unlink-late


PIPE:path
FIFO:path

Creates and opens a pipe if path does not exist; opens path if it already
exists. 
Option groups: FD, NAMED, FIFO
Note: this address uses the mknod(2) system call to create the named pipe. On
FreeBSD, this call requires root privilege


EXEC:cmdline

Forks off a child process after establishing a bidirectional communication
channel (with socketpair, pipes, or pty). The child then starts "cmdline" with
execvp().
Note: spaces and shell meta characters in cmdline must be quoted if socat is
invoked from the command line.
Option groups: FD, FORK, EXEC, SOCKET, SOCK_UNIX, FIFO, TERMIOS
Useful options: path, fdin, fdout, chroot, su, pty, stderr
Note: on AIX, search permissions on /dev/pts/ are required to use option pty.


SYSTEM:cmdline

Forks off a child process after establishing a bidirectional communication
channel (with socketpair, pipes, or pty). The child then starts "cmdline" with
system().
Note: spaces and shell meta characters in cmdline must be quoted if socat is
invoked from the command line.
Option groups: FD, FORK, EXEC, SOCKET, SOCK_UNIX, FIFO, TERMIOS
Useful options: path, fdin, fdout, chroot, su, pty, stderr
Note: there are slightly different semantics with options pty or pipes, because
they do not communicate an EOF condition to the shell process. Therefore, the
shell process and its child do not terminate due to EOF, but are explicitly
killed during close of the socat file handle. Consider using
exec:'/bin/sh -c command',pty...


UNIX:path
LOCAL:path

Connects to a UNIX domain socket.
Option groups: FD, SOCKET, SOCK_UNIX
NOTE: you need rw permissions to connect to a local socket. My Linux answers
with "connection refused" to insufficient permissions, not existing 
socket, not a socket, or just a socket entry without a listening process.
NOTE: this address does not implement option group NAMED because its connect
call succeeds only if there is already someone listening, but at this point the
NAMED group actions no longer affect this socket, only the fs entry.


UNIX-listen:path
UNIX-l:path

Create a listening UNIX domain socket. With the fork option, for each accepted
connection a new process is forked off, and more connections are accepted on
the parent socket. Without fork, only the first connection is accepted.
Option groups: FD, NAMED, SOCKET, SOCK_UNIX, LISTEN, CHILD


IP:host:protocol
IP4:host:protocol

Open a raw socket with IP4 protocol. This mode sends packets to and accepts
them only from host. protocol is a number from 0 to 255, with 1 meaning ICMP,
6..TCP,  17..UDP, 255..raw IP; 0 might be unsupported by the local IP stack,
resulting in an error. 
Requires root privilege.
Note: my Linux 2.4.10 kernel seems to drop payloads smaller than 8
bytes on their way from the network to the application.
Option groups: FD, SOCKET, SOCK_IP


TCP:host:port
TCP4:host:port
INET:host:port

Create a TCP/IP4 client socket and connect to the given host/port combination.
Option groups: FD, SOCKET, SOCK_IP, IPAPP, IP_TCP
Useful options: crlf, bind, tos, mtudiscover, mss, nodelay, 


TCP-l:port
TCP-listen:port
TCP4-l:port
TCP4-listen:port
INET-l:port
INET-listen:port

Create a TCP/IP4 server socket and wait for an incoming connection. With the
fork option, for each accepted connection a new process is forked off, and more
connections are accepted on the parent socket. Without fork, only the first
connection is accepted.
Option groups: FD, SOCKET, SOCK_IP, IPAPP, IP_TCP, LISTEN, RANGE, CHILD
Useful options: fork, crlf, bind, backlog, mtu, tcpwrap


UDP:host:port
UDP-CONNECT:host:port

   Connects to port on host using UDP/IP version 4 or 6
   depending on address specification, name resolution, or option pf.
   Please note that,
   due to UDP protocol properties, no real connection is established; data has
   to be sent for `connecting' to the server, and no end-of-file condition can
   be transported.
Option groups: FD, SOCKET, SOCK_IP4, SOCK_IP6, IP_UDP
Useful options: ttl

UDP4:host:port
UDP4-CONNECT:host:port

Like UDP-CONNECT, but only supports IPv4 protocol.
Option groups: FD, SOCKET, SOCK_IP, IPAPP, IP_UDP


UDP-listen:port
UDP-l:port

Emulates a UDP server in the same way as netcat: Create a UDP/IP4 socket and
bind to the given port. Then wait for the first packet, get its sender address
(without consuming its data), connect() to this address, and leave xioopen().
Afterwards, our socket only communicates with this peer.
Option groups: FD, SOCKET, SOCK_IP, IPAPP, IP_UDP, RANGE
Note: with fork option, child processes might hang forever because UDP cannot
transport EOF conditions.


#UDP-dgram:port
#UDP-d:port
#
#Create and use a pure datagram oriented UDP socket.
#The following restrictions apply:
#* range option does not work
#* de facto this is a read-only endpoint: sending data to 0.0.0.0 might fail.


TCP6:host:port
INET6:host:port

Create a TCP/IP6 client socket and connect to the given host/port combination.
Option groups: FD, SOCKET, SOCK_IP, IPAPP, IP_TCP
Note: Address syntax parsing is awkward, since the IPv6 address word separator
is ':' which is used as port separator too.
An FTP listen entry looks in netstat ":::21"!


TCP6-l:port
TCP6-listen:port
INET6-l:port
INET6-listen:port

Create a TCP server socket and wait for an incoming connection. With the fork
option, for each accepted connection a new process is forked off, and more
connections are accepted on the parent socket. Without fork, only the first
connection is accepted.
Option groups: FD, SOCKET, SOCK_IP, IPAPP, IP_TCP, LISTEN, RANGE, CHILD


SOCKS4:sockd:host:port
SOCKS:sockd:host:port

Use a socks server, socks protocol version 4, to build a TCP (IPv4) connection.
Sockd is the name or address of the socks server, host and port specify the
destination address. Use option socksport if the socks server does not listen
on port 1080. 
Option groups: FD, SOCKET, SOCK_IP, IPAPP, IP_TCP, IP_SOCKS
Useful options: sp, socksport, socksuser
Note: If you do not specify option socksuser, xioopen tries to derive it from
environment: LOGNAME or USER, and might therefore undisclose your identity.


SOCKS4a:sockd:host:port

Like SOCKS4, but use the socks version 4a extension for destination name
resolution on the socks server.
Option groups: FD, SOCKET, SOCK_IP, IPAPP, IP_TCP, IP_SOCKS


PTY

Creates a pseudo terminal (pty) and uses its master side. Another process may
open the pty´s slave side using it like a serial line or terminal.
Option groups: FD,NAMED,PTY,TERMIOS
Useful options: link, openpty, mode, user, group


OPENSSL-CONNECT:host:port
OPENSSL:host:port

Tries to establish a SSL connection to port on host using TCP/IPv4.
Note: this is currently only an experimental integration of openssl!
(it does not provide any trust between the peers because is does not check
certificates!)
Option groups: FD,SOCKET,SOCK_IP4,IP_TCP,OPENSSL,RETRY
Useful options: cipher, method, verify, cafile, capath, certificate, bind, sourceport, retry


OPENSSL-LISTEN:port

Listens on tcp4 port. When a connection is accepted, this address behaves as
SSL server.
Option groups: FD,SOCKET,SOCK_IP4,TCP,LISTEN,CHILD,RANGE,OPENSSL,RETRY
Usefule options: cipher, method, verify, cafile, capath, certificate, retry


PROXY:proxy:host:port
PROXY-CONNECT:proxy:host:port

Connects to an HTTP proxy server on port 8080 using TCP/IPv4, and sends a
CONNECT request for host:port. If the proxy grants access and succeeds to
connect to the target, data transfer between socat and the target can
start. Note that the traffic need not be HTTP but can be an arbitrary
protocol.
Option groups: FD,SOCKET,IP4,TCP,HTTP
Useful options: proxyport, ignorecr, proxyauth, crnl, bind, mss, sourceport

===============================================================================

Option Groups:

Each option is member of one option group. Address definitions specify which
option groups they support. This allows to reject unapplyable options in an
early stage of address processing. 

Address groups are identified by single bit positions. Option definitions
specify to which group the option belongs (some options are member or more than
one group). Addresses use a bit pattern to specify which option groups they
support.

Currently the following option groups are defined:

GROUP_FD: All addresses that result in one or more file descriptors. These
options are typically applied with fcntl() or some special calls like fchown()
or fchmod(). There is no documented restriction to apply these functions to any
file descriptor; but they are not always meaningful, and sometimes lead to OS
exceptions. 

GROUP_APPL: All addresses. The options do not need file descriptors, because
they manipulate the data streams at application level (ignoreeof, line
terminator conversion).

GROUP_PROCESS: For options that change process related attributes, like user id
(setuid). 

GROUP_FIFO: Options for pipes. Currently not used.

GROUP_CHR: Options for character devices. Currently not used.

GROUP_BLK: Options for block devices. Currently not used.

GROUP_REG, GROUP_FILE: Options for regular files. Currently not used.

GROUP_SOCKET: Options for arbitrary type sockets, e.g. so-sndbuf, so-linger.

GROUP_NAMED: Options for file system entries, e.g. user-early, unlink.

GROUP_OPEN: Options that are applied with the open() system call.

GROUP_EXEC: Options for program or script execution, e.g. path.

GROUP_FORK: Options for communication with children processes, e.g. fdin, pty.

GROUP_LISTEN: Options for listening sockets. Only backlog.

GROUP_DEVICE: not used

GROUP_CHILD: Options for addresses that may fork off independent child
processes. Currently only option fork.

GROUP_RETRY: Options for failure handling. Currently not used.

GROUP_TERMIOS: Options for terminal settings, e.g. echo, b38400, raw.

GROUP_READLINE: Options for readline (GNU line editing and history).

GROUP_RANGE: Options for checking peer address. Currently only range.

GROUP_SOCK_UNIX: Options for UNIX domain sockets. Currently not used.

GROUP_SOCK_IP4: Options for IP4 sockets. Currently not used.

GROUP_SOCK_IP6: Options for IP6 sockets. Currently not used.

GROUP_SOCK_IP: Options for IP sockets, e.g. mtu, ip-options, ttl.

GROUP_IP_UDP: Options for UDP sockets. Currently not used.

GROUP_IP_TCP: Options for TCP sockets, e.g. maxseg, nodelay.

GROUP_IPAPP: Options for UDP and TCP sockets. Currently only sourceport.

GROUP_IP_SOCKS4: Options for SOCKS client connections, e.g. socksuser.

GROUP_PROCESS: Options for process wide attributes, e.g. su, chroot.

GROUP_APPL: Options handled by application. Currently not used.

GROUP_PTY: Options for pseudo terminals. Used with addresses PTY, EXEC, and
SYSTEM.

GROUP_OPENSSL: Options for the OPENSSL address.

There are "combined" group definitions too:
#define GROUP_ANY       (GROUP_PROCESS|GROUP_APPL)
#define GROUP_ALL       0xffffffff

===============================================================================

Address Options

Address options are identified by a case insensitive keyword. If the options
needs a parameter value, the option syntax is always:
OPTION=VALUE
Currently there do not exist options that take more than one argument;
sometimes, two values are combined to form one argument value, e.g. IP4 address
and port:
192.168.0.1:80

Note:
"Type" describes the type of data that may or must be given to the option and
that is passed to the system. There are some options with boolean semantics
(on/off or yes/no), but their values are passed to the system with an int 
parameter. This situation is indicated as "Logical type: bool" and "Physical
type: int". In this case xioopen passes the physical value to the system,
giving the user one more hacking playground.


Option: append

Type: BOOL
Option group: FD
Phase: LATE
Platforms: all (UNIX98)

Sets the O_APPEND flag via a fcntl() call and F_SETFL; with OPEN type
addresses, this flag is applied with the open() call. All data written is
appended to the actual file end, even if other processes have written to or
truncated the file in the meantime. 


Option: async

Type: BOOL
Option group: FD
Phase: LATE
Platforms: FreeBSD, Linux, SunOS

Sets the O_ASYNC (or FASYNC) flag via a fcntl() call and F_SETFL; with FILE
addresses, this flag is applied with the open() call. Consult your kernel
documentation for effects of this flag. 
NOTE: socat does not handle the SIGIO signal.


Option: cloexec

Type: BOOL
Option group: FD
Phase: LATE
Platforms: all

Sets the FD_CLOEXEC (close-on-exec) flag on the file descriptor via a
fcntl()call with F_SETFD. Use with caution, because xioopen() makes use of this
flag to archieve what we consider the most reasonable behaviour; using this
option overrides xioopen's setting!


Option: flock-ex
Aliases: flock, lock

Type: BOOL
Option group: FD
Phase: FD
Platforms: FreeBSD, Linux

Applies the flock(fd, LOCK_EX) call to the file descriptor(s). This locks a file
exclusively (but only for processes also using flock() on this file - otherwise, they seem to have unrestricted access).
If the file is already locked with flock, our flock call blocks until the other
processes lock is released.
Note: the "lock" option name alias applies to this option only
 if the fcntl locking mechanism is not available on a platform.


Option: flock-ex-nb
Aliases: flock-nb

Type: BOOL
Option group: FD
Phase: FD
Platforms: FreeBSD, Linux

Applies the flock(fd, LOCK_EX|LOCK_NB) call to the file descriptor(s). This locks a file
exclusively (but only for processes also using flock() on this file -
otherwise, they seem to have unrestricted access). 
If the file is already locked with flock, our flock call returns the error
"Resource temporarily unavailable".


Option: flock-sh

Type: BOOL
Option group: FD
Phase: FD
Platforms: FreeBSD, Linux

Applies a shared advisory lock to the file using the flock(fd, LOCK_SH) call. 
This prevents processes from locking the file exclusively.
If the file has already an exclusive lock, our flock call blocks until the
other processes lock is released. 


Option: flock-sh-nb

Type: BOOL
Option group: FD
Phase: FD
Platforms: FreeBSD, Linux

Applies a shared advisory lock to the file using the flock(fd, LOCK_SH|LOCK_NB) call. 
This prevents processes from locking the file exclusively.
If the file has already an exclusive lock, our flock call returns with error
"Resource temporarily unavailable".


Option: f-setlk-rd
Aliases: setlk-rd

Type: BOOL
Option group: FD
Phase: FD
Platforms: all

Locks the complete file with fcntl(fd, F_SETLK, {F_RDLCK}) (complete means from its
start to its maximal length). This locks the file exclusively (but only if the
other processes accessing this file also use f-setlk or f-setlkw - otherwise,
they seem to have unrestricted access). If the file is already locked with
f-setlk or f-setlkw, the fcntl call blocks until release by the other process.


Option: f-setlk-wr
Aliases: f-setlk, setlk-wr, setlk

Type: BOOL
Option group: FD
Phase: FD
Platforms: all

Locks the complete file with fcntl(fd, F_SETLK, {F_WRLCK}) (complete means from its
start to its maximal length). This locks the file exclusively (but only if the
other processes accessing this file also use f-setlk or f-setlkw - otherwise,
they seem to have unrestricted access). If the file is already locked with
f-setlk or f-setlkw, the fcntl call blocks until release by the other process.


Option: f-setlkw-rd
Aliases: setlkw-rd

Type: BOOL
Option group: FD
Phase: FD
Platforms: all

Locks the complete file with fcntl(fd, F_SETLKW, {F_RDLCK}) (complete means from its
start to its maximal length). This locks the file exclusively (but only if the
other processes accessing this file also use f-setlk or f-setlkw - otherwise,
they seem to have unrestricted access). If the file is already locked with
f-setlk or f-setlkw, fcntl returns with EAGAIN.


Option: f-setlkw-wr
Aliases: setlkw-wr, f-setlkw, setlkw, lockw, lock

Type: BOOL
Option group: FD
Phase: FD
Platforms: all

Locks the complete file with fcntl(fd, F_SETLKW, {F_WRLCK}) (complete means from its
start to its maximal length). This locks the file exclusively (but only if the
other processes accessing this file also use f-setlk or f-setlkw - otherwise,
they seem to have unrestricted access). If the file is already locked with
f-setlk or f-setlkw, fcntl returns with EAGAIN.


Option: fork

Type: BOOL
Option group: CHILD
Phase: PASTACCEPT
Platforms: all

Without fork (or fork=0), the listening process accepts exactly one
connections, and terminates afterwards. With fork set, it forks off a new socat
child process for each incoming connection.
It is very important to understand what socat does with this fork option:
The parent process remains in a loop of accept() and fork() calls until
terminated from outside. The child process leaves this loop and goes on with
the socat processing. If the fork occurs in the first address argument, the
child process continues with parsing and activating the second address
argument. This will in most cases be what you want or expect.
If the fork call occurs in socats second address argument, all children will
inherit and share the already activated first address.


Option: group=value
Aliases: gid=value

Type: GIDT  or  unsigned int
Option group: NAMED
Type: GIDT
Platforms: all

Takes one argument, a UNIX group name or a numeric group id. The first
character of value is a digit for group ids.
With NAMED addresses this option is applied via a chown() call, with a 
fchown() call otherwise.
If groupname is a name it must be a valid groupname from /etc/group and is
converted to a group id with a getgrnam(3) call.
On most modern operating systems, the owner of the process must be member of
the group being set; only root may set any group, even numbers without group
name.
A Linux 2.2.10 kernel SIGSEGVs the process in the fchown() call when this
option is used with a socket or pipe. Is fixed with Linux 2.4.
LINUXBUG TESTCASE:
SH1: socat -D - unix-l:/tmp/socket,unlink-early
SH2: socat -d -d -d -d -D gopen:/tmp/socket,group=floppy -


Option: group-late=value

Type: GIDT  or  string
Option group: FD
Type: GIDT
Platforms: all

Takes one argument, a UNIX group name or a numeric group id. The first
character of value is a digit for group ids.
This option is applied via a fchown(2) call.
If groupname is a name it must be a valid groupname from /etc/group and is
converted to a group id with a getgrnam(3) call.
On most modern operating systems, the owner of the process must be member of
the group being set; only root may set any group, even numberic group ids
without group name.


Option: o-nonblock
Aliases: nonblock

Type: BOOL
Option group: FD
Phase: FD
Platforms: all (UNIX98)

Sets the O_NONBLOCK flag of a file descriptor via a fcntl(2) call and F_SETFL;
with OPEN type addresses, this flag is applied with the open() call.
It does not change the behaviour of socat's data transfer loop because socat
uses select() which blocks nevertheless.
Currently is has only two documented uses:
1) With address TCP, the connect() call
does not block; instead, it continues through the open step. The channel is
passed to the select() call. If something is written to the channel before it
is connected, this is an error. If connection fails, a read condition occurs
and read() returns the error.
2) Opening a named pipe does not block with this option.


Option: o-ndelay
Aliases: ndelay

Type: BOOL
Option group: FD
Phase: LATE
Platforms: HP-UX, SunOS (UNIX98)

Under Solaris it sets the O_NDELAY of the file descriptor via a fcntl(2) call
and F_SETFL; with OPEN type addresses, this flag is applied with the open()
call.
With all other operating systems, this is just another name for the nonblock option.


Option: o-noatime
Aliases: noatime

Type: BOOL
Option group: FD
Phase: FD
Platforms: Linux

Sets the O_NOATIME flag of a file descriptor via a fcntl(2) call and F_SETFL;
with OPEN type addresses, this flag is applied with the open() call.
It prevents the access time from being updated during read operations.


Option: perm=value
Aliases: mode=value

Type: MODET (mode_t)
Option group: NAMED
Phase: FD
Platforms: all

This option changes the mode (permissions) of an addresses inode. xioopen
tries to apply this option already during open phase. If the address does not
have a open phase or if the option cannot be applied there, the value is
applied directly on the file descriptor afterwards.
It is up to you to (1) have the permission to change the permissions, and (2)
not to set permissions that prevent you from performing your transactions :-)
NOTE: At least with some Linux 2.2, setting permissions on an existing file or
device with fchmod() does not change the permissions of its inode on disk. See
perm-early which uses chmod() instead.
NOTE: At least with some Linux 2.2, restricting mode on file descriptors does
not restrict this file descriptors data transfer capabilities.


Option: perm-late=value

Type: MODET (mode_t)
Option group: FD
Phase: LATE
Platforms: all

This option changes the mode (permissions) of a file descriptor with fchmod()
in the last phase of address processing.


Option: seek-set=offset
Aliases: lseek=offset, seek=offset

Type: OFF32 or OFF64
Option group: BLK
Phase: LATE
Platforms: HP-UX, Linux, SunOS

Positions the file at the given absolute offset, using lseek() (or lseek64() if
available) with SEEK_SET.


Option: seek-cur=offset

Type: OFF32 or OFF64
Option group: BLK
Phase: LATE
Platforms: HP-UX, Linux, SunOS

Positions the file at the given offset from the current position,
using lseek() (or lseek64() if available) with SEEK_SET. 


Option: seek-end=offset

Type: OFF32 or OFF64
Option group: BLK
Phase: LATE
Platforms: HP-UX, Linux, SunOS

Positions the file at the given offset from the file end,
using lseek() (or lseek64() if available) with SEEK_END.


Option: lseek32-set=offset
Aliases: lseek32=offset

Type: OFF32
Option group: BLK
Phase: LATE
Platforms: HP-UX, Linux, SunOS

Positions the file at the given absolute offset using lseek() with SEEK_SET.
This call might fail for non
random access data objects like character devices or sockets.
NOTE: this option seems to be useless on files with O_APPEND set.


Option: lseek32-cur=offset

Type: OFF32 (instead of off_t)
Option group: BLK
Phase: LATE
Platforms: HP-UX, Linux, SunOS

Positions the file at the given offset from the current position using lseek()
with SEEK_CUR. This call
might fail for non random access data objects like character devices.
On Linux, the seek() call fails on pipes, sockets and ttys but works on files
and /dev/null 
NOTE: this option seems to be useless on files with O_APPEND set.


Option: lseek32-end=offset

Type: OFF32
Option group: BLK
Phase: LATE
Platforms: HP-UX, Linux, SunOS

Positions the file at the given offset from the file end using lseek() with
SEEK_END. This call might fail
for non random access data objects like character devices.
NOTE: this option seems to be useless on files with O_APPEND set.


Option: lseek64-set=offset
Aliases: lseek64=offset

Type: OFF64
Option group: BLK
Phase: LATE
Platforms: all

Positions the file at the given absolute offset using lseek64() with SEEK_SET.
This call might fail for non
random access data objects like character devices or sockets.
NOTE: this option seems to be useless on files with O_APPEND set.


Option: lseek64-cur=offset

Type: OFF64
Option group: BLK
Phase: LATE
Platforms: all

Positions the file at the given offset from the current position using
lseek64() with SEEK_CUR. This call
might fail for non random access data objects like character devices.
NOTE: this option seems to be useless on files with O_APPEND set.


Option: lseek64-end=offset

Type: OFF64
Option group: BLK
Phase: LATE
Platforms: all

Positions the file at the given offset from the file end using lseek64() with
SEEK_END. This call might fail
for non random access data objects like character devices.
NOTE: this option seems to be useless on files with O_APPEND set.


Option: chroot=path

Type: STRING
Option group: PROCESS
Phase: LATE
Platforms: all

Invokes the chroot() system call with the given path after the address
resolution, so the path names of the address must be specified with absolute 
pathes. 
Note: when you combine chroot with substuser, with substuser applied within the
chroot environment, usually the etc/passwd and etc/group files in the chroot
environment are used for group set etc.
See appendix "generating a sandbox"


Option: chroot-early=path

Type: STRING
Option group: PROCESS
Phase: EARLY
Platforms: all

Invokes the chroot() system call with the given path before the address is
resolved, this means before file opening in OPEN, GOPEN and before program
execution in EXEC and SYSTEM, so their pathes must be specified related to
their chroot directory.
See appendix "generating a sandbox"


Option: setgid=group

Type: GIDT  (gid_t  or  string)
Option group: PROCESS
Phase: LATE2
Platforms: all

Invokes setgid() with the group id. For EXEC and SYSTEM this call is performed
for the child process after the fork and therefore does not affect the socat
process directly. For LISTEN group addresses with fork option, this call is
performed only on the child processes. For all other addresses, it is performed
in the late phase of address processing, so it does not affect the address
where it is used, but for the next address (if any), and for the data loop.
Note: setgid() does not remove any groups from the current process group set.


Option: setuid=user

Type: UIDT  (uid_t  or  string)
Option group: PROCESS
Phase: LATE2
Platforms: all

Invokes setuid() with the user id. For EXEC and SYSTEM this call is performed
for the child process after the fork and therefore does not affect the socat
process directly. For LISTEN group addresses with fork option, this call is
performed only on the child processes. For all other addresses, it is performed
in the late phase of address processing, so it does not affect the address
where it is used, but the next address (if any), and the data loop.
Note: setuid() is invoked AFTER setgid(), if both are applied.
Note: setuid() does not influence the processes group set; in most cases, you
want to prefer substuser option.


Option: substuser=user
Aliases: su=user

Type: UIDT  (uid_t  or  string)
Option group: PROCESS
Phase: LATE2
Platforms: all

Tries to switch the process to the given user and its group set.
To make sure that the groups are set correctly for the new process owner, the
system calls initgroups(), setgid(), and setuid() are invoked with the
appropriate arguments.
On sane operating system, this option requires root privileges.
Note: this option sets the user and group ids of the process, but does not
change the environment; therefore, all variables including $USER, $HOME,
$LOGNAME, $SHELL etc. are inherited from the old users environment.
Note: starting a SETUID program after applying substuser or setuid gives the
process the SETUID owner, which might give root privileges again.


Option: substuser-delayed=user
Aliases: su-d=user

Type: UIDT  (unsigned int  or  string)
Option group: PROCESS
Phase: INIT
Platforms: all

Like substuser, but reads the user and group information in an early phase of
address processing, but applies the appropriate system calls in a late
phase. This allows to use user information from the host in a chroot
environment, without exposing this data within the sandbox.


Option: o-trunc
Aliases: trunc

Type: BOOL
Option group: OPEN
Phase: LATE
Platforms: all

Sets the O_TRUNC flag of the open() call, thus truncating the file to zero
length.
#! block devices?


Option: ftruncate=value
Aliases: truncate=value

Type: OFF32 or OFF64
Option group: REG
Phase: LATE
Platforms: HP-UX, Linux, SunOS

Invokes the ftruncate() (or ftruncate64() if available) call for the file descriptor with the given value,
thus reducing the length of the file to the given length.
On Linux, ftruncate() fails on sockets and devices but works on regular files
and pipes.
#! block devices?
Note: AIX docu says: for regular files only


Option: ftruncate32=value

Type: OFF32
Option group: REG
Phase: LATE
Platforms: HP-UX, Linux, SunOS

Invokes the ftruncate() call (even if ftruncate64() is available) call for the file descriptor with the given value,
thus reducing the length of the file to the given length.


Option: ftruncate64=value

Type: OFF64
Option group: REG
Phase: LATE
Platforms: all

Invokes the ftruncate64() call if available, for the file descriptor with the given value,
thus reducing the length of the file to the given length.


Option: o-binary
Aliases: binary, bin

Type: BOOL
Option group: FD
Phase: OPEN
Platforms: none; Cygwin

Sets the O_BINARY flag with open() or fcntl() to avoid implicit line terminator conversions.


Option: o-text
Aliases: text

Type: BOOL
Option group: FD
Phase: OPEN
Platforms: none; Cygwin

Sets the O_TEXT flag with open() or fcntl() to force implicit line terminator conversions.


Option: o-noinherit
Aliases: noinherit

Type: BOOL
Option group: FD
Phase: OPEN
Platforms: none; Cygwin

Sets the O_NOINHERIT flag with open() or fcntl() to not keep this file open in a spawned process.


Option: cool-write
Aliases: coolwrite

Type: BOOL
Option group: FD
Phase: INIT
Platforms: all

   Takes it easy when write fails with EPIPE or ECONNRESET and logs the message
   with notice level instead of error.
   This prevents the log file from being filled with useless error messages
   when socat is used as a high volume server or proxy where clients often
   abort the connection.
   This option is experimental.


Option: end-close
Aliases: close

Type: CONST
Option group: FD
Phase: INIT
Platforms: all

   Changes the (address dependent) method to close a connection to just close
   the file descriptors. This is useful when the connection is to be reused by
   or shared with other processes.
   Normally, socket connections will be ended with shutdown(2) which
   terminates the socket even if it is shared by multiple processes. 
   close(2) "unlinks" the socket from the process but keeps it active as
   long as there are still links from other processes.
   Similarly, when an address of type EXEC or SYSTEM is ended, socat usually
   will explicitely kill the sub process. With this option, it will just close
   the file descriptors.


Option: user=value
Aliases: owner=value, uid=value

Type: UIDT  (unsigned int  or  string)
Option group: NAMED
Phase: FD
Platforms: all

Takes one argument, a UNIX user name or a numeric user id. The first
character of value is a digit for user ids.
For NAMED addresses, if the file already exists, this option is applied via a
chown() call, with fchown() for all other cases.
If username is a name it must be a valid username from /etc/passwd and is
converted to a user id with a getpwnam() call.
On sane operating systems, the owner of the process must be root to change
the owner of a file descriptor; root may even apply undefined (unnamed) user
ids.
My Linux 2.2 kernel SIGSEGVs the process in the fchown() call when this
option is used with a (UNIX, unconnected or connected) socket or pipe. Linux
2.4.0 handles this call correctly.
TESTCASE: ./socat -d -d -d -d - tcp:loopback:21,user=root


Option: user-late=value
Aliases: uid-l=value

Type: UIDT  (unsigned int  or  string)
Option group: FD
Phase: LATE
Platforms: all

Takes one argument, a UNIX user name or a numeric user id. The first
character of value is a digit for user ids.
This option is applied via a fchown() call just before xioopen_single()
terminates. 
If username is a name it must be a valid username from /etc/passwd and is
converted to a user id with a getpwnam() call.
On sane operating systems, the owner of the process must be root to change
the owner of a file descriptor; root may even apply undefined (unnamed) user
ids.
My Linux 2.2 kernel SIGSEGVs the process in the fchown() call when this
option is used with a socket or pipe.


===============================================================================
OPEN group options
Options of this group may be used with all addresses that support OPEN group
options.


Option: o-rdonly
Aliases: rdonly

Type: BOOL  (inherent - no value)
Option group: OPEN
Phase: OPEN
Platforms: all

Use O_RDONLY with the open() call instead of the position dependend default. 
Take care not to block later write operations.


Option: o-wronly
Aliases: wronly

Type: BOOL  (inherent - no value)
Option group: OPEN
Phase: OPEN
Platforms: all

Use O_WRONLY with the open() call instead of the position dependend default. 
Take care not to block later write operations.


Option: o-rdwr
Aliases: rdwr

Type: BOOL  (inherent - no value)
Option group: OPEN
Phase: OPEN
Platforms: all

Use O_RDWR with the open() call instead of the position dependend default. 


Option: o-create
Aliases: create, creat

Type: BOOL
Option group: OPEN
Phase: OPEN
Platforms: all

Sets the O_CREAT flag of the open() call. This means that it is not an error if
the file does not exist.


Option: o-defer
Aliases: defer

Type: BOOL
Option group: OPEN
Phase: OPEN
Platforms: none

Sets the O_DEFER flag of the open() call. This means that write data is stored
in paging space until an fsync() call.


Option: o-delay
Aliases: delay

Type: BOOL
Option group: OPEN
Phase: OPEN
Platforms: none

Sets the O_DELAY flag of the open() call. This lets open block until the share
conditions are fulfilled (see nshare, rshare)


Option: o-direct
Aliases: direct

Type: BOOL
Option group: OPEN
Phase: OPEN
Platforms: FreeBSD, HP-UX, Linux

Sets the O_DIRECT flag of the open() call.


Option: o-directory
Aliases: directory

Type: BOOL
Option group: OPEN
Phase: OPEN
Platforms: Linux

Sets the O_DIRECTORY flag of the open() call. This lets open fail if the given
path is not a directory. This does not seem to be useful with socat.


Option: o-dsync
Aliases: dsync

Type: BOOL
Option group: OPEN
Phase: OPEN
Platforms: HP-UX, Linux, SunOS (UNIX98)

Sets the O_DSYNC flag with the open() call. This lets write() calls wait until
modification metainfo is physically written to media.


Option: o-excl
Aliases: excl

Type: BOOL
Option group: OPEN
Phase: OPEN
Platforms: all

Sets the O_EXCL flag of the open() call.


Option: o-largefile
Aliases: largefile

Type: BOOL
Option group: OPEN
Phase: OPEN
Platforms: HP-UX, Linux, SunOS

Sets the O_LARGEFILE flag of the open() flag.


Option: o-noctty
Aliases: noctty

Type: BOOL
Option group: OPEN
Phase: OPEN
Platforms: all

Sets the O_NOCTTY flag of the open() call, so the opened device does not become
the controlling tty of the process.


Option: o-nofollow
Aliases: nofollow

Type: BOOL
Option group: OPEN
Phase: OPEN
Platforms: FreeBSD, Linux

Sets the O_NOFOLLOW flag of the open() call. This means that the last component
of the open path must no be a symlink.


Option: o-sync
Aliases: sync

Type: BOOL
Option group: OPEN
Phase: OPEN
Platforms: all (UNIX98)

Sets the O_SYNC flag with the open() call. This lets write() calls wait until
data is physically written to media.


Option: o-rshare
Aliases: rshare

Type: BOOL
Option group: OPEN
Phase: OPEN
Platforms: none

Sets the O_RSHARE flag of the open() call. This means that the file must not be
opened for writing by other processes ("read sharing").


Option: o-nshare
Aliases: nshare

Type: BOOL
Option group: OPEN
Phase: OPEN
Platforms: none

Sets the O_NSHARE flag of the open() call. This means that the file must not be
shared with other processes ("no sharing").


Option: o-rsync
Aliases: rsync

Type: BOOL
Option group: OPEN
Phase: OPEN
Platforms: HP-UX, Linux, SunOS (UNIX98)

Sets the O_RSYNC flag with the open() call. This lets write() calls wait until
read metainfo is physically written to media.


Option: o-priv
Aliases: priv

Type: BOOL
Option group: OPEN
Phase: OPEN
Platforms: none (Solaris)

Sets the O_PRIV flag with the open() call.

===============================================================================
NAMED group options
This group is valid for all addresses that refer to a file system entry like
file, device, named pipe, or named UNIX domain socket.


Option: unlink-early
Aliases: new

Type: BOOL
Option group: NAMED
Phase: EARLY
Platforms: all

This options tries to remove the filesystem entry given in the address before
starting any other processing (even before user-early, perm-early, or
group-early). unlink() is called; note that this call, in contrast to rm(1),
removes entries regardless of their permissions. Instead, ownership or root
privileges and write permissions in the directory are required and sufficient.


Option: unlink

Type: BOOL
Option group: NAMED
Phase: PREOPEN
Platforms: all

This options tries to remove the filesystem entry given in the address before
it is tried to open, but past user-early, perm-early, or group-early).
unlink() is called; note that this call, in contrast to rm(1), removes entries
regardless of their permissions. Instead, ownership or root privileges and
write permissions in the directory are required and sufficient.


Option: unlink-late

Type: BOOL
Option group: NAMED
Phase: PASTOPEN
Platforms: all

This option tries to remove the filesystem entry after it has been opened. 
Options can still be applied to the file descriptor, and
the node or files data can be used, but it can no longer be accessed by other
processes (except by tricks?), and after closing the stream the data or node is
completely removed.
unlink() is called; note that this call, in contrast to rm(1), removes entries
regardless of their permissions. Instead, ownership or root privileges and
write permissions in the directory are required and sufficient.


Option: perm-early=value

Type: MODET  (mode_t)
Option group: NAMED
Phase: PREOPEN
Platforms: all

This option changes the mode (permissions) of an already existing filesystem
entry with chmod() before the file is opened or after the UNIX domain socket is
bound, but before it listens/connects.


Option: user-early=value
Aliases: uid-e=value

Type: UIDT (unsigned int  or  string)
Option group: NAMED
Phase: PREOPEN
Platforms: all

Takes one argument, a UNIX user name or a numeric user id. The first
character of value is a digit for user ids.
This option is applied via a chown() call before the file system entry is
opened or after the UNIX domain socket is bound, but before it starts to
listen/connect.
If username is a name it must be a valid username from /etc/passwd and is
converted to a user id with a getpwnam() call.
On sane operating systems, the owner of the process must be root to change
the owner of a file descriptor; root may even apply undefined (unnamed) user
ids.


Option: group-early=value
Aliases: gid-e=value

Type: GIDT (unsigned int  or  string)
Option group: NAMED
Phase: PREOPEN
Platforms: all

Takes one argument, a UNIX group name or a numeric group id. The first
character of value is a digit for group ids.
This option is applied via a chown() call before the file system entry is
opened or after the UNIX domain socket is bound, but before it
listens/connects.
If groupname is a name it must be a valid groupname from /etc/group and is
converted to a group id with a getgrnam() call.
On most modern operating systems, the owner of the process must be member of
the group being set; only root may set any group, even numbers without group
name.


Option: umask=value

Type: MODET
Option group: NAMED
Phase: EARLY
Platforms: all

Sets the umask before opening a file or creating a UNIX domain socket. This is
especially useful for these sockets, because there interface does not provide a
mode argument.


Option: unlink-close

Type: BOOL
Option group: NAMED
Phase: LATE
Platforms: all

Remove the addresses file system entry when closing the address.
For named pipes, listening unix domain sockets, and the symbolic links of pty
addresses, the default is 1; for created files, opened files, generic opened
files, and client unix domain sockets the default is 0.


===============================================================================
FORK and EXEC options

Option: path=string

Type: STRING
Option group: EXEC
Phase: PREEXEC
Platforms: all

Changes the PATH environment variable in the child process before the exec() or
system() call.


Option: nofork

Type: BOOL
Option group: FORK
Phase: BIGEN
Platforms: all

Does not fork a subprocess for executing the program, instead calls execvp()
directly from the actual socat instance. This avoids the overhead of another process
between the program and the communication peer, but introduces lots of
restrictions:
 * this option can only be applied to the second socat() address.
 * the first socat address cannot be OPENSSL or READLINE
 * socat options -b, -t, -D, -l, -v, -x, -t become useless
 * for both addresses, options ignoreeof, cr and crnl become useless
 * for the second address (the one with option nofork), options 
   append, async, cloexec, flock, user, group, mode, nonblock,
   perm-late, setlk, and setpgid cannot be applied, and should be used on the
   first address instead.


Option: pipes

Type: BOOL
Option group: FORK
Phase: BIGEN
Platforms: all

For communication between the exec() or system() subprocess with socat, use two
unnamed pipes instead of creating a socket pair.


Option: pty

Type: BOOL
Option group: FORK
Phase: BIGEN
Platforms: all

For communication between the exec() or system() subprocess with socat, use a
pseudo terminal instead of a socket pair. The executed program gets the slave
side, and socat the controlling side of the pseudo terminal. 
This is especially useful if you want to use, e.g., chat with socat (see
EXAMPLES). Plus, ptys do not buffer I/O.
Note: implementation of pseudo terminals are differing between platforms, so
extra porting struggles might be required for porting this feature.


Option: fdin=num

Type: USHORT
Option group: FORK
Phase: PASTBIGEN
Platforms: all

After forking the child process, assign the stream where the child
receives data from socat, to file descriptor num instead of stdin.


Option: fdout=num

Type: USHORT
Option group: FORK
Phase: PASTBIGEN
Platforms: all

After forking the child process, assign the stream where the child
writes data to socat, to file descriptor num instead of stdout.


Option: stderr

Type: BOOL
Option group: FORK
Phase: PASTFORK
Platforms: all

Normally, the stderr filedescriptor of the forked program is a clone of socat's
stderr fd. If this option is used, the programs stderr filedescriptor is a copy
of the "normal" data output of the program, i.e. of its stdout or fdout.


Option: setsid
Aliases: sid

Type: BOOL
Option group: PROCESS
Phase: LATE
Platforms: all

Invokes setsid() to make the forked off subprocess the leader of a new
session. This also generates a new process group with this process as leader.
This is useful, e.g., when exec'ing ssh to get the password prompt into the I/O
channel (see EXAMPLES)


Option: setpgid
Aliases: pgid

Type: INT
Option group: FORK
Phase: LATE
Platforms: all

Invokes setpgid(0, val) from the child process.


Option: tiocsctty
Aliases: ctty

Type: BOOL
Option group: TERMIOS
Phase: LATE2
Platforms: all

Applies only in combination with the pty option or its variants. Tries to make
the pty the controlling terminal. May require option setsid to work correctly.


Option: dash
Aliases: login

Type: BOOL
Option group: EXEC
Phase: PREEXEC
Platforms: all

Prefixes argv[0] for the execvp() call with '-', thus making a shell behave as
login shell.


Option: sighup

Type: CONST
Option group: PARENT
Phase: LATE
Platforms: all

   Has socat pass an eventual SIGHUP signal to the sub process.
   If no address has this option, socat terminates on SIGHUP.


Option: sigint

Type: CONST
Option group: PARENT
Phase: LATE
Platforms: all

   Has socat pass an eventual SIGINT signal to the sub process.
   If no address has this option, socat terminates on SIGINT.


Option: sigquit

Type: CONST
Option group: PARENT
Phase: LATE
Platforms: all

   Has socat pass an eventual SIGQUIT signal to the sub process.
   If no address has this option, socat dumps core and terminates on SIGQUIT.


===============================================================================
PTY options
These options may be used with addresses that create a pseudo terminal (pty).
In particular, these are addresses EXEC, SYSTEM, and PTY.


Option: openpty

Type: BOOL
Option group: PTY
Phase: BIGEN
Platforms: FreeBSD, Linux

Like pty, but only use the openpty mechanism, not any other way for pty
generation. 


Option: ptmx

Type: BOOL
Option group: PTY
Phase: BIGEN
Platforms: HP-UX, Linux, SunOS

Like pty, but only use the /dev/ptmx (/dev/ptc on AIX) mechanism, not any other
way for pty generation. 


Option: symbolic-link=filename

Type: FILENAME
Option group: PTY
Phase: LATE
Platforms: all

Generates a symbolic link that points to the actual pseudo terminal (pty). This
might help to solve the problem that ptys are generated with more or less
unpredictable names, making it difficult to directly access the socat generated
pty automatically. With this option, the user can specify a "fix" point in the
file hierarchy that helps him to access the actual pty.


Option: pty-wait-slave
Aliases: wait-slave, waitslave

Type: BOOL
Option group: PTY
Phase: EARLY
Platforms: all

   Blocks the open phase until a process opens the slave side of the pty.
   Usually, socat continues after generating the pty with opening the next
   address or with entering the transfer engine. With the wait-slave option,
   socat waits until some process opens the slave side of the pty before
   continuing. 
   This option only works if the operating system provides the tt(poll())
   system call. And it depends on an undocumented behaviour of pty's, so it
   does not work on all operating systems. It has successfully been tested on
   Linux, FreeBSD, NetBSD, and on Tru64 with openpty. 


Option: pty-interval

Type: TIMESPEC
Option group: PTY
Phase: EARLY
Platforms: all

   When the wait-slave option is set, socat periodically checks the HUP
   condition using poll() to find if the pty's slave side has been
   opened. The default 
   polling interval is 1s. Use the pty-interval option to change this value.


===============================================================================
SOCKET options
These are options that may be applied to all socket type addresses: UNIX
(LOCAL) domain sockets (even with EXEC type addresses if not pipes), IP, and
IPv6.


Option: so-debug
Aliases: debug

Logical type: bool
Physical type: INT
Option group: SOCKET
Phase: PASTSOCKET
Platforms: all (UNIX98)

Sets the SO_DEBUG socket option. Requires root.


Option: so-acceptconn
Aliases: acceptconn

Logical type: bool
Physical type: INT
Option group: SOCKET
Phase: PASTSOCKET
Platforms: all (UNIX98)

Tries to set the SO_ACCEPTCONN socket option. Read-only!


Option: so-broadcast
Aliases: broadcast

Logical type: bool
Physical type: INT
Option group: SOCKET
Phase: PASTSOCKET
Platforms: all (UNIX98)

Sets the SO_BROADCAST socket option.


Option: so-reuseaddr
Aliases: reuseaddr

Logical type: bool
Physical type: INT
Option group: SOCKET
Phase: PASTSOCKET
Platforms: all (UNIX98)

Sets the SO_REUSEADDR socket option. Allows to bind to a port even if this
port is already used for a connection.


Option: so-keepalive
Aliases: keepalive

Logical type: bool
Physical type: INT
Option group: SOCKET
Phase: FD
Platforms: all (UNIX98)

Sets the SO_KEEPALIVE socket option.


Option: so-linger=value
Aliases: linger=value

Type: LINGER
Option group: SOCKET
Phase: PASTSOCKET
Platforms: all (UNIX98)

Activates the SO_LINGER option and sets a value (seconds) for it.
This lets shutdown() or close() block until data transfers have finished or the
given value timed out.
Note: on some systems, the type for setsockopt() is struct { int; int; }
In this case, xioopen() sets {1,value}.


Option: so-oobinline
Aliases: oobinline

Logical type: bool
Physical type: INT
Option group: SOCKET
Phase: PASTSOCKET
Platforms: all (UNIX98)

Sets the SO_OOBINLINE socket option.


Option: so-sndbuf=value
Aliases: sndbuf=value

Type: INT
Option group: SOCKET
Phase: PASTSOCKET
Platforms: all (UNIX98)

Sets the SO_SNDBUF option of the socket to the given value. This option is
applied after the socket() (or socketpair()) call.
NOTE: The kernel might change the effective value:
My Linux 2.2 with TCP doubles the value, but uses at least 2048.


Option: so-sndbuf-late=value
Aliases: sndbuf-late=value

Type: INT
Option group: SOCKET
Phase: LATE
Platforms: all (UNIX98)

Sets the SO_SNDBUF option of the socket to the given value. This option is
applied after the connect() or accept() (or socketpair) call.
NOTE: The kernel might change the effective value:
My Linux 2.2 with TCP doubles the value, but uses at least 2048, and a
maximum of 131070 (system limit?).


Option: so-rcvbuf=value
Aliases: rcvbuf=value

Type: INT
Option group: SOCKET
Phase: PASTSOCKET
Platforms: all (UNIX98)

Sets the SO_RCVBUF option of the socket to the given value. This option is
applied after the socket() call.
NOTE: The kernel might change the effective value:
My Linux 2.2 with TCP connect doubles the value, but uses at least 256 and
at most 131070.
My Linux 2.2 with TCP listen doubles the value but uses at least 11772.
NOTE: For applying the SO_RCVBUF options after the connect() or accept() calls
see rcvbuf-late.


Option: so-rcvbuf-late=value
Aliases: rcvbuf-late=value

Type: INT
Option group: SOCKET
Phase: LATE
Platforms: all (UNIX98)

Sets the SO_RCVBUF option of the socket to the given value. This option is
applied after the connect() or listen() call.
NOTE: The kernel might change the effective value:
My Linux 2.2 with TCP doubles the value, but uses at least 256 and maximal
131070.
NOTE: sequence of this call may be relevant for the effecting value (AIX
4.3.3). For applying the SO_RCVBUF option immediately after the socket() call
see rcvbuf.


Option: so-error
Aliases: error

Logical type: bool
Physical type: INT
Option group: SOCKET
Phase: PASTSOCKET
Platforms: all (UNIX98)

Tries to set the SO_ERROR socket option which is a read-only option.
On my Linux 2.2 it gives "protocol not available".


Option: so-type=value
Aliases: type=value

Type: INT
Option group: SOCKET
Phase: PASTSOCKET
Platforms: all

Set the sockettype argument of the socket() or socketpair() call. This
overrides the per 
protocol default (e.g., TCP: SOCK_STREAM). Most values might 
not be supported by a given protocol.
The following combinations are known to work at least under one OS:
TCP     SOCK_STREAM (system default)
UDP     SOCK_DGRAM (system default)
IP      SOCK_RAW (socat default)
UNIX    SOCK_STREAM (system default)
UNIX    SOCK_DGRAM


Option: so-dontroute
Aliases: dontroute

Logical type: bool
Physical type: INT
Option group: SOCKET
Phase: PASTSOCKET
Platforms: all (UNIX98)

Sets the SO_DONTROUTE socket option.


Option: so-rcvlowat=value
Aliases: rcvlowat=value

Type: INT
Option group: SOCKET
Phase: PASTSOCKET
Platforms: all (UNIX98)

Sets the SO_RCVLOWAT socket option. Cannot be changed in Linux (always
gives "protocol not available").


Option: so-rcvtimeo=value
Aliases: rcvtimeo=value

Provided type: double
Physical type: TIMEVAL (long[2])
Option group: SOCKET
Phase: PASTSOCKET
Platforms: all (UNIX98)

Sets the SO_RCVTIMOE socket option. Cannot be changed in Linux (always
gives "protocol not available").


Option: so-sndlowat=value
Aliases: sndlowat=value

Type: INT
Option group: SOCKET
Phase: PASTSOCKET
Platforms: all (UNIX98)

Sets the SO_SNDLOWAT socket option. Cannot be changed in Linux (always
gives "protocol not available").


Option: so-sndtimeo=value
Aliases: sndtimeo=value

Provided type: double
Physical type: TIMEVAL (long[2])
Option group: SOCKET
Phase: PASTSOCKET
Platforms: all (UNIX98)

Sets the SO_SNDTIMEO socket option. Cannot be changed in Linux (always
gives "protocol not available").


Option: so-audit
Aliases: audit

Type: INT
Option group: SOCKET
Phase: PASTSOCKET
Platforms: none

Sets the SO_AUDIT socket option.


Option: so-attach-filter
Aliases: attach-filter, attachfilter

Type: INT
Option group: SOCKET
Phase: PASTSOCKET
Platforms: Linux

Linux docu recommends to use libpcap for this feature.
"protocol not available", need kernel CONFIG_FILTER!


Option: so-detach-filter
Aliases: detach-filter, detachfilter

Type: INT
Option group: SOCKET
Phase: PASTSOCKET
Platforms: Linux

See Linux "man 7 socket".
"protocol not available", need kernel CONFIG_FILTER!


Option: so-bindtodevice=string
Aliases: bindtodevice, interface, if

Type: NAME
Option group: SOCKET
Phase: PASTSOCKET
Platforms: Linux

Binds the socket to a net interface, e.g. lo0 or eth0 (interface names depend
on operating system). Might require root privilege.


Option: so-bsdcompat
Aliases: bsdcompat

Logical type: bool
Physical type: INT
Option group: SOCKET
Phase: PASTSOCKET
Platforms: none

Sets the SO_BSDCOMPAT socket option. See Linux "man 7 socket".


Option: so-cksumrecv
Aliases: cksumrecv

Logical type: bool
Physical type: INT
Option group: SOCKET
Phase: PASTSOCKET
Platforms: none

Sets the SO_CKSUMRECV socket option.


Option: so-kernaccept
Aliases: kernaccept

Logical type: bool
Physical type: INT
Option group: SOCKET
Phase: PASTSOCKET
Platforms: none

Sets the SO_KERNACCEPT socket option.


Option: so-no-check
Aliases: no-check, nocheck

Logical type: bool
Physical type: INT
Option group: SOCKET
Phase: PASTSOCKET
Platforms: Linux

Sets the SO_NO_CHECK socket option." Intentionally undocumented" under
Linux (see "man 7 socket"), don't know what it does....


Option: so-noreuseaddr
Aliases: noreuseaddr

Type: INT?
Option group: SOCKET
Phase: PASTSOCKET
Platforms: none

Sets the SO_NOREUSEADDR socket option.


Option: passcred
Aliases: so-passcred

Type: INT
Option group: SOCKET
Phase: PASTSOCKET
Platforms: Linux

Sets the SO_PASSCRED option of a socket.


Option: so-peercred
Aliases: peercred

Type: INT3 or int[3]?
Option group: SOCKET
Phase: PASTSOCKET
Platforms: Linux

Enables receiving of credentials. Read only.
Not really implemented yet.
Nevertheless, Gives "Protocol not available".


Option: so-priority=value
Aliases: priority=value

Type: INT
Option group: SOCKET
Phase: PASTSOCKET
Platforms: Linux

Sets the protocol defined priority for all packets to be sent on this socket.
Docu says it requires root privileges. Normal user may set 0..6 for UNIX domain
and TCP client sockets on Linux 2.2. root may send any int value.


Option: so-reuseport
Aliases: reuseport

Type: INT?
Option group: SOCKET
Phase: PASTSOCKET
Platforms: FreeBSD, HP-UX

Sets the SO_REUSEPORT socket option.


Option: so-security-authentication
Aliases: security-authentication, securityauthentication

Type: INT?
Option group: SOCKET
Phase: PASTSOCKET
Platforms: Linux

Sets the SO_SECURITY_AUTHENTICATION socket option. Gives "protocol not
available" error.
In Linux 2.2.16 source, only exists in asm-*/socket.h


Option: so-security-encryption-network
Aliases: security-encryption-network, securityencryptionnetwork

Type: INT?
Option group: SOCKET
Phase: PASTSOCKET
Platforms: Linux

Sets the SO_SECURITY_ENCRYPTION_NETWORK option of the socket. Gives "protocol
not available" error.
In Linux 2.2.16 source, only exists in asm-*/socket.h


Option: so-security-encryption-transport
Aliases: security-encryption-transport, securityencryptiontransport

Type: INT?
Option group: SOCKET
Phase: PASTSOCKET
Platforms: Linux

Sets the SO_SECURITY_ENCRYPTION_TRANSPORT option of the socket. Gives "protocol
not available" error.
In Linux 2.2.16 source, only exists in asm-*/socket.h


Option: so-use-ifbufs
Aliases: use-ifbufs, useifbufs

Type: INT?
Option group: SOCKET
Phase: PASTSOCKET
Platforms: none

Sets the SO_USE_IFBUFS socket option.


Option: so-useloopback
Aliases: useloopback

Type: INT?
Option group: SOCKET
Phase: PASTSOCKET
Platforms: FreeBSD, HP-UX, SunOS

Sets the SO_USELOOPBACK socket option.


Option: so-dgram-errind
Aliases: dgram-errind, dgramerrind

Logical type: bool?
Physical type: INT?
Option group: SOCKET
Phase: PASTSOCKET
Platforms: SunOS

Sets the SO_DGRAM_ERRIND flag. 


Option: so-dontlinger
Aliases: dontlinger

Type: INT?
Option group: SOCKET
Phase: PASTSOCKET
Platforms: SunOS

Sets the SO_DONTLINGER socket option.


Option: so-prototype
Aliases: prototype

Type: INT?
Option group: SOCKET
Phase: PASTSOCKET
Platforms: HP-UX, SunOS

Sets the SO_PROTOTYPE socket option.


Option: type

Type: INT
Option group: SOCKET
Phase: PASTSOCKET
Platforms: all

Sets the type of the socket, usually as argument to the socket() or
socketpair() call, to <type>. Under Linux, 1 means stream oriented socket, 2
means datagram socket, and 3 means raw socket.  


Option: protocol-family
Aliases: pf

Type: STRING
Option group: SOCKET
Phase: PRESOCKET
Platforms: all

Forces the use of the specified IP version. <string> can be something like
"ip4" or "ip6".


Option: fiosetown

Logical type: bool
Physical type: INT
Option group: SOCKET
Phase: PASTSOCKET
Platforms: FreeBSD, Linux

Sets the FIOSETOWN ioctl (in "man 7 socket" called FIOCSETOWN).


#Option: ciocspgrp
#
#Allowed in addresses: SOCKET
#Logical type: bool
#Physical type: int
#
#Sets the CIOCSPGRP ioctl.


#Option: addr=value
#
#Allowed in addresses: SOCKET
#Type: socket-address
#
#For client socket, sets the local (bind) address. Not yet implemented.


Option: bind=socketaddress

Type: STRING
Option group: SOCKET
Phase: BIND
Platforms: all

Gives the address to be used in the bind(2) system call. The format of the
socketaddress depends on the socket type (see below). For "client" sockets this
option inserts a bind(2) call between socket(2) and connect(2) calls. For
"server" sockets this option is ignored! For datagram sockets behaviour of this
option is currently unspecified.
Note: for client sockets in the UNIX domain this option is not useful: with the
same address as connect it will conflict with the bind call of the server
socket; another address for bind is ignored (with Linux 2.2).
For TCP sockets these formats are currently implemented:
HOSTNAME
HOSTNAME:PORT
IPADDR
IPADDR:PORT
:PORT
.PORT


Option: connect-timeout=seconds

Type: TIMEVAL
Option group: SOCKET
Phase: PASTSOCKET
Platforms: all

Abort the connection attempt after the given time with error status.

#
Option: backlog=value

Type: INT
Option group: LISTEN
Phase: LISTEN
Platforms: all

Sets the value to be used with the listen(2) system call. The default is 5.
It does not seem to work for Linux 2.2; Linux seems to allow much more
established connections, but then they stay even after server process
shutdown...


Option: range=address:mask, range=address/bits

Type: STRING
Option group: RANGE
Phase: ACCEPT
Platforms: all
Implementation status: only for INET (IP4) addresses

Defines a subnet where clients may connect from. If other clients connect the
accepted connection is shut down immediately after examination of the client
address. If this option is not used, the default is 0.0.0.0:0.0.0.0, allowing
arbitrary client addresses. bits is the number of high order bits that must
match between the range value and the clients address.


Option: tcpwrap, tcpwrap=name

Type: STRING_NULL
Option group: RANGE
Phase: ACCEPT
Platforms: (depends on libwrap installation)

Uses the rules introduced by Wietse Venema's libwrap (tcpd) library to check
if the client is allowed to connect. The configuration files are
/etc/hosts.allow and /etc/hosts.deny. See "man 5 hosts_access" for 
more information. <name> is passed to the wrapper functions as daemon
process name. If omitted, the basename of socats invokation (argv[0]) is
passed. 
If both tcpwrap and and range options are applied to an address, both
conditions must be fulfilled to allow the connection.


Option: hosts-allow, tcpwrap-hosts-allow-table

Type: FILENAME
Option group: RANGE
Phase: ACCEPT
Platforms: (depends on libwrap installation)

Takes the specified file instead of /etc/hosts.allow.


Option: hosts-deny, tcpwrap-hosts-deny-table

Type: FILENAME
Option group: RANGE
Phase: ACCEPT
Platforms: (depends on libwrap installation)

Takes the specified file instead of /etc/hosts.deny.


Option: tcpwrap-etc, tcpwrap-dir

Type: FILENAME
Option group: RANGE
Phase: ACCEPT
Platforms: (depends on libwrap installation)

   Looks for hosts.allow and hosts.deny in the specified directory. Is
   overriden by options hosts-allow and hosts-deny.


-------------------------------------------------------------------------------
IP options


Option: ip-options=values
Aliases: ipoptions

Type: BIN
Option group: SOCK_IP
Phase: PASTSOCKET
Platforms: all

Sets the IP_OPTIONS values of the IP socket. For example, to send packets to
destination D.D.D.D via a router G.G.G.G you have to specify G.G.G.G as the
"normal" destination, and D.D.D.D in the source route:
TCP:G.G.G.G:25,ip-options=x890704dddddddd
Note that the destination will see G.G.G.G as sender of the packets, and
therefore might not return the answers correctly.
See RFC791 for detailed specification of IP option fields.
Examples:
x01 ... nop
x8307040a000001 ... loose source route
x890b040a000001c0c1c2c3 ... strict source route
Note: with source routes, you should not specifiy destination address and
hops as defined in RFC791 (first hop as IP header destination address,
further hops and final destination in source route) because the (Linux?) kernel changes
them to a more intuitive form (final destination as destination in IP header,
gateways in source route). So, in destination address give the final
destination, and in the source route the gateways!
Note: this option may be mulitply applied per socket but the (Linux?) kernel
pads each setting with 0' to align the options end to 4 octets. So you should
better pad the options data with nops (01) yourself.


Option: ip-pktinfo
Aliases: ippktinfo, pktinfo

Type: INT (should be struct in_pktinfo)
Option group: SOCK_IP
Phase: PASTSOCKET
Platforms: Linux
Status: Not completely implemented (ancillary messages are not supported by
socat/xio)

Pass an IP_PKTINFO ancillary message.


Option: ip-recvtos
Aliases: iprecvtos, recvtos

Logical type: bool
Physical type: INT
Option group: SOCK_IP
Phase: PASTSOCKET
Platforms: Linux
Status: Not completely implemented (ancillary messages are not supported by
socat/xio)

Set the IP_RECVTOS socket option which enables IP_TOS ancillary message
passing.


Option: ip-recvttl
Aliases: iprecvttl, recvttl

Logical type: bool
Physical type: INT
Option group: SOCK_IP
Phase: PASTSOCKET
Platforms: all
Implementation status: No results.

Set the IP_RECVTTL socket option. 


Option: ip-recvopts
Aliases: iprecvopts, recvopts

Logical type: bool
Physical type: INT
Option group: SOCK_IP
Phase: PASTSOCKET
Platforms: all
Implementation status: No results.

Set the IP_RECVOPTS socket option. 


Option: ip-retopts
Aliases: ipretopts, retopts

Logical type: bool
Physical type: INT
Option group: SOCK_IP
Phase: PASTSOCKET
Platforms: all
Implementation status: No results.

Set the IP_RETOPTS socket option. 


Option: ip-tos=value
Aliases: iptos=value, tos=value

Logical type: byte
Physical type: INT
Option group: SOCK_IP
Phase: PASTSOCKET
Platforms: all

Sets the TOS (type of service) flags for the outgoing IP headers of the
socket. My Linux 2.2 does not allow to set values other than 0 (probably
needs some optional kernel features).


Option: ip-ttl=value
Aliases: ipttl=value, ttl=value

Logical type: byte
Physical type: INT
Option group: SOCK_IP
Phase: PASTSOCKET
Platforms: all

Sets the TTL (time to live) field for the outgoing IP headers of the socket.
0 does not seem to be useful and gives "invalid argument" error in Linux.
This option can be used to implement a "poor mans traceroute" in conjunction
with tcpdump.


Option: ip-hdrincl
Aliases: iphdrincl, hdrincl

Logical type: bool
Physical type: INT
Option group: SOCK_IP
Phase: PASTSOCKET
Platforms: all

Set the IP_HDRINCL socket option. User will supply IP header before user
data. For raw IP sockets only. Not tested.


Option: ip-recverr
Aliases: iprecverr, recverr

Type: INT
Option group: SOCK_IP
Phase: PASTSOCKET
Platforms: Linux

Set the IP_RECVERR socket option. 
Implementation status: No results.


Option: ip-mtu-discover=value
Aliases: ipmtudiscover=value, mtudiscover=value

Type: INT (0..2)
Option group: SOCK_IP
Phase: PASTSOCKET
Platforms: Linux

Sets the IP_MTU_DISCOVER flag of the IP socket. In Linux there are three values
defined: 0..dont(never), 1..want(per route), 2..do(always)


Option: ip-mtu
Aliases: ipmtu, mtu

Type: INT
Option group: SOCK_IP
Phase: PASTSOCKET
Platforms: none

Sets the MTU (maximal transfer unit) of the socket. In Linux this is a
read-only parameter and results in a "protocol not available" error.


Option: ip-freebind
Aliases: ipfreebind, freebind

Logical type: bool
Physical type: INT
Option group: SOCK_IP
Phase: PASTSOCKET
Platforms: none

Allows the socket to locally bind to any address, even those that are
not covered by an interface address, alias address or a local subnet. Even
broadcast and multicast addresses are possible.
Note: this option has been found on Linux 2.4 in <linux/in.h>. This file might
not be included per default, because it creates errors.
To make this option available, "make" socat with the CCOPT environment
variable set to "-DIP_FREEBIND=15"


Option: ip-router-alert=value
Aliases: iprouteralert, routeralert

Type: INT
Option group: SOCK_IP
Phase: PASTSOCKET
Platforms: Linux

Sets the IP_ROUTER_ALERT socket option. Only works with raw sockets.
"Invalid argument"


Option: ip-add-membership=multicast-address:interface-address
        ip-add-membership=multicast-address:interface-name
	ip-add-membership=multicast-address:interface-index
	ip-add-membership=multicast-address:interface-address:interface-name
	ip-add-membership=multicast-address:interface-address:interface-index
Aliases: add-membership
	 ip-membership

Type: IP_MREQN
Option group: SOCK_IP
Phase: PASTSOCKET
Platforms: all

   Makes the socket member of the specified multicast group. This is currently
   only implemented for IPv4. The option takes the IP address of the multicast
   group and info about the desired network interface. The most common syntax
   is the first one, while the others are only available on systems that
   provide tt(struct mreqn) (Linux).nl()
   The indices of active network interfaces can be shown using the utility
   procan().


Option: ip-drop-membership

Not implemented.


#! Option: ipv6-join-group


Option: ip-multicast-ttl=byte
Aliases: ipmulticastttl, multicastttl

Type: BYTE
Option group: SOCK_IP
Phase: PASTSOCKET
Platforms: all

   Sets the TTL used for outgoing multicast traffic. Default is 1.


Option: ip-multicast-loop
Aliases: ipmulticastloop, multicastloop

Logical type: bool
Physical type: INT
Option group: SOCK_IP
Phase: PASTSOCKET
Platforms: all

   Specifies if outgoing multicast traffic should loop back to the interface.


Option: ip-multicast-if=hostname
Aliases: multicast-if

Type: IP4NAME
Option group: SOCK_IP
Phase: PASTSOCKET
Platforms: all

   Specifies hostname or address of the network interface to be used for
   multicast traffic.


Option: ip-pktoptions
Aliases: ippktoptions, pktoptions, pktopts

Type: INT?
Option group: SOCK_IP
Phase: PASTSOCKET
Platforms: Linux

Set the IP_PKTOPTIONS socket option. No docu found.
Implementation status: "Protocol not available".


Option: res-debug

Type: BOOL
Option group: SOCK_IP
Phase: INIT
Platforms: all

Apply the debug resolver option to all queries of this XIO address.


Option: res-aaonly
Aliases: aaonly

Type: BOOL
Option group: SOCK_IP
Phase: INIT
Platforms: all

Apply the aaonly resolver option to all queries of this XIO address.


Option: res-usevc
Aliases: usevc

Type: BOOL
Option group: SOCK_IP
Phase: INIT
Platforms: all

Apply the usevc resolver option to all queries of this XIO address.


Option: res-primary
Aliases: primary

Type: BOOL
Option group: SOCK_IP
Phase: INIT
Platforms: all

Apply the primary resolver option to all queries of this XIO address.


Option: res-igntc
Aliases: igntc

Type: BOOL
Option group: SOCK_IP
Phase: INIT
Platforms: all

Apply the igntc resolver option to all queries of this XIO address.


Option: res-recurse
Aliases: recurse

Type: BOOL
Option group: SOCK_IP
Phase: INIT
Platforms: all

Apply the recurse resolver option to all queries of this XIO address.


Option: res-defnames
Aliases: defnames

Type: BOOL
Option group: SOCK_IP
Phase: INIT
Platforms: all

Apply the defnames resolver option to all queries of this XIO address.


Option: res-stayopen
Aliases: stayopen

Type: BOOL
Option group: SOCK_IP
Phase: INIT
Platforms: all

Apply the stayopen resolver option to all queries of this XIO address.


Option: res-dnsrch
Aliases: dnsrch

Type: BOOL
Option group: SOCK_IP
Phase: INIT
Platforms: all

Apply the dnsrch resolver option to all queries of this XIO address.


-------------------------------------------------------------------------------
IP6 options


Option: ipv6-v6only=value
Alias: ipv6only, v6only

Type: BOOL
Option group: SOCK_IP6
Phase: PASTSOCKET
Platforms: FreeBSD, Linux

Apply the IPV6_V6ONLY socket option to the file descriptor. This controls if
the socket listens only on the IPv6 protocol or also on IPv4.


-------------------------------------------------------------------------------
IPAPP (TCP and UDP) options


Option: sourceport=value
Alias: sp=value

Type: 2BYTE
Option group: IPAPP (IP_TCP and IP_UDP)
Phase: LATE
Platforms: all

For outgoing (client) TCP and UDP connections, it sets the source port (local port, client side port) of
the socket connection. For server type addresses, requires the client to use
this sourceport, otherwise socat immediately shuts down the connection. 
On UNIX class operating systems root privilege are required to set a source
port  between 1 and 1023 incl. 0 gives a "random" port number >= 1024, which is
the default.


Option: lowport

Type: BOOL
Option group: IPAPP (IP_TCP and IP_UDP)
Phase: LATE
Platforms: all

For outgoing (client) TCP and UDP connections, it sets the source
to an unused random port between 640 and 1023 incl. On UN*X type operating
systems, this requires root privilege, and thus guaranties the peer to be
root authorized.
With TCP or UDP listen addresses, socat immediately shuts down the
connection if the client does not use a sourceport <= 1023.
This mechanism can provide limited authorization under some circumstances.

-------------------------------------------------------------------------------
TCP options


Option: tcp-nodelay
Aliases: nodelay

Logical type: bool
Physical type: INT
Option group: IP_TCP
Phase: PASTSOCKET
Platforms: all

Sets the TCP_NODELAY flag of the TCP socket. This turns off Nagles algorithm.


Option: tcp-maxseg
Aliases: maxseg, mss

Type: INT
Option group: IP_TCP
Phase: PASTSOCKET
Platforms: all

Limits the MAXSEG (MSS) value of the TCP socket. This option is applied before
the connect or listen call, so it is transferred in the SYN packet to the peer
socket.
Linux client: 0 gives "invalid argument", higher values are used in SYN
negotiation, but effective MSS is n-12, at least 8.
On AIX, this is a read-only option.


Option: tcp-maxseg-late
Aliases: maxseg-late, mss-late

Type: INT
Option group: IP_TCP
Phase: CONNECTED
Platforms: all

Limits the MAXSEG (MSS) value of the TCP socket. This option is applied past
the connect or accept call, so it is not transferred as MSS to the peer socket.
Observation with Linux 2.2: does not influence the size of packets generated
by the local socket.


Option: tcp-cork
Aliases: cork

Logical type: bool
Physical type: INT
Option group: IP_TCP
Phase: PASTSOCKET
Platforms: Linux

Sets the TCP_CORK option.


Option: tcp-stdurg
Aliases: stdurg

Logical type: bool
Physical type: INT
Option group: IP_TCP
Phase: PASTSOCKET
Platforms: none

Applies the TCP_STDURG option with setsockopt. This enables RFC 1122 compliant
urgent point handling.


Option: tcp-rfc1323
Aliases: rfc1323

Logical type: bool
Physical type: INT
Option group: IP_TCP
Phase: PASTSOCKET
Platforms: none

Applies the TCP_RFC1323 option with setsockopt. This enables RFC1323 TCP
enhancements (window scale, timestamp).


Option: tcp-keepidle
Aliases: keepidle

Type: INT
Option group: IP_TCP
Phase: PASTSOCKET
Platforms: Linux

Sets the TCP_KEEPIDLE value of the socket with setsockopt(). Starts keepalive
after this period (in seconds?)


Option: tcp-keepintvl
Aliases: keepintvl

Type: INT
Option group: IP_TCP
Phase: PASTSOCKET
Platforms: Linux

Sets the TCP_KEEPINTVL value of the socket with setsockopt(). Interval between
keepalives (in seconds?)


Option: tcp-keepcnt
Aliases: keepcnt

Type: INT
Option group: IP_TCP
Phase: PASTSOCKET
Platforms: Linux

Sets the TCP_KEEPCNT value of the socket with setsockopt(). Number of
keepalives before death.


Option: tcp-syncnt
Aliases: syncnt

Type: INT
Option group: IP_TCP
Phase: PASTSOCKET
Platforms: Linux

Sets the TCP_SYNCNT value of the socket with setsockopt(). Number of SYN
retransmits. 


Option: tcp-linger2
Aliases: linger2

Type: INT
Option group: IP_TCP
Phase: PASTSOCKET
Platforms: Linux

Sets the TCP_LINGER2 value of the socket with setsockopt(). Life time of
orphaned FIN-WAIT-2 state.


Option: tcp-defer-accept
Aliases: defer-accept

Type: INT
Option group: IP_TCP
Phase: PASTSOCKET
Platforms: Linux

Sets the TCP_DEFER_ACCEPT value of the socket with setsockopt(). accept() of
the listener will only return when data arrived at the new connection. The
value is converted to seconds by some algorithm.


Option: tcp-window-clamp
Aliases: window-clamp

Type: INT
Option group: IP_TCP
Phase: PASTSOCKET
Platforms: Linux

Sets the TCP_WINDOW_CLAMP value of the socket with setsockopt(). "Bound advertised
window".


Option: tcp-info
Aliases: info

Type: INT
Option group: IP_TCP
Phase: PASTSOCKET
Platforms: FreeBSD, Linux

Sets the TCP_INFO value of the socket with setsockopt(). Is a read only option,
so it always generates an error.


Option: tcp-quickack
Aliases: quickack

Type: INT
Option group: IP_TCP
Phase: PASTSOCKET
Platforms: Linux

Sets the TCP_QUICKACK option with setsockopt().


Option: tcp-md5sig
Aliases: md5sig

Type: INT
Option group: IP_TCP
Phase: PASTSOCKET
Platforms: none

Enables generation of MD5 digests on the packets.


Option: tcp-noopt
Aliases: noopt

Type: INT
Option: group: IP_TCP
Phase: PASTSOCKET
Platforms: FreeBSD

Disables use of TCP options.


Option: tcp-nopush
Aliases: nopush

Type: INT
Option: group: IP_TCP
Phase: PASTSOCKET
Platforms: FreeBSD

Sets the TCP_NOPUSH option.


Option: tcp-sack-disable
Aliases: sack-disable

Type: INT
Option: group: IP_TCP
Phase: PASTSOCKET
Platforms: none

Disables use the selective acknowledge feature.


Option: tcp-signature-enable
Aliases: signature-enable

Type: INT
Option: group: IP_TCP
Phase: PASTSOCKET
Platforms: none

Enables generation of MD5 digests on the packets.


Option: tcp-abort-threshold
Aliases: abort-threshold

Type: INT
Option group: IP_TCP
Phase: PASTSOCKET
Platforms: HP-UX, SunOS

Sets the time to wait for an answer of the peer on an established connection.


Option: tcp-conn-abort-threshold
Aliases: conn-abort-threshold

Type: INT
Option group: IP_TCP
Phase: PASTSOCKET
Platforms: HP-UX, SunOS

Sets the time to wait for an answer of the server during the initial connect.


Option: tcp-keepinit
Aliases: keepinit

Type: INT
Option group: IP_TCP
Phase: PASTSOCKET
Platforms: none

Sets the time to wait for an answer of the server during connect() before
giving up. Value in half seconds, default is 150 (75s).


Option: tcp-paws
Aliases: paws

Type: BOOL
Option group: IP_TCP
Phase: PASTSOCKET
Platforms: none

Enables the "protect against wrapped sequence numbers" feature.


Option: tcp-sackena
Aliases: sackena

Type: BOOL
Option group: IP_TCP
Phase: PASTSOCKET
Platforms: none

Enables selective acknowledge.


Option: tcp-tsoptena
Aliases: tsoptena

Type: BOOL
Option group: IP_TCP
Phase: PASTSOCKET
Platforms: none

Enables the time stamp option that allows RTT recalculation on existing
connections.


===============================================================================
SOCKS options


Option: socksport

Type: STRING
Option group: IP_SOCKS4
Phase: LATE
Platforms: all

Overrides the default socks server port 1080


Option: socksuser

Type: NAME
Option group: IP_SOCKS4
Phase: LATE
Platforms: all

Overrides the system derived socks user name ($USER or $LOGNAME or "anonymous")


===============================================================================
HTTP options


Option: proxyport

Type: STRING
Option group: HTTP
Phase: LATE
Platforms: all

Overrides the default HTTP proxy port 8080.


Option: ignorecr

Type: BOOL
Option group: HTTP
Phase: LATE
Platforms: all

The HTTP protocol requires the use of CR+NL as line terminator. When a proxy
server violates this standard, socat might not understand its answer. 
This option directs socat to interprete NL as line terminator and
to ignore CR in the answer. Nevertheless, socat sends CR+NL to the proxy.


Option: proxyauth

Type: STRING
Option group: HTTP
Phase: LATE
Platforms: all

Provide "basic" authentication to the proxy server. The argument to the option
must be the username followed by ':' followed by the password. This string is
used with a "Proxy-Authorize: Base" header in base64 encoded form.


Option: resolve

Type: BOOL
Option group: HTTP
Phase: LATE
Platforms: all

Per default, socat sends to the proxy a CONNECT request containing the target
hostname. With this option, socat resolves the hostname locally and sends the
IP address.


===============================================================================
TERMIOS options

These options are applied with tcsetattr calls with a struct termios.
Attention: Applying these options to stdin/stdout when they refer to your
terminal might directly effect your terminal!
See Linux:"man 3 termios" and Linux:"man 2 stty"

-------------------------------------------------------------------------------
TERMIOS combined modes


Option: raw

Type: CONST
Option group: TERMIOS
Phase: FD
Platforms: all

Is equivalent to 
ignbrk=0,brkint=0,ignpar=0,parmrk=0,inpck=0,istrip=0,inlcr=0,igncr=0,icrnl=0,ixon=0,ixoff=0,iuclc=0,ixany=0,imaxbel=0,opost=0,isig=0,icanon=0,xcase=0,vmin=1,vtime=0


Option: sane

Type: CONST
Option group: TERMIOS
Phase: FD
Platforms: all

Is equivalent to
cread,ignbrk=0,brkint,inlcr=0,igncr=0,icrnl,ixoff=0,iuclc=0,-ixany=0,imaxbel,opost,olcuc=0,ocrnl=0,onlcr,onocr=0,onlret=0,ofill=0,ofdel=0,nl0,cr0,tab0,bs0,vt0,ff0,isig,icanon,iexten,echo,echoe,echok,echonl=0,noflsh=0,xcase=0,tostop=0,echoprt=0,echoctl,echoke

-------------------------------------------------------------------------------
TERMIOS input mode flags


Option: ignbrk

Type: BOOL
Option group: TERMIOS
Phase: FD
Platforms: all

Sets the IGNBRK flag of the terminal driver.


Option: brkint

Type: BOOL
Option group: TERMIOS
Phase: FD
Platforms: all

Sets the BRKINT flag of the terminal driver.


Option: ignpar

Type: BOOL
Option group: TERMIOS
Phase: FD
Platforms: all

Sets the IGNPAR flag of the terminal driver.


Option: parmrk

Type: BOOL
Option group: TERMIOS
Phase: FD
Platforms: all

Sets the PARMRK flag of the terminal driver.


Option: inpck

Type: BOOL
Option group: TERMIOS
Phase: FD
Platforms: all

Sets the INPCK flag of the terminal driver. Enables input parity checking.


Option: istrip

Type: BOOL
Option group: TERMIOS
Phase: FD
Platforms: all

Sets the ISTRIP flag of the terminal driver. Strips off the eighth bit.


Option: inlcr

Type: BOOL
Option group: TERMIOS
Phase: FD
Platforms: all

Sets the INLCR flag of the terminal driver. Translates NL to CR on input.


Option: igncr

Type: BOOL
Option group: TERMIOS
Phase: FD
Platforms: all

Sets the IGNCR flag of the terminal driver. Ignores CR character on input.


Option: icrnl

Type: BOOL
Option group: TERMIOS
Phase: FD
Platforms: all

Sets the ICRNL flag of the terminal driver. Translates CR to NL on input. This
option is ignored when IGNCR is set.


Option: iuclc

Type: BOOL
Option group: TERMIOS
Phase: FD
Platforms: HP-UX, Linux, SunOS

Sets the IUCLC flag of the terminal driver. Changes characters in input from
uppercase to lowercase.


Option: ixon

Type: BOOL
Option group: TERMIOS
Phase: FD
Platforms: all

Sets the IXON flag of the terminal driver. Enables XON/XOFF flow control on
output (?).


Option: ixany

Type: BOOL
Option group: TERMIOS
Phase: FD
Platforms: all

Sets the IXANY flag of the terminal driver. Enables any character to restart
output.


Option: ixoff
Aliases: tandem

Type: BOOL
Option group: TERMIOS
Phase: FD
Platforms: all

Sets the IXOFF flag of the terminal driver. Enables XON/XOFF flow control on
input.


Option: imaxbel

Type: BOOL
Option group: TERMIOS
Phase: FD
Platforms: all

Sets the IMAXBEL flag of the terminal driver. Rings the bell when the input
queue is full.

-------------------------------------------------------------------------------
TERMIOS output mode flags


Option: opost

Type: BOOL
Option group: TERMIOS
Phase: FD
Platforms: all

Sets the OPOST flag of the terminal driver.


Option: olcuc

Type: BOOL
Option group: TERMIOS
Phase: FD
Platforms: HP-UX, Linux, SunOS

Sets the OLCUC flag of the terminal driver.


Option: onlcr

Type: BOOL
Option group: TERMIOS
Phase: FD
Platforms: all

Sets the ONLCR flag of the terminal driver.


Option: ocrnl

Type: BOOL
Option group: TERMIOS
Phase: FD
Platforms: all

Sets the OCRNL flag of the terminal driver.


Option: onocr

Type: BOOL
Option group: TERMIOS
Phase: FD
Platforms: all

Sets the ONOCR flag of the terminal driver.


Option: onlret

Type: BOOL
Option group: TERMIOS
Phase: FD
Platforms: all

Sets the ONLRET flag of the terminal driver.


Option: ofill

Type: BOOL
Option group: TERMIOS
Phase: FD
Platforms: HP-UX, Linux, SunOS

Sets the OFILL flag of the terminal driver.


Option: ofdel

Type: BOOL
Option group: TERMIOS
Phase: FD
Platforms: HP-UX, Linux, SunOS

Sets the OFDEL flag of the terminal driver.


Option: nldly

Type: BOOL
Option group: TERMIOS
Phase: FD
Platforms: HP-UX, Linux, SunOS

Sets the NLDLY flag of the terminal driver. 0 sets the value to NL0, and 1 to
NL1. See nl0, nl1.


Option: nl0

Type: CONST (const bool, always sets 0)
Option group: TERMIOS
Phase: FD
Platforms: HP-UX, Linux, SunOS

Sets the field NLDLY to the value NL0.


Option: nl1

Type: CONST (const bool, always sets 1)
Option group: TERMIOS
Phase: FD
Platforms: HP-UX, Linux, SunOS

Sets the field NLDLY to the value NL1.


Option: crdly=value

Type: UINT (0..3)
Option group: TERMIOS
Phase: FD
Platforms: HP-UX, Linux, SunOS

Sets the field CRDLY to the given value.
See cr0, cr1, cr2, cr3.


Option: cr0

Type: CONST
Option group: TERMIOS
Phase: FD
Platforms: HP-UX, Linux, SunOS

Sets the CRDLY field to the value CR0.
See crdly.


Option: cr1

Type: CONST
Option group: TERMIOS
Phase: FD
Platforms: HP-UX, Linux, SunOS

Sets the CRDLY field to the value CR1.
See crdly.


Option: cr2

Type: CONST
Option group: TERMIOS
Phase: FD
Platforms: HP-UX, Linux, SunOS

Sets the CRDLY field to the value CR2.
See crdly.


Option: cr3

Type: CONST
Option group: TERMIOS
Phase: FD
Platforms: HP-UX, Linux, SunOS

Sets the CRDLY field to the value CR3.
See crdly.


Option: tab0

Type: CONST
Option group: TERMIOS
Phase: FD
Platforms: HP-UX, Linux, SunOS

Sets the horizontal tab delay mask to TAB0.
See tabdly.


Option: tab1

Type: CONST
Option group: TERMIOS
Phase: FD
Platforms: HP-UX, Linux, SunOS

Sets the horizontal tab delay mask to TAB1.
See tabdly.


Option: tab2

Type: CONST
Option group: TERMIOS
Phase: FD
Platforms: HP-UX, Linux, SunOS

Sets the horizontal tab delay mask to TAB2.
See tabdly.


Option: tab3

Type: CONST
Option group: TERMIOS
Phase: FD
Platforms: HP-UX, Linux, SunOS

Sets the horizontal tab delay mask to TAB3.
See tabdly.


Option: tabdly=value

Type: UINT (0..3)
Option group: TERMIOS
Phase: FD
Platforms: HP-UX, Linux, SunOS

Sets the field TABDLY to the given value.
See tab0, tab1, tab2, and tab3.


Option: xtabs

Type: CONST
Option group: TERMIOS
Phase: FD
Platforms: HP-UX, Linux, SunOS

Sets the horizontal tab delay mask to XTABS.


Option: bs0

Type: CONST (0)
Option group: TERMIOS
Phase: FD
Platforms: HP-UX, Linux, SunOS

Sets the field BSDLY to the value BS0


Option: bs1

Type: CONST (1)
Option group: TERMIOS
Phase: FD
Platforms: HP-UX, Linux, SunOS

Sets the field BSDLY to the value BS1


Option: bsdly

Type: BOOL
Option group: TERMIOS
Phase: FD
Platforms: HP-UX, Linux, SunOS

Sets the BSDLY flag of the terminal driver. 0 sets the value to BS0, and 1 to
BS1. See bs0, bs1.


Option: vt0

Type: CONST (0)
Option group: TERMIOS
Phase: FD
Platforms: HP-UX, Linux, SunOS

Sets the field VTDLY to the value VT0


Option: vt1

Type: CONST (1)
Option group: TERMIOS
Phase: FD
Platforms: HP-UX, Linux, SunOS

Sets the field VTDLY to the value VT1


Option: vtdly

Type: BOOL
Option group: TERMIOS
Phase: FD
Platforms: HP-UX, Linux, SunOS

Sets the VTDLY flag of the terminal driver. 0 sets the value to VT0, and 1 to
VT1. See vt0, vt1.


Option: ff0

Type: CONST (0)
Option group: TERMIOS
Phase: FD
Platforms: HP-UX, Linux, SunOS

Sets the field FFDLY to the value FF0
See ffdly.


Option: ff1

Type: CONST (1)
Option group: TERMIOS
Phase: FD
Platforms: HP-UX, Linux, SunOS

Sets the field FFDLY to the value FF1
See ffdly.


Option: ffdly

Type: BOOL (0..1)
Option group: TERMIOS
Phase: FD
Platforms: HP-UX, Linux, SunOS

Sets the FFDLY flag of the terminal driver. 0 sets the value to FF0, and 1 to
FF1. See ff0, ff1.



-------------------------------------------------------------------------------
TERMIOS control mode flags


Option: cs5

Type: CONST
Option group: TERMIOS
Phase: FD
Platforms: all

Sets the field CSIZE to the value CS5


Option: cs6

Type: CONST
Option group: TERMIOS
Phase: FD
Platforms: all

Sets the field CSIZE to the value CS6


Option: cs7

Type: CONST
Option group: TERMIOS
Phase: FD
Platforms: all

Sets the field CSIZE to the value CS7


Option: cs8

Type: CONST
Option group: TERMIOS
Phase: FD
Platforms: all

Sets the field CSIZE to the value CS8


Option: csize

Type: UINT (0..3)
Option group: TERMIOS
Phase: FD
Platforms: all

Sets the field CSIZE. 0..CS5, 1..CS6, 2..CS7, 3..CS8


Option: cstopb

Type: BOOL
Option group: TERMIOS
Phase: FD
Platforms: all

Sets the flag CSTOPB.


Option: cread

Type: BOOL
Option group: TERMIOS
Phase: FD
Platforms: all

Sets the value of the CREAD flag.


Option: parenb

Type: BOOL
Option group: TERMIOS
Phase: FD
Platforms: all

Sets the PARENB flag of the terminal driver.


Option: parodd

Type: BOOL
Option group: TERMIOS
Phase: FD
Platforms: all

Sets the PARODD flag of the terminal driver.


Option: hupcl
Aliases: hup

Type: BOOL
Option group: TERMIOS
Phase: FD
Platforms: all

Sets the HUPCL flag of the terminal driver.


Option: clocal

Type: BOOL
Option group: TERMIOS
Phase: FD
Platforms: all

Sets the CLOCAL flag of the terminal driver.


Option: crtscts

Type: BOOL
Option group: TERMIOS
Phase: FD
Platforms: FreeBSD, Linux, SunOS

Sets the CRTSCTS flag of the terminal driver.


Option: b0        (HP-UX, Linux, SunOS)
Option: b50       (HP-UX, Linux, SunOS)
Option: b75       (HP-UX, Linux, SunOS)
Option: b110      (HP-UX, Linux, SunOS)
Option: b134      (HP-UX, Linux, SunOS)
Option: b150      (HP-UX, Linux, SunOS)
Option: b200      (HP-UX, Linux, SunOS)
Option: b300      (HP-UX, Linux, SunOS)
Option: b600      (HP-UX, Linux, SunOS)
Option: b900      (HP-UX)
Option: b1200     (HP-UX, Linux, SunOS)
Option: b1800     (HP-UX, Linux, SunOS)
Option: b2400     (HP-UX, Linux, SunOS)
Option: b3600     (HP-UX)
Option: b4800     (HP-UX, Linux, SunOS)
Option: b7200     (HP-UX)
Option: b9600     (HP-UX, Linux, SunOS)
Option: b19200    (HP-UX, Linux, SunOS)
Option: b38400    (HP-UX, Linux, SunOS)
Option: b57600    (HP-UX, Linux, SunOS)
Option: b115200   (HP-UX, Linux, SunOS)
Option: b230400   (HP-UX, Linux, SunOS)
Option: b460800   (HP-UX, Linux, SunOS)
Option: b500000   (Linux)
Option: b576000   (Linux)
Option: b921600   (Linux)
Option: b1000000  (Linux)
Option: b1152000  (Linux)
Option: b1500000  (Linux)
Option: b2000000  (Linux)
Option: b2500000  (Linux)
Option: b3000000  (Linux)
Option: b3500000  (Linux)
Option: b4000000  (Linux)

Type: CONST
Option group: TERMIOS
Phase: FD

Sets the baud rate to the implied value. b0 "hangs up" the connection.


Option: ispeed

Type: UINT
Option group: TERMIOS
Phase: FD
Platforms: FreeBSD, Linux

Sets the input baud rate to the specified value. This works on systems where
struct termios has a special c_ispeed field.


Option: ospeed

Type: UINT
Option group: TERMIOS
Phase: FD
Platforms: FreeBSD, Linux

Sets the input baud rate to the specified value. This works on systems where
struct termios has a special c_ospeed field.




-------------------------------------------------------------------------------
TERMIOS local mode flags


Option: isig

Type: BOOL
Option group: TERMIOS
Phase: FD
Platforms: all

Sets the ISIG flag of the terminal driver.


Option: icanon

Type: BOOL
Option group: TERMIOS
Phase: FD
Platforms: all

Sets the ICANON flag of the terminal driver.


Option: xcase

Type: BOOL
Option group: TERMIOS
Phase: FD
Platforms: HP-UX, Linux, SunOS

Sets the XCASE flag of the terminal driver.


Option: echo

Type: BOOL
Option group: TERMIOS
Phase: FD
Platforms: all

Sets the ECHO flag of the terminal driver.


Option: echoe
Aliases: crterase

Type: BOOL
Option group: TERMIOS
Phase: FD
Platforms: all

Sets the ECHOE flag of the terminal driver.


Option: echok

Type: BOOL
Option group: TERMIOS
Phase: FD
Platforms: all

Sets the ECHOK flag of the terminal driver.


Option: echonl

Type: BOOL
Option group: TERMIOS
Phase: FD
Platforms: all

Sets the ECHONL flag of the terminal driver.


Option: echoctl
Aliases: ctlecho

Type: BOOL
Option group: TERMIOS
Phase: FD
Platforms: all

Sets the ECHOCTL flag of the terminal driver.


Option: echoprt
Aliases: prterase

Type: BOOL
Option group: TERMIOS
Phase: FD
Platforms: all

Sets the ECHOPRT flag of the terminal driver.


Option: echoke
Aliases: crtkill

Type: BOOL
Option group: TERMIOS
Phase: FD
Platforms: all

Sets the ECHOKE flag of the terminal driver.


Option: flusho

Type: BOOL
Option group: TERMIOS
Phase: FD
Platforms: all

Sets the FLUSHO flag of the terminal driver.


Option: noflsh

Type: BOOL
Option group: TERMIOS
Phase: FD
Platforms: all

Sets the NOFLSH flag of the terminal driver.


Option: tostop

Type: BOOL
Option group: TERMIOS
Phase: FD
Platforms: all

Sets the TOSTOP flag of the terminal driver.


Option: pendin

Type: BOOL
Option group: TERMIOS
Phase: FD
Platforms: all

Sets the PENDIN flag of the terminal driver.


Option: iexten

Type: BOOL
Option group: TERMIOS
Phase: FD
Platforms: all

Sets the IEXTEN flag of the terminal driver.


-------------------------------------------------------------------------------
TERMIOS options for functional characters

Option: vintr=value
Aliases: intr=value

Type: BYTE
Option group: TERMIOS
Phase: FD
Platforms: all
Status: tested

Sets the value for the VINTR character that interrupts the current process.
On UNIX systems the preset value usually is 3 (^C).


Option: vquit=value
Aliases: quit=value

Type: BYTE
Option group: TERMIOS
Phase: FD
Platforms: all
Status: tested

Sets the value for the VQUIT character that quits the current process. 
On my Linux 2.2 system the preset value is 0x1c (^\).


Option: verase=value
Aliases: erase=value

Type: BYTE
Option group: TERMIOS
Phase: FD
Platforms: all
Status: tested

Sets the value for the VERASE character that erases the last character.
On many UNIX systems the preset value is 0x7f.


Option: vkill=value
Aliases: kill=value

Type: BYTE
Option group: TERMIOS
Phase: FD
Platforms: all
Status: tested

Sets the value for the VKILL character that kills (erases) the current line.
On my Linux 2.2 system systems the preset value is 0x15 (^U).


Option: veof=value
Aliases: eof=value

Type: BYTE
Option group: TERMIOS
Phase: FD
Platforms: all
Status: tested

Sets the value for the VEOF character that kills indicate end of file.
On most UNIX systems the preset value is 0x04 (^D).


Option: vtime=value
Aliases: time=value

Type: BYTE
Option group: TERMIOS
Phase: FD
Platforms: all
Status: not tested

Sets the value of VTIME. See "man 1 stty" / time.
On my Linux 2.2 system the preset value is 0.


Option: vmin=value
Aliases: min=value

Type: BYTE
Option group: TERMIOS
Phase: FD
Platforms: all
Status: not tested

Sets the value of VMIN. See "man 1 stty" / time.
On my Linux 2.2 system the preset value is 1.


Option: vswtc=value
Aliases: swtc=value, swtch=value

Type: BYTE
Option group: TERMIOS
Phase: FD
Platforms: Linux
Status: not tested

Sets the value of VSWTC. "Switches to a different shell layer".
On my Linux 2.2 system the preset value is 0.


Option: vstart=value
Aliases: start=value

Type: BYTE
Option group: TERMIOS
Phase: FD
Platforms: all
Status: tested

Sets the value for the VSTART character that resumes data flow after a stop.
Usually the preset value is 0x11 (^Q).


Option: vstop=value
Aliases: stop=value

Type: BYTE
Option group: TERMIOS
Phase: FD
Platforms: all
Status: tested

Sets the value for the VSTOP character that stops output.
Usually the preset value is 0x13 (^S)


Option: vsusp=value
Aliases: susp=value

Type: BYTE
Option group: TERMIOS
Phase: FD
Platforms: all
Status: tested

Sets the value for the VSUSP character that suspends the current foreground
process and reactivates the shell.
Usually the preset value is 0x1a (^Z)


Option: vdsusp=value
Aliases: dsusp=value

Type: BYTE
Option group: TERMIOS
Phase: FD
Platforms: FreeBSD, HP-UX, SunOS
Status: tested

Sets the value for the VDSUSP character that suspends the current foreground
process and reactivates the shell.


Option: veol=value
Aliases: eol=value

Type: BYTE
Option group: TERMIOS
Phase: FD
Platforms: all
Status: tested with awkward results

Sets the value for the VEOL character that should indicate end of line.
Not clear what differentiates it from the return key; xterm window put "xterm"
into the input buffer.
On my Linux 2.2 system the preset value is 0 (disabled)


Option: vreprint=value
Aliases: reprint=value, rprnt=value

Type: BYTE
Option group: TERMIOS
Phase: FD
Platforms: FreeBSD, Linux, SunOS
Status: not tested

Sets the value for the VREPRINT character that should reprint the current line.
On my Linux 2.2 system the preset value is 0x12 (^R). Nevertheless, bash
enters backward search mode.


Option: vdiscard=value
Aliases: discard=value

Type: BYTE
Option group: TERMIOS
Phase: FD
Platforms: FreeBSD, Linux, SunOS
Status: not tested

Sets the value for the VDISCARD character.
On my Linux 2.2 system the preset value is 0x0f (^O)


Option: vwerase=value
Aliases: werase=value

Type: BYTE
Option group: TERMIOS
Phase: FD
Platforms: all
Status: tested

Sets the value for the VWERASE character that erases the last word.
On my Linux 2.2 system the preset value is 0x17 (^W)


Option: vlnext=value
Aliases: lnext=value

Type: BYTE
Option group: TERMIOS
Phase: FD
Platforms: all
Status: tested

Sets the value for the VLNEXT character that lets the next input character raw
(not interpreted).
On my Linux 2.2 system the preset value is 0x16 (^V)


Option: veol2=value
Aliases: eol2=value

Type: BYTE
Option group: TERMIOS
Phase: FD
Platforms: all
Status: not tested

Sets the value for the VEOL2 character.
On my Linux 2.2 system the preset value is 0 (disabled).


===============================================================================
READLINE options

Option: history-file=filename
Aliases: history=filename

Type: STRING
Option group: READLINE
Phase: LATE
Platforms: (depends on libreadline installation)

Without this option, the readline address uses only a per process history
list. With this option, socat tries to read history lines during initialization
from the given file, and on termination writes the old and new lines to the
file.
NOTE: currently, no mechanism is implemented for limiting the length of the
history file.
NOTE: filename must be a valid relativ or absolute path; "~" is not supported!


Option: noprompt

Type: BOOL
Option group: READLINE
Phase: LATE
Platforms: all

Since version 1.3.3, socat per default tries to determine a prompt - 
that is then passed to the readline call - by remembering the last
incomplete line of the output. With this option, socat does not pass a
prompt to the readline call, so it might set the cursor to the first column
of the terminal. 


Option: noecho

Type: STRING
Option group: READLINE
Phase: LATE
Platforms: all

Specifies a regular pattern for a prompt that prevents the following input
line from being displayed on the screen and from being added to the history.
The prompt is defined as the text that was output to the readline address 
after the lastest newline character and before an input character was
typed. The pattern is a regular expression, e.g.
"^[Pp]assword:.*$" or "([Uu]ser:|[Pp]assword:)". See regex(7) for details.


Option: prompt

Type: STRING
Option group: READLINE
Phase: LATE
Platforms: all

Passes the string as prompt to the readline function. readline prints this
prompt when stepping through the history. If this string matches a constant
prompt issued by an interactive program on the other socat address,
consistent look and feel can be archieved.

===============================================================================
OPENSSL options

Option: openssl-cipherlist=string
Aliases: cipherlist=string, ciphers=string, cipher=string

Type: STRING
Option group: OPENSSL
Phase: SPEC
Platforms: (depends on openssl installation)

Selects the list of ciphers that may be used for the connection.
See the man page ciphers(1), section CIPHER LIST FORMAT, for
detailed information about syntax, values, and default of the cipherlist
string.
Several cipher strings may be given, separated by ':'.
Some simple cipher strings:
	3DES	Uses a cipher suite with triple DES.
	MD5	Uses a cipher suite with MD5.
	aNULL	Uses a cipher suite without authentication.
	NULL	Does not use encryption.
	HIGH	Uses a cipher suite with "high" encryption.
Note that the peer must support the selected property, or the negotiation
will fail.


Option: openssl-method=string
Aliases: method=string

Type: STRING
Option group: OPENSSL
Phase: SPEC
Platforms: (depends on openssl installation)

Sets the protocol version to be used. Valid strings (not case sensitive) are:  
	SSLv2	Select SSL protocol version 2.
	SSLv3	Select SSL protocol version 3.
	SSLv23	Select SSL protocol version 2 or 3. This is the default when
 this option is not provided.
	TLSv1	Select TLS protocol version 1.


Option: openssl-verify=bool
Aliases: verify=bool

Type: BOOL
Option group: OPENSSL
Phase: SPEC
Platforms: (depends on openssl installation)

   Controls check of the peer's certificate. Default is 1 (true). Disabling
   verify might open your socket for everyone! 


Option: openssl-certificate=file
Aliases: cert=file

Type: FILENAME
Option group: OPENSSL
Phase: SPEC
Platforms: (depends on openssl installation)

Specifies the file with the certificate. The certificate must be
in OpenSSL format (*.pem). With openssl-listen, this option is strongly
recommended: except with cipher aNULL, "no shared ciphers" error might
occur when no certificate is given.


Option: openssl-key=file
Aliases: key

Type: FILENAME
Option group: OPENSSL
Phase: SPEC
Platforms: (depends on openssl installation)

Specifies the file with the private key. The private key may be in this
file or in the file given with the ref(cert) option. The party that has
to proof that it is the owner of a certificate needs the private key.


Option: openssl-cafile=file
Aliases: cafile

Type: FILENAME
Option group: OPENSSL
Phase: SPEC
Platforms: (depends on openssl installation)

Specifies the file with the trusted (root) authority certificates. The file
must be in PEM format and should contain one or more certificates. 


Option: openssl-capath=directory
Aliases: capath

Type: FILENAME
Option group: OPENSSL
Phase: SPEC
Platforms: (depends on openssl installation)

Specify the directory with the trusted (root) certificates. The directory
must contain certificates in PEM format and their hashes (see OpenSSL
documentation) 


Option: openssl-egd=file
Aliases: egd

Type: FILENAME
Option group: OPENSSL
Phase: SPEC
Platforms: (depends on openssl installation)

On some systems, openssl requires an explicit source of random data. Specify
the socket name where an entropy gathering daemon like egd provides random
data, e.g. /dev/egd-pool.


Option: openssl-pseudo
Aliases: pseudo

Type: BOOL
Option group: OPENSSL
Phase: SPEC
Platforms: (depends on openssl installation)

On systems where openssl cannot find an entropy source and where no entropy
gathering daemon can be utilized, this option activates a mechanism for
providing pseudo entropy. This is archieved by taking the current time in
microseconds for feeding the libc pseudo random number generator with an
initial value. openssl is then feeded with output from random calls.
NOTE:This mechanism is not sufficient for generation of secure keys!


Option: openssl-fips
Aliases: fips

Type: BOOL
Option group: BOOL
Phase: SPEC
Platforms: (depends on OpenSSL installation and FIPS implementation)

Enables FIPS mode if compiled in. For info about the FIPS encryption
implementation standard see http://oss-institute.org/fips-faq.html.
This mode might require that the involved certificates are generated with a
FIPS enabled version of openssl. Setting or clearing this option on one
socat address affects all OpenSSL addresses of this process.


Option: openssl-compress
Aliases: compress

Type: STRING
Option group: OPENSSL
Phase: SPEC
Platforms: (depends on openssl installation)

Enable or disable the use of compression for a connection. Setting this to
"none" disables compression, setting it to "auto" lets OpenSSL choose the best
available algorithm supported by both parties. The default is to not touch any
compression-related settings.
NOTE: Requires OpenSSL 0.9.8 or higher.
NOTE: Disabling compression with OpenSSL 0.9.8 affects all new connections in
the same process.


===============================================================================
Application specific address options


Option: ignoreeof
Aliases: ignoreof

Type: BOOL
Option group: APPL
Phase: LATE
Platforms: all

This option has to be supported by the application. For socat it means that an
EOF condition on this data source does not trigger termination procedures, but 
instead the read/write loop waits for one second and then tries to read more
input data. This behaviour emulates "tail -f" and might not be useful for all
kinds of input devices, but regular files and /dev/null are good candidates. 
Termination of socat then can only occur by EOF condition of the other input
device, an error, or by external events.


Option: cr

Type: CONST
Option group: APPL
Phase: LATE
Platforms: all

The appropriate data endpoint uses CR ('\r', 0x0d) as line terminator
character. Convert data to and from this stream appropriately.
This is useful for, e.g., modems.


Option: crnl
Aliases: crlf

Type: CONST
Option group: APPL
Phase: LATE
Platforms: all

The appropriate data endpoint uses CR+LF ("\r\n", 0x0d0a ) as line terminator
string. Convert data to and from this stream appropriately.
This is useful for, e.g., TCP protocols like SMTP and FTP.


Option: readbytes=num
Aliases: bytes

Type: SIZE_T
Option group: APPL
Phase: LATE
Platforms: all

socat reads only so many bytes from this address (the address provides
only so many bytes for transfer and pretends to be at EOF afterwards).


Option: lockfile=filename

Type: FILENAME
Option group: APPL
Phase: INIT
Platforms: all

If lockfile exists, exits with error. If lockfile does not exist, creates it
and continues; removes lockfile on exit.


Option: waitlock=filename

Type: FILENAME
Option group: APPL
Phase: INIT
Platforms: all

If lockfile exists, waits until it disappears. When lockfile does not exist,
creates it and continues; removes lockfile on exit.

===============================================================================
RETRY options

Option: retry=<num>

Type: UINT
Option group: RETRY
Phase: INIT
Platforms: all

Number of retries before the connection or listen attempt is aborted. 
Default is 0, which means just one attempt. 


Option: interval=<double>

Type: TIMESPEC
Option group: RETRY
Phase: INIT
Platforms: all

Time between consecutive attempts (seconds). Default is 1 second.


Option: forever

Type: BOOL
Option group: RETRY
Phase: INIT
Platforms: all

Performs an unlimited number of retry attempts.

===============================================================================
EXT2 options

Option: ext2-secrm=<bool>
Aliases: secrm=<bool>

Type: BOOL
Option group: REG
Phase: FD
Platforms: Linux

Sets the secrm file attribute on the file.


Option: ext2-unrm=<bool>
Aliases: unrm=<bool>

Type: BOOL
Option group: REG
Phase: FD
Platforms: Linux

Sets the unrm file attribute on the file.


Option: ext2-compr=<bool>
Aliases: compr=<bool>

Type: BOOL
Option group: REG
Phase: FD
Platforms: Linux

Sets the compr file attribute on the file.


Option: ext2-sync=<bool>

Type: BOOL
Option group: REG
Phase: FD
Platforms: all

Sets the sync file attribute on the file.


Option: ext2-immutable=<bool>
Aliases: immutable=<bool>

Type: BOOL
Option group: REG
Phase: FD
Platforms: Linux

Sets the immutable file attribute on the file.


Option: ext2-append=<bool>

Type: BOOL
Option group: REG
Phase: FD
Platforms: all

Sets the append file attribute on the file.


Option: ext2-nodump=<bool>
Aliases: nodump=<bool>

Type: BOOL
Option group: REG
Phase: FD
Platforms: Linux

Sets the nodump file attribute on the file.


Option: ext2-noatime=<bool>

Type: BOOL
Option group: REG
Phase: FD
Platforms: Linux

Sets the noatime file attribute on the file.


Option: ext2-journal-data=<bool>
Aliases: journal-data=<bool>

Type: BOOL
Option group: REG
Phase: FD
Platforms: Linux

Sets the journal-data file attribute on the file.


Option: ext2-notail=<bool>
Aliases: notail=<bool>

Type: BOOL
Option group: REG
Phase: FD
Platforms: none

Sets the notail file attribute on the file.


Option: ext2-dirsync=<bool>
Aliases: dirsync=<bool>

Type: BOOL
Option group: REG
Phase: FD
Platforms: Linux

Sets the dirsync file attribute on the file.


Option: ext2-topdir=<bool>
Aliases: topdir=<bool>

Type: BOOL
Option group: REG
Phase: FD
Platforms: Linux

Sets the topdir file attribute on the file.


===============================================================================

Appendix: generating a sandbox (chroot environment)

While it is possible to generate a sandbox almost anywhere in the file system,
I recommend to use a file system that has been mounted with restrictions,
especially nosuid and maybe nodev, or even ro.

You may mount a dedicated file system for the sandbox, so it gets a little
harder for the guests to determine for sure if they are within a sandbox when
using "ls -id /"

The following desribes typical steps for generating a sandbox. Depending on
your operating system, application, and security requirements, your mileage may
vary. With the below steps, you will be able to run some check programs to play
around with the sandbox. 

I Installation
1) Create a sandbox group - but give it and all following "sandbox" ids a more
cryptic name!
2) Create a sandbox user, only in sandbox group. If this user must never login,
give it a useless shell like /bin/false
3) Check the sandbox home directory (e.g. /home/sandbox) and save and remove
all .profile, public_html/ etc.
4) Optionally mount a new file system over the new home directory
5) Generate subdirectories bin, lib, etc, usr, usr/bin, usr/lib.
Set their permissions and ownership equal to the original directories (or use
only root.root)
6) Generate subdirectory home/sandbox (or similarly; like sandbox home)
7) Generate etc/passwd with users sandbox and root, but do not store original
password hashes there!
8) Generate etc/group with only groups sandbox and root (or system on AIX)
9) Copy test programs and utilities to bin, e.g. su, id, ls, mount, strace (but
without SUID/SGID)
10) Copy the required shared libraries and the shared library loader to their
directories. 
On Linux, e.g. /lib/ld-linux.so.2, /lib/libnss_compat.so.2
Note: it is often difficult to find out what shared libraries are (still) not
installed in the sandbox. The programs invoked in the sandbox typically do not
give useful error messages. If chroot's exec call gives an error like "no such
file or directory", and you do not know if it even found the program itself,
then remove the test programs execute permission; the error message should
change to "execute permission denied" or so. Redo the execute permissions and
look for the shared libraries...
List required libraries of a program:
Linux: ldd <program>
AIX:   xdb <program>
       map

11) For testing purposes, install id, ls, su, mount, strace, and maybe sh in
the sandbox. Test it.

II Customization
12) Copy your applications, configuration files, and data to the appropriate
directories within the sandbox.
Test function of the application in the sandbox, and add missing files and
libraries. If an application program gets killed immediately after start, it
might miss a shared library.

III Cleanup, check
13) Implement your own tricks how to improve security of the sandbox
14) Remove test programs like bin/sh, id, ls, mount, strace


===============================================================================
socket types, modes and their security features:
IP.v4.TCP.connect
IP.v4.TCP.listen	range	tcpwrap	srcport	lowport
IP.v4.UDP.connect
IP.v4.UDP.listen	range	tcpwrap	srcport	lowport
IP.v4.UDP.sendto
IP.v4.UDP.recvfrom	range	tcpwrap	srcport	lowport
IP.v4.UDP.recv		range	tcpwrap	srcport	lowport
IP.v4.raw.sendto
IP.v4.raw.recvfrom	range	tcpwrap
IP.v4.raw.recv		range	tcpwrap
IP.v6.TCP.connect
IP.v6.TCP.listen	range	tcpwrap	srcport	lowport
IP.v6.UDP.connect
IP.v6.UDP.listen	range	tcpwrap	srcport	lowport
IP.v6.UDP.sendto
IP.v6.UDP.recvfrom	range	tcpwrap	srcport	lowport
IP.v6.UDP.recv		range	tcpwrap	srcport	lowport
IP.v6.raw.sendto
IP.v6.raw.recvfrom	range	tcpwrap
IP.v6.raw.recv		srcport	lowport
UNIX.stream.connect
UNIX.stream.listen
UNIX.dgram.sendto
UNIX.dgram.recvfrom
UNIX.dgram.recv
OPENSSL.connect
OPENSSL.TCP4.listen	range	tcpwrap	srcport	lowport
OPENSSL.TCP6.listen	range	tcpwrap	srcport	lowport

===============================================================================
Missing features and Caveats:

. no support for SIGIO mechanism
. no support for socket ancillary messages
. Probably many ioctls not implemented due to missing documentation
. only limited implementation of raw sockets and interfaces,
. no support for high level sockets beyond UNIX, INET, and INET6 domains
