ipcsockd (inter-process communication socket daemon) is a
super-server daemon for UNIX domain sockets. Think of it as xinetd but for
UNIX domain sockets.
To run a command myserver http everytime a connection to the socket a.sock
in the current directory is made:
ipcsockd ./a.sock myserver http
For each incoming connection, ipcsockd will execute the command myserver http in a separate thread, with passing input from the socket to the thread's
stdin, and passing output from the thread's stdout back to the socket.
To run a command with flags (ex. myserver http --cool-feature -v), prepend
the command with a -- to escape those arguments:
ipcsockd ./a.sock -- myserver http --cool-feature -v
If -- is not provided, ipcsockd will assume those flags were meant for
itself rather than for the command.
To perform the same given above, but limit concurrent connections to 20:
ipcsockd -l 20 ./a.sock -- myserver http --cool-feature -v
ipcsockd is not limited to just HTTP applications. You can do much more with
it.
For more technical information, run ipcsockd --help.
This demo requires ncat (nc) to be installed.
Here, we create a socket /tmp/cat.sock which echoes what you send to the
socket back. Bind to the socket using ipcsockd and instruct it to run
cat(1) for each connection.
ipcsockd /tmp/cat.sock cat
It should print "OK". Now, in another terminal, run
echo "hello" | nc -U /tmp/cat.sock
It will print "hello" back!
$ echo "hello" | nc -U /tmp/cat.sock
hello
You can also try this using curl(1):
$ curl --unix-socket /tmp/cat.sock http://localhost/hello --http0.9
GET /hello HTTP/1.1
Host: localhost
User-Agent: curl/7.82.0
Accept: */*
It printed the request curl sent to the socket.
ipcsockd requires a Rust toolchain to compile. To build a debug build (ideal for testing/reporting bugs), run
cargo build
For a release build (ideal to distribute or run in production), run
cargo build --release
Copyright (C) 2022 Pranav Karawale https://karawale.in
This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License along with this program. If not, see https://www.gnu.org/licenses/.
This notice and license notices of dependencies can be found in the LICENSE
file.