# stdintap
Read lines from stdin and copy them to all connected clients.
## Features
* UNIX socket support (including Linux's abstract namespace)
* Adjustable behaviour of handling slow clients: lines may be dropped or backpressure can be applied.
* For slow clients, `stdintap` can announce number of omitted lines. Alternatively, it can announce moments where backpressure was applied.
* History mode - `stdintap` can keep N last lines and replay them to connected clients. There is optional announcement where history ends and realtime data begins.
* Optional printing of timestamps (using monotonic timer) and sequence numbers.
* Maximum line size is limited (adjustable). You can use zero byte instead of newline if needed.
* You can request content to be also forwarded to stdout.
* Reasonable performance.
## Examples
Simple
```
| $ stdintap 127.0.0.1:1234
| A
| B
| C | $ nc 127.0.0.1 1234
| D | D
| E | E
| F | F | $ nc 127.0.0.1 1234
| G | G | G
| H | ^C | H
| I | $ | I
| J | J
...
```
Advanced options
```
| $ stdintap @qqq -x -H --history 2 -t --seqn
| a
| b
| c
| d
| e
| | $ socat - abstract:qqq
| | 000004.000452 3 d
| | 000006.000780 4 e
| | 000012.000967 HELLO
| f | 000085.000356 5 f
| g | 000090.000084 6 g
| ^D | 000134.000408 EOF
| $ | $
```
Overrun announcements
```
| $ stdintap @qqq -x --qlen 1 --send-buffer-size 16
| | $ socat - abstract:qqq,rcvbuf=16
| 000000000000000 | 000000000000000
| 111111111111111 | 111111111111111
| 222222222222222 | 222222222222222
| | ^Z
| | [1]+ Stopped
| | $
| 333333333333333
| 444444444444444
| 555555555555555
| 666666666666666
| 777777777777777
| 888888888888888
| 999999999999999
| AAAAAAAAAAAAAAA
| BBBBBBBBBBBBBBB
| CCCCCCCCCCCCCCC
| DDDDDDDDDDDDDDD
| EEEEEEEEEEEEEEE
| FFFFFFFFFFFFFFF
| GGGGGGGGGGGGGGG
| | $ fg
| | 444444444444444
| | 555555555555555
| | 666666666666666
| | 777777777777777
| | 888888888888888
| | 999999999999999
| | AAAAAAAAAAAAAAA
| | OVERRUN 5
| | GGGGGGGGGGGGGGG
| HHHHHHHHHHHHHHH | HHHHHHHHHHHHHHH
| ^D | EOF
| $ | $
```
## Installation
Download a pre-built executable from [Github releases](https://github.com/vi/stdintap/releases) or install from source code with `cargo install --path .` or `cargo install stdintap`.
## CLI options
stdintap --help output (not including the `tokio-listener` options)
```
CLI tool to read lines from stdin and broadcast them to connected TCP clients
Usage:
Arguments:
Socket address to listen for incoming connections.
Various types of addresses are supported:
* TCP socket address and port, like 127.0.0.1:8080 or [::]:80
* UNIX socket path like /tmp/mysock or Linux abstract address like @abstract
* Special keyword "sd-listen" to accept connections from file descriptor 3 (e.g. systemd socket activation). You can also specify a named descriptor after a colon or * to use all passed sockets.
Note that some features may be disabled by compile-time settings.
Options:
-q, --qlen
Size of broadcast channel for serving the lines
[default: 16]
--backpressure
Slow down reading from stdin if connected clients are slow in reading output
-x, --announce-overruns
Inject special lines that denote missed content due to slow reading In `--backpressure` mode, it will insert announcements that backpressure is applied Additionally, stdin EOFs will also be announced.
When `--timestamps` are active, special lines are separated from the timestamp by spaces instead of tabs.
Note that overrun announcements may exacerbate overruns.
--disconnect-on-overruns
Disconnect clients when they are too slow to read lines
-t, --timestamps
Prefix messages with a monotone timestamps
-H, --hello-message
Inject initial message at the beginning of each client connection
With --history option, the hello message appears after the history, before the "online" content.
--max-line-size
Automatically split lines longer than this
[default: 65536]
-0, --zero-separated
Separata lines by zero byte instead of \n
-T, --tee
Also copy stdin to stdout
--seqn
Print sequence numbers of lines
--history
Remember and this number of lines and replay them to each connecting client
--require-observer
Don't read from stdin unless at least one client is connected.
Does not gurantee lack of dropped lines on disconnections.
-h, --help
Print help (see a summary with '-h')
-V, --version
Print version
```
(manually removed an inapplicable phrase)
Socket listening options
```
--unix-listen-unlink
remove UNIX socket prior to binding to it
--unix-listen-chmod
change filesystem mode of the newly bound UNIX socket to `owner`, `group` or `everybody`
--unix-listen-uid
change owner user of the newly bound UNIX socket to this numeric uid
--unix-listen-gid
change owner group of the newly bound UNIX socket to this numeric uid
--sd-accept-ignore-environment
ignore environment variables like LISTEN_PID or LISTEN_FDS and unconditionally use file descritor `3` as a socket in sd-listen or sd-listen-unix modes
--tcp-keepalive
set SO_KEEPALIVE settings for each accepted TCP connection.
Value is a colon-separated triplet of time_ms:count:interval_ms, each of which is optional.
--tcp-reuse-port
Try to set SO_REUSEPORT, so that multiple processes can accept connections from the same port in a round-robin fashion
--recv-buffer-size
Set socket's SO_RCVBUF value
--send-buffer-size
Set socket's SO_SNDBUF value
--tcp-only-v6
Set socket's IPV6_V6ONLY to true, to avoid receiving IPv4 connections on IPv6 socket
--tcp-listen-backlog
Maximum number of pending unaccepted connections
```
## See also
* https://github.com/vi/line2httppost + https://github.com/vi/postsse
* https://github.com/vi/websocat + https://github.com/vi/wsbroad