9P-CMDBUF(3)                                         9P-CMDBUF(3)

          Cmdbuf, parsecmd, respondcmderror, lookupcmd - control
          message parsing

          #include <u.h>
          #include <libc.h>
          #include <fcall.h>
          #include <thread.h>
          #include <9p.h>

          typedef struct Cmdbuf
              char    *buf;
              char    **f;
              int     nf;
          } Cmdbuf;

          typedef struct Cmdtab
              int     index;
              char    *cmd;
              int     narg;

          Cmdbuf      *parsecmd(char *p, int n)
          Cmdtab      *lookupcmd(Cmdbuf *cb, Cmdtab *tab, int ntab)
          void        respondcmderror(Req *r, Cmdbuf *cb, char *fmt, ...)

          These data structures and functions provide parsing of
          textual control messages.

          Parsecmd treats the n bytes at p (which need not be NUL-
          terminated) as a UTF string and splits it using tokenize
          (see getfields(3)). It returns a Cmdbuf structure holding
          pointers to each field in the message.

          Lookupcmd walks through the array ctab, which has ntab
          entries, looking for the first Cmdtab that matches the
          parsed command.  (If the parsed command is empty, lookupcmd
          returns nil immediately.)  A Cmdtab matches the command if
          cmd is equal to cb->f[0] or if cmd is `*'.  Once a matching
          Cmdtab has been found, if narg is not zero, then the parsed
          command must have exactly narg fields (including the command
          string itself).  If the command has the wrong number of
          arguments, lookupcmd returns nil.  Otherwise, it returns a
          pointer to the Cmdtab entry.  If lookupcmd does not find a
          matching command at all, it returns nil.  Whenever lookupcmd
          returns nil, it sets the system error string.

     9P-CMDBUF(3)                                         9P-CMDBUF(3)

          Respondcmderror resoponds to request r with an error of the
          form `fmt: cmd,' where fmt is the formatted string and cmd
          is a reconstruction of the parsed command.  Fmt is often
          simply %r .

          This interface is not used in any distributed 9P servers.
          It was lifted from the Plan 9 kernel.  Almost any Plan 9
          kernel driver (/sys/src/9/*/dev*.c on Plan 9) is a good