                   _
   _ __ ___  _ __ | |__  _   _
  | '__/ _ \| '_ \| '_ \| | | |
  | | | (_) | |_) | | | | |_| |
  |_|  \___/| .__/|_| |_|\__, |
            |_|          |___/
  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).
