Cmdbuf, parsecmd, respondcmderror, lookupcmd - control message parsing
typedef struct Cmdbuf
typedef struct Cmdtab
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
Parsecmd treats the n bytes at p (which need not be NUL-terminated) as
a UTF string and splits it using tokenize (see getfields(2)). It
returns a Cmdbuf structure holding pointers to each field in the mes‐
sage. It is the caller's responsibility to free this structure when it
is no longer needed.
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 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.
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 kernel driver
(/sys/src/9/*/dev*.c) is a good example.