1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
|
.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
.MR 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
.MR 9p (3)
|