s6
Software
skarnet.org
The s6-ioconnect program
s6-ioconnect performs full-duplex data transmission
between two sets of open file descriptors.
Interface
s6-ioconnect [ -t millisecs ] [ -r fdr ] [ -w fdw ]
- s6-ioconnect reads data from its stdin and writes it as is to
file descriptor 7, which is assumed to be open.
- It also reads data from its file descriptor 6, which is assumed
to be open, and writes it as is to its stdout.
- When both sides have transmitted EOF and s6-ioconnect has
flushed its buffers, it exits 0.
Options
- -t millisecs : if no activity on
either side happens for millisecs milliseconds, s6-ioconnect
closes the connection on both ends and exits 1. By default,
millisecs is 0, which means no such timeout.
- -r fdr : Use fd fdr for
"remote" reading instead of fd 6.
- -w fdw : Use fd fdw for
"remote" writing instead of fd 7.
- The -0, -1, -6 and -7 options
are still recognized for compatibility, but do nothing; they are
deprecated. They were previously used to tell
s6-ioconnect that the local reading, local writing, remote reading and
remote writing endpoints, respectively, were sockets — but this is
now autodetected.
Notes
- The point of s6-ioconnect is to be used together with
s6-tcpclient or
s6-ipcclient to establish a full-
duplex connection between the client and the server, for instance
for testing purposes. s6-ioconnect is to s6-tcpclient as
cat is to s6-tcpserver: a program that will just echo
what it gets.
- The s6-ioconnect utility was once part of the
s6-networking
suite, which is why the
examples here involve TCP. Nevertheless, it can be used with connections
across Unix domain sockets as well, and has its place in the s6
package.
- If one of the endpoints is a socket, s6-ioconnect will call
shutdown()
on it (for reading or writing, depending on the endpoint) when it
needs to transmit EOF. This is a necessary workaround to a
misdesign of the
socket API, but it could have unintended consequences
when the socket is shared among several processes that expect a
persistent connection. Most of the time, however, it is a mistake
to share a data socket between processes, so s6-ioconnect's behaviour
is suited to an overwhelming majority of cases, and the exceptions are
specialized enough that they won't need to use s6-ioconnect.