Blame


1 cfa37a7b 2004-04-10 devnull .TH 9PCMDBUF 3
2 cfa37a7b 2004-04-10 devnull .SH NAME
3 cfa37a7b 2004-04-10 devnull Cmdbuf, parsecmd, respondcmderror, lookupcmd \- control message parsing
4 cfa37a7b 2004-04-10 devnull .SH SYNOPSIS
5 cfa37a7b 2004-04-10 devnull .ft L
6 cfa37a7b 2004-04-10 devnull .nf
7 cfa37a7b 2004-04-10 devnull #include <u.h>
8 cfa37a7b 2004-04-10 devnull #include <libc.h>
9 cfa37a7b 2004-04-10 devnull #include <fcall.h>
10 cfa37a7b 2004-04-10 devnull #include <thread.h>
11 cfa37a7b 2004-04-10 devnull #include <9p.h>
12 cfa37a7b 2004-04-10 devnull .fi
13 cfa37a7b 2004-04-10 devnull .PP
14 cfa37a7b 2004-04-10 devnull .ft L
15 cfa37a7b 2004-04-10 devnull .nf
16 cfa37a7b 2004-04-10 devnull .ta \w'\fL1234'u +\w'\fL12345678'u
17 cfa37a7b 2004-04-10 devnull typedef struct Cmdbuf
18 cfa37a7b 2004-04-10 devnull {
19 cfa37a7b 2004-04-10 devnull char *buf;
20 cfa37a7b 2004-04-10 devnull char **f;
21 cfa37a7b 2004-04-10 devnull int nf;
22 cfa37a7b 2004-04-10 devnull } Cmdbuf;
23 cfa37a7b 2004-04-10 devnull
24 cfa37a7b 2004-04-10 devnull typedef struct Cmdtab
25 cfa37a7b 2004-04-10 devnull {
26 cfa37a7b 2004-04-10 devnull int index;
27 cfa37a7b 2004-04-10 devnull char *cmd;
28 cfa37a7b 2004-04-10 devnull int narg;
29 cfa37a7b 2004-04-10 devnull };
30 cfa37a7b 2004-04-10 devnull
31 cfa37a7b 2004-04-10 devnull Cmdbuf *parsecmd(char *p, int n)
32 cfa37a7b 2004-04-10 devnull Cmdtab *lookupcmd(Cmdbuf *cb, Cmdtab *tab, int ntab)
33 cfa37a7b 2004-04-10 devnull void respondcmderror(Req *r, Cmdbuf *cb, char *fmt, ...)
34 cfa37a7b 2004-04-10 devnull .fi
35 cfa37a7b 2004-04-10 devnull .SH DESCRIPTION
36 cfa37a7b 2004-04-10 devnull These data structures and functions provide parsing of textual control messages.
37 cfa37a7b 2004-04-10 devnull .PP
38 cfa37a7b 2004-04-10 devnull .I Parsecmd
39 cfa37a7b 2004-04-10 devnull treats the
40 cfa37a7b 2004-04-10 devnull .I n
41 cfa37a7b 2004-04-10 devnull bytes at
42 cfa37a7b 2004-04-10 devnull .I p
43 cfa37a7b 2004-04-10 devnull (which need not be NUL-terminated) as a UTF string and splits it
44 cfa37a7b 2004-04-10 devnull using
45 058b0118 2005-01-03 devnull .I tokenize
46 058b0118 2005-01-03 devnull (see
47 058b0118 2005-01-03 devnull .IR getfields (3)).
48 cfa37a7b 2004-04-10 devnull It returns a
49 cfa37a7b 2004-04-10 devnull .B Cmdbuf
50 cfa37a7b 2004-04-10 devnull structure holding pointers to each field in the message.
51 cfa37a7b 2004-04-10 devnull .PP
52 cfa37a7b 2004-04-10 devnull .I Lookupcmd
53 cfa37a7b 2004-04-10 devnull walks through the array
54 cfa37a7b 2004-04-10 devnull .IR ctab ,
55 cfa37a7b 2004-04-10 devnull which has
56 cfa37a7b 2004-04-10 devnull .I ntab
57 cfa37a7b 2004-04-10 devnull entries,
58 cfa37a7b 2004-04-10 devnull looking for the first
59 cfa37a7b 2004-04-10 devnull .B Cmdtab
60 cfa37a7b 2004-04-10 devnull that matches the parsed command.
61 cfa37a7b 2004-04-10 devnull (If the parsed command is empty,
62 cfa37a7b 2004-04-10 devnull .I lookupcmd
63 cfa37a7b 2004-04-10 devnull returns nil immediately.)
64 cfa37a7b 2004-04-10 devnull A
65 cfa37a7b 2004-04-10 devnull .B Cmdtab
66 cfa37a7b 2004-04-10 devnull matches the command if
67 cfa37a7b 2004-04-10 devnull .I cmd
68 cfa37a7b 2004-04-10 devnull is equal to
69 cfa37a7b 2004-04-10 devnull .IB cb -> f [0]
70 cfa37a7b 2004-04-10 devnull or if
71 cfa37a7b 2004-04-10 devnull .I cmd
72 cfa37a7b 2004-04-10 devnull is
73 cfa37a7b 2004-04-10 devnull .LR * .
74 cfa37a7b 2004-04-10 devnull Once a matching
75 cfa37a7b 2004-04-10 devnull .B Cmdtab
76 cfa37a7b 2004-04-10 devnull has been found, if
77 cfa37a7b 2004-04-10 devnull .I narg
78 cfa37a7b 2004-04-10 devnull is not zero, then the parsed command
79 cfa37a7b 2004-04-10 devnull must have exactly
80 cfa37a7b 2004-04-10 devnull .I narg
81 cfa37a7b 2004-04-10 devnull fields (including the command string itself).
82 cfa37a7b 2004-04-10 devnull If the command has the wrong number of arguments,
83 cfa37a7b 2004-04-10 devnull .I lookupcmd
84 cfa37a7b 2004-04-10 devnull returns nil.
85 cfa37a7b 2004-04-10 devnull Otherwise, it returns a pointer to the
86 cfa37a7b 2004-04-10 devnull .B Cmdtab
87 cfa37a7b 2004-04-10 devnull entry.
88 cfa37a7b 2004-04-10 devnull If
89 cfa37a7b 2004-04-10 devnull .I lookupcmd
90 cfa37a7b 2004-04-10 devnull does not find a matching command at all,
91 cfa37a7b 2004-04-10 devnull it returns nil.
92 cfa37a7b 2004-04-10 devnull Whenever
93 cfa37a7b 2004-04-10 devnull .I lookupcmd
94 cfa37a7b 2004-04-10 devnull returns nil, it sets the system error string.
95 cfa37a7b 2004-04-10 devnull .PP
96 cfa37a7b 2004-04-10 devnull .I Respondcmderror
97 cfa37a7b 2004-04-10 devnull resoponds to request
98 cfa37a7b 2004-04-10 devnull .I r
99 cfa37a7b 2004-04-10 devnull with an error of the form
100 cfa37a7b 2004-04-10 devnull `\fIfmt\fB:\fI cmd\fR,'
101 cfa37a7b 2004-04-10 devnull where
102 cfa37a7b 2004-04-10 devnull .I fmt
103 cfa37a7b 2004-04-10 devnull is the formatted string and
104 cfa37a7b 2004-04-10 devnull .I cmd
105 cfa37a7b 2004-04-10 devnull is a reconstruction of the parsed command.
106 cfa37a7b 2004-04-10 devnull Fmt
107 cfa37a7b 2004-04-10 devnull is often simply
108 cfa37a7b 2004-04-10 devnull .B "%r" .
109 cfa37a7b 2004-04-10 devnull .SH EXAMPLES
110 cfa37a7b 2004-04-10 devnull This interface is not used in any distributed 9P servers.
111 cfa37a7b 2004-04-10 devnull It was lifted from the Plan 9 kernel.
112 cfa37a7b 2004-04-10 devnull Almost any kernel driver
113 c3674de4 2005-01-11 devnull .RB ( \*9/src/9/*/dev*.c )
114 cfa37a7b 2004-04-10 devnull is a good example.
115 cfa37a7b 2004-04-10 devnull .SH SOURCE
116 c3674de4 2005-01-11 devnull .B \*9/src/lib9p/parse.c
117 cfa37a7b 2004-04-10 devnull .SH SEE ALSO
118 bf8a59fa 2004-04-11 devnull .IR 9p (3)