plumber is a user-level file server that receives, examines, rewrites, and dispatches
messages between programs.
Its behavior is programmed by a
plumbing file (default
$HOME/lib/plumbing) in the format of
Its services are posted via
plumb. and consist of two
plumb/rules, and a set of output
ports for dispatching messages to applications.
to deliver messages to the
send file, and
fsread to receive them from the corresponding port.
plumb menu item or the
B command cause a message to be sent to
sam in turn reads from, by convention,
plumb/edit to receive messages about files to open.
A copy of each message is sent to each client that has the corresponding port open.
If none has it open, and the rule has a
start rule, that rule is applied.
client rule causes the specified command to be run
and the message to be held for delivery when the port is opened.
start rule runs the command but discards the message.
client is specified and the port is not open,
the message is discarded and a write error is returned to the sender.
The set of output ports is determined dynamically by the
specification in the plumbing rules file: a port is created for each unique
destination of a
The set of rules currently active may be examined by reading the file
plumb/rules; appending to this file adds new rules to the set, while
creating it (opening it with
OTRUNC) clears the rule set.
Thus the rule set may be edited dynamically with a traditional text editor.
However, ports are never deleted dynamically; if a new set of rules does not
include a port that was defined in earlier rules, that port will still exist (although
no new messages will be delivered there).