9PCMDBUF(2) 9PCMDBUF(2)
NAME
Cmdbuf, parsecmd, respondcmderror, lookupcmd - control
message parsing
SYNOPSIS
#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, ...)
DESCRIPTION
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(2)). It returns a Cmdbuf structure holding
pointers to each field in the message. 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[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
9PCMDBUF(2) 9PCMDBUF(2)
matching command at all, it returns nil. Whenever lookupcmd
returns nil, it sets the system error string.
Respondcmderror responds 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 .
EXAMPLES
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.
SOURCE
/sys/src/lib9p/parse.c
SEE ALSO
9p(2)