123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120 |
- .TH 9PCMDBUF 2
- .SH NAME
- Cmdbuf, parsecmd, respondcmderror, lookupcmd \- control message parsing
- .SH SYNOPSIS
- .ft L
- .nf
- #include <u.h>
- #include <libc.h>
- #include <fcall.h>
- #include <thread.h>
- #include <9p.h>
- .fi
- .PP
- .ft L
- .nf
- .ta \w'\fL1234'u +\w'\fL12345678'u
- 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, ...)
- .fi
- .SH DESCRIPTION
- These data structures and functions provide parsing of textual control messages.
- .PP
- .I Parsecmd
- treats the
- .I n
- bytes at
- .I p
- (which need not be NUL-terminated) as a UTF string and splits it
- using
- .I tokenize
- (see
- .IR getfields (2)).
- It returns a
- .B 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.
- .PP
- .I Lookupcmd
- walks through the array
- .IR ctab ,
- which has
- .I ntab
- entries,
- looking for the first
- .B Cmdtab
- that matches the parsed command.
- (If the parsed command is empty,
- .I lookupcmd
- returns nil immediately.)
- A
- .B Cmdtab
- matches the command if
- .I cmd
- is equal to
- .IB cb -> f [0]
- or if
- .I cmd
- is
- .LR * .
- Once a matching
- .B Cmdtab
- has been found, if
- .I narg
- is not zero, then the parsed command
- must have exactly
- .I narg
- fields (including the command string itself).
- If the command has the wrong number of arguments,
- .I lookupcmd
- returns nil.
- Otherwise, it returns a pointer to the
- .B Cmdtab
- entry.
- If
- .I lookupcmd
- does not find a matching command at all,
- it returns nil.
- Whenever
- .I lookupcmd
- returns nil, it sets the system error string.
- .PP
- .I Respondcmderror
- resoponds to request
- .I r
- with an error of the form
- `\fIfmt\fB:\fI cmd\fR,'
- where
- .I fmt
- is the formatted string and
- .I cmd
- is a reconstruction of the parsed command.
- Fmt
- is often simply
- .B "%r" .
- .SH EXAMPLES
- This interface is not used in any distributed 9P servers.
- It was lifted from the Plan 9 kernel.
- Almost any kernel driver
- .RB ( /sys/src/9/*/dev*.c )
- is a good example.
- .SH SOURCE
- .B /sys/src/lib9p/parse.c
- .SH SEE ALSO
- .IR 9p (2)
|