|  | .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. |