| .TH PROTO 3 |
| .SH NAME |
| rdproto \- parse and process a proto file listing |
| .SH SYNOPSIS |
| .nf |
| .ft L |
| #include <u.h> |
| #include <libc.h> |
| #include <disk.h> |
| .ft |
| .PP |
| .B |
| typedef void Protoenum(char *new, char *old, Dir *d, void *a) |
| .PP |
| .B |
| typedef void Protowarn(char *msg, void *a) |
| .PP |
| .B |
| int rdproto(char *proto, char *root, Protoenum *enm, |
| .br |
| .B |
| Protowarn *warn, void *a) |
| .SH DESCRIPTION |
| .I Rdproto |
| reads and interprets the named |
| .I proto |
| file relative to the |
| root directory |
| .IR root . |
| .PP |
| Each line of the |
| .I proto |
| file specifies a file to copy. |
| Blank lines and lines beginning with |
| .B # |
| are ignored. |
| Indentation (usually tabs) is significant, |
| with each level of indentation corresponding to a level in the file tree. |
| Fields within a line are separated by white space. |
| The first field is the last path element in the destination file tree. |
| The second field specifies the permissions. |
| The third field is the owner of the file, |
| and the fourth is the group owning the file. |
| The fifth field is the name of the file from which to copy; |
| this file is read from the current name space, |
| not the source file tree. |
| All fields except the first are optional. |
| Specifying |
| .B - |
| for permissions, owner, or group |
| causes |
| .I rdproto |
| to fetch the corresponding information |
| from the file rather than override it. |
| (This is the default behavior when the fields |
| are not present; explicitly specifying |
| .B - |
| is useful when one wishes to set, say, |
| the file owner without setting the permissions.) |
| .PP |
| Names beginning with a |
| .L $ |
| are expanded as environment variables. |
| If the first file specified in a directory is |
| .LR * , |
| all of the files in that directory are considered listed. |
| If the first file is |
| .LR + , |
| all of the files are copied, and all subdirectories |
| are recursively considered listed. |
| All files are considered relative to |
| .IR root . |
| .PP |
| For each file named by the |
| .IR proto , |
| .I enm |
| is called with |
| .I new |
| pointing at the name of the file (without the root prefix), |
| .I old |
| pointing at the name of the source file (with the root prefix, |
| when applicable), |
| and |
| .I Dir |
| at the desired directory information for the new file. |
| Only the |
| .BR name , |
| .BR uid , |
| .BR gid , |
| .BR mode , |
| .BR mtime , |
| and |
| .B length |
| fields are guaranteed to be valid. |
| The argument |
| .I a |
| is the same argument passed to |
| .IR rdproto ; |
| typically it points at some extra state |
| used by the enumeration function. |
| .PP |
| When files or directories do not exist or |
| cannot be read by |
| .IR rdproto , |
| it formats a warning message, calls |
| .IR warn , |
| and continues processing; |
| if |
| .I warn |
| is nil, |
| .I rdproto |
| prints the warning message to standard error. |
| .PP |
| .I Rdproto |
| returns zero |
| if |
| .I proto |
| was processed, \-1 if it could not be opened. |
| .SH FILES |
| .TF /sys/lib/sysconfig/proto/portproto |
| .TP |
| .B /sys/lib/sysconfig/proto/ |
| directory of prototype files. |
| .TP |
| .B /sys/lib/sysconfig/proto/portproto |
| generic prototype file. |
| .SH SOURCE |
| .B \*9/src/libdisk/proto.c |
| .SH SEE ALSO |
| .IR mk9660 (1), |
| Plan 9's \fImkfs\fR(8) |