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 bf8a59fa 2004-04-11 devnull .IR tokenize (3).
46 cfa37a7b 2004-04-10 devnull It returns a
47 cfa37a7b 2004-04-10 devnull .B Cmdbuf
48 cfa37a7b 2004-04-10 devnull structure holding pointers to each field in the message.
49 cfa37a7b 2004-04-10 devnull .PP
50 cfa37a7b 2004-04-10 devnull .I Lookupcmd
51 cfa37a7b 2004-04-10 devnull walks through the array
52 cfa37a7b 2004-04-10 devnull .IR ctab ,
53 cfa37a7b 2004-04-10 devnull which has
54 cfa37a7b 2004-04-10 devnull .I ntab
55 cfa37a7b 2004-04-10 devnull entries,
56 cfa37a7b 2004-04-10 devnull looking for the first
57 cfa37a7b 2004-04-10 devnull .B Cmdtab
58 cfa37a7b 2004-04-10 devnull that matches the parsed command.
59 cfa37a7b 2004-04-10 devnull (If the parsed command is empty,
60 cfa37a7b 2004-04-10 devnull .I lookupcmd
61 cfa37a7b 2004-04-10 devnull returns nil immediately.)
62 cfa37a7b 2004-04-10 devnull A
63 cfa37a7b 2004-04-10 devnull .B Cmdtab
64 cfa37a7b 2004-04-10 devnull matches the command if
65 cfa37a7b 2004-04-10 devnull .I cmd
66 cfa37a7b 2004-04-10 devnull is equal to
67 cfa37a7b 2004-04-10 devnull .IB cb -> f [0]
68 cfa37a7b 2004-04-10 devnull or if
69 cfa37a7b 2004-04-10 devnull .I cmd
70 cfa37a7b 2004-04-10 devnull is
71 cfa37a7b 2004-04-10 devnull .LR * .
72 cfa37a7b 2004-04-10 devnull Once a matching
73 cfa37a7b 2004-04-10 devnull .B Cmdtab
74 cfa37a7b 2004-04-10 devnull has been found, if
75 cfa37a7b 2004-04-10 devnull .I narg
76 cfa37a7b 2004-04-10 devnull is not zero, then the parsed command
77 cfa37a7b 2004-04-10 devnull must have exactly
78 cfa37a7b 2004-04-10 devnull .I narg
79 cfa37a7b 2004-04-10 devnull fields (including the command string itself).
80 cfa37a7b 2004-04-10 devnull If the command has the wrong number of arguments,
81 cfa37a7b 2004-04-10 devnull .I lookupcmd
82 cfa37a7b 2004-04-10 devnull returns nil.
83 cfa37a7b 2004-04-10 devnull Otherwise, it returns a pointer to the
84 cfa37a7b 2004-04-10 devnull .B Cmdtab
85 cfa37a7b 2004-04-10 devnull entry.
86 cfa37a7b 2004-04-10 devnull If
87 cfa37a7b 2004-04-10 devnull .I lookupcmd
88 cfa37a7b 2004-04-10 devnull does not find a matching command at all,
89 cfa37a7b 2004-04-10 devnull it returns nil.
90 cfa37a7b 2004-04-10 devnull Whenever
91 cfa37a7b 2004-04-10 devnull .I lookupcmd
92 cfa37a7b 2004-04-10 devnull returns nil, it sets the system error string.
93 cfa37a7b 2004-04-10 devnull .PP
94 cfa37a7b 2004-04-10 devnull .I Respondcmderror
95 cfa37a7b 2004-04-10 devnull resoponds to request
96 cfa37a7b 2004-04-10 devnull .I r
97 cfa37a7b 2004-04-10 devnull with an error of the form
98 cfa37a7b 2004-04-10 devnull `\fIfmt\fB:\fI cmd\fR,'
99 cfa37a7b 2004-04-10 devnull where
100 cfa37a7b 2004-04-10 devnull .I fmt
101 cfa37a7b 2004-04-10 devnull is the formatted string and
102 cfa37a7b 2004-04-10 devnull .I cmd
103 cfa37a7b 2004-04-10 devnull is a reconstruction of the parsed command.
104 cfa37a7b 2004-04-10 devnull Fmt
105 cfa37a7b 2004-04-10 devnull is often simply
106 cfa37a7b 2004-04-10 devnull .B "%r" .
107 cfa37a7b 2004-04-10 devnull .SH EXAMPLES
108 cfa37a7b 2004-04-10 devnull This interface is not used in any distributed 9P servers.
109 cfa37a7b 2004-04-10 devnull It was lifted from the Plan 9 kernel.
110 cfa37a7b 2004-04-10 devnull Almost any kernel driver
111 cfa37a7b 2004-04-10 devnull .RB ( /sys/src/9/*/dev*.c )
112 cfa37a7b 2004-04-10 devnull is a good example.
113 cfa37a7b 2004-04-10 devnull .SH SOURCE
114 cfa37a7b 2004-04-10 devnull .B /sys/src/lib9p/parse.c
115 cfa37a7b 2004-04-10 devnull .SH SEE ALSO
116 bf8a59fa 2004-04-11 devnull .IR 9p (3)