PROTO(2)                                                 PROTO(2)

     NAME
          rdproto - parse and process a proto file listing

     SYNOPSIS
          #include <u.h>
          #include <libc.h>
          #include <disk.h>

          typedef void Protoenum(char *new, char *old, Dir *d, void *a)

          typedef void Protowarn(char *msg, void *a)

          int rdproto(char *proto, char *root, Protoenum *enm,
                                   Protowarn *warn, void *a)

     DESCRIPTION
          Rdproto reads and interprets the named proto file relative
          to the root directory root.

          Each line of the proto file specifies a file to copy except
          lines in the form of attr=val which sets an attribute (see
          below).  Blank lines and lines beginning with # 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 - for permissions, owner, or
          group causes 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 speci-
          fying - is useful when one wishes to set, say, the file
          owner without setting the permissions.)

          Names beginning with a `$' are expanded as environment vari-
          ables.  If the first file specified in a directory is `*',
          all of the files in that directory are considered listed.
          If the first file is `+', all of the files are copied, and
          all subdirectories are recursively considered listed.  All
          files are considered relative to root.

          Attributes, lines in the form of attr=val, apply to all
          files in the current indention level after the attribute
          line.  Attributes are inherited to deeper levels but each
          level can override them individualy.  The attribute
          skip=regexp skips all file names matching the regular

     PROTO(2)                                                 PROTO(2)

          expression regexp for * and + operations using regexp(2). If
          owner or group is left unspecified on a file, the attributes
          uid=owner and gid=group will override these fields.  The
          mode=mode attribute adds, sets or masks file permission bits
          if permissions where not explicitly specified on the file.
          If multiple mode= lines are given and mode is not a set
          operation (forced by ! character) the modes are combined.
          Except for the special ! character, mode has the same syntax
          as in chmod(1).

          For each file named by the proto, enm is called with new
          pointing at the name of the file (without the root prefix),
          old pointing at the name of the source file (with the root
          prefix, when applicable), and Dir at the desired directory
          information for the new file.  Only the name, uid, gid,
          mode, mtime, and length fields are guaranteed to be valid.
          The argument a is the same argument passed to rdproto; typi-
          cally it points at some extra state used by the enumeration
          function.

          When files or directories do not exist or cannot be read by
          rdproto, it formats a warning message, calls warn, and con-
          tinues processing; if warn is nil, rdproto prints the warn-
          ing message to standard error.

          Rdproto returns zero if proto was processed, -1 if it could
          not be opened.

     FILES
          /sys/lib/sysconfig/proto/           directory of prototype
                                              files.
          /sys/lib/sysconfig/proto/portproto  generic prototype file.

     SOURCE
          /sys/src/libdisk/proto.c

     SEE ALSO
          mk9660(8), mkfs(8), regexp(2), chmod(1).