xref: /minix3/sbin/ifconfig/parse.h (revision 90b801219a391518dca4b04b17c88ad3b82b6ad9)
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