Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
socat(1)							      socat(1)

NAME
       socat - Multipurpose relay (SOcket CAT)

SYNOPSIS
       socat [options] <address> <address>
       socat -V
       socat -h[h[h]] |	-?[?[?]]
       filan
       procan

DESCRIPTION
       Socat  is  a  command  line based utility that establishes two bidirec-
       tional byte streams  and	 transfers  data  between  them.  Because  the
       streams	can be constructed from	a large	set of different types of data
       sinks and sources (see address types), and because lots of address  op-
       tions may be applied to the streams, socat can be used for many differ-
       ent  purposes.	It  might  be  one  of the tools that one `has already
       needed'.

       Filan is	a utility that prints information about	its  active  file  de-
       scriptors to stdout. It has been	written	for debugging socat, but might
       be useful for other purposes too. Use the -h option to find more	infos.

       Procan is a utility that	prints information about process parameters to
       stdout.	It  has	 been  written	to better understand some UNIX process
       properties and for debugging socat, but might be	useful for other  pur-
       poses too.

       The life	cycle of a socat instance typically consists of	four phases.

       In  the	init phase, the	command	line options are parsed	and logging is
       initialized.

       During the open phase, socat opens the first address and	afterwards the
       second address. These steps are usually blocking; thus, for complex ad-
       dress types like	socks, connection requests or  authentication  dialogs
       must be completed before	the next step is started.

       In  the transfer	phase, socat watches both streams' read	and write file
       descriptors via select(), and, when data	is available on	one  side  and
       can  be	written	 to  the  other	side, socat reads it, performs newline
       character conversions if	required, and writes the  data	to  the	 write
       file  descriptor	 of  the other stream, then continues waiting for more
       data in both directions.

       When one	of the streams effectively reaches EOF,	the closing phase  be-
       gins. Socat transfers the EOF condition to the other stream, i.e. tries
       to shutdown only	its write stream, thus giving it a chance to terminate
       gracefully. For a defined time, socat continues to transfer data	in the
       other direction,	but then closes	all remaining channels and terminates.

OPTIONS
       Socat  provides	some command line options that modify the behaviour of
       the program. They have nothing to do with  so  called  address  options
       that are	used as	parts of address specifications.

       -V     Print  version  and available feature information	to stdout, and
	      exit.

       -h | -?
	      Print a help text	to stdout describing command line options  and
	      available	address	types, and exit.

       -hh | -??
	      Like -h, plus a list of the short	names of all available address
	      options.	Some options are platform dependend, so	this output is
	      helpful for checking the particular implementation.

       -hhh | -???
	      Like -h, plus a list of all available address option names.

       -d     Without this option, only	fatal and error	 messages  are	gener-
	      ated; applying this option also prints warning messages. See DI-
	      AGNOSTICS	for more information.

       -d -d  Prints fatal, error, warning, and	notice messages.

       -d -d -d
	      Prints fatal, error, warning, notice, and	info messages.

       -d -d -d	-d
	      Prints fatal, error, warning, notice, info, and debug messages.

       -D     Logs  information	 about	file  descriptors  before starting the
	      transfer phase.

       -ly[<facility>]
	      Writes messages to syslog	instead	of stderr; severity as defined
	      with -d option. With optional <facility>,	the syslog type	can be
	      selected,	default	is "daemon".

       -lf <logfile>
	      Writes messages to <logfile> [filename] instead of stderr.

       -ls    Writes messages to stderr	(this is the default).

       -lp<progname>
	      Overrides	the program name printed in error messages.

       -lu    Extends the timestamp of error messages to  microsecond  resolu-
	      tion. Does not work when logging to syslog.

       -lm[<facility>]
	      Mixed  log  mode.	During startup messages	are printed to stderr;
	      when socat starts	the transfer phase loop	or daemon  mode	 (i.e.
	      after opening all	streams	and before starting data transfer, or,
	      with listening sockets with fork option, before the first	accept
	      call), it	switches logging to syslog.  With optional <facility>,
	      the syslog type can be selected, default is "daemon".

       -v     Writes  the  transferred	data not only to their target streams,
	      but also to stderr. The output format is text with some  conver-
	      sions for	readability, and prefixed with "> " or "< " indicating
	      flow directions.

       -x     Writes  the  transferred	data not only to their target streams,
	      but also to stderr. The output format is	hexadecimal,  prefixed
	      with  ">	"  or "< " indicating flow directions. Can be combined
	      with -v.

       -b<size>
	      Sets the data transfer block <size> [size_t].   At  most	<size>
	      bytes are	transferred per	step. Default is 8192 bytes.

       -s     By  default,  socat terminates when an error occurred to prevent
	      the process from running when some option	could not be  applied.
	      With  this option, socat is sloppy with errors and tries to con-
	      tinue. Even with this option, socat will	exit  on  fatals,  and
	      will abort connection attempts when security checks failed.

       -t<timeout>
	      When  one	 channel  has reached EOF, the write part of the other
	      channel is shut down. Then, socat	waits <timeout>	[timeval] sec-
	      onds before terminating. Default is 0.5 seconds.

       -u     Uses unidirectional mode.	The first address  is  only  used  for
	      reading, and the second address is only used for writing.

       -U     Uses unidirectional mode in reverse direction. The first address
	      is  only	used  for writing, and the second address is only used
	      for reading.

       -g     During address option parsing, don't check if the	option is con-
	      sidered useful in	the given address environment. Use it  if  you
	      want  to	force,	e.g., appliance	of a socket option to a	serial
	      device.

ADDRESS	SPECIFICATIONS
       With the	address	command	line arguments,	the user gives socat  instruc-
       tions and the necessary information for establishing the	byte streams.

       An  address  specification usually consists of an address type keyword,
       zero or more required address parameters	separated by ':' from the key-
       word and	from each other, and zero or more address options separated by
       ','.

       The keyword specifies the address type (e.g., TCP4,  OPEN,  EXEC).  For
       some  keywords there exist synonyms ('-'	for STDIO, TCP for TCP4). Key-
       words are case insensitive.  For	a few special address types, the  key-
       word  may be omitted: Address specifications starting with a number are
       assumed to be FD	(raw file descriptor) addresses; if a '/' is found be-
       fore the	first ':' or ',', GOPEN	(generic file open) is assumed.

       The required number and type of address parameters depend  on  the  ad-
       dress  type.  E.g.,  TCP4  requires a server specification (name	or ad-
       dress), and a port specification	(number	or service name).

       Zero or more address options may	be given with each address.  They  in-
       fluence the address in some ways.  Options consist of an	option keyword
       or an option keyword and	a value, separated by '='. Option keywords are
       case  insensitive.   For	 filtering the options that are	useful with an
       address type, each option is member of one option group.	For  each  ad-
       dress  type  there  is a	set of option groups allowed. Only options be-
       longing to one of these address groups may be used (except with	option
       -g).

       Address	specifications following the above schema are also called sin-
       gle address specifications.  Two	single addresses can be	combined  with
       "!!"  to	 form a	dual type address for one channel. Here, the first ad-
       dress is	used by	socat for reading data,	and  the  second  address  for
       writing	data. There is no way to specify an option only	once for being
       applied to both single addresses.

       Usually,	addresses are opened in	read/write mode. When  an  address  is
       part  of	a dual address specification, or when option -u	or -U is used,
       an address might	be used	only for reading or for	 writing.  Considering
       this is important with some address types.

ADDRESS	TYPES
       This section describes the available address types with their keywords,
       parameters, and semantics.

       CREATE:<filename>
	      Opens  <filename>	 with creat() and uses the file	descriptor for
	      writing.	This address type requires write-only context, because
	      a	file opened with creat cannot be read from.   <filename>  must
	      be  a  valid  existing or	not existing path.  If <filename> is a
	      named pipe, creat() might	 block;	 if  <filename>	 refers	 to  a
	      socket, this is an error.
	      Option groups: FD,REG,NAMED
	      Useful  options:	mode,  user, group, unlink-early, unlink-late,
	      append
	      See also:	OPEN, GOPEN

       EXEC:<command-line>
	      Forks a sub process that establishes communication with its par-
	      ent process and invokes the  specified  program  with  execvp().
	      <command-line>  is  a simple command with	arguments separated by
	      single spaces. If	the program name contains a '/', the part  af-
	      ter  the	last '/' is taken as ARGV[0]. If the program name is a
	      relative path, the execvp() semantics for	 finding  the  program
	      via  $PATH  apply.  After	successful program start, socat	writes
	      data to stdin of the process and reads from its stdout  using  a
	      UNIX domain socket generated by socketpair() per default.
	      Option groups: FD,SOCKET,EXEC,FORK,TERMIOS
	      Useful  options:	path,  fdin,  fdout, chroot, su, su-d, nofork,
	      pty, stderr, ctty, setsid, pipes,	login, sigint, sigquit
	      See also:	SYSTEM

       FD:<fdnum>
	      Uses the file descriptor <fdnum>.	It must	already	exist as valid
	      UN*X file	descriptor.
	      Option groups: FD	(TERMIOS,REG,SOCKET)
	      See also:	STDIO, STDIN, STDOUT, STDERR

       GOPEN:<filename>
	      (Generic open) This address type tries to	handle any file	system
	      entry except directories usefully. <filename> may	be a  relative
	      or absolute path.	If it already exists, its type is checked.  In
	      case  of	a  UNIX	 domain	 socket, socat connects; if connecting
	      fails, socat assumes a datagram socket and uses sendto()	calls.
	      If  the entry is not a socket, socat opens it applying the O_AP-
	      PEND flag.  If it	does not exist,	it is opened with flag O_CREAT
	      as a regular file.
	      Option groups: FD,REG,SOCKET,NAMED,OPEN
	      See also:	OPEN, CREATE, UNIX-CONNECT

       IP4:<host>:<protocol>
	      Opens a raw IPv4 socket with <protocol>, sends packets to	<host>
	      [IPv4 address] and receives packets  from	 host.	 Protocol  255
	      uses the raw socket with the IP header being part	of the data.
	      Option groups: FD,SOCKET,IP4
	      Useful options: ttl, broadcast
	      See also:	IP6, UDP4, UDP4-LISTEN

       IP6:<host>:<protocol>
	      Opens a raw IPv6 socket with <protocol>, sends packets to	<host>
	      [IPv6 address] and receives packets from host.
	      Option groups: FD,SOCKET,IP6
	      Useful options: ttl, broadcast
	      See also:	IP4, UDP6, UDP6-LISTEN

       OPEN:<filename>
	      Opens  <filename>	 using the open() system call.	This operation
	      fails on UNIX domain sockets.
	      Note: This address type is rarly useful in bidirectional mode.
	      Option groups: FD,REG,NAMED,OPEN
	      Useful options: creat, excl, nofollow, append,  rdonly,  wronly,
	      lock, ignoreeof
	      See also:	CREATE,	GOPEN, UNIX-CONNECT

       OPENSSL:<host>:<port>
	      Tries  to	 establish a SSL connection to <port> [TCP service] on
	      <host> [IPv4 address] using TCP/IPv4.
	      Option groups: FD,SOCKET,SOCK_IP4,TCP,OPENSSL,RETRY
	      Useful options: cipher, method, verify, cafile, capath, certifi-
	      cate, bind, connect-timeout, sourceport, retry
	      See also:	OPENSSL-LISTEN,	TCP4

       OPENSSL-LISTEN:<port>
	      Listens on tcp4 <port> [TCP service]. When a connection  is  ac-
	      cepted, this address behaves as SSL server.
	      Note:  You probably want to use the certificate option with this
	      address.
	      Option		groups:		   FD,SOCKET,SOCK_IP4,TCP,LIS-
	      TEN,OPENSSL,CHILD,RANGE,RETRY
	      Useful options: cipher, method, verify, cafile, capath, certifi-
	      cate, fork, bind,	range, tcpwrap,	su, reuseaddr, retry
	      See also:	OPENSSL, TCP4

       PIPE:<filename>
	      If  <filename> already exists, it	is opened.  If is does not ex-
	      ist, a named pipe	is created and opened.
	      Note: When a pipe	is used	for both reading and writing, it works
	      as echo service.
	      Note: When a pipe	is used	for both reading and writing, and  so-
	      cat  tries  to  write more bytes than the	pipe can buffer	(Linux
	      2.4: 2048	bytes),	socat  might  block.  Consider	using  option,
	      e.g., -b 2048
	      Option groups: FD,NAMED,OPEN
	      Useful  options:	rdonly,	 nonblock,  group, user, mode, unlink-
	      early
	      See also:	unnamed	pipe

       PIPE   Creates an unnamed pipe and uses it for reading and writing.  It
	      works  as	an echo, because everything written to it appeares im-
	      mediately	as read	data.
	      Note: When socat tries to	write more bytes  than	the  pipe  can
	      queue  (Linux  2.4:  2048	 bytes),  socat	might block. Consider,
	      e.g., using option -b 2048
	      Option groups: FD
	      See also:	named pipe

       PROXY:<proxy>:<hostname>:<port>
	      Connects to an HTTP proxy	server on port	8080  using  TCP/IPv4,
	      and  sends  a  CONNECT  request  for hostname:port. If the proxy
	      grants access and	succeeds to connect to the target, data	trans-
	      fer between socat	and the	target can start. Note that the	 traf-
	      fic need not be HTTP but can be an arbitrary protocol.
	      Option groups: FD,SOCKET,IP4,TCP,HTTP
	      Useful  options:	proxyport, ignorecr, proxyauth,	resolve, crnl,
	      bind, connect-timeout, mss, sourceport, retry
	      See also:	SOCKS, TCP4

       PTY    Generates	a pseudo terminal (pty)	and uses its master side.  An-
	      other process may	open the pty's slave side using	it like	a ser-
	      ial  line	 or  terminal. If both the ptmx	and the	openpty	mecha-
	      nisms are	available, ptmx	is used	(POSIX).
	      Option groups: FD,NAMED,PTY,TERMIOS
	      Useful options: link, openpty, wait-slave, mode, user, group
	      See also:	UNIX-LISTEN, PIPE, EXEC, SYSTEM

       READLINE
	      Uses GNU readline	and history on	stdio  to  allow  editing  and
	      reusing  input lines. This requires the GNU readline and history
	      libraries. Note that stdio should	be a (pseudo) terminal device,
	      otherwise	readline does not seem to work.
	      Option groups: FD,READLINE,TERMIOS
	      Useful options: history, noecho
	      See also:	STDIO

       SOCKS4:<socks-server>:<host>:<port>
	      Connects via <socks-server> [IPv4	address] to <host>  [IPv4  ad-
	      dress] on	<port> [TCP service], using socks version 4 protocol.
	      Option groups: FD,SOCKET,IP4,TCP,SOCKS4
	      Useful options: socksuser, socksport, sourceport,	retry
	      See also:	SOCKS4A, TCP4

       SOCKS4A:<socks-server>:<host>:<port>
	      Connects	via  <socks-server> [IPv4 address] to <host> [IPv4 ad-
	      dress] on	<port> [TCP service].  This address uses version 4a of
	      the socks	protocol in case it cannot resolve the hostname,  thus
	      it  sends	 the destination host name unresolved in the socks re-
	      quest.
	      Option groups: FD,SOCKET,IP4,TCP,SOCKS4
	      Useful options: socksuser, socksport, sourceport,	retry
	      See also:	SOCKS4,	TCP4

       STDERR Uses file	descriptor 2.
	      Option groups: FD	(TERMIOS,REG,SOCKET)
	      See also:	FD

       STDIN  Uses file	descriptor 0.
	      Option groups: FD	(TERMIOS,REG,SOCKET)
	      See also:	FD

       STDIO  Uses file	descriptor 0 for reading, and 1	for writing.
	      Option groups: FD	(TERMIOS,REG,SOCKET)
	      See also:	FD

       STDOUT Uses file	descriptor 1.
	      Option groups: FD	(TERMIOS,REG,SOCKET)
	      See also:	FD

       SYSTEM:<shell-command>
	      Forks a sub process that establishes communication with its par-
	      ent process and invokes the  specified  program  with  system().
	      Please  note  that <shell-command> [string] must not contain ','
	      or "!!", and that	shell meta characters  may  have  to  be  pro-
	      tected.	After  successful  program start, socat	writes data to
	      stdin of the process and reads from its stdout.
	      Option groups: FD,SOCKET,EXEC,FORK,TERMIOS
	      Useful options: path, fdin, fdout,  chroot,  su,	su-d,  nofork,
	      pty, stderr, ctty, setsid, pipes,	sigint,	sigquit
	      See also:	EXEC

       TCP4:<host>:<port>
	      Connects	to <port> [TCP service]	on <host> [IPv4	address] using
	      TCP/IPv4.
	      Option groups: FD,SOCKET,IP4,TCP
	      Useful options: crnl, bind, connect-timeout,  tos,  mtudiscover,
	      mss, nodelay, nonblock, sourceport, retry
	      See also:	TCP4-LISTEN, UDP4, TCP6, UNIX-CONNECT

       TCP4-LISTEN:<port>
	      Listens  on  <port> [TCP service]	and accepts a TCP/IPv4 connec-
	      tion. Note that opening this  address  usually  blocks  until  a
	      client connects.
	      Option groups: FD,SOCKET,LISTEN,CHILD,RANGE,IP4,TCP
	      Useful  options: crnl, fork, bind, range,	tcpwrap, backlog, mss,
	      su, reuseaddr, retry
	      See also:	TCP4, UDP4-LISTEN, TCP6-LISTEN,	UNIX-LISTEN,  OPENSSL-
	      LISTEN

       TCP6:<host>:<port>
	      Connects	to <port> [TCP service]	on <host> [IPv6	address] using
	      TCP/IPv6.
	      Option groups: FD,SOCKET,IP6,TCP
	      Useful options: crnl, bind, connect-timeout, tos,	nodelay,  non-
	      block, retry
	      See also:	TCP6-LISTEN, UDP6, TCP4

       TCP6-LISTEN:<port>
	      Listens  on  <port>  TCP service]	and accepts a TCP/IPv6 connec-
	      tion. Note that opening this  address  usually  blocks  until  a
	      client connects.
	      Option groups: FD,SOCKET,LISTEN,CHILD,RANGE,IP6,TCP
	      Useful  options:	crnl,  fork,  bind, range, backlog, reuseaddr,
	      retry
	      See also:	TCP6, UDP6-LISTEN, TCP4-LISTEN

       UDP4:<host>:<port>
	      Connects to <port> [UDP service] on <host> [IPv4 address]	 using
	      UDP/IPv4.	  Please note that, due	to UDP protocol	properties, no
	      real connection is established; data has to be  sent  for	 `con-
	      necting'	to  the	 server,  and  no end-of-file condition	can be
	      transported.
	      Option groups: FD,SOCKET,IP4
	      Useful options: ttl, tos,	bind, sourceport
	      See also:	UDP4-LISTEN, TCP4, UDP6

       UDP4-LISTEN:<port>
	      Waits for	a UDP/IPv4 packet arriving on <port> [UDP service] and
	      `connects' back to sender.  Please note that, due	to UDP	proto-
	      col  properties,	no real	connection is established; data	has to
	      arrive from the peer first, and no end-of-file condition can  be
	      transported. Note	that opening this address usually blocks until
	      a	client connects.
	      Option groups: FD,SOCKET,LISTEN,CHILD,RANGE,IP4
	      Useful options: fork, bind, range
	      See also:	UDP4, TCP4-LISTEN, UDP6-LISTEN

       UDP6:<host>:<port>
	      Connects	to <port> [UDP service]	on <host> [IPv6	address] using
	      UDP/IPv6.	Please note that, due to UDP protocol  properties,  no
	      real  connection	is  established; data has to be	sent for `con-
	      necting' to the server, and  no  end-of-file  condition  can  be
	      transported.
	      Option groups: FD,SOCKET,IP6
	      Useful options: ttl, tos
	      bind, sourceport,	See also: UDP6-LISTEN, TCP6, UDP4

       UDP6-LISTEN:<port>
	      Waits for	a UDP/IPv6 packet arriving on <port> [UDP service] and
	      `connects'  back to sender.  Please note that, due to UDP	proto-
	      col properties, no real connection is established; data  has  to
	      arrive  from the peer first, and no end-of-file condition	can be
	      transported. Note	that opening this address usually blocks until
	      a	client connects.
	      Option groups: FD,SOCKET,LISTEN,CHILD,RANGE,IP6
	      Useful options: fork, bind, range
	      See also:	UDP6, TCP6-LISTEN, UDP4-LISTEN

       UNIX-CONNECT:<filename>
	      Connects to <filename> assuming it is a UNIX domain socket.   If
	      <filename>  does	not  exist, this is an error; if <filename> is
	      not a UNIX domain	socket,	this is	an error; if <filename>	 is  a
	      UNIX  domain socket, but no process is listening,	this is	an er-
	      ror.
	      Option groups: FD,SOCKET,NAMED
	      See also:	UNIX-LISTEN, TCP4

       UNIX-LISTEN:<filename>
	      Listens on <filename> using a UNIX domain	stream socket and  ac-
	      cepts  a	connection.  If	<filename> exists and is not a socket,
	      this is an error.	 If <filename> exists and  is  a  UNIX	domain
	      socket, binding to the address fails (use	option unlink-early!).
	      Note  that  opening  this	 address usually blocks	until a	client
	      connects.
	      Option groups: FD,SOCKET,NAMED,LISTEN,CHILD
	      Useful options: fork, umask, mode, user, group, unlink-early
	      See also:	UNIX-CONNECT, TCP4-LISTEN

ADDRESS	OPTIONS
       Address options can be applied to address specifications	 to  influence
       the  process of opening the addresses and the properties	of the result-
       ing data	channels.

       For technical reasons not every option can be applied to	every  address
       type;  e.g.,  applying  a socket	option to a regular file will fail. To
       catch most useless combinations as early	as in the open phase, the con-
       cept of option groups was introduced. Each option  belongs  to  one  or
       more  option  groups.  Options can be used only with address types that
       support at least	one of their option groups (but	see option -g).

       Address options have data types that  their  values  must  conform  to.
       Every  address  option consists of just a keyword or a keyword followed
       by "=value", where value	must conform to	the options  type.   Some  ad-
       dress  options manipulate parameters of system calls; e.g., option sync
       sets the	O_SYNC flag with the open() call.  Other options cause a  sys-
       tem  or	library	call; e.g., with option	`ttl=value' the	setsockopt(fd,
       SOL_IP, IP_TTL, value, sizeof(int)) call	is applied.  Other options set
       internal	socat variables	that are  used	during	data  transfer;	 e.g.,
       `crnl'  causes explicit character conversions.  A few options have more
       complex implementations;	e.g., su-d (substuser-delayed)	inquires  some
       user  and group infos, stores them, and applies them later after	a pos-
       sible chroot() call.

       If multiple options are given to	an address, their sequence in the  ad-
       dress specification has (almost)	no effect on the sequence of their ex-
       ecution/application.  Instead, socat has	built in an option phase model
       that tries to bring the options in a useful order. Some	options	 exist
       in different forms (e.g., unlink, unlink-early, unlink-late) to control
       the time	of their execution.

       If the same option is specified more than once within one address spec-
       ification,  with	 equal	or different values, the effect	depends	on the
       kind of option. Options resulting in function calls  like  setsockopt()
       cause  multiple invocations. With options that set parameters for a re-
       quired call like	open() or set internal flags, the value	 of  the  last
       option occurrence is effective.

       The  existence or semantics of many options are system dependent. Socat
       usually does NOT	try to emulate missing libc  or	 kernel	 features,  it
       just  provides an interface to the underlying system. So, if an operat-
       ing system lacks	a feature, the related option is simply	not  available
       on this platform.

       The  following  paragraphs  introduce  just the more common address op-
       tions. For a comprehensive reference  and  to  find  information	 about
       canonical  option  names, alias names, option phases, and platforms see
       file xio.help.

       FD option group

       This option group contains options that are applied  to	a  UN*X	 style
       file  descriptor,  no matter how	it was generated.  Because all current
       socat address types are file descriptor based, these options may	be ap-
       plied to	any address.
       Note: Some of these options are also member of  another	option	group,
       that  provides an other,	non-fd based mechanism.	 For these options, it
       depends on the actual address type and its option groups	 which	mecha-
       nism is used. The second, non-fd	based mechanism	is prioritized.

       cloexec=<bool>
	      Sets  the	 FD_CLOEXEC flag with the fcntl() system call to value
	      <bool>. If set, the file descriptor is closed on	exec()	family
	      function	calls.	Socat internally handles this flag for the fds
	      it controls, so in most cases there will be  no  need  to	 apply
	      this option.

       setlk  Tries  to	 set  a	discretionary lock to the whole	file using the
	      fcntl(fd,	F_SETLK, ...) system call.  If	the  file  is  already
	      locked, this call	results	in an error.

       setlkw Tries  to	set a discretionary waiting lock to the	whole file us-
	      ing the fcntl(fd,	F_SETLKW, ...) system call. If the file	is al-
	      ready locked, this call blocks.

       flock-ex
	      Tries to set a blocking exclusive	advisory lock to the file  us-
	      ing the flock(fd,	LOCK_EX) system	call. Socat hangs in this call
	      if the file is locked by another process.

       flock-ex-nb
	      Tries  to	 set a nonblocking exclusive advisory lock to the file
	      using the	flock(fd, LOCK_EX) system call.	If the file is already
	      locked, this option results in an	error.

       flock-sh
	      Tries to set a blocking shared advisory lock to the  file	 using
	      the  flock(fd, LOCK_SH) system call. Socat hangs in this call if
	      the file is locked by another process.

       flock-sh-nb
	      Tries to set a nonblocking shared	advisory lock to the file  us-
	      ing  the	flock(fd, LOCK_SH|LOCK_NB) system call.	If the file is
	      already locked, this option results in an	error.

       lock   Sets a blocking lock on the file.	Uses the setlk or flock	mecha-
	      nism depending on	availability on	the  particular	 platform.  If
	      both are available, the POSIX variant (setlkw) is	selected.

       user=<user>
	      Sets the <user> (owner) of the stream.  If the address is	member
	      of  the  NAMED  option group, socat uses the chown() system call
	      after opening the	file or	binding	 to  the  UNIX	domain	socket
	      (race  condition!).   Without  filesystem	 entry,	socat sets the
	      user of the stream using the fchown() system call.  These	 calls
	      might require root privilege.

       user-late=<user>
	      Sets the owner of	the fd to <user> with the fchown() system call
	      after opening or connecting the channel.	This is	useful only on
	      file system entries.

       group=<group>
	      Sets the <group> of the stream.  If the address is member	of the
	      NAMED  option  group,  socat  uses the chown() system call after
	      opening the file or binding to the UNIX domain socket (race con-
	      dition!).	 Without filesystem entry, socat sets the group	of the
	      stream with the fchown() system call.  These calls might require
	      group membership or root privilege.

       group-late=<group>
	      Sets the group of	the fd to <group>  with	 the  fchown()	system
	      call  after  opening  or connecting the channel.	This is	useful
	      only on file system entries.

       mode=<mode>
	      Sets the <mode> [mode_t] (permissions) of	the  stream.   If  the
	      address  is member of the	NAMED option group and uses the	open()
	      or creat() call, the mode	is applied with	these.	If the address
	      is member	of the NAMED option group without using	 these	system
	      calls,  socat  uses  the	chmod()	 system	call after opening the
	      filesystem entry or binding to the UNIX domain socket (race con-
	      dition!).	 Otherwise, socat sets the mode	of  the	 stream	 using
	      fchmod().	  These	 calls	might require ownership	or root	privi-
	      lege.

       perm-late=<mode>
	      Sets the permissions of the fd to	value  <mode>  [mode_t]	 using
	      the  fchmod()  system call after opening or connecting the chan-
	      nel.  This is useful only	on file	system entries.

       append=<bool>
	      Always writes data to the	actual end of file.  If	the address is
	      member of	the OPEN option	group, socat uses  the	O_APPEND  flag
	      with  the	 open()	system call.  Otherwise, socat applies the fc-
	      ntl(fd, F_SETFL, O_APPEND) call.

       nonblock=<bool>
	      Tries to open or use file	in nonblocking mode. Its only  effects
	      are that the connect() call of TCP addresses does	not block, and
	      that  opening  a	named pipe for reading does not	block.	If the
	      address is member	of the	OPEN  option  group,  socat  uses  the
	      O_NONBLOCK  flag	with the open()	system call.  Otherwise, socat
	      applies the fcntl(fd, F_SETFL, O_NONBLOCK) call.

       binary Opens the	file in	binary mode to avoid implicit line  terminator
	      conversions (Cygwin).

       text   Opens  the  file	in text	mode to	force implicit line terminator
	      conversions (Cygwin).

       noinherit
	      Does not keep this file open in a	spawned	process	(Cygwin).

       NAMED option group

       These options work on file system entries.
       See also	options	user, group, and mode.

       user-early=<user>
	      Changes the <user> (owner) of the	file system entry  before  ac-
	      cessing  it,  using the chown() system call. This	call might re-
	      quire root privilege.

       group-early=<group>
	      Changes the <group> of the file system  entry  before  accessing
	      it, using	the chown() system call. This call might require group
	      membership or root privilege.

       perm-early=<mode>
	      Changes  the <mode> [mode_t] of the file system entry before ac-
	      cessing it, using	the chmod() system call. This call  might  re-
	      quire ownership or root privilege.

       umask=<mode>
	      Sets  the	umask of the process to	<mode> [mode_t]	before access-
	      ing the file system entry	(useful	with  UNIX  domain  sockets!).
	      This  call  might	 affect	 all  further  operations of the socat
	      process!

       unlink-early
	      Unlinks (removes)	the file before	opening	it and even before ap-
	      plying user-early	etc.

       unlink Unlinks (removes)	the file before	accessing it, but after	 user-
	      early etc.

       unlink-late
	      Unlinks  (removes) the file after	opening	it to make it inacces-
	      sible for	other processes	after a	short race condition.

       OPEN option group

       The OPEN	group options allow to set flags with the open() system	 call.
       E.g., option `creat' sets the O_CREAT flag.
       See also	options	append and nonblock.

       creat=<bool>
	      Creates the file if it does not exist.

       dsync=<bool>
	      Blocks write() calls until metainfo is physically	written	to me-
	      dia.

       excl=<bool>
	      With option creat, if file exists	this is	an error.

       largefile=<bool>
	      On 32 bit	systems, allows	a file larger than 2^31	bytes.

       noctty=<bool>
	      Does not make this file the controlling terminal.

       nofollow=<bool>
	      Does not follow symbolic links.

       nshare=<bool>
	      Does not allow to	share this file	with other processes.

       rshare=<bool>
	      Does not allow other processes to	open this file for writing.

       rsync=<bool>
	      Blocks write() until metainfo is physically written to media.

       sync=<bool>
	      Blocks write() until data	is physically written to media.

       rdonly=<bool>
	      Opens the	file for reading only.

       wronly=<bool>
	      Opens the	file for writing only.

       trunc  Truncates	the file to size 0 during opening it.

       REG and BLK option group

       These  options are usually applied to a UN*X file descriptor, but their
       semantics make sense only on a file supporting random access.

       seek=<offset>
	      Applies the lseek(fd, <offset>, SEEK_SET)	 (or  lseek64)	system
	      call,  thus  positioning the file	pointer	absolutely to <offset>
	      [off_t or	off64_t].

       seek-cur=<offset>
	      Applies the lseek(fd, <offset>, SEEK_CUR)	 (or  lseek64)	system
	      call,  thus  positioning	the  file  pointer  <offset> [off_t or
	      off64_t] bytes relatively	to its current position	(which is usu-
	      ally 0).

       seek-end=<offset>
	      Applies the lseek(fd, <offset>, SEEK_END)	 (or  lseek64)	system
	      call,  thus  positioning	the  file  pointer  <offset> [off_t or
	      off64_t] bytes relatively	to the files current end.

       ftruncate=<offset>
	      Applies the ftruncate(fd,	<offset>) (or  ftruncate64  if	avail-
	      able)  system  call,  thus  truncating  the file at the position
	      <offset> [off_t or off64_t].

       PROCESS option group

       Options of this group change the	process	properties instead of just af-
       fecting one data	channel.  For EXEC and SYSTEM addresses	and for	LISTEN
       and CONNECT type	addresses with option FORK, these options apply	to the
       child processes instead of the main socat process.

       chroot=<directory>
	      Performs a chroot() operation to	<directory>  after  processing
	      the address. This	call might require root	privilege.

       chroot-early=<directory>
	      Performs	a chroot() operation to	<directory> before opening the
	      address. This call might require root privilege.

       setgid=<group>
	      Changes the primary <group> of the process after processing  the
	      address. This call might require root privilege.

       setgid-early=<group>
	      Changes  the  primary  <group> of	the process before opening the
	      address. This call might require root privilege.

       setuid=<user>
	      Changes the <user> (owner) of the	process	after  processing  the
	      address. This call might require root privilege.

       setuid-early=<user>
	      Changes the <user> (owner) of the	process	before opening the ad-
	      dress. This call might require root privilege.

       su=<user>
	      Changes  the <user> (owner) and groups of	the process after pro-
	      cessing the address. This	call might require root	privilege.

       su-d=<user>
	      Short name for substuser-delayed.	 Changes  the  <user>  (owner)
	      and  groups  of  the  process after processing the address.  The
	      user and his groups are retrieved	before	a  possible  chroot().
	      This call	might require root privilege.

       setpgid=<pid_t>
	      Makes  the  process  a  member  of  the  specified process group
	      <pid_t>. If no value is given, or	if the value is	0  or  1,  the
	      process becomes leader of	a new process group.

       setsid Makes the	process	the leader of a	new session.

       READLINE	option group

       These options apply to the readline address type.

       history=<filename>
	      Reads and	writes history from/to <filename>.

       noprompt
	      Since  version  1.4.0,  socat  per  default tries	to determine a
	      prompt - that is then passed to the readline call	- by remember-
	      ing 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.

       noecho=<pattern>
	      Specifies	a regular pattern for a	prompt that prevents the  fol-
	      lowing  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 new-
	      line character and before	an input character was typed. The pat-
	      tern  is	a  regular  expression,	 e.g.	"^[Pp]assword:.*$"  or
	      "([Uu]ser:|[Pp]assword:)". See regex(7) for details.

       prompt=<string>
	      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 pro-
	      gram on the other	socat address, consistent look and feel	can be
	      archieved.

       APPLICATION option group

       This group contains options that	work at	data level.  Note  that	 these
       options	only  apply to the "raw" data transferred by socat, but	not to
       protocol	data used by addresses like PROXY.

       cr     Converts the default line	termination character NL ('\n',	 0x0a)
	      to/from CR ('\r',	0x0d) when writing/reading on this channel.

       crnl   Converts	the default line termination character NL ('\n', 0x0a)
	      to/from CRNL ("\r\n", 0x0d0a) when writing/reading on this chan-
	      nel.  Note: socat	simply strips all CR characters.

       ignoreeof
	      When EOF occurs on this channel, socat ignores it	and  tries  to
	      read more	data (like "tail -f").

       SOCKET option group

       These  options  are  intended for all kinds of sockets, e.g. IP or UNIX
       domain. Most are	applied	with a setsockopt() call.

       bind=<sockname>
	      Binds the	socket to the given socket address  using  the	bind()
	      system  call. The	form of	<sockname> is socket domain dependent:
	      IP4  and	IP6  allow  the	  form	 [hostname|hostaddress][:(ser-
	      vice|port)], UNIX	domain sockets require <filename>.

       connect-timeout=<seconds>
	      Abort  the connection attempt after <seconds> [timeval] with er-
	      ror status.

       interface=<interface>
	      Binds the	socket to the given <interface>.  With Linux, this  is
	      a	string like "eth0".  This option might require root privilege.

       broadcast
	      For  datagram sockets, allows sending to broadcast addresses and
	      receiving	packets	addressed to broadcast addresses.

       bsdcompat
	      Emulates some (old?) bugs	of the BSD socket implementation.

       debug  Enables socket debugging.

       dontroute
	      Only communicates	with directly connected	peers,	does  not  use
	      routers.

       keepalive
	      Enables sending keepalives on the	socket.

       linger=<seconds>
	      Blocks  shutdown() or close() until data transfers have finished
	      or the given timeout [int] expired.

       oobinline
	      Places out-of-band data in the input data	stream.

       priority=<priority>
	      Sets the protocol	defined	<priority> [<int>] for outgoing	 pack-
	      ets.

       rcvbuf=<bytes>
	      Sets  the	 size of the receive buffer after the socket() call to
	      <bytes> [int].  With TCP sockets,	this value corresponds to  the
	      socket's maximal window size.

       rcvbuf-late=<bytes>
	      Sets  the	 size of the receive buffer when the socket is already
	      connected	to <bytes> [int].  With	TCP sockets, this value	corre-
	      sponds to	the socket's maximal window size.

       rcvlowat=<bytes>
	      Specifies	the minimum number of received bytes [int]  until  the
	      socket layer will	pass the buffered data to socat.

       rcvtimeo=<seconds>
	      Sets the receive timeout [timeval].

       reuseaddr
	      Allows  other  sockets to	bind to	an address even	if parts of it
	      (e.g. the	local port) are	already	in use by socat.

       sndbuf=<bytes>
	      Sets the size of the send	buffer	after  the  socket()  call  to
	      <bytes> [int].

       sndbuf-late=<bytes>
	      Sets the size of the send	buffer when the	socket is connected to
	      <bytes> [int].

       sndlowat=<bytes>
	      Specifies	 the  minimum number of	bytes in the send buffer until
	      the socket layer will send the data to <bytes> [int].

       sndtimeo=<seconds>
	      Sets the send timeout to seconds [timeval].

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

       IP4 and IP6 option groups

       These options can be used with IPv4 and IPv6 based sockets.

       tos=<tos>
	      Sets  the	 TOS  (type  of	 service) field	of outgoing packets to
	      <tos> [byte] (see	RFC 791).

       ttl=<ttl>
	      Sets the TTL (time to live) field	of outgoing packets  to	 <ttl>
	      [byte].

       ipoptions=<data>
	      Sets  IP	options	 like  source routing. Must be given in	binary
	      form, recommended	format is a leading "x"	followed  by  an  even
	      number  of  hex  digits. This option may be used multiple	times,
	      data are appended.  E.g.,	to connect to host 10.0.0.1  via  some
	      gateway  using  a	loose source route, use	the gateway as address
	      parameter	and set	a loose	source route using  the	 option	 ipop-
	      tions=x8307040a000001.
	      IP options are defined in	RFC 791.

       mtudiscover=<0|1|2>
	      Takes 0, 1, 2 to never, want, or always use path MTU discover on
	      this socket.

       TCP option group

       These options may be applied to TCP sockets. They work by invoking set-
       sockopt() with the appropriate parameters.

       cork   Doesn't send packets smaller than	MSS (maximal segment size).

       defer-accept
	      While  listening,	 accepts  connections  only when data from the
	      peer arrived.

       keepcnt=<count>
	      Sets the number of keepalives before shutting down the socket to
	      <count> [int].

       keepidle=<seconds>
	      Sets the idle time before	sending	the first keepalive  to	 <sec-
	      onds> [int].

       keepintvl=<seconds>
	      Sets the intervall between two keepalives	to <seconds> [int].

       linger2=<seconds>
	      Sets  the	 time  to keep the socket in FIN-WAIT-2	state to <sec-
	      onds> [int].

       mss=<bytes>
	      Sets the MSS (maximum segment size) after	the socket()  call  to
	      <bytes>  [int]. This value is then proposed to the peer with the
	      SYN or SYN/ACK packet.

       mss-late=<bytes>
	      Sets the MSS of the socket after connection has been established
	      to <bytes> [int].

       nodelay
	      Turns off	the Nagle algorithm for	measuring the RTT (round  trip
	      time).

       rfc1323
	      Enables  RFC1323	TCP options: TCP window	scale, round-trip time
	      measurement (RTTM), and protect against wrapped sequence numbers
	      (PAWS) (AIX).

       stdurg Enables RFC1122 compliant	urgent pointer handling	(AIX).

       syncnt=<count>
	      Sets the maximal number of SYN  retransmits  during  connect  to
	      <count> [int].

       md5sig Enables generation of MD5	digests	on the packets (FreeBSD).

       noopt  Disables use of TCP options (FreeBSD, MacOSX).

       nopush sets the TCP_NOPUSH socket option	(FreeBSD, MacOSX).

       sack-disable
	      Disables use the selective acknowledge feature (OpenBSD).

       signature-enable
	      Enables generation of MD5	digests	on the packets (OpenBSD).

       abort-threshold=<milliseconds>
	      Sets  the	 time  to  wait	for an answer of the peer on an	estab-
	      lished connection	(HP-UX).

       conn-abort-threshold=<milliseconds>
	      Sets the time to wait for	an answer of  the  server  during  the
	      initial connect (HP-UX).

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

       paws   Enables  the  "protect against wrapped sequence numbers" feature
	      (Tru64).

       sackena
	      Enables selective	acknowledge (Tru64).

       tsoptena
	      Enables the time stamp option that allows	RTT  recalculation  on
	      existing connections (Tru64).

       UDP and TCP option groups

       Here we find options that are related to	the network port mechanism and
       that thus can be	used with UDP and TCP, client and server addresses.

       sourceport=<port>
	      For  outgoing  (client)  TCP  and	 UDP  connections, it sets the
	      source <port> using an extra bind() call.	 With TCP or UDP  lis-
	      ten  addresses,  socat  immediately shuts	down the connection if
	      the client does not use this sourceport.

       lowport
	      Outgoing (client)	TCP and	UDP connections	with this  option  use
	      an  unused random	source port between 640	and 1023 incl. On UNIX
	      class operating systems, this requires root privilege, and  thus
	      indicates	 that  the client process is authorized	by local root.
	      TCP and UDP listen addresses with	this option  immediately  shut
	      down  the	 connection if the client does not use a sourceport <=
	      1023.  This mechanism can	provide	 limited  authorization	 under
	      some circumstances.

       SOCKS option group

       When  using  SOCKS  type	 addresses, some socks specific	options	can be
       set.

       socksport=<tcp service>
	      Overrides	the default "socks" service or port 1080 for the socks
	      server port with <TCP service>.

       socksuser=<user>
	      Sends the	<user> [string]	in the username	 field	to  the	 socks
	      server. Default is the actual user name ($LOGNAME	or $USER).

       HTTP option group

       Options	that  can  be provided with HTTP type addresses. The only HTTP
       address currently implemented is	proxy-connect.

       proxyport=<TCP service>
	      Overrides	the default HTTP proxy port 8080 with <TCP service>.

       ignorecr
	      The HTTP protocol	requires the use of CR+NL as line  terminator.
	      When  a proxy server violates this standard, socat might not un-
	      derstand 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.

       proxyauth=<username>:<password>
	      Provide "basic" authentication to	the proxy server. The argument
	      to the option is used with a "Proxy-Authorization: Base"	header
	      in base64	encoded	form.
	      Note:  username  and  password are visible for every user	on the
	      local machine in the process list;  username  and	 password  are
	      transferred to the proxy server unencrypted (base64 encoded) and
	      might be sniffed.

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

       RANGE option group

       These options check if a	connecting client is granted access. They  can
       be applied to listening network sockets.

       range=<address-range>
	      After accepting a	connection, tests if the peer is within	range.
	      This  option  is	currently only implemented for IPv4 addresses.
	      Address range has	the form ww.xx.yy.zz/bits, e.g.	10.0.0.0/8. If
	      the client address does not match, socat issues an error	abort-
	      ing the program or keeps listening (see option -s).

       tcpwrap[=<name>]
	      Uses  Wietse Venema's libwrap (tcpd) library to determine	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> (type  string)  is  passed  to  the
	      wrapper  functions as daemon process name. If omitted, the base-
	      name of socats invocation	(argv[0]) is passed.  If both  tcpwrap
	      and  range  options  are	applied	to an address, both conditions
	      must be fulfilled	to allow the connection.

       LISTEN option group

       Options specific	to listening sockets.

       backlog=<count>
	      Sets the backlog value passed with the listen() system  call  to
	      <count> [int]. Default is	5.

       CHILD option group

       Options for addresses with multiple connections via child processes.

       fork   After  establishing a connection,	handles	its channel in a child
	      process and keeps	the parent process attempting to produce  more
	      connections, either by listening or by connecting	in a loop.
	      SSL-CONNECT and SSL-LISTEN differ	in when	they actually fork off
	      the child: SSL-LISTEN forks before the SSL handshake, while SSL-
	      CONNECT forks afterwards.	 RETRY and FOREVER options are not in-
	      herited by the child process.

       EXEC option group

       Options for addresses that invoke a program.

       path=<string>
	      Overrides	 the  PATH environment variable	for searching the pro-
	      gram with	<string>. This $PATH value is effective	in  the	 child
	      process too.

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

       FORK option group

       EXEC or SYSTEM addresses	invoke a program using	a  child  process  and
       transfer	 data between socat and	the program. The interprocess communi-
       cation mechanism	can be influenced with the following options. Per  de-
       fault,  a  socketpair()	is created and assigned	to stdin and stdout of
       the child process, while	stderr is inherited from  the  socat  process,
       and  the	 child process uses file descriptors 0 and 1 for communicating
       with the	main socat process.

       nofork Does not fork a subprocess for executing	the  program,  instead
	      calls  execvp()  or  system() directly from the actual socat in-
	      stance. This avoids the overhead of another process between  the
	      program and its peer, but	introduces a lot of restrictions:

       o      this option can only be applied to the second socat address.

       o      it cannot	be applied to a	part of	a LINK(dual)(ADDRESS_DUAL) ad-
	      dress.

       o      the first	socat address cannot be	OPENSSL	or READLINE

       o      socat options -b,	-t, -D,	-l, -v,	-x become useless

       o      for  both	addresses, options ignoreeof, cr, and crnl become use-
	      less

       o      for the second address (the one with option nofork), options ap-
	      pend,  cloexec, flock, user, group, mode,	 nonblock,  perm-late,
	      setlk,  and  setpgid  cannot  be applied.	Some of	these could be
	      used on the first	address	though.

       pipes  Creates a	pair of	unnamed	pipes for  interprocess	 communication
	      instead of a socket pair.

       openpty
	      Establishes  communication  with	the sub	process	using a	pseudo
	      terminal created with openpty() instead of the default  (socket-
	      pair or ptmx).

       ptmx   Establishes  communication  with	the sub	process	using a	pseudo
	      terminal created by opening /dev/ptmx or /dev/ptc	instead	of the
	      default (socketpair).

       pty    Establishes communication	with the sub process  using  a	pseudo
	      terminal	instead	 of  a	socket	pair.  Creates the pty with an
	      available	mechanism. If openpty and ptmx are both	available,  it
	      uses ptmx	because	this is	POSIX compliant.

       ctty   Makes the	pty the	controlling tty	of the sub process.

       stderr Directs  stderr of the sub process to its	output channel by mak-
	      ing stderr a dup() of stdout.

       fdin=<fdnum>
	      Assigns the sub processes	input channel to its  file  descriptor
	      <fdnum>  instead of stdin	(0). The program started from the sub-
	      process has to use this fd for reading data from socat.

       fdout=<fdnum>
	      Assigns the sub processes	output channel to its file  descriptor
	      <fdnum> instead of stdout	(1). The program started from the sub-
	      process has to use this fd for writing data to socat.

       sighup, sigint, sigquit
	      Has  socat  pass	an  eventual  signal  of  this type to the sub
	      process.	If no address has this	option,	 socat	terminates  on
	      these signals.

       TERMIOS option group

       For   addresses	that  work  on	a  tty	(e.g.,	stdio,	file:/dev/tty,
       exec:...,pty), the terminal parameters  defined	in  the	 UN*X  termios
       mechanism are made available as address option parameters.  Please note
       that  changes of	the parameters of your interactive terminal remain ef-
       fective after socat's termination, so you might have to	enter  "reset"
       or "stty	sane" in your shell afterwards.	 For EXEC and SYSTEM addresses
       with option PTY,	these options apply to the pty by the child processes.

       b0     Disconnects the terminal.

       b19200 Sets  the	 serial	line speed to 19200 baud. Some other rates are
	      possible;	use something like socat -hh |grep ' b[1-9]'  to  find
	      all speeds supported by your implementation.
	      Note: On some operating systems, these options may not be	avail-
	      able. Use	ispeed or ospeed instead.

       echo=<bool>
	      Enables or disables local	echo.

       icanon=<bool>
	      Sets  or clears canonical	mode, enabling line buffering and some
	      special characters.

       raw    Sets raw mode, thus passing input	and output almost unprocessed.

       ignbrk=<bool>
	      Ignores or interpretes the BREAK character (e.g.,	^C)

       brkint=<bool>

       bs0

       bs1

       bsdly=<0|1>

       clocal=<bool>

       cr0
       cr1
       cr2
       cr3

	      Sets the carriage	return delay to	0, 1, 2, or  3,	 respectively.
	      0	means no delay,	the other values are terminal dependent.

       crdly=<0|1|2|3>

       cread=<bool>

       crtscts=<bool>

       cs5
       cs6
       cs7
       cs8

	      Sets the character size to 5, 6, 7, or 8 bits, respectively.

       csize=<0|1|2|3>

       cstopb=<bool>
	      Sets two stop bits, rather than one.

       dsusp=<byte>
	      Sets  the	 value for the VDSUSP character	that suspends the cur-
	      rent foreground process and reactivates the  shell  (all	except
	      Linux).

       echoctl=<bool>
	      Echos control characters in hat notation (e.g. ^A)

       echoe=<bool>

       echok=<bool>

       echoke=<bool>

       echonl=<bool>

       echoprt=<bool>

       eof=<byte>

       eol=<byte>

       eol2=<byte>

       erase=<byte>

       discard=<byte>

       ff0

       ff1

       ffdly=<bool>

       flusho=<bool>

       hupcl=<bool>

       icrnl=<bool>

       iexten=<bool>

       igncr=<bool>

       ignpar=<bool>

       imaxbel=<bool>

       inlcr=<bool>

       inpck=<bool>

       intr=<byte>

       isig=<bool>

       ispeed=<unsigned-int>
	      Set the baud rate	for incoming data on this line.
	      See also:	ospeed,	b19200 dif(istrip=<bool>)

       iuclc=<bool>

       ixany=<bool>

       ixoff=<bool>

       ixon=<bool>

       kill=<byte>

       lnext=<byte>

       min=<byte>

       nl0    Sets the newline delay to	0.

       nl1

       nldly=<bool>

       noflsh=<bool>

       ocrnl=<bool>

       ofdel=<bool>

       ofill=<bool>

       olcuc=<bool>

       onlcr=<bool>

       onlret=<bool>

       onocr=<bool>

       opost=<bool>
	      Enables  or disables output processing; e.g., converts NL	to CR-
	      NL.

       ospeed=<unsigned-int>
	      Set the baud rate	for outgoing data on this line.
	      See also:	ispeed,	b19200

       parenb=<bool>
	      Enable parity generation on output and parity checking  for  in-
	      put.

       parmrk=<bool>

       parodd=<bool>

       pendin=<bool>

       quit=<byte>

       reprint=<byte>

       sane   Brings the terminal to something like a useful default state.

       start=<byte>

       stop=<byte>

       susp=<byte>

       swtc=<byte>

       tab0

       tab1

       tab2

       tab3

       tabdly=<unsigned-int>

       time=<byte>

       tostop=<bool>

       vt0

       vt1

       vtdly=<bool>

       werase=<byte>

       xcase=<bool>

       xtabs

       PTY option group

       These options are intended for use with the pty address type.

       link=<filename>
	      Generates	 a symbolic link that points to	the actual pseudo ter-
	      minal (pty). This	might help to solve the	problem	that ptys  are
	      generated	 with more or less unpredictable names,	making it dif-
	      ficult 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.

       wait-slave
	      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 loop.
	      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 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.

       pty-intervall
	      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 intervall is 1s.	Use  the  pty-
	      intervall	option [timeval] to change this	value.

       OPENSSL option group

       These options apply to the openssl and openssl-listen address types.

       cipher=<cipherlist>
	      Selects the list of ciphers that may be used for the connection.
	      See the man page of ciphers, section CIPHER LIST FORMAT, for de-
	      tailed  information  about  syntax,  values, and default of <ci-
	      pherlist>.
	      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.

       method=<ssl-method>
	      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.

       verify=<bool>
	      Controls	check  of  the	server's certificate. Default is true.
	      Disabling	verify might open your socket for everyone!

       cert=<filename>
	      Specifies	the file with the certificate and private key for  au-
	      thentication.    The  certificate	 must  be  in  OpenSSL	format
	      (*.pem).	With openssl-listen, use of this  option  is  strongly
	      recommended. Except with cipher aNULL, "no shared	ciphers" error
	      will occur when no certificate is	given.

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

       dhparams=<filename>
	      Specifies	the file with the Diffie Hellman parameters. These pa-
	      rameters may also	be in the file given with the cert  option  in
	      which case the dhparams option is	not needed.

       cafile=<filename>
	      Specifies	 the  file  with the trusted (root) authority certifi-
	      cates. The file must be in PEM format and	should contain one  or
	      more  certificates.  The party that checks the authentication of
	      its peer trusts only certificates	that are in this file.

       capath=<dirname>
	      Specifies	the directory with the	trusted	 (root)	 certificates.
	      The  directory must contain certificates in PEM format and their
	      hashes (see OpenSSL documentation)

       egd=<filename>
	      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.

       pseudo On systems where openssl cannot find an entropy source and where
	      no entropy gathering daemon can be utilized, this	 option	 acti-
	      vates   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!

       RETRY option group

       Options that control retry of some system calls,	especially  connection
       attempts.  With	version	 1.4.1,	these options are implemented only for
       tcp4 and	tcp6 connect and listen	addresses and their derivatives	socks,
       proxy, openssl, and openssl-listen.

       retry=<num>
	      Number of	retries	before the connection  or  listen  attempt  is
	      aborted.	Default	is 0, which means just one attempt.

       intervall=<timespec>
	      Time between consecutive attempts	(seconds, [timespec]). Default
	      is 1 second.

       forever
	      Performs an unlimited number of retry attempts.

DATA VALUES
       This  section explains the different data types that address parameters
       and address options can take.

       address-range
	      Is currently  only  implemented  for  IPv4.  See	address-option
	      `range'

       bool   "0" or "1"; if value is omitted, "1" is taken.

       byte   An  unsigned  int	number,	read with strtoul(), lower or equal to
	      UCHAR_MAX.

       command-line
	      A	string specifying a program name and its arguments,  separated
	      by single	spaces.

       data   A	 raw data specification	following dalan	syntax.	The only docu-
	      mented form is a string starting with 'x'	followed  by  an  even
	      number of	hex digits.

       directory
	      A	string with usual UN*X directory name semantics.

       facility
	      The name of a syslog facility in lower case characters.

       fdnum  An  unsigned  int	 type,	read with strtoul(), specifying	a UN*X
	      file descriptor.

       filename
	      A	string with usual UN*X filename	semantics.

       group  If the first character is	a decimal digit,  the  value  is  read
	      with strtoul() as	unsigned integer specifying a group id.	Other-
	      wise, it must be an existing group name.

       int    A	 number	following the rules of the strtol() function with base
	      "0", i.e.	decimal	number,	octal  number  with  leading  "0",  or
	      hexadecimal  number with leading "0x". The value must fit	into a
	      C	int.

       interface
	      A	string specifying the device name of a network interface.

       IPv4 address
	      A	hostname that is resolved by gethostbyname(), or an address in
	      numbers-and-dots notation.
	      Examples:	www.dest-unreach.org, dns1, 127.0.0.1

       IPv6 address
	      A	hostname that is resolved by getaddrinfo(), getipnodebyname(),
	      or gethostbyname(), or an	address	in hexnumbers-and-colons nota-
	      tion.
	      Examples:		       ip6name.domain.org,		  ::1,
	      1234:5678:9abc:def0:1234:5678:9abc:def0

       long   A	number read with strtol(). The value must fit into a C long.

       long long
	      A	 number	 read with strtoll(). The value	must fit into a	C long
	      long.

       off_t  An implementation	dependend signed number, usually 32 bits, read
	      with strtol or strtoll.

       off64_t
	      An implementation	dependend signed number, usually 64 bits, read
	      with strtol or strtoll.

       mode_t An unsigned integer, read	with strtoul(),	specifying mode	 (per-
	      mission) bits.

       pid_t  A	number,	read with strtol(), specifying a process id.

       port   A	byte2_t	(16 bit) unsigned number specifying a TCP or UDP port,
	      read with	strtoul().

       protocol
	      An unsigned 8 bit	number,	read with strtoul().

       size_t An unsigned int with size_t limitations, read with strtoul.

       sockname
	      A	socket address.	See address-option `bind'

       string A	 sequence of characters, not containing	'\0' and, depending on
	      the position within the command line, ':', ',',  or  "!!".  Note
	      that  you	might have to escape shell meta	characters in the com-
	      mand line.

       TCP service
	      A	service	name, not starting with	a digit, that is  resolved  by
	      getservbyname(), or an unsigned int 16 bit number	read with str-
	      toul().

       timeval
	      A	 double	 float specifying seconds; the number is mapped	into a
	      struct timeval, consisting of seconds and	microseconds.

       timespec
	      A	double float specifying	seconds; the number is mapped  into  a
	      struct timespec, consisting of seconds and nanoseconds.

       UDP service
	      A	 service  name,	not starting with a digit, that	is resolved by
	      getservbyname(), or an unsigned int 16 bit number	read with str-
	      toul().

       unsigned	int
	      A	number read with strtoul(). The	value must fit into  a	C  un-
	      signed int.

       user   If  the  first  character	 is a decimal digit, the value is read
	      with strtoul() as	unsigned integer specifying a user id.	Other-
	      wise, it must be an existing user	name.

EXAMPLES
       socat - TCP4:www.domain.org:80

	      Transfers	 data  between STDIO (-) and a TCP4 connection to port
	      80 of host www.domain.org. This example results in  an  interac-
	      tive  connection similar to telnet or netcat. The	stdin terminal
	      parameters are not changed, so you may close the relay  with  ^D
	      or abort it with ^C.

       socat -d	-d READLINE,history=$HOME/.http_history	\
       TCP4:www.domain.org:www,crnl

	      This  is	similar	 to the	previous example, but you can edit the
	      current line in a	bash like manner (READLINE) and	use  the  his-
	      tory  file  .http_history;  socat	prints messages	about progress
	      (-d -d). The  port is specified by service name (www), and  cor-
	      rect  network  line  termination characters (crnl) instead of NL
	      are used.

       socat TCP4-LISTEN:www TCP4:www.domain.org:www

	      Installs a simple	TCP port forwarder. With TCP4-LISTEN  it  lis-
	      tens  on	local  port "www" until	a connection comes in, accepts
	      it, then connects	to the remote  host  (TCP4)  and  starts  data
	      transfer.	It will	not accept a second connection.

       socat -d	-d -lmlocal2 \
       TCP4-LISTEN:80,bind=myaddr1,su=nobody,fork,range=10.0.0.0/8,reuseaddr \
       TCP4:www.domain.org:80,bind=myaddr2

	      TCP  port	forwarder, each	side bound to another local IP address
	      (bind). This example handles an almost arbitrary number of  par-
	      allel or consecutive connections by fork'ing a new process after
	      each  accept().  It provides a little security by	su'ing to user
	      nobody after forking; it only permits connections	from the  pri-
	      vate  10	network	(range); due to	reuseaddr, it allows immediate
	      restart after master process's termination, even if  some	 child
	      sockets  are  not	 completely  shut down.	 With -lmlocal2, socat
	      logs to stderr until successfully	reaching the accept loop. Fur-
	      ther logging is directed to syslog with facility local2.

       socat TCP4-LISTEN:5555,fork,tcpwrap=script \
       EXEC:/bin/myscript,chroot=/home/sandbox,su-d=sandbox,pty,stderr

	      A	simple	server	that  accepts  connections  (TCP4-LISTEN)  and
	      fork's a new child process for each connection; every child acts
	      as  single  relay.   The	client must match the rules for	daemon
	      process name "script" in /etc/hosts.allow	 and  /etc/hosts.deny,
	      otherwise	 it is refused access (see "man	5 hosts_access").  For
	      EXEC'uting  the  program,	 the   child   process	 chroot's   to
	      /home/sandbox, su's to user sandbox, and then starts the program
	      /home/sandbox/bin/myscript. Socat	and myscript communicate via a
	      pseudo  tty (pty); myscript's stderr is redirected to stdout, so
	      its error	messages are transferred via socat  to	the  connected
	      client.

       socat EXEC:"mail.sh target@domain.com",fdin=3,fdout=4 \
       TCP4:mail.relay.org:25,crnl,bind=alias1.server.org,mss=512

	      mail.sh  is  a shell script, distributed with socat, that	imple-
	      ments a simple SMTP client. It is	programmed to "speak" SMTP  on
	      its FDs 3	(in) and 4 (out).  The fdin and	fdout options tell so-
	      cat to use these FDs for communication with the program. Because
	      mail.sh inherits stdin and stdout	while socat does not use them,
	      the  script  can read a mail body	from stdin. Socat makes	alias1
	      your local source	address	(bind),	cares for correct network line
	      termination (crnl) and sends at most 512 data bytes  per	packet
	      (mss).

       socat - /dev/ttyS0,raw,echo=0,crnl

	      Opens  an	 interactive  connection via the serial	line, e.g. for
	      talking with a modem. raw	and echo set ttyS0's terminal  parame-
	      ters  to	practicable  values,  crnl converts to correct newline
	      characters. Consider using READLINE instead of `-'.

       socat UNIX-LISTEN:/tmp/.X11-unix/X1,fork	\
       SOCKS4:host.victim.org:127.0.0.1:6000,socksuser=nobody,sourceport=20

	      With UNIX-LISTEN,	socat opens a  listening  UNIX	domain	socket
	      /tmp/.X11-unix/X1.  This	path corresponds to local XWindow dis-
	      play :1 on your machine, so XWindow client connections  to  DIS-
	      PLAY=:1  are  accepted. Socat then speaks	with the SOCKS4	server
	      host.victim.org that might permit	sourceport  20	based  connec-
	      tions  due  to an	FTP related weakness in	its static IP filters.
	      Socat pretends to	be invoked by socksuser	nobody,	 and  requests
	      to  be connected to loopback port	6000 (only weak	sockd configu-
	      rations will allow this).	So we get a connection to the  victims
	      XWindow  server  and, if it does not require MIT cookies or Ker-
	      beros authentication, we can start work. Please note that	 there
	      can  only	be one connection at a time, because TCP can establish
	      only one session with a given set	of addresses and ports.

       socat -u	/tmp/readdata,seek-end=0,ignoreeof -

	      This is an example for unidirectional data transfer (-u).	 Socat
	      transfers	data from file /tmp/readdata (implicit address GOPEN),
	      starting at its current end (seek-end=0 lets socat start reading
	      at  current  end	of file; use seek=0 or no seek option to first
	      read the existing	data) in a "tail -f"  like  mode  (ignoreeof).
	      The  "file" might	also be	a listening UNIX domain	socket (do not
	      use a seek option	then).

       (sleep 5; echo PASSWORD;	sleep 5; echo ls; sleep	1) |
       socat - EXEC:'ssh -l user server',pty,setsid,ctty

	      EXEC'utes	an ssh session to server. Uses a pty for communication
	      between socat and	ssh, makes it ssh's  controlling  tty  (ctty),
	      and makes	this pty the owner of a	new process group (setsid), so
	      ssh accepts the password from socat.

       socat -u	TCP4-LISTEN:3334,reuseaddr,fork	\
       OPEN:/tmp/in.log,creat,append

	      Implements  a  simple network based message collector.  For each
	      client connecting	to port	3334, a	new child process is generated
	      (option fork).  All data sent by the clients  are	 append'ed  to
	      the file /tmp/in.log.  If	the file does not exist, socat creat's
	      it.   Option  reuseaddr  allows  immediate restart of the	server
	      process.

       socat READLINE,noecho='[Pp]assword:' EXEC:'ftp ftp.server.com',pty,set-
       sid,ctty

	      Puts a command line history (READLINE) in	front of the EXEC'uted
	      ftp client utility.  This	allows editing and reuse of  FTP  com-
	      mands for	relatively comfortable browsing	through	the ftp	direc-
	      tory hierarchy. The password is echoed!  pty is required to have
	      ftp  issue  a prompt.  Nevertheless, there may occur some	confu-
	      sion with	the password and FTP prompts.

	      On server	with modem:

       socat TCP4-LISTEN:54321,reuseaddr /dev/ttyS0,nonblock

	      On client: mkdir $HOME/dev

       socat PTY,link=$HOME/dev/vmodem0	TCP4:modemserver.us.org:54321

	      Installs a TCP4 service on a modemserver and generates a	pseudo
	      terminal	device	(PTY)  on the client that can be reached under
	      the symbolic link	$HOME/dev/vmodem0. Now an application  on  the
	      client  that expects a serial line or modem can be configured to
	      use  $HOME/dev/vmodem0;  its  traffic  will   be	 directed   to
	      /dev/ttyS0 on the	modem server.

       socat TCP4-LISTEN:2022,reuseaddr,fork \
       PROXY:proxy:www.domain.org:22,proxyport=3128,proxyauth=user:pass

	      starts  a	 forwarder  that accepts connections on	port 2022, and
	      directs them through the proxy daemon  listening	on  port  3128
	      (proxyport)  on host proxy, using	the CONNECT method, where they
	      are authenticated	as "user" with "pass" (proxyauth).  The	 proxy
	      should  establish	 connections to	host www.domain.org on port 22
	      then.

       echo |socat -u -	file:/tmp/bigfile,create,largefile,seek=100000000000

	      creates a	100GB sparse file; this	requires a  file  system  type
	      that supports this (ext2,	ext3, reiserfs,	jfs; not minix,	vfat).
	      The  operation of	writing	1 byte might take long (reiserfs: some
	      minutes; ext2: "no" time), and the resulting  file  can  consume
	      some  disk  space	 with  just  its  inodes (reiserfs: 2MB; ext2:
	      16KB).

       socat tcp-l:7777,reuseaddr,fork system:'filan -i	0 -s >&2',nofork

	      listens for incoming TCP connections on port 7777. For each  ac-
	      cepted connection, invokes a shell. This shell has its stdin and
	      stdout directly connected	to the TCP socket (nofork).  The shell
	      starts  filan  and  lets it print	the socket addresses to	stderr
	      (your terminal window).

       echo -e

	      functions	as primitive binary editor: it writes the 4 bytes  000
	      014   000	  000  to  the	executable  /usr/bin/squid  at	offset
	      0x00074420 (this is a real world patch to	make  the  squid  exe-
	      cutable from Cygwin run under Windows, actual per	May 2004).

DIAGNOSTICS
       Socat uses a logging mechanism that allows to filter messages by	sever-
       ity.  The severities provided are more or less compatible to the	appro-
       priate syslog priority. With one	or up to four occurrences  of  the  -d
       command	line  option,  the lowest priority of messages that are	issued
       can be selected.	Each message contains  a  single  uppercase  character
       specifying the messages severity	(one of	F, E, W, N, I, or D)

       FATAL: Conditions that require unconditional and	immediate program ter-
	      mination.

       ERROR: Conditions  that	prevent	proper program processing. Usually the
	      program is terminated (see option	-s).

       WARNING:
	      Something	did not	function correctly or is in a state where cor-
	      rect further processing cannot be	guaranteed, but	might be  pos-
	      sible.

       NOTICE:
	      Interesting  actions  of the program, e.g. for supervising socat
	      in some kind of server mode.

       INFO:  Description of what the program does, and	maybe why it happens.

       DEBUG: Description of how the program  works,  all  system  or  library
	      calls and	their results.

       Log messages can	be written to stderr, to a file, or to syslog.

       On exit,	socat gives status 0 if	it terminated due to EOF or inactivity
       timeout,	 with  a positive value	on error, and with a negative value on
       fatal error.

FILES
       /usr/bin/socat
       /usr/bin/filan
       /usr/bin/procan

CREDITS
       The work	of the following groups	and organizations was  invaluable  for
       this project:

       The  FSF	(GNU, http://www.fsf.org/ project with their free and portable
       development software and	lots of	other useful tools and libraries.

       The Linux developers community (http://www.linux.org/) for providing  a
       free, open source operating system.

       Sourceforge  (http://www.sourceforge.net/) for providing	a compile farm
       with Solaris, FreeBSD, and MacOS	X machines, making these ports	possi-
       ble.

       The Open	Group (http://www.unix-systems.org/) for making	their standard
       specifications available	on the Internet	for free.

VERSION
       This man	page describes version 1.4.2 of	socat.

BUGS
       socat is	not POSIX.1 compliant.

       Addresses  cannot  be  nested,  so a single socat process cannot, e.g.,
       drive ssl over socks.

       In address specifications, characters with special meaning  (':',  ',',
       '!!')  cannot be	escaped, so it is hardly possible to directly invoke a
       second socat instance from an exec type address.

       IPv6 address specification does not allow '[' and ']'.

       Proxy, socks, and openssl addresses cannot use IP6 transport.

       Address option ftruncate	without	value uses default 1 instead of	0.

       Verbose modes (-x and/or	-v) display line termination characters	incon-
       sistently when address options cr or crnl are used.

       The data	transfer blocksize setting (-b)	is ignored with	address	 read-
       line.

       Send bug	reports	to <socat@dest-unreach.org>

SEE ALSO
       nc(1),	netcat6(1),   sock(1),	 rinetd(8),   cage(1),	socks.conf(5),
       openssl(1), stunnel(8), pty(1), rlwrap(1), setsid(1)

       Socat home page http://www.dest-unreach.org/socat/

AUTHOR
       Gerhard Rieger <rieger@dest-unreach.org>

socat				  March	2005			      socat(1)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=socat&sektion=1&manpath=FreeBSD+6.0-RELEASE+and+Ports>

home | help