| .TH PLUMBER 4 |
| .SH NAME |
| plumber \- file system for interprocess messaging |
| .SH SYNOPSIS |
| .B plumber |
| [ |
| .B -p |
| .I plumbing |
| ] |
| .SH DESCRIPTION |
| The |
| .I plumber |
| is a user-level file server that receives, examines, rewrites, and dispatches |
| .IR plumb (7) |
| messages between programs. |
| Its behavior is programmed by a |
| .I plumbing |
| file (default |
| .BR $HOME/lib/plumbing ) |
| in the format of |
| .IR plumb (7). |
| .PP |
| Its services are posted via |
| .IR 9pserve (4) |
| as |
| .BR plumb . |
| and consist of two |
| pre-defined files, |
| .B plumb/send |
| and |
| .BR plumb/rules , |
| and a set of output |
| .I ports |
| for dispatching messages to applications. |
| .PP |
| Programs use |
| .B fswrite |
| (see |
| .IR 9pclient (3)) |
| to deliver messages to the |
| .B send |
| file, and |
| .I fsread |
| to receive them from the corresponding port. |
| For example, |
| .IR sam (1)'s |
| .B plumb |
| menu item or the |
| .B B |
| command cause a message to be sent to |
| .BR plumb/send ; |
| .B sam |
| in turn reads from, by convention, |
| .B plumb/edit |
| to receive messages about files to open. |
| .PP |
| 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 |
| .B plumb |
| .B client |
| or |
| .B plumb |
| .B start |
| rule, that rule is applied. |
| A |
| .B plumb |
| .B client |
| rule causes the specified command to be run |
| and the message to be held for delivery when the port is opened. |
| A |
| .B plumb |
| .B start |
| rule runs the command but discards the message. |
| If neither |
| .B start |
| or |
| .B client |
| is specified and the port is not open, |
| the message is discarded and a write error is returned to the sender. |
| .PP |
| 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 |
| .B plumb |
| .B to |
| rule. |
| .PP |
| The set of rules currently active may be examined by reading the file |
| .BR plumb/rules ; |
| appending to this file adds new rules to the set, while |
| creating it (opening it with |
| .BR 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). |
| .SH FILES |
| .TF $HOME/lib/plumbing |
| .TP |
| .B $HOME/lib/plumbing |
| default rules file |
| .TP |
| .B \*9/plumb |
| directory to search for files in |
| .B include |
| statements |
| .TP |
| .B plumb |
| mount name for |
| .IR plumber (4). |
| .SH SOURCE |
| .B \*9/src/cmd/plumb |
| .SH "SEE ALSO" |
| .IR plumb (1), |
| .IR plumb (3), |
| .IR plumb (7) |
| .\" .SH BUGS |
| .\" .IR Plumber 's |
| .\" file name space is fixed, so it is difficult to plumb |
| .\" messages that involve files in newly mounted services. |