| .TH 9P-CMDBUF 3 |
| .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 (3)). |
| It returns a |
| .B Cmdbuf |
| structure holding pointers to each field in the message. |
| .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 Plan 9 kernel driver |
| .RB ( /sys/src/9/*/dev*.c |
| on Plan 9) |
| is a good example. |
| .SH SOURCE |
| .B \*9/src/lib9p/parse.c |
| .SH SEE ALSO |
| .IR 9p (3) |