1*90b80121SDavid van Moolenbroek #ifndef _IFCONFIG_PARSE_H
2*90b80121SDavid van Moolenbroek #define _IFCONFIG_PARSE_H
3*90b80121SDavid van Moolenbroek
4*90b80121SDavid van Moolenbroek #include <inttypes.h>
5*90b80121SDavid van Moolenbroek #include <stdbool.h>
6*90b80121SDavid van Moolenbroek #include <stddef.h>
7*90b80121SDavid van Moolenbroek #include <sys/queue.h>
8*90b80121SDavid van Moolenbroek #include <prop/proplib.h>
9*90b80121SDavid van Moolenbroek #include <sys/socket.h>
10*90b80121SDavid van Moolenbroek
11*90b80121SDavid van Moolenbroek struct match;
12*90b80121SDavid van Moolenbroek struct parser;
13*90b80121SDavid van Moolenbroek
14*90b80121SDavid van Moolenbroek extern struct pbranch command_root;
15*90b80121SDavid van Moolenbroek
16*90b80121SDavid van Moolenbroek typedef int (*parser_exec_t)(prop_dictionary_t, prop_dictionary_t);
17*90b80121SDavid van Moolenbroek typedef int (*parser_match_t)(const struct parser *, const struct match *,
18*90b80121SDavid van Moolenbroek struct match *, int, const char *);
19*90b80121SDavid van Moolenbroek typedef int (*parser_init_t)(struct parser *);
20*90b80121SDavid van Moolenbroek
21*90b80121SDavid van Moolenbroek struct match {
22*90b80121SDavid van Moolenbroek prop_dictionary_t m_env;
23*90b80121SDavid van Moolenbroek const struct parser *m_nextparser;
24*90b80121SDavid van Moolenbroek const struct parser *m_parser;
25*90b80121SDavid van Moolenbroek int m_argidx;
26*90b80121SDavid van Moolenbroek parser_exec_t m_exec;
27*90b80121SDavid van Moolenbroek };
28*90b80121SDavid van Moolenbroek
29*90b80121SDavid van Moolenbroek /* method table */
30*90b80121SDavid van Moolenbroek struct parser_methods {
31*90b80121SDavid van Moolenbroek parser_match_t pm_match;
32*90b80121SDavid van Moolenbroek parser_init_t pm_init;
33*90b80121SDavid van Moolenbroek };
34*90b80121SDavid van Moolenbroek
35*90b80121SDavid van Moolenbroek struct parser {
36*90b80121SDavid van Moolenbroek const struct parser_methods *p_methods;
37*90b80121SDavid van Moolenbroek parser_exec_t p_exec;
38*90b80121SDavid van Moolenbroek const char *p_name;
39*90b80121SDavid van Moolenbroek struct parser *p_nextparser;
40*90b80121SDavid van Moolenbroek bool p_initialized;
41*90b80121SDavid van Moolenbroek };
42*90b80121SDavid van Moolenbroek
43*90b80121SDavid van Moolenbroek struct branch {
44*90b80121SDavid van Moolenbroek SIMPLEQ_ENTRY(branch) b_next;
45*90b80121SDavid van Moolenbroek struct parser *b_nextparser;
46*90b80121SDavid van Moolenbroek };
47*90b80121SDavid van Moolenbroek
48*90b80121SDavid van Moolenbroek struct pbranch {
49*90b80121SDavid van Moolenbroek struct parser pb_parser;
50*90b80121SDavid van Moolenbroek SIMPLEQ_HEAD(, branch) pb_branches;
51*90b80121SDavid van Moolenbroek bool pb_match_first;
52*90b80121SDavid van Moolenbroek const struct branch *pb_brinit;
53*90b80121SDavid van Moolenbroek size_t pb_nbrinit;
54*90b80121SDavid van Moolenbroek };
55*90b80121SDavid van Moolenbroek
56*90b80121SDavid van Moolenbroek struct pterm {
57*90b80121SDavid van Moolenbroek struct parser pt_parser;
58*90b80121SDavid van Moolenbroek const char *pt_key;
59*90b80121SDavid van Moolenbroek };
60*90b80121SDavid van Moolenbroek
61*90b80121SDavid van Moolenbroek extern const struct parser_methods paddr_methods;
62*90b80121SDavid van Moolenbroek extern const struct parser_methods pbranch_methods;
63*90b80121SDavid van Moolenbroek extern const struct parser_methods piface_methods;
64*90b80121SDavid van Moolenbroek extern const struct parser_methods pinteger_methods;
65*90b80121SDavid van Moolenbroek extern const struct parser_methods pstr_methods;
66*90b80121SDavid van Moolenbroek extern const struct parser_methods pkw_methods;
67*90b80121SDavid van Moolenbroek extern const struct parser_methods pterm_methods;
68*90b80121SDavid van Moolenbroek
69*90b80121SDavid van Moolenbroek #define PTERM_INITIALIZER(__pt, __name, __exec, __key) \
70*90b80121SDavid van Moolenbroek { \
71*90b80121SDavid van Moolenbroek .pt_parser = {.p_name = (__name), .p_methods = &pterm_methods, \
72*90b80121SDavid van Moolenbroek .p_exec = (__exec)}, \
73*90b80121SDavid van Moolenbroek .pt_key = (__key) \
74*90b80121SDavid van Moolenbroek }
75*90b80121SDavid van Moolenbroek
76*90b80121SDavid van Moolenbroek #define PBRANCH_INITIALIZER(__pb, __name, __brs, __nbr, __match_first) \
77*90b80121SDavid van Moolenbroek { \
78*90b80121SDavid van Moolenbroek .pb_parser = {.p_name = (__name), .p_methods = &pbranch_methods},\
79*90b80121SDavid van Moolenbroek .pb_branches = SIMPLEQ_HEAD_INITIALIZER((__pb)->pb_branches), \
80*90b80121SDavid van Moolenbroek .pb_brinit = (__brs), \
81*90b80121SDavid van Moolenbroek .pb_nbrinit = (__nbr), \
82*90b80121SDavid van Moolenbroek .pb_match_first = (__match_first) \
83*90b80121SDavid van Moolenbroek }
84*90b80121SDavid van Moolenbroek
85*90b80121SDavid van Moolenbroek #define PSTR_INITIALIZER(__ps, __name, __defexec, __defkey, __defnext) \
86*90b80121SDavid van Moolenbroek PSTR_INITIALIZER1((__ps), (__name), (__defexec), (__defkey), \
87*90b80121SDavid van Moolenbroek true, (__defnext))
88*90b80121SDavid van Moolenbroek
89*90b80121SDavid van Moolenbroek #define PSTR_INITIALIZER1(__ps, __name, __defexec, __defkey, __defhexok,\
90*90b80121SDavid van Moolenbroek __defnext) \
91*90b80121SDavid van Moolenbroek { \
92*90b80121SDavid van Moolenbroek .ps_parser = {.p_name = (__name), .p_methods = &pstr_methods, \
93*90b80121SDavid van Moolenbroek .p_exec = (__defexec), \
94*90b80121SDavid van Moolenbroek .p_nextparser = (__defnext)}, \
95*90b80121SDavid van Moolenbroek .ps_key = (__defkey), \
96*90b80121SDavid van Moolenbroek .ps_hexok = (__defhexok) \
97*90b80121SDavid van Moolenbroek }
98*90b80121SDavid van Moolenbroek
99*90b80121SDavid van Moolenbroek #define PADDR_INITIALIZER(__pa, __name, __defexec, __addrkey, \
100*90b80121SDavid van Moolenbroek __maskkey, __activator, __deactivator, __defnext) \
101*90b80121SDavid van Moolenbroek { \
102*90b80121SDavid van Moolenbroek .pa_parser = {.p_name = (__name), .p_methods = &paddr_methods, \
103*90b80121SDavid van Moolenbroek .p_exec = (__defexec), \
104*90b80121SDavid van Moolenbroek .p_nextparser = (__defnext)}, \
105*90b80121SDavid van Moolenbroek .pa_addrkey = (__addrkey), \
106*90b80121SDavid van Moolenbroek .pa_maskkey = (__maskkey), \
107*90b80121SDavid van Moolenbroek .pa_activator = (__activator), \
108*90b80121SDavid van Moolenbroek .pa_deactivator = (__deactivator), \
109*90b80121SDavid van Moolenbroek }
110*90b80121SDavid van Moolenbroek
111*90b80121SDavid van Moolenbroek #define PIFACE_INITIALIZER(__pif, __name, __defexec, __defkey, __defnext)\
112*90b80121SDavid van Moolenbroek { \
113*90b80121SDavid van Moolenbroek .pif_parser = {.p_name = (__name), .p_methods = &piface_methods,\
114*90b80121SDavid van Moolenbroek .p_exec = (__defexec), \
115*90b80121SDavid van Moolenbroek .p_nextparser = (__defnext)}, \
116*90b80121SDavid van Moolenbroek .pif_key = (__defkey) \
117*90b80121SDavid van Moolenbroek }
118*90b80121SDavid van Moolenbroek
119*90b80121SDavid van Moolenbroek #define PINTEGER_INITIALIZER1(__pi, __name, __min, __max, __base, \
120*90b80121SDavid van Moolenbroek __defexec, __defkey, __defnext) \
121*90b80121SDavid van Moolenbroek { \
122*90b80121SDavid van Moolenbroek .pi_parser = {.p_name = (__name), .p_methods = &pinteger_methods,\
123*90b80121SDavid van Moolenbroek .p_exec = (__defexec), \
124*90b80121SDavid van Moolenbroek .p_nextparser = (__defnext), \
125*90b80121SDavid van Moolenbroek .p_initialized = false}, \
126*90b80121SDavid van Moolenbroek .pi_min = (__min), \
127*90b80121SDavid van Moolenbroek .pi_max = (__max), \
128*90b80121SDavid van Moolenbroek .pi_base = (__base), \
129*90b80121SDavid van Moolenbroek .pi_key = (__defkey) \
130*90b80121SDavid van Moolenbroek }
131*90b80121SDavid van Moolenbroek
132*90b80121SDavid van Moolenbroek #define PINTEGER_INITIALIZER(__pi, __name, __base, __defexec, __defkey, \
133*90b80121SDavid van Moolenbroek __defnext) \
134*90b80121SDavid van Moolenbroek PINTEGER_INITIALIZER1(__pi, __name, INTMAX_MIN, INTMAX_MAX, \
135*90b80121SDavid van Moolenbroek __base, __defexec, __defkey, __defnext)
136*90b80121SDavid van Moolenbroek
137*90b80121SDavid van Moolenbroek #define PKW_INITIALIZER(__pk, __name, __defexec, __defkey, __kws, __nkw,\
138*90b80121SDavid van Moolenbroek __defnext) \
139*90b80121SDavid van Moolenbroek { \
140*90b80121SDavid van Moolenbroek .pk_parser = {.p_name = (__name), \
141*90b80121SDavid van Moolenbroek .p_exec = (__defexec), \
142*90b80121SDavid van Moolenbroek .p_methods = &pkw_methods, \
143*90b80121SDavid van Moolenbroek .p_initialized = false}, \
144*90b80121SDavid van Moolenbroek .pk_keywords = SIMPLEQ_HEAD_INITIALIZER((__pk)->pk_keywords), \
145*90b80121SDavid van Moolenbroek .pk_kwinit = (__kws), \
146*90b80121SDavid van Moolenbroek .pk_nkwinit = (__nkw), \
147*90b80121SDavid van Moolenbroek .pk_keyinit = (__defkey), \
148*90b80121SDavid van Moolenbroek .pk_nextinit = (__defnext) \
149*90b80121SDavid van Moolenbroek }
150*90b80121SDavid van Moolenbroek
151*90b80121SDavid van Moolenbroek #define IFKW(__word, __flag) \
152*90b80121SDavid van Moolenbroek { \
153*90b80121SDavid van Moolenbroek .k_word = (__word), .k_neg = true, .k_type = KW_T_INT, \
154*90b80121SDavid van Moolenbroek .k_int = (__flag), \
155*90b80121SDavid van Moolenbroek .k_negint = -(__flag) \
156*90b80121SDavid van Moolenbroek }
157*90b80121SDavid van Moolenbroek
158*90b80121SDavid van Moolenbroek #define KW_T_NONE 0
159*90b80121SDavid van Moolenbroek #define KW_T_OBJ 1
160*90b80121SDavid van Moolenbroek #define KW_T_INT 2
161*90b80121SDavid van Moolenbroek #define KW_T_STR 3
162*90b80121SDavid van Moolenbroek #define KW_T_BOOL 4
163*90b80121SDavid van Moolenbroek #define KW_T_UINT 5
164*90b80121SDavid van Moolenbroek
165*90b80121SDavid van Moolenbroek struct kwinst {
166*90b80121SDavid van Moolenbroek SIMPLEQ_ENTRY(kwinst) k_next;
167*90b80121SDavid van Moolenbroek int k_type;
168*90b80121SDavid van Moolenbroek const char *k_word;
169*90b80121SDavid van Moolenbroek const char *k_key;
170*90b80121SDavid van Moolenbroek const char *k_act;
171*90b80121SDavid van Moolenbroek const char *k_deact;
172*90b80121SDavid van Moolenbroek const char *k_altdeact;
173*90b80121SDavid van Moolenbroek parser_exec_t k_exec;
174*90b80121SDavid van Moolenbroek union kwval {
175*90b80121SDavid van Moolenbroek int64_t u_sint;
176*90b80121SDavid van Moolenbroek uint64_t u_uint;
177*90b80121SDavid van Moolenbroek const char *u_str;
178*90b80121SDavid van Moolenbroek prop_object_t u_obj;
179*90b80121SDavid van Moolenbroek bool u_bool;
180*90b80121SDavid van Moolenbroek } k_u, k_negu;
181*90b80121SDavid van Moolenbroek #define k_int k_u.u_sint
182*90b80121SDavid van Moolenbroek #define k_uint k_u.u_uint
183*90b80121SDavid van Moolenbroek #define k_str k_u.u_str
184*90b80121SDavid van Moolenbroek #define k_obj k_u.u_obj
185*90b80121SDavid van Moolenbroek #define k_bool k_u.u_bool
186*90b80121SDavid van Moolenbroek
187*90b80121SDavid van Moolenbroek #define k_negint k_negu.u_sint
188*90b80121SDavid van Moolenbroek #define k_neguint k_negu.u_uint
189*90b80121SDavid van Moolenbroek #define k_negstr k_negu.u_str
190*90b80121SDavid van Moolenbroek #define k_negobj k_negu.u_obj
191*90b80121SDavid van Moolenbroek #define k_negbool k_negu.u_bool
192*90b80121SDavid van Moolenbroek
193*90b80121SDavid van Moolenbroek bool k_neg; /* allow negative form, -keyword */
194*90b80121SDavid van Moolenbroek struct parser *k_nextparser;
195*90b80121SDavid van Moolenbroek };
196*90b80121SDavid van Moolenbroek
197*90b80121SDavid van Moolenbroek struct pkw {
198*90b80121SDavid van Moolenbroek struct parser pk_parser;
199*90b80121SDavid van Moolenbroek const char *pk_key;
200*90b80121SDavid van Moolenbroek const char *pk_keyinit;
201*90b80121SDavid van Moolenbroek const struct kwinst *pk_kwinit;
202*90b80121SDavid van Moolenbroek size_t pk_nkwinit;
203*90b80121SDavid van Moolenbroek SIMPLEQ_HEAD(, kwinst) pk_keywords;
204*90b80121SDavid van Moolenbroek };
205*90b80121SDavid van Moolenbroek
206*90b80121SDavid van Moolenbroek #define pk_nextinit pk_parser.p_nextparser
207*90b80121SDavid van Moolenbroek #define pk_execinit pk_parser.p_exec
208*90b80121SDavid van Moolenbroek
209*90b80121SDavid van Moolenbroek struct pstr {
210*90b80121SDavid van Moolenbroek struct parser ps_parser;
211*90b80121SDavid van Moolenbroek const char *ps_key;
212*90b80121SDavid van Moolenbroek bool ps_hexok;
213*90b80121SDavid van Moolenbroek };
214*90b80121SDavid van Moolenbroek
215*90b80121SDavid van Moolenbroek struct pinteger {
216*90b80121SDavid van Moolenbroek struct parser pi_parser;
217*90b80121SDavid van Moolenbroek int64_t pi_min;
218*90b80121SDavid van Moolenbroek int64_t pi_max;
219*90b80121SDavid van Moolenbroek int pi_base;
220*90b80121SDavid van Moolenbroek const char *pi_key;
221*90b80121SDavid van Moolenbroek };
222*90b80121SDavid van Moolenbroek
223*90b80121SDavid van Moolenbroek struct intrange {
224*90b80121SDavid van Moolenbroek SIMPLEQ_ENTRY(intrange) r_next;
225*90b80121SDavid van Moolenbroek int64_t r_bottom;
226*90b80121SDavid van Moolenbroek int64_t r_top;
227*90b80121SDavid van Moolenbroek struct parser *r_nextparser;
228*90b80121SDavid van Moolenbroek };
229*90b80121SDavid van Moolenbroek
230*90b80121SDavid van Moolenbroek struct pranges {
231*90b80121SDavid van Moolenbroek struct parser pr_parser;
232*90b80121SDavid van Moolenbroek SIMPLEQ_HEAD(, intrange) pr_ranges;
233*90b80121SDavid van Moolenbroek };
234*90b80121SDavid van Moolenbroek
235*90b80121SDavid van Moolenbroek struct paddr_prefix {
236*90b80121SDavid van Moolenbroek int16_t pfx_len;
237*90b80121SDavid van Moolenbroek struct sockaddr pfx_addr;
238*90b80121SDavid van Moolenbroek };
239*90b80121SDavid van Moolenbroek
240*90b80121SDavid van Moolenbroek static inline size_t
paddr_prefix_size(const struct paddr_prefix * pfx)241*90b80121SDavid van Moolenbroek paddr_prefix_size(const struct paddr_prefix *pfx)
242*90b80121SDavid van Moolenbroek {
243*90b80121SDavid van Moolenbroek return offsetof(struct paddr_prefix, pfx_addr) + pfx->pfx_addr.sa_len;
244*90b80121SDavid van Moolenbroek }
245*90b80121SDavid van Moolenbroek
246*90b80121SDavid van Moolenbroek struct paddr {
247*90b80121SDavid van Moolenbroek struct parser pa_parser;
248*90b80121SDavid van Moolenbroek const char *pa_addrkey;
249*90b80121SDavid van Moolenbroek const char *pa_maskkey;
250*90b80121SDavid van Moolenbroek const char *pa_activator;
251*90b80121SDavid van Moolenbroek const char *pa_deactivator;
252*90b80121SDavid van Moolenbroek };
253*90b80121SDavid van Moolenbroek
254*90b80121SDavid van Moolenbroek struct piface {
255*90b80121SDavid van Moolenbroek struct parser pif_parser;
256*90b80121SDavid van Moolenbroek const char *pif_key;
257*90b80121SDavid van Moolenbroek };
258*90b80121SDavid van Moolenbroek
259*90b80121SDavid van Moolenbroek struct prest {
260*90b80121SDavid van Moolenbroek struct parser pr_parser;
261*90b80121SDavid van Moolenbroek };
262*90b80121SDavid van Moolenbroek
263*90b80121SDavid van Moolenbroek struct prest *prest_create(const char *);
264*90b80121SDavid van Moolenbroek struct paddr *paddr_create(const char *, parser_exec_t, const char *,
265*90b80121SDavid van Moolenbroek const char *, struct parser *);
266*90b80121SDavid van Moolenbroek struct pstr *pstr_create(const char *, parser_exec_t, const char *,
267*90b80121SDavid van Moolenbroek bool, struct parser *);
268*90b80121SDavid van Moolenbroek struct piface *piface_create(const char *, parser_exec_t, const char *,
269*90b80121SDavid van Moolenbroek struct parser *);
270*90b80121SDavid van Moolenbroek struct pkw *pkw_create(const char *, parser_exec_t,
271*90b80121SDavid van Moolenbroek const char *, const struct kwinst *, size_t, struct parser *);
272*90b80121SDavid van Moolenbroek struct pranges *pranges_create(const char *, parser_exec_t, const char *,
273*90b80121SDavid van Moolenbroek const struct intrange *, size_t, struct parser *);
274*90b80121SDavid van Moolenbroek struct pbranch *pbranch_create(const char *, const struct branch *, size_t,
275*90b80121SDavid van Moolenbroek bool);
276*90b80121SDavid van Moolenbroek int pbranch_addbranch(struct pbranch *, struct parser *);
277*90b80121SDavid van Moolenbroek int pbranch_setbranches(struct pbranch *, const struct branch *, size_t);
278*90b80121SDavid van Moolenbroek
279*90b80121SDavid van Moolenbroek int parse(int, char **, const struct parser *, struct match *, size_t *, int *);
280*90b80121SDavid van Moolenbroek
281*90b80121SDavid van Moolenbroek int matches_exec(const struct match *, prop_dictionary_t, size_t);
282*90b80121SDavid van Moolenbroek int parser_init(struct parser *);
283*90b80121SDavid van Moolenbroek
284*90b80121SDavid van Moolenbroek #endif /* _IFCONFIG_PARSE_H */
285