_ _ __ ___ _ __ | |__ _ _ | '__/ _ \| '_ \| '_ \| | | | | | | (_) | |_) | | | | |_| | |_| \___/| .__/|_| |_|\__, | |_| |___/ https://uninformativ.de/git/rophy https://uninformativ.de/bugs.html - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - rophy is a simple Gopher server with a limited feature set written in Rust. It targets OpenBSD and uses pledge() / unveil(), but should also work on other systems. It expects to be called by inetd or systemd's socket activation. Installation ------------ Run "cargo build --release". Running ------- rophy does not implement any "daemon" functionality, thus you need to use inetd or systemd's socket activation (xinetd probably also works but is not tested). You will also need to set up your Gopher hole which will probably need to include some index files. Refer to the manpage for further details. Non-goals --------- rophy tries to reduce the attack surface. On OpenBSD, it will call pledge() and unveil() very early on, locking the process to its docroot and making it impossible to open new sockets or exec into other programs. As a consequence, there is no "CGI" functionality like other Gopher servers have it. This is on purpose and won't be added. The builtin search functionality is the only way to get dynamic content. rophy also won't gain a standalone server mode. Daemons like inetd already exist and we don't need to reimplement them. Performance is good enough (you won't be able to serve ~10'000 requests per second with rophy, but such a thing does not exist in the world of Gopher anyway).