Blame


1 deb7f90e 2026-05-31 rsadowski /* $OpenBSD: parse.y,v 1.265 2026/05/31 12:44:06 rsadowski Exp $ */
2 41042ecc 2006-12-16 reyk
3 41042ecc 2006-12-16 reyk /*
4 dc2f787f 2014-06-25 reyk * Copyright (c) 2007 - 2014 Reyk Floeter <reyk@openbsd.org>
5 bdd13866 2011-05-23 reyk * Copyright (c) 2008 Gilles Chehade <gilles@openbsd.org>
6 8c736326 2007-09-28 pyr * Copyright (c) 2006 Pierre-Yves Ritschard <pyr@openbsd.org>
7 41042ecc 2006-12-16 reyk * Copyright (c) 2004, 2005 Esben Norby <norby@openbsd.org>
8 41042ecc 2006-12-16 reyk * Copyright (c) 2004 Ryan McBride <mcbride@openbsd.org>
9 41042ecc 2006-12-16 reyk * Copyright (c) 2002, 2003, 2004 Henning Brauer <henning@openbsd.org>
10 41042ecc 2006-12-16 reyk * Copyright (c) 2001 Markus Friedl. All rights reserved.
11 41042ecc 2006-12-16 reyk * Copyright (c) 2001 Daniel Hartmeier. All rights reserved.
12 41042ecc 2006-12-16 reyk * Copyright (c) 2001 Theo de Raadt. All rights reserved.
13 41042ecc 2006-12-16 reyk *
14 41042ecc 2006-12-16 reyk * Permission to use, copy, modify, and distribute this software for any
15 41042ecc 2006-12-16 reyk * purpose with or without fee is hereby granted, provided that the above
16 41042ecc 2006-12-16 reyk * copyright notice and this permission notice appear in all copies.
17 41042ecc 2006-12-16 reyk *
18 41042ecc 2006-12-16 reyk * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
19 41042ecc 2006-12-16 reyk * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
20 41042ecc 2006-12-16 reyk * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
21 41042ecc 2006-12-16 reyk * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
22 41042ecc 2006-12-16 reyk * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
23 41042ecc 2006-12-16 reyk * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
24 41042ecc 2006-12-16 reyk * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
25 41042ecc 2006-12-16 reyk */
26 41042ecc 2006-12-16 reyk
27 41042ecc 2006-12-16 reyk %{
28 41042ecc 2006-12-16 reyk #include <sys/types.h>
29 41042ecc 2006-12-16 reyk #include <sys/socket.h>
30 19437691 2007-10-13 deraadt #include <sys/stat.h>
31 41042ecc 2006-12-16 reyk #include <sys/queue.h>
32 bdd13866 2011-05-23 reyk #include <sys/ioctl.h>
33 d93c36af 2015-01-22 reyk #include <sys/time.h>
34 d93c36af 2015-01-22 reyk #include <sys/tree.h>
35 e1f9d231 2007-11-24 reyk
36 e1f9d231 2007-11-24 reyk #include <netinet/in.h>
37 41042ecc 2006-12-16 reyk #include <arpa/inet.h>
38 24b53830 2015-01-21 deraadt #include <net/if.h>
39 24b53830 2015-01-21 deraadt #include <net/pfvar.h>
40 d93c36af 2015-01-22 reyk #include <net/route.h>
41 41042ecc 2006-12-16 reyk
42 189a2332 2020-10-26 martijn #include <agentx.h>
43 d93c36af 2015-01-22 reyk #include <stdint.h>
44 d93c36af 2015-01-22 reyk #include <stdarg.h>
45 d93c36af 2015-01-22 reyk #include <stdio.h>
46 19437691 2007-10-13 deraadt #include <unistd.h>
47 d93c36af 2015-01-22 reyk #include <ctype.h>
48 41042ecc 2006-12-16 reyk #include <err.h>
49 d93c36af 2015-01-22 reyk #include <endian.h>
50 41042ecc 2006-12-16 reyk #include <errno.h>
51 41042ecc 2006-12-16 reyk #include <limits.h>
52 41042ecc 2006-12-16 reyk #include <netdb.h>
53 41042ecc 2006-12-16 reyk #include <string.h>
54 b0d88a11 2009-08-27 reyk #include <ifaddrs.h>
55 bf77d89d 2013-03-04 sthen #include <syslog.h>
56 3e04b122 2014-12-18 reyk #include <md5.h>
57 41042ecc 2006-12-16 reyk
58 6d0767ae 2007-12-07 reyk #include "relayd.h"
59 69fde657 2014-07-09 reyk #include "http.h"
60 6b5c4000 2026-03-02 rsadowski #include "log.h"
61 41042ecc 2006-12-16 reyk
62 19437691 2007-10-13 deraadt TAILQ_HEAD(files, file) files = TAILQ_HEAD_INITIALIZER(files);
63 19437691 2007-10-13 deraadt static struct file {
64 19437691 2007-10-13 deraadt TAILQ_ENTRY(file) entry;
65 19437691 2007-10-13 deraadt FILE *stream;
66 19437691 2007-10-13 deraadt char *name;
67 32a6aa4e 2018-06-11 denis size_t ungetpos;
68 32a6aa4e 2018-06-11 denis size_t ungetsize;
69 32a6aa4e 2018-06-11 denis u_char *ungetbuf;
70 32a6aa4e 2018-06-11 denis int eof_reached;
71 19437691 2007-10-13 deraadt int lineno;
72 19437691 2007-10-13 deraadt int errors;
73 107f759e 2008-02-26 mpf } *file, *topfile;
74 19437691 2007-10-13 deraadt struct file *pushfile(const char *, int);
75 19437691 2007-10-13 deraadt int popfile(void);
76 19437691 2007-10-13 deraadt int check_file_secrecy(int, const char *);
77 19437691 2007-10-13 deraadt int yyparse(void);
78 19437691 2007-10-13 deraadt int yylex(void);
79 65f74224 2019-07-05 patrick int yyerror(const char *, ...)
80 65f74224 2019-07-05 patrick __attribute__((__format__ (printf, 1, 2)))
81 65f74224 2019-07-05 patrick __attribute__((__nonnull__ (1)));
82 19437691 2007-10-13 deraadt int kw_cmp(const void *, const void *);
83 19437691 2007-10-13 deraadt int lookup(char *);
84 32a6aa4e 2018-06-11 denis int igetc(void);
85 19437691 2007-10-13 deraadt int lgetc(int);
86 32a6aa4e 2018-06-11 denis void lungetc(int);
87 19437691 2007-10-13 deraadt int findeol(void);
88 41042ecc 2006-12-16 reyk
89 41042ecc 2006-12-16 reyk TAILQ_HEAD(symhead, sym) symhead = TAILQ_HEAD_INITIALIZER(symhead);
90 41042ecc 2006-12-16 reyk struct sym {
91 19437691 2007-10-13 deraadt TAILQ_ENTRY(sym) entry;
92 41042ecc 2006-12-16 reyk int used;
93 41042ecc 2006-12-16 reyk int persist;
94 41042ecc 2006-12-16 reyk char *nam;
95 41042ecc 2006-12-16 reyk char *val;
96 41042ecc 2006-12-16 reyk };
97 4ab45c57 2006-12-16 reyk int symset(const char *, const char *, int);
98 4ab45c57 2006-12-16 reyk char *symget(const char *);
99 41042ecc 2006-12-16 reyk
100 6d0767ae 2007-12-07 reyk struct relayd *conf = NULL;
101 19437691 2007-10-13 deraadt static int errors = 0;
102 591e6ab5 2011-05-19 reyk static int loadcfg = 0;
103 c8f9d8e3 2007-12-08 pyr objid_t last_rdr_id = 0;
104 19437691 2007-10-13 deraadt objid_t last_table_id = 0;
105 19437691 2007-10-13 deraadt objid_t last_host_id = 0;
106 19437691 2007-10-13 deraadt objid_t last_relay_id = 0;
107 19437691 2007-10-13 deraadt objid_t last_proto_id = 0;
108 39bc6125 2009-08-13 reyk objid_t last_rt_id = 0;
109 39bc6125 2009-08-13 reyk objid_t last_nr_id = 0;
110 19437691 2007-10-13 deraadt
111 c8f9d8e3 2007-12-08 pyr static struct rdr *rdr = NULL;
112 19437691 2007-10-13 deraadt static struct table *table = NULL;
113 19437691 2007-10-13 deraadt static struct relay *rlay = NULL;
114 9b90e758 2009-08-07 reyk static struct host *hst = NULL;
115 f8a7ea4c 2009-08-05 reyk struct relaylist relays;
116 19437691 2007-10-13 deraadt static struct protocol *proto = NULL;
117 69fde657 2014-07-09 reyk static struct relay_rule *rule = NULL;
118 39bc6125 2009-08-13 reyk static struct router *router = NULL;
119 69fde657 2014-07-09 reyk static int label = 0;
120 69fde657 2014-07-09 reyk static int tagged = 0;
121 69fde657 2014-07-09 reyk static int tag = 0;
122 d7758aba 2007-12-08 reyk static in_port_t tableport = 0;
123 0f7a5e2e 2012-10-03 reyk static int dstmode;
124 69fde657 2014-07-09 reyk static enum key_type keytype = KEY_TYPE_NONE;
125 69fde657 2014-07-09 reyk static enum direction dir = RELAY_DIR_ANY;
126 69fde657 2014-07-09 reyk static char *rulefile = NULL;
127 3e04b122 2014-12-18 reyk static union hashkey *hashkey = NULL;
128 19437691 2007-10-13 deraadt
129 ebf0f4ca 2018-10-22 denis struct address *host_ip(const char *);
130 41042ecc 2006-12-16 reyk int host_dns(const char *, struct addresslist *,
131 d250825b 2009-04-24 reyk int, struct portrange *, const char *, int);
132 b0d88a11 2009-08-27 reyk int host_if(const char *, struct addresslist *,
133 b0d88a11 2009-08-27 reyk int, struct portrange *, const char *, int);
134 e9c39896 2026-05-17 kirill int host_ifaddr(struct sockaddr_storage *, struct ifaddrs *);
135 41042ecc 2006-12-16 reyk int host(const char *, struct addresslist *,
136 d250825b 2009-04-24 reyk int, struct portrange *, const char *, int);
137 e9c39896 2026-05-17 kirill int host_local(struct addresslist *);
138 591e6ab5 2011-05-19 reyk void host_free(struct addresslist *);
139 41042ecc 2006-12-16 reyk
140 d7758aba 2007-12-08 reyk struct table *table_inherit(struct table *);
141 fae05986 2014-04-22 reyk int relay_id(struct relay *);
142 f8a7ea4c 2009-08-05 reyk struct relay *relay_inherit(struct relay *, struct relay *);
143 09913286 2008-09-29 reyk int getservice(char *);
144 bdd13866 2011-05-23 reyk int is_if_in_group(const char *, const char *);
145 36dd1e7a 2026-05-15 rsadowski static struct keyname *proto_keyname(char *);
146 6f706db5 2007-05-27 reyk
147 41042ecc 2006-12-16 reyk typedef struct {
148 41042ecc 2006-12-16 reyk union {
149 3cce92a3 2009-08-07 reyk int64_t number;
150 3cce92a3 2009-08-07 reyk char *string;
151 3cce92a3 2009-08-07 reyk struct host *host;
152 3cce92a3 2009-08-07 reyk struct timeval tv;
153 3cce92a3 2009-08-07 reyk struct table *table;
154 3cce92a3 2009-08-07 reyk struct portrange port;
155 3e04b122 2014-12-18 reyk struct {
156 3e04b122 2014-12-18 reyk union hashkey key;
157 3e04b122 2014-12-18 reyk int keyset;
158 3e04b122 2014-12-18 reyk } key;
159 69fde657 2014-07-09 reyk enum direction dir;
160 8a025509 2007-11-21 reyk struct {
161 3cce92a3 2009-08-07 reyk struct sockaddr_storage ss;
162 fc2c091b 2019-05-10 reyk int prefixlen;
163 2f6ec04d 2015-01-16 deraadt char name[HOST_NAME_MAX+1];
164 3cce92a3 2009-08-07 reyk } addr;
165 3cce92a3 2009-08-07 reyk struct {
166 3cce92a3 2009-08-07 reyk enum digest_type type;
167 3cce92a3 2009-08-07 reyk char *digest;
168 3cce92a3 2009-08-07 reyk } digest;
169 41042ecc 2006-12-16 reyk } v;
170 41042ecc 2006-12-16 reyk int lineno;
171 41042ecc 2006-12-16 reyk } YYSTYPE;
172 41042ecc 2006-12-16 reyk
173 41042ecc 2006-12-16 reyk %}
174 41042ecc 2006-12-16 reyk
175 04a2f953 2020-09-14 martijn %token AGENTX APPEND BACKLOG BACKUP BINARY BUFFER CA CACHE SET CHECK CIPHERS
176 04a2f953 2020-09-14 martijn %token CODE COOKIE DEMOTE DIGEST DISABLE ERROR EXPECT PASS BLOCK EXTERNAL
177 04a2f953 2020-09-14 martijn %token FILENAME FORWARD FROM HASH HEADER HEADERLEN HOST HTTP ICMP INCLUDE INET
178 04a2f953 2020-09-14 martijn %token INET6 INTERFACE INTERVAL IP KEYPAIR LABEL LISTEN VALUE LOADBALANCE LOG
179 deb7f90e 2026-05-31 rsadowski %token LOOKUP METHOD MODE NAT NO DESTINATION NODELAY NOTHING OCSP ON PARENT
180 deb7f90e 2026-05-31 rsadowski %token PATH PFTAG PORT PREFORK PRIORITY PROTO QUERYSTR REAL REDIRECT RELAY
181 deb7f90e 2026-05-31 rsadowski %token REMOVE REQUEST RESPONSE RETRY QUICK RETURN ROUNDROBIN ROUTE SACK SCRIPT
182 deb7f90e 2026-05-31 rsadowski %token SEND SESSION SOCKET SPLICE STICKYADDR STRIP STYLE TABLE TAG TAGGED TCP
183 c2be2049 2020-10-30 martijn %token TIMEOUT TLS TO ROUTER RTLABEL TRANSPARENT URL WITH TTL RTABLE
184 3fe6d92f 2017-11-27 claudio %token MATCH PARAMS RANDOM LEASTSTATES SRCHASH KEY CERTIFICATE PASSWORD ECDHE
185 04a2f953 2020-09-14 martijn %token EDH TICKETS CONNECTION CONNECTIONS CONTEXT ERRORS STATE CHANGES CHECKS
186 80347df3 2026-02-18 kirill %token WEBSOCKETS PFLOG CLIENT PROXYPROTO V1 V2
187 41042ecc 2006-12-16 reyk %token <v.string> STRING
188 4c6cdd88 2007-10-01 pyr %token <v.number> NUMBER
189 c2be2049 2020-10-30 martijn %type <v.string> context hostname interface table value path
190 c2be2049 2020-10-30 martijn %type <v.number> http_type loglevel quick
191 69fde657 2014-07-09 reyk %type <v.number> dstmode flag forwardmode retry
192 80347df3 2026-02-18 kirill %type <v.number> opttls opttlsclient optproxyproto
193 199fb283 2024-06-17 sashan %type <v.number> redirect_proto relay_proto match pflog
194 69fde657 2014-07-09 reyk %type <v.number> action ruleaf key_option
195 09913286 2008-09-29 reyk %type <v.port> port
196 41042ecc 2006-12-16 reyk %type <v.host> host
197 fc2c091b 2019-05-10 reyk %type <v.addr> address rulesrc ruledst addrprefix
198 90aa962e 2006-12-25 reyk %type <v.tv> timeout
199 69fde657 2014-07-09 reyk %type <v.digest> digest optdigest
200 d7758aba 2007-12-08 reyk %type <v.table> tablespec
201 69fde657 2014-07-09 reyk %type <v.dir> dir
202 3e04b122 2014-12-18 reyk %type <v.key> hashkey
203 41042ecc 2006-12-16 reyk
204 41042ecc 2006-12-16 reyk %%
205 41042ecc 2006-12-16 reyk
206 41042ecc 2006-12-16 reyk grammar : /* empty */
207 002d9ce9 2007-10-22 reyk | grammar include '\n'
208 41042ecc 2006-12-16 reyk | grammar '\n'
209 41042ecc 2006-12-16 reyk | grammar varset '\n'
210 41042ecc 2006-12-16 reyk | grammar main '\n'
211 c8f9d8e3 2007-12-08 pyr | grammar rdr '\n'
212 d7758aba 2007-12-08 reyk | grammar tabledef '\n'
213 30640247 2007-02-22 reyk | grammar relay '\n'
214 30640247 2007-02-22 reyk | grammar proto '\n'
215 39bc6125 2009-08-13 reyk | grammar router '\n'
216 19437691 2007-10-13 deraadt | grammar error '\n' { file->errors++; }
217 41042ecc 2006-12-16 reyk ;
218 41042ecc 2006-12-16 reyk
219 002d9ce9 2007-10-22 reyk include : INCLUDE STRING {
220 002d9ce9 2007-10-22 reyk struct file *nfile;
221 002d9ce9 2007-10-22 reyk
222 002d9ce9 2007-10-22 reyk if ((nfile = pushfile($2, 0)) == NULL) {
223 002d9ce9 2007-10-22 reyk yyerror("failed to include file %s", $2);
224 002d9ce9 2007-10-22 reyk free($2);
225 002d9ce9 2007-10-22 reyk YYERROR;
226 002d9ce9 2007-10-22 reyk }
227 002d9ce9 2007-10-22 reyk free($2);
228 002d9ce9 2007-10-22 reyk
229 002d9ce9 2007-10-22 reyk file = nfile;
230 002d9ce9 2007-10-22 reyk lungetc('\n');
231 002d9ce9 2007-10-22 reyk }
232 e3c7fae6 2010-10-18 sthen ;
233 002d9ce9 2007-10-22 reyk
234 096ff28b 2014-12-12 reyk opttls : /*empty*/ { $$ = 0; }
235 fba21fa4 2023-10-29 kn | TLS { $$ = 1; }
236 6024acb8 2009-04-01 reyk ;
237 6024acb8 2009-04-01 reyk
238 096ff28b 2014-12-12 reyk opttlsclient : /*empty*/ { $$ = 0; }
239 fba21fa4 2023-10-29 kn | WITH TLS { $$ = 1; }
240 096ff28b 2014-12-12 reyk ;
241 096ff28b 2014-12-12 reyk
242 b688796e 2017-11-15 benno http_type : HTTP { $$ = 0; }
243 b688796e 2017-11-15 benno | STRING {
244 68887603 2007-02-26 pyr if (strcmp("https", $1) == 0) {
245 68887603 2007-02-26 pyr $$ = 1;
246 68887603 2007-02-26 pyr } else {
247 6dd60e60 2007-07-05 thib yyerror("invalid check type: %s", $1);
248 68887603 2007-02-26 pyr free($1);
249 68887603 2007-02-26 pyr YYERROR;
250 68887603 2007-02-26 pyr }
251 68887603 2007-02-26 pyr free($1);
252 68887603 2007-02-26 pyr }
253 05982e1a 2007-01-29 pyr ;
254 05982e1a 2007-01-29 pyr
255 85fb7214 2007-09-04 pyr hostname : /* empty */ {
256 85fb7214 2007-09-04 pyr $$ = strdup("");
257 85fb7214 2007-09-04 pyr if ($$ == NULL)
258 85fb7214 2007-09-04 pyr fatal("calloc");
259 85fb7214 2007-09-04 pyr }
260 85fb7214 2007-09-04 pyr | HOST STRING {
261 2e9d43a3 2009-04-17 reyk if (asprintf(&$$, "Host: %s\r\nConnection: close\r\n",
262 2e9d43a3 2009-04-17 reyk $2) == -1)
263 85fb7214 2007-09-04 pyr fatal("asprintf");
264 85fb7214 2007-09-04 pyr }
265 ab7af3ec 2007-11-19 reyk ;
266 85fb7214 2007-09-04 pyr
267 d250825b 2009-04-24 reyk relay_proto : /* empty */ { $$ = RELAY_PROTO_TCP; }
268 ca01b046 2007-12-08 reyk | TCP { $$ = RELAY_PROTO_TCP; }
269 b688796e 2017-11-15 benno | HTTP { $$ = RELAY_PROTO_HTTP; }
270 68887603 2007-02-26 pyr | STRING {
271 b688796e 2017-11-15 benno if (strcmp("dns", $1) == 0) {
272 7ba7514d 2007-09-10 reyk $$ = RELAY_PROTO_DNS;
273 68887603 2007-02-26 pyr } else {
274 6dd60e60 2007-07-05 thib yyerror("invalid protocol type: %s", $1);
275 68887603 2007-02-26 pyr free($1);
276 68887603 2007-02-26 pyr YYERROR;
277 68887603 2007-02-26 pyr }
278 68887603 2007-02-26 pyr free($1);
279 68887603 2007-02-26 pyr }
280 68887603 2007-02-26 pyr ;
281 68887603 2007-02-26 pyr
282 d250825b 2009-04-24 reyk redirect_proto : /* empty */ { $$ = IPPROTO_TCP; }
283 d250825b 2009-04-24 reyk | TCP { $$ = IPPROTO_TCP; }
284 d250825b 2009-04-24 reyk | STRING {
285 d250825b 2009-04-24 reyk struct protoent *p;
286 d250825b 2009-04-24 reyk
287 d250825b 2009-04-24 reyk if ((p = getprotobyname($1)) == NULL) {
288 d250825b 2009-04-24 reyk yyerror("invalid protocol: %s", $1);
289 d250825b 2009-04-24 reyk free($1);
290 d250825b 2009-04-24 reyk YYERROR;
291 d250825b 2009-04-24 reyk }
292 d250825b 2009-04-24 reyk free($1);
293 d250825b 2009-04-24 reyk
294 d250825b 2009-04-24 reyk $$ = p->p_proto;
295 d250825b 2009-04-24 reyk }
296 d250825b 2009-04-24 reyk ;
297 d250825b 2009-04-24 reyk
298 691e5d5c 2007-11-20 reyk eflags_l : eflags comma eflags_l
299 691e5d5c 2007-11-20 reyk | eflags
300 691e5d5c 2007-11-20 reyk ;
301 691e5d5c 2007-11-20 reyk
302 691e5d5c 2007-11-20 reyk opteflags : /* nothing */
303 691e5d5c 2007-11-20 reyk | eflags
304 691e5d5c 2007-11-20 reyk ;
305 691e5d5c 2007-11-20 reyk
306 691e5d5c 2007-11-20 reyk eflags : STYLE STRING
307 691e5d5c 2007-11-20 reyk {
308 691e5d5c 2007-11-20 reyk if ((proto->style = strdup($2)) == NULL)
309 691e5d5c 2007-11-20 reyk fatal("out of memory");
310 691e5d5c 2007-11-20 reyk free($2);
311 691e5d5c 2007-11-20 reyk }
312 691e5d5c 2007-11-20 reyk ;
313 691e5d5c 2007-11-20 reyk
314 b688796e 2017-11-15 benno port : PORT HTTP {
315 b688796e 2017-11-15 benno int p = 0;
316 b688796e 2017-11-15 benno $$.op = PF_OP_EQ;
317 b688796e 2017-11-15 benno if ((p = getservice("http")) == -1)
318 b688796e 2017-11-15 benno YYERROR;
319 b688796e 2017-11-15 benno $$.val[0] = p;
320 b688796e 2017-11-15 benno $$.val[1] = 0;
321 b688796e 2017-11-15 benno }
322 b688796e 2017-11-15 benno | PORT STRING {
323 09913286 2008-09-29 reyk char *a, *b;
324 09913286 2008-09-29 reyk int p[2];
325 68887603 2007-02-26 pyr
326 09913286 2008-09-29 reyk p[0] = p[1] = 0;
327 09913286 2008-09-29 reyk
328 09913286 2008-09-29 reyk a = $2;
329 09913286 2008-09-29 reyk b = strchr($2, ':');
330 09913286 2008-09-29 reyk if (b == NULL)
331 09913286 2008-09-29 reyk $$.op = PF_OP_EQ;
332 09913286 2008-09-29 reyk else {
333 09913286 2008-09-29 reyk *b++ = '\0';
334 09913286 2008-09-29 reyk if ((p[1] = getservice(b)) == -1) {
335 09913286 2008-09-29 reyk free($2);
336 09913286 2008-09-29 reyk YYERROR;
337 09913286 2008-09-29 reyk }
338 09913286 2008-09-29 reyk $$.op = PF_OP_RRG;
339 09913286 2008-09-29 reyk }
340 09913286 2008-09-29 reyk if ((p[0] = getservice(a)) == -1) {
341 4c6cdd88 2007-10-01 pyr free($2);
342 4c6cdd88 2007-10-01 pyr YYERROR;
343 4c6cdd88 2007-10-01 pyr }
344 09913286 2008-09-29 reyk $$.val[0] = p[0];
345 09913286 2008-09-29 reyk $$.val[1] = p[1];
346 48c4b3ed 2007-01-08 reyk free($2);
347 48c4b3ed 2007-01-08 reyk }
348 4c6cdd88 2007-10-01 pyr | PORT NUMBER {
349 edf40961 2017-08-28 florian if ($2 <= 0 || $2 > (int)USHRT_MAX) {
350 65f74224 2019-07-05 patrick yyerror("invalid port: %lld", $2);
351 4c6cdd88 2007-10-01 pyr YYERROR;
352 4c6cdd88 2007-10-01 pyr }
353 09913286 2008-09-29 reyk $$.val[0] = htons($2);
354 09913286 2008-09-29 reyk $$.op = PF_OP_EQ;
355 4c6cdd88 2007-10-01 pyr }
356 48c4b3ed 2007-01-08 reyk ;
357 48c4b3ed 2007-01-08 reyk
358 41042ecc 2006-12-16 reyk varset : STRING '=' STRING {
359 73f26315 2016-06-21 benno char *s = $1;
360 73f26315 2016-06-21 benno while (*s++) {
361 73f26315 2016-06-21 benno if (isspace((unsigned char)*s)) {
362 73f26315 2016-06-21 benno yyerror("macro name cannot contain "
363 73f26315 2016-06-21 benno "whitespace");
364 e6336ca4 2018-04-26 krw free($1);
365 e6336ca4 2018-04-26 krw free($3);
366 73f26315 2016-06-21 benno YYERROR;
367 73f26315 2016-06-21 benno }
368 73f26315 2016-06-21 benno }
369 41042ecc 2006-12-16 reyk if (symset($1, $3, 0) == -1)
370 41042ecc 2006-12-16 reyk fatal("cannot store variable");
371 41042ecc 2006-12-16 reyk free($1);
372 41042ecc 2006-12-16 reyk free($3);
373 41042ecc 2006-12-16 reyk }
374 41042ecc 2006-12-16 reyk ;
375 41042ecc 2006-12-16 reyk
376 7c36f315 2007-01-08 reyk sendbuf : NOTHING {
377 cbeeaf47 2007-01-12 pyr table->sendbuf = NULL;
378 7c36f315 2007-01-08 reyk }
379 7c36f315 2007-01-08 reyk | STRING {
380 cbeeaf47 2007-01-12 pyr table->sendbuf = strdup($1);
381 cbeeaf47 2007-01-12 pyr if (table->sendbuf == NULL)
382 cbeeaf47 2007-01-12 pyr fatal("out of memory");
383 7c36f315 2007-01-08 reyk free($1);
384 7c36f315 2007-01-08 reyk }
385 7c36f315 2007-01-08 reyk ;
386 7c36f315 2007-01-08 reyk
387 738b3cc9 2019-09-15 rob sendbinbuf : NOTHING {
388 738b3cc9 2019-09-15 rob table->sendbinbuf = NULL;
389 738b3cc9 2019-09-15 rob }
390 738b3cc9 2019-09-15 rob | STRING {
391 738b3cc9 2019-09-15 rob if (strlen($1) == 0) {
392 738b3cc9 2019-09-15 rob yyerror("empty binary send data");
393 738b3cc9 2019-09-15 rob free($1);
394 738b3cc9 2019-09-15 rob YYERROR;
395 738b3cc9 2019-09-15 rob }
396 738b3cc9 2019-09-15 rob table->sendbuf = strdup($1);
397 738b3cc9 2019-09-15 rob if (table->sendbuf == NULL)
398 738b3cc9 2019-09-15 rob fatal("out of memory");
399 738b3cc9 2019-09-15 rob table->sendbinbuf = string2binary($1);
400 738b3cc9 2019-09-15 rob if (table->sendbinbuf == NULL)
401 738b3cc9 2019-09-15 rob fatal("failed in binary send data");
402 738b3cc9 2019-09-15 rob free($1);
403 738b3cc9 2019-09-15 rob }
404 738b3cc9 2019-09-15 rob ;
405 738b3cc9 2019-09-15 rob
406 4c6cdd88 2007-10-01 pyr main : INTERVAL NUMBER {
407 58fc320c 2016-09-02 reyk if ((conf->sc_conf.interval.tv_sec = $2) < 0) {
408 65f74224 2019-07-05 patrick yyerror("invalid interval: %lld", $2);
409 4c6cdd88 2007-10-01 pyr YYERROR;
410 4c6cdd88 2007-10-01 pyr }
411 4c6cdd88 2007-10-01 pyr }
412 591e6ab5 2011-05-19 reyk | LOG loglevel {
413 58fc320c 2016-09-02 reyk conf->sc_conf.opts |= $2;
414 591e6ab5 2011-05-19 reyk }
415 90aa962e 2006-12-25 reyk | TIMEOUT timeout {
416 04adeb63 2016-09-26 reyk bcopy(&$2, &conf->sc_conf.timeout,
417 04adeb63 2016-09-26 reyk sizeof(struct timeval));
418 90aa962e 2006-12-25 reyk }
419 4c6cdd88 2007-10-01 pyr | PREFORK NUMBER {
420 9179ded7 2016-09-03 reyk if ($2 <= 0 || $2 > PROC_MAX_INSTANCES) {
421 30640247 2007-02-22 reyk yyerror("invalid number of preforked "
422 65f74224 2019-07-05 patrick "relays: %lld", $2);
423 30640247 2007-02-22 reyk YYERROR;
424 30640247 2007-02-22 reyk }
425 58fc320c 2016-09-02 reyk conf->sc_conf.prefork_relay = $2;
426 30640247 2007-02-22 reyk }
427 04a2f953 2020-09-14 martijn | AGENTX context path {
428 04a2f953 2020-09-14 martijn conf->sc_conf.flags |= F_AGENTX;
429 04a2f953 2020-09-14 martijn if ($2 != NULL) {
430 04a2f953 2020-09-14 martijn if (strlcpy(conf->sc_conf.agentx_context, $2,
431 04a2f953 2020-09-14 martijn sizeof(conf->sc_conf.agentx_context)) >=
432 04a2f953 2020-09-14 martijn sizeof(conf->sc_conf.agentx_context)) {
433 04a2f953 2020-09-14 martijn yyerror("agentx context too long");
434 04a2f953 2020-09-14 martijn free($2);
435 04a2f953 2020-09-14 martijn free($3);
436 04a2f953 2020-09-14 martijn YYERROR;
437 04a2f953 2020-09-14 martijn }
438 04a2f953 2020-09-14 martijn free($2);
439 04a2f953 2020-09-14 martijn } else
440 04a2f953 2020-09-14 martijn conf->sc_conf.agentx_context[0] = '\0';
441 04a2f953 2020-09-14 martijn if ($3 != NULL) {
442 04a2f953 2020-09-14 martijn if (strlcpy(conf->sc_conf.agentx_path, $3,
443 04a2f953 2020-09-14 martijn sizeof(conf->sc_conf.agentx_path)) >=
444 04a2f953 2020-09-14 martijn sizeof(conf->sc_conf.agentx_path)) {
445 04a2f953 2020-09-14 martijn yyerror("agentx path too long");
446 04a2f953 2020-09-14 martijn free($3);
447 04a2f953 2020-09-14 martijn YYERROR;
448 04a2f953 2020-09-14 martijn }
449 04a2f953 2020-09-14 martijn free($3);
450 04a2f953 2020-09-14 martijn } else
451 04a2f953 2020-09-14 martijn (void)strlcpy(conf->sc_conf.agentx_path,
452 189a2332 2020-10-26 martijn AGENTX_MASTER_PATH,
453 04a2f953 2020-09-14 martijn sizeof(conf->sc_conf.agentx_path));
454 04a2f953 2020-09-14 martijn }
455 a98b5322 2017-11-29 benno | SOCKET STRING {
456 a98b5322 2017-11-29 benno conf->sc_ps->ps_csock.cs_name = $2;
457 a98b5322 2017-11-29 benno }
458 41042ecc 2006-12-16 reyk ;
459 41042ecc 2006-12-16 reyk
460 04a2f953 2020-09-14 martijn path : /* nothing */ { $$ = NULL; }
461 04a2f953 2020-09-14 martijn | PATH STRING { $$ = $2; }
462 04a2f953 2020-09-14 martijn
463 04a2f953 2020-09-14 martijn context : /* nothing */ { $$ = NULL; }
464 04a2f953 2020-09-14 martijn | CONTEXT STRING { $$ = $2; }
465 04a2f953 2020-09-14 martijn
466 8d46aaef 2019-09-18 benno loglevel : STATE CHANGES { $$ = RELAYD_OPT_LOGUPDATE; }
467 37ed6014 2018-08-06 benno | HOST CHECKS { $$ = RELAYD_OPT_LOGHOSTCHECK; }
468 37ed6014 2018-08-06 benno | CONNECTION { $$ = (RELAYD_OPT_LOGCON |
469 37ed6014 2018-08-06 benno RELAYD_OPT_LOGCONERR); }
470 37ed6014 2018-08-06 benno | CONNECTION ERRORS { $$ = RELAYD_OPT_LOGCONERR; }
471 f802d393 2007-02-07 reyk ;
472 f802d393 2007-02-07 reyk
473 c8f9d8e3 2007-12-08 pyr rdr : REDIRECT STRING {
474 c8f9d8e3 2007-12-08 pyr struct rdr *srv;
475 41042ecc 2006-12-16 reyk
476 58fc320c 2016-09-02 reyk conf->sc_conf.flags |= F_NEEDPF;
477 591e6ab5 2011-05-19 reyk
478 591e6ab5 2011-05-19 reyk if (!loadcfg) {
479 591e6ab5 2011-05-19 reyk free($2);
480 591e6ab5 2011-05-19 reyk YYACCEPT;
481 591e6ab5 2011-05-19 reyk }
482 591e6ab5 2011-05-19 reyk
483 23fba4ad 2008-01-31 reyk TAILQ_FOREACH(srv, conf->sc_rdrs, entry)
484 87178699 2007-05-27 pyr if (!strcmp(srv->conf.name, $2))
485 41042ecc 2006-12-16 reyk break;
486 41042ecc 2006-12-16 reyk if (srv != NULL) {
487 d7758aba 2007-12-08 reyk yyerror("redirection %s defined twice", $2);
488 41042ecc 2006-12-16 reyk free($2);
489 41042ecc 2006-12-16 reyk YYERROR;
490 41042ecc 2006-12-16 reyk }
491 41042ecc 2006-12-16 reyk if ((srv = calloc(1, sizeof (*srv))) == NULL)
492 41042ecc 2006-12-16 reyk fatal("out of memory");
493 41042ecc 2006-12-16 reyk
494 87178699 2007-05-27 pyr if (strlcpy(srv->conf.name, $2,
495 87178699 2007-05-27 pyr sizeof(srv->conf.name)) >=
496 87178699 2007-05-27 pyr sizeof(srv->conf.name)) {
497 062dadc0 2024-08-10 tb yyerror("redirection name truncated: %s", $2);
498 647e1330 2014-04-21 reyk free($2);
499 33b0029d 2008-01-29 pyr free(srv);
500 41042ecc 2006-12-16 reyk YYERROR;
501 41042ecc 2006-12-16 reyk }
502 4ab45c57 2006-12-16 reyk free($2);
503 9f4dba07 2008-07-17 reyk srv->conf.id = ++last_rdr_id;
504 2ac5660d 2008-05-07 reyk srv->conf.timeout.tv_sec = RELAY_TIMEOUT;
505 c8f9d8e3 2007-12-08 pyr if (last_rdr_id == INT_MAX) {
506 d7758aba 2007-12-08 reyk yyerror("too many redirections defined");
507 33b0029d 2008-01-29 pyr free(srv);
508 41042ecc 2006-12-16 reyk YYERROR;
509 41042ecc 2006-12-16 reyk }
510 c8f9d8e3 2007-12-08 pyr rdr = srv;
511 c8f9d8e3 2007-12-08 pyr } '{' optnl rdropts_l '}' {
512 c8f9d8e3 2007-12-08 pyr if (rdr->table == NULL) {
513 d7758aba 2007-12-08 reyk yyerror("redirection %s has no table",
514 c8f9d8e3 2007-12-08 pyr rdr->conf.name);
515 41042ecc 2006-12-16 reyk YYERROR;
516 41042ecc 2006-12-16 reyk }
517 c8f9d8e3 2007-12-08 pyr if (TAILQ_EMPTY(&rdr->virts)) {
518 d7758aba 2007-12-08 reyk yyerror("redirection %s has no virtual ip",
519 c8f9d8e3 2007-12-08 pyr rdr->conf.name);
520 41042ecc 2006-12-16 reyk YYERROR;
521 41042ecc 2006-12-16 reyk }
522 23fba4ad 2008-01-31 reyk conf->sc_rdrcount++;
523 c8f9d8e3 2007-12-08 pyr if (rdr->backup == NULL) {
524 c8f9d8e3 2007-12-08 pyr rdr->conf.backup_id =
525 23fba4ad 2008-01-31 reyk conf->sc_empty_table.conf.id;
526 23fba4ad 2008-01-31 reyk rdr->backup = &conf->sc_empty_table;
527 c8f9d8e3 2007-12-08 pyr } else if (rdr->backup->conf.port !=
528 c8f9d8e3 2007-12-08 pyr rdr->table->conf.port) {
529 d7758aba 2007-12-08 reyk yyerror("redirection %s uses two different "
530 d7758aba 2007-12-08 reyk "ports for its table and backup table",
531 c8f9d8e3 2007-12-08 pyr rdr->conf.name);
532 41042ecc 2006-12-16 reyk YYERROR;
533 41042ecc 2006-12-16 reyk }
534 c8f9d8e3 2007-12-08 pyr if (!(rdr->conf.flags & F_DISABLE))
535 c8f9d8e3 2007-12-08 pyr rdr->conf.flags |= F_ADD;
536 c812a96d 2008-07-17 reyk TAILQ_INSERT_TAIL(conf->sc_rdrs, rdr, entry);
537 d7758aba 2007-12-08 reyk tableport = 0;
538 c8f9d8e3 2007-12-08 pyr rdr = NULL;
539 41042ecc 2006-12-16 reyk }
540 41042ecc 2006-12-16 reyk ;
541 41042ecc 2006-12-16 reyk
542 c8f9d8e3 2007-12-08 pyr rdropts_l : rdropts_l rdroptsl nl
543 c8f9d8e3 2007-12-08 pyr | rdroptsl optnl
544 41042ecc 2006-12-16 reyk ;
545 41042ecc 2006-12-16 reyk
546 2ac5660d 2008-05-07 reyk rdroptsl : forwardmode TO tablespec interface {
547 3e04b122 2014-12-18 reyk if (hashkey != NULL) {
548 10638510 2014-12-23 reyk memcpy(&rdr->conf.key,
549 10638510 2014-12-23 reyk hashkey, sizeof(rdr->conf.key));
550 10638510 2014-12-23 reyk rdr->conf.flags |= F_HASHKEY;
551 3e04b122 2014-12-18 reyk free(hashkey);
552 3e04b122 2014-12-18 reyk hashkey = NULL;
553 3e04b122 2014-12-18 reyk }
554 3e04b122 2014-12-18 reyk
555 6d5340e6 2008-06-11 reyk switch ($1) {
556 6d5340e6 2008-06-11 reyk case FWD_NORMAL:
557 6d5340e6 2008-06-11 reyk if ($4 == NULL)
558 6d5340e6 2008-06-11 reyk break;
559 6d5340e6 2008-06-11 reyk yyerror("superfluous interface");
560 647e1330 2014-04-21 reyk free($4);
561 6d5340e6 2008-06-11 reyk YYERROR;
562 6d5340e6 2008-06-11 reyk case FWD_ROUTE:
563 6d5340e6 2008-06-11 reyk if ($4 != NULL)
564 6d5340e6 2008-06-11 reyk break;
565 6d5340e6 2008-06-11 reyk yyerror("missing interface to route to");
566 647e1330 2014-04-21 reyk free($4);
567 6d5340e6 2008-06-11 reyk YYERROR;
568 6d5340e6 2008-06-11 reyk case FWD_TRANS:
569 6d5340e6 2008-06-11 reyk yyerror("no transparent forward here");
570 45c9097e 2014-04-20 reyk if ($4 != NULL)
571 45c9097e 2014-04-20 reyk free($4);
572 6d5340e6 2008-06-11 reyk YYERROR;
573 6d5340e6 2008-06-11 reyk }
574 2ac5660d 2008-05-07 reyk if ($4 != NULL) {
575 45c9097e 2014-04-20 reyk if (strlcpy($3->conf.ifname, $4,
576 45c9097e 2014-04-20 reyk sizeof($3->conf.ifname)) >=
577 45c9097e 2014-04-20 reyk sizeof($3->conf.ifname)) {
578 45c9097e 2014-04-20 reyk yyerror("interface name truncated");
579 45c9097e 2014-04-20 reyk free($4);
580 45c9097e 2014-04-20 reyk YYERROR;
581 45c9097e 2014-04-20 reyk }
582 2ac5660d 2008-05-07 reyk free($4);
583 2ac5660d 2008-05-07 reyk }
584 2ac5660d 2008-05-07 reyk
585 d7758aba 2007-12-08 reyk if ($3->conf.check == CHECK_NOCHECK) {
586 d7758aba 2007-12-08 reyk yyerror("table %s has no check", $3->conf.name);
587 2f479274 2015-05-02 claudio purge_table(conf, conf->sc_tables, $3);
588 41042ecc 2006-12-16 reyk YYERROR;
589 41042ecc 2006-12-16 reyk }
590 c8f9d8e3 2007-12-08 pyr if (rdr->backup) {
591 d7758aba 2007-12-08 reyk yyerror("only one backup table is allowed");
592 2f479274 2015-05-02 claudio purge_table(conf, conf->sc_tables, $3);
593 41042ecc 2006-12-16 reyk YYERROR;
594 41042ecc 2006-12-16 reyk }
595 c8f9d8e3 2007-12-08 pyr if (rdr->table) {
596 c8f9d8e3 2007-12-08 pyr rdr->backup = $3;
597 c8f9d8e3 2007-12-08 pyr rdr->conf.backup_id = $3->conf.id;
598 d6c9879f 2012-10-19 reyk if (dstmode != rdr->conf.mode) {
599 d6c9879f 2012-10-19 reyk yyerror("backup table for %s with "
600 d6c9879f 2012-10-19 reyk "different mode", rdr->conf.name);
601 d6c9879f 2012-10-19 reyk YYERROR;
602 d6c9879f 2012-10-19 reyk }
603 d7758aba 2007-12-08 reyk } else {
604 c8f9d8e3 2007-12-08 pyr rdr->table = $3;
605 c8f9d8e3 2007-12-08 pyr rdr->conf.table_id = $3->conf.id;
606 d6c9879f 2012-10-19 reyk rdr->conf.mode = dstmode;
607 41042ecc 2006-12-16 reyk }
608 6d5340e6 2008-06-11 reyk $3->conf.fwdmode = $1;
609 c8f9d8e3 2007-12-08 pyr $3->conf.rdrid = rdr->conf.id;
610 d660dfed 2009-04-01 reyk $3->conf.flags |= F_USED;
611 41042ecc 2006-12-16 reyk }
612 199fb283 2024-06-17 sashan | LISTEN ON STRING redirect_proto port interface pflog {
613 c8f9d8e3 2007-12-08 pyr if (host($3, &rdr->virts,
614 d250825b 2009-04-24 reyk SRV_MAX_VIRTS, &$5, $6, $4) <= 0) {
615 41042ecc 2006-12-16 reyk yyerror("invalid virtual ip: %s", $3);
616 41042ecc 2006-12-16 reyk free($3);
617 d250825b 2009-04-24 reyk free($6);
618 41042ecc 2006-12-16 reyk YYERROR;
619 41042ecc 2006-12-16 reyk }
620 41042ecc 2006-12-16 reyk free($3);
621 d250825b 2009-04-24 reyk free($6);
622 c8f9d8e3 2007-12-08 pyr if (rdr->conf.port == 0)
623 d250825b 2009-04-24 reyk rdr->conf.port = $5.val[0];
624 c8f9d8e3 2007-12-08 pyr tableport = rdr->conf.port;
625 199fb283 2024-06-17 sashan if ($7)
626 199fb283 2024-06-17 sashan rdr->conf.flags |= F_PFLOG;
627 41042ecc 2006-12-16 reyk }
628 c8f9d8e3 2007-12-08 pyr | DISABLE { rdr->conf.flags |= F_DISABLE; }
629 c8f9d8e3 2007-12-08 pyr | STICKYADDR { rdr->conf.flags |= F_STICKY; }
630 69fde657 2014-07-09 reyk | match PFTAG STRING {
631 58fc320c 2016-09-02 reyk conf->sc_conf.flags |= F_NEEDPF;
632 9832d300 2010-10-26 reyk if (strlcpy(rdr->conf.tag, $3,
633 c8f9d8e3 2007-12-08 pyr sizeof(rdr->conf.tag)) >=
634 c8f9d8e3 2007-12-08 pyr sizeof(rdr->conf.tag)) {
635 062dadc0 2024-08-10 tb yyerror("redirection tag name truncated: %s",
636 062dadc0 2024-08-10 tb $3);
637 9832d300 2010-10-26 reyk free($3);
638 41042ecc 2006-12-16 reyk YYERROR;
639 41042ecc 2006-12-16 reyk }
640 9832d300 2010-10-26 reyk if ($1)
641 9832d300 2010-10-26 reyk rdr->conf.flags |= F_MATCH;
642 9832d300 2010-10-26 reyk free($3);
643 41042ecc 2006-12-16 reyk }
644 2ac5660d 2008-05-07 reyk | SESSION TIMEOUT NUMBER {
645 2ac5660d 2008-05-07 reyk if ((rdr->conf.timeout.tv_sec = $3) < 0) {
646 983a954b 2013-04-27 benno yyerror("invalid timeout: %lld", $3);
647 2ac5660d 2008-05-07 reyk YYERROR;
648 2ac5660d 2008-05-07 reyk }
649 983a954b 2013-04-27 benno if (rdr->conf.timeout.tv_sec > INT_MAX) {
650 983a954b 2013-04-27 benno yyerror("timeout too large: %lld", $3);
651 983a954b 2013-04-27 benno YYERROR;
652 983a954b 2013-04-27 benno }
653 2ac5660d 2008-05-07 reyk }
654 29d1b5dd 2007-11-20 reyk | include
655 41042ecc 2006-12-16 reyk ;
656 41042ecc 2006-12-16 reyk
657 9832d300 2010-10-26 reyk match : /* empty */ { $$ = 0; }
658 9832d300 2010-10-26 reyk | MATCH { $$ = 1; }
659 9832d300 2010-10-26 reyk ;
660 9832d300 2010-10-26 reyk
661 199fb283 2024-06-17 sashan pflog : /* empty */ { $$ = 0; }
662 199fb283 2024-06-17 sashan | PFLOG { $$ = 1; }
663 199fb283 2024-06-17 sashan ;
664 199fb283 2024-06-17 sashan
665 6d5340e6 2008-06-11 reyk forwardmode : FORWARD { $$ = FWD_NORMAL; }
666 6d5340e6 2008-06-11 reyk | ROUTE { $$ = FWD_ROUTE; }
667 6d5340e6 2008-06-11 reyk | TRANSPARENT FORWARD { $$ = FWD_TRANS; }
668 2ac5660d 2008-05-07 reyk ;
669 2ac5660d 2008-05-07 reyk
670 d7758aba 2007-12-08 reyk table : '<' STRING '>' {
671 d7758aba 2007-12-08 reyk if (strlen($2) >= TABLE_NAME_SIZE) {
672 d7758aba 2007-12-08 reyk yyerror("invalid table name");
673 d7758aba 2007-12-08 reyk free($2);
674 d7758aba 2007-12-08 reyk YYERROR;
675 d7758aba 2007-12-08 reyk }
676 d7758aba 2007-12-08 reyk $$ = $2;
677 d7758aba 2007-12-08 reyk }
678 d7758aba 2007-12-08 reyk ;
679 d7758aba 2007-12-08 reyk
680 d7758aba 2007-12-08 reyk tabledef : TABLE table {
681 41042ecc 2006-12-16 reyk struct table *tb;
682 41042ecc 2006-12-16 reyk
683 591e6ab5 2011-05-19 reyk if (!loadcfg) {
684 591e6ab5 2011-05-19 reyk free($2);
685 591e6ab5 2011-05-19 reyk YYACCEPT;
686 591e6ab5 2011-05-19 reyk }
687 591e6ab5 2011-05-19 reyk
688 23fba4ad 2008-01-31 reyk TAILQ_FOREACH(tb, conf->sc_tables, entry)
689 87178699 2007-05-27 pyr if (!strcmp(tb->conf.name, $2))
690 41042ecc 2006-12-16 reyk break;
691 41042ecc 2006-12-16 reyk if (tb != NULL) {
692 6dd60e60 2007-07-05 thib yyerror("table %s defined twice", $2);
693 41042ecc 2006-12-16 reyk free($2);
694 41042ecc 2006-12-16 reyk YYERROR;
695 41042ecc 2006-12-16 reyk }
696 4ab45c57 2006-12-16 reyk
697 41042ecc 2006-12-16 reyk if ((tb = calloc(1, sizeof (*tb))) == NULL)
698 41042ecc 2006-12-16 reyk fatal("out of memory");
699 4ab45c57 2006-12-16 reyk
700 45c9097e 2014-04-20 reyk if (strlcpy(tb->conf.name, $2,
701 45c9097e 2014-04-20 reyk sizeof(tb->conf.name)) >= sizeof(tb->conf.name)) {
702 45c9097e 2014-04-20 reyk yyerror("table name truncated");
703 45c9097e 2014-04-20 reyk free($2);
704 45c9097e 2014-04-20 reyk YYERROR;
705 45c9097e 2014-04-20 reyk }
706 d7758aba 2007-12-08 reyk free($2);
707 d7758aba 2007-12-08 reyk
708 9f4dba07 2008-07-17 reyk tb->conf.id = 0; /* will be set later */
709 58fc320c 2016-09-02 reyk bcopy(&conf->sc_conf.timeout, &tb->conf.timeout,
710 919e5ba2 2007-01-03 reyk sizeof(struct timeval));
711 33a2ceaa 2008-07-17 reyk TAILQ_INIT(&tb->hosts);
712 41042ecc 2006-12-16 reyk table = tb;
713 0f7a5e2e 2012-10-03 reyk dstmode = RELAY_DSTMODE_DEFAULT;
714 3a75ae45 2012-10-04 reyk } tabledefopts_l {
715 41042ecc 2006-12-16 reyk if (TAILQ_EMPTY(&table->hosts)) {
716 87178699 2007-05-27 pyr yyerror("table %s has no hosts",
717 87178699 2007-05-27 pyr table->conf.name);
718 41042ecc 2006-12-16 reyk YYERROR;
719 41042ecc 2006-12-16 reyk }
720 23fba4ad 2008-01-31 reyk conf->sc_tablecount++;
721 33a2ceaa 2008-07-17 reyk TAILQ_INSERT_TAIL(conf->sc_tables, table, entry);
722 41042ecc 2006-12-16 reyk }
723 41042ecc 2006-12-16 reyk ;
724 41042ecc 2006-12-16 reyk
725 d7758aba 2007-12-08 reyk tabledefopts_l : tabledefopts_l tabledefopts
726 d7758aba 2007-12-08 reyk | tabledefopts
727 41042ecc 2006-12-16 reyk ;
728 41042ecc 2006-12-16 reyk
729 d7758aba 2007-12-08 reyk tabledefopts : DISABLE { table->conf.flags |= F_DISABLE; }
730 d7758aba 2007-12-08 reyk | '{' optnl tablelist_l '}'
731 d7758aba 2007-12-08 reyk ;
732 d7758aba 2007-12-08 reyk
733 d7758aba 2007-12-08 reyk tablelist_l : tablelist comma tablelist_l
734 d7758aba 2007-12-08 reyk | tablelist optnl
735 d7758aba 2007-12-08 reyk ;
736 d7758aba 2007-12-08 reyk
737 d7758aba 2007-12-08 reyk tablelist : host {
738 87178699 2007-05-27 pyr $1->conf.tableid = table->conf.id;
739 87178699 2007-05-27 pyr $1->tablename = table->conf.name;
740 33a2ceaa 2008-07-17 reyk TAILQ_INSERT_TAIL(&table->hosts, $1, entry);
741 41042ecc 2006-12-16 reyk }
742 d7758aba 2007-12-08 reyk | include
743 d7758aba 2007-12-08 reyk ;
744 d7758aba 2007-12-08 reyk
745 3a75ae45 2012-10-04 reyk tablespec : table {
746 d7758aba 2007-12-08 reyk struct table *tb;
747 d7758aba 2007-12-08 reyk if ((tb = calloc(1, sizeof (*tb))) == NULL)
748 d7758aba 2007-12-08 reyk fatal("out of memory");
749 45c9097e 2014-04-20 reyk if (strlcpy(tb->conf.name, $1,
750 45c9097e 2014-04-20 reyk sizeof(tb->conf.name)) >= sizeof(tb->conf.name)) {
751 45c9097e 2014-04-20 reyk yyerror("table name truncated");
752 45c9097e 2014-04-20 reyk free($1);
753 45c9097e 2014-04-20 reyk YYERROR;
754 45c9097e 2014-04-20 reyk }
755 d7758aba 2007-12-08 reyk free($1);
756 d7758aba 2007-12-08 reyk table = tb;
757 69fde657 2014-07-09 reyk dstmode = RELAY_DSTMODE_DEFAULT;
758 3e04b122 2014-12-18 reyk hashkey = NULL;
759 d7758aba 2007-12-08 reyk } tableopts_l {
760 d7758aba 2007-12-08 reyk struct table *tb;
761 d7758aba 2007-12-08 reyk if (table->conf.port == 0)
762 d7758aba 2007-12-08 reyk table->conf.port = tableport;
763 09913286 2008-09-29 reyk else
764 09913286 2008-09-29 reyk table->conf.flags |= F_PORT;
765 d7758aba 2007-12-08 reyk if ((tb = table_inherit(table)) == NULL)
766 d7758aba 2007-12-08 reyk YYERROR;
767 d7758aba 2007-12-08 reyk $$ = tb;
768 d7758aba 2007-12-08 reyk }
769 d7758aba 2007-12-08 reyk ;
770 d7758aba 2007-12-08 reyk
771 d7758aba 2007-12-08 reyk tableopts_l : tableopts tableopts_l
772 d7758aba 2007-12-08 reyk | tableopts
773 d7758aba 2007-12-08 reyk ;
774 d7758aba 2007-12-08 reyk
775 2e6003cf 2010-09-02 sobrado tableopts : CHECK tablecheck
776 09913286 2008-09-29 reyk | port {
777 09913286 2008-09-29 reyk if ($1.op != PF_OP_EQ) {
778 09913286 2008-09-29 reyk yyerror("invalid port");
779 09913286 2008-09-29 reyk YYERROR;
780 09913286 2008-09-29 reyk }
781 09913286 2008-09-29 reyk table->conf.port = $1.val[0];
782 09913286 2008-09-29 reyk }
783 90aa962e 2006-12-25 reyk | TIMEOUT timeout {
784 87178699 2007-05-27 pyr bcopy(&$2, &table->conf.timeout,
785 87178699 2007-05-27 pyr sizeof(struct timeval));
786 41042ecc 2006-12-16 reyk }
787 d7758aba 2007-12-08 reyk | DEMOTE STRING {
788 d7758aba 2007-12-08 reyk table->conf.flags |= F_DEMOTE;
789 d7758aba 2007-12-08 reyk if (strlcpy(table->conf.demote_group, $2,
790 d7758aba 2007-12-08 reyk sizeof(table->conf.demote_group))
791 d7758aba 2007-12-08 reyk >= sizeof(table->conf.demote_group)) {
792 d7758aba 2007-12-08 reyk yyerror("yyparse: demote group name too long");
793 d7758aba 2007-12-08 reyk free($2);
794 d7758aba 2007-12-08 reyk YYERROR;
795 d7758aba 2007-12-08 reyk }
796 d7758aba 2007-12-08 reyk free($2);
797 d7758aba 2007-12-08 reyk if (carp_demote_init(table->conf.demote_group, 1)
798 d7758aba 2007-12-08 reyk == -1) {
799 d7758aba 2007-12-08 reyk yyerror("yyparse: error initializing group "
800 d7758aba 2007-12-08 reyk "'%s'", table->conf.demote_group);
801 d7758aba 2007-12-08 reyk YYERROR;
802 d7758aba 2007-12-08 reyk }
803 41042ecc 2006-12-16 reyk }
804 d7758aba 2007-12-08 reyk | INTERVAL NUMBER {
805 58fc320c 2016-09-02 reyk if ($2 < conf->sc_conf.interval.tv_sec ||
806 58fc320c 2016-09-02 reyk $2 % conf->sc_conf.interval.tv_sec) {
807 d7758aba 2007-12-08 reyk yyerror("table interval must be "
808 d7758aba 2007-12-08 reyk "divisible by global interval");
809 d7758aba 2007-12-08 reyk YYERROR;
810 d7758aba 2007-12-08 reyk }
811 3a75ae45 2012-10-04 reyk table->conf.skip_cnt =
812 58fc320c 2016-09-02 reyk ($2 / conf->sc_conf.interval.tv_sec) - 1;
813 41042ecc 2006-12-16 reyk }
814 3e04b122 2014-12-18 reyk | MODE dstmode hashkey {
815 d7758aba 2007-12-08 reyk switch ($2) {
816 d7758aba 2007-12-08 reyk case RELAY_DSTMODE_LOADBALANCE:
817 d7758aba 2007-12-08 reyk case RELAY_DSTMODE_HASH:
818 d6c9879f 2012-10-19 reyk case RELAY_DSTMODE_SRCHASH:
819 3e04b122 2014-12-18 reyk if (hashkey != NULL) {
820 3e04b122 2014-12-18 reyk yyerror("key already specified");
821 3e04b122 2014-12-18 reyk free(hashkey);
822 3e04b122 2014-12-18 reyk YYERROR;
823 3e04b122 2014-12-18 reyk }
824 3e04b122 2014-12-18 reyk if ((hashkey = calloc(1,
825 3e04b122 2014-12-18 reyk sizeof(*hashkey))) == NULL)
826 3e04b122 2014-12-18 reyk fatal("out of memory");
827 3e04b122 2014-12-18 reyk memcpy(hashkey, &$3.key, sizeof(*hashkey));
828 3e04b122 2014-12-18 reyk break;
829 3e04b122 2014-12-18 reyk default:
830 3e04b122 2014-12-18 reyk if ($3.keyset) {
831 3e04b122 2014-12-18 reyk yyerror("key not supported by mode");
832 3e04b122 2014-12-18 reyk YYERROR;
833 3e04b122 2014-12-18 reyk }
834 3e04b122 2014-12-18 reyk hashkey = NULL;
835 3e04b122 2014-12-18 reyk break;
836 3e04b122 2014-12-18 reyk }
837 3e04b122 2014-12-18 reyk
838 3e04b122 2014-12-18 reyk switch ($2) {
839 3e04b122 2014-12-18 reyk case RELAY_DSTMODE_LOADBALANCE:
840 3e04b122 2014-12-18 reyk case RELAY_DSTMODE_HASH:
841 c8f9d8e3 2007-12-08 pyr if (rdr != NULL) {
842 d7758aba 2007-12-08 reyk yyerror("mode not supported "
843 d7758aba 2007-12-08 reyk "for redirections");
844 d7758aba 2007-12-08 reyk YYERROR;
845 d7758aba 2007-12-08 reyk }
846 d7758aba 2007-12-08 reyk /* FALLTHROUGH */
847 10638510 2014-12-23 reyk case RELAY_DSTMODE_RANDOM:
848 d7758aba 2007-12-08 reyk case RELAY_DSTMODE_ROUNDROBIN:
849 10638510 2014-12-23 reyk case RELAY_DSTMODE_SRCHASH:
850 0f7a5e2e 2012-10-03 reyk dstmode = $2;
851 d7758aba 2007-12-08 reyk break;
852 d6c9879f 2012-10-19 reyk case RELAY_DSTMODE_LEASTSTATES:
853 d6c9879f 2012-10-19 reyk if (rdr == NULL) {
854 d6c9879f 2012-10-19 reyk yyerror("mode not supported "
855 d6c9879f 2012-10-19 reyk "for relays");
856 d6c9879f 2012-10-19 reyk YYERROR;
857 d6c9879f 2012-10-19 reyk }
858 d6c9879f 2012-10-19 reyk dstmode = $2;
859 d6c9879f 2012-10-19 reyk break;
860 d7758aba 2007-12-08 reyk }
861 d7758aba 2007-12-08 reyk }
862 d7758aba 2007-12-08 reyk ;
863 d7758aba 2007-12-08 reyk
864 3e04b122 2014-12-18 reyk /* should be in sync with sbin/pfctl/parse.y's hashkey */
865 3e04b122 2014-12-18 reyk hashkey : /* empty */ {
866 3e04b122 2014-12-18 reyk $$.keyset = 0;
867 3e04b122 2014-12-18 reyk $$.key.data[0] = arc4random();
868 3e04b122 2014-12-18 reyk $$.key.data[1] = arc4random();
869 3e04b122 2014-12-18 reyk $$.key.data[2] = arc4random();
870 3e04b122 2014-12-18 reyk $$.key.data[3] = arc4random();
871 3e04b122 2014-12-18 reyk }
872 3e04b122 2014-12-18 reyk | STRING {
873 3e04b122 2014-12-18 reyk /* manual key configuration */
874 3e04b122 2014-12-18 reyk $$.keyset = 1;
875 3e04b122 2014-12-18 reyk
876 3e04b122 2014-12-18 reyk if (!strncmp($1, "0x", 2)) {
877 3e04b122 2014-12-18 reyk if (strlen($1) != 34) {
878 3e04b122 2014-12-18 reyk free($1);
879 3e04b122 2014-12-18 reyk yyerror("hex key must be 128 bits "
880 3e04b122 2014-12-18 reyk "(32 hex digits) long");
881 3e04b122 2014-12-18 reyk YYERROR;
882 3e04b122 2014-12-18 reyk }
883 3e04b122 2014-12-18 reyk
884 3e04b122 2014-12-18 reyk if (sscanf($1, "0x%8x%8x%8x%8x",
885 3e04b122 2014-12-18 reyk &$$.key.data[0], &$$.key.data[1],
886 3e04b122 2014-12-18 reyk &$$.key.data[2], &$$.key.data[3]) != 4) {
887 3e04b122 2014-12-18 reyk free($1);
888 3e04b122 2014-12-18 reyk yyerror("invalid hex key");
889 3e04b122 2014-12-18 reyk YYERROR;
890 3e04b122 2014-12-18 reyk }
891 3e04b122 2014-12-18 reyk } else {
892 3e04b122 2014-12-18 reyk MD5_CTX context;
893 3e04b122 2014-12-18 reyk
894 3e04b122 2014-12-18 reyk MD5Init(&context);
895 3e04b122 2014-12-18 reyk MD5Update(&context, (unsigned char *)$1,
896 3e04b122 2014-12-18 reyk strlen($1));
897 3e04b122 2014-12-18 reyk MD5Final((unsigned char *)$$.key.data,
898 3e04b122 2014-12-18 reyk &context);
899 3e04b122 2014-12-18 reyk HTONL($$.key.data[0]);
900 3e04b122 2014-12-18 reyk HTONL($$.key.data[1]);
901 3e04b122 2014-12-18 reyk HTONL($$.key.data[2]);
902 3e04b122 2014-12-18 reyk HTONL($$.key.data[3]);
903 3e04b122 2014-12-18 reyk }
904 3e04b122 2014-12-18 reyk free($1);
905 3e04b122 2014-12-18 reyk }
906 3e04b122 2014-12-18 reyk ;
907 3e04b122 2014-12-18 reyk
908 d7758aba 2007-12-08 reyk tablecheck : ICMP { table->conf.check = CHECK_ICMP; }
909 d7758aba 2007-12-08 reyk | TCP { table->conf.check = CHECK_TCP; }
910 fba21fa4 2023-10-29 kn | TLS {
911 87178699 2007-05-27 pyr table->conf.check = CHECK_TCP;
912 58fc320c 2016-09-02 reyk conf->sc_conf.flags |= F_TLS;
913 096ff28b 2014-12-12 reyk table->conf.flags |= F_TLS;
914 05982e1a 2007-01-29 pyr }
915 d7758aba 2007-12-08 reyk | http_type STRING hostname CODE NUMBER {
916 d7758aba 2007-12-08 reyk if ($1) {
917 58fc320c 2016-09-02 reyk conf->sc_conf.flags |= F_TLS;
918 096ff28b 2014-12-12 reyk table->conf.flags |= F_TLS;
919 05982e1a 2007-01-29 pyr }
920 87178699 2007-05-27 pyr table->conf.check = CHECK_HTTP_CODE;
921 d7758aba 2007-12-08 reyk if ((table->conf.retcode = $5) <= 0) {
922 65f74224 2019-07-05 patrick yyerror("invalid HTTP code: %lld", $5);
923 d7758aba 2007-12-08 reyk free($2);
924 4c6cdd88 2007-10-01 pyr free($3);
925 4c6cdd88 2007-10-01 pyr YYERROR;
926 4c6cdd88 2007-10-01 pyr }
927 1ad64381 2007-02-08 reyk if (asprintf(&table->sendbuf,
928 18abd06b 2026-03-03 rsadowski "HEAD %s HTTP/1.%c\r\nUser-Agent: %s\r\n%s\r\n",
929 18abd06b 2026-03-03 rsadowski $2, strlen($3) ? '1' : '0', RELAYD_SERVERNAME, $3) == -1)
930 1ad64381 2007-02-08 reyk fatal("asprintf");
931 d7758aba 2007-12-08 reyk free($2);
932 cbeeaf47 2007-01-12 pyr free($3);
933 cbeeaf47 2007-01-12 pyr if (table->sendbuf == NULL)
934 cbeeaf47 2007-01-12 pyr fatal("out of memory");
935 41042ecc 2006-12-16 reyk }
936 d7758aba 2007-12-08 reyk | http_type STRING hostname digest {
937 d7758aba 2007-12-08 reyk if ($1) {
938 58fc320c 2016-09-02 reyk conf->sc_conf.flags |= F_TLS;
939 096ff28b 2014-12-12 reyk table->conf.flags |= F_TLS;
940 05982e1a 2007-01-29 pyr }
941 87178699 2007-05-27 pyr table->conf.check = CHECK_HTTP_DIGEST;
942 1ad64381 2007-02-08 reyk if (asprintf(&table->sendbuf,
943 18abd06b 2026-03-03 rsadowski "GET %s HTTP/1.%c\r\nUser-Agent: %s\r\n%s\r\n",
944 18abd06b 2026-03-03 rsadowski $2, strlen($3) ? '1' : '0', RELAYD_SERVERNAME, $3) == -1)
945 1ad64381 2007-02-08 reyk fatal("asprintf");
946 d7758aba 2007-12-08 reyk free($2);
947 cbeeaf47 2007-01-12 pyr free($3);
948 cbeeaf47 2007-01-12 pyr if (table->sendbuf == NULL)
949 cbeeaf47 2007-01-12 pyr fatal("out of memory");
950 45c9097e 2014-04-20 reyk if (strlcpy(table->conf.digest, $4.digest,
951 45c9097e 2014-04-20 reyk sizeof(table->conf.digest)) >=
952 45c9097e 2014-04-20 reyk sizeof(table->conf.digest)) {
953 45c9097e 2014-04-20 reyk yyerror("digest truncated");
954 45c9097e 2014-04-20 reyk free($4.digest);
955 45c9097e 2014-04-20 reyk YYERROR;
956 45c9097e 2014-04-20 reyk }
957 d7758aba 2007-12-08 reyk table->conf.digest_type = $4.type;
958 d7758aba 2007-12-08 reyk free($4.digest);
959 41042ecc 2006-12-16 reyk }
960 096ff28b 2014-12-12 reyk | SEND sendbuf EXPECT STRING opttls {
961 87178699 2007-05-27 pyr table->conf.check = CHECK_SEND_EXPECT;
962 d7758aba 2007-12-08 reyk if ($5) {
963 58fc320c 2016-09-02 reyk conf->sc_conf.flags |= F_TLS;
964 096ff28b 2014-12-12 reyk table->conf.flags |= F_TLS;
965 50c4bd1a 2007-02-26 pyr }
966 d7758aba 2007-12-08 reyk if (strlcpy(table->conf.exbuf, $4,
967 87178699 2007-05-27 pyr sizeof(table->conf.exbuf))
968 87178699 2007-05-27 pyr >= sizeof(table->conf.exbuf)) {
969 f89c70fd 2007-01-08 reyk yyerror("yyparse: expect buffer truncated");
970 d7758aba 2007-12-08 reyk free($4);
971 7c36f315 2007-01-08 reyk YYERROR;
972 7c36f315 2007-01-08 reyk }
973 b279fb39 2007-10-02 pyr translate_string(table->conf.exbuf);
974 d7758aba 2007-12-08 reyk free($4);
975 7c36f315 2007-01-08 reyk }
976 738b3cc9 2019-09-15 rob | BINARY SEND sendbinbuf EXPECT STRING opttls {
977 738b3cc9 2019-09-15 rob table->conf.check = CHECK_BINSEND_EXPECT;
978 738b3cc9 2019-09-15 rob if ($6) {
979 738b3cc9 2019-09-15 rob conf->sc_conf.flags |= F_TLS;
980 738b3cc9 2019-09-15 rob table->conf.flags |= F_TLS;
981 738b3cc9 2019-09-15 rob }
982 738b3cc9 2019-09-15 rob if (strlen($5) == 0) {
983 738b3cc9 2019-09-15 rob yyerror("empty binary expect data");
984 738b3cc9 2019-09-15 rob free($5);
985 738b3cc9 2019-09-15 rob YYERROR;
986 738b3cc9 2019-09-15 rob }
987 738b3cc9 2019-09-15 rob if (strlcpy(table->conf.exbuf, $5,
988 738b3cc9 2019-09-15 rob sizeof(table->conf.exbuf))
989 738b3cc9 2019-09-15 rob >= sizeof(table->conf.exbuf)) {
990 738b3cc9 2019-09-15 rob yyerror("expect buffer truncated");
991 738b3cc9 2019-09-15 rob free($5);
992 738b3cc9 2019-09-15 rob YYERROR;
993 738b3cc9 2019-09-15 rob }
994 738b3cc9 2019-09-15 rob struct ibuf *ibuf = string2binary($5);
995 738b3cc9 2019-09-15 rob if (ibuf == NULL) {
996 738b3cc9 2019-09-15 rob yyerror("failed in binary expect data buffer");
997 738b3cc9 2019-09-15 rob ibuf_free(ibuf);
998 738b3cc9 2019-09-15 rob free($5);
999 738b3cc9 2019-09-15 rob YYERROR;
1000 738b3cc9 2019-09-15 rob }
1001 a4719117 2023-07-03 claudio memcpy(table->conf.exbinbuf, ibuf_data(ibuf),
1002 738b3cc9 2019-09-15 rob ibuf_size(ibuf));
1003 738b3cc9 2019-09-15 rob ibuf_free(ibuf);
1004 738b3cc9 2019-09-15 rob free($5);
1005 738b3cc9 2019-09-15 rob }
1006 d7758aba 2007-12-08 reyk | SCRIPT STRING {
1007 292100ef 2007-05-29 reyk table->conf.check = CHECK_SCRIPT;
1008 d7758aba 2007-12-08 reyk if (strlcpy(table->conf.path, $2,
1009 292100ef 2007-05-29 reyk sizeof(table->conf.path)) >=
1010 292100ef 2007-05-29 reyk sizeof(table->conf.path)) {
1011 292100ef 2007-05-29 reyk yyerror("script path truncated");
1012 30640247 2007-02-22 reyk free($2);
1013 30640247 2007-02-22 reyk YYERROR;
1014 30640247 2007-02-22 reyk }
1015 58fc320c 2016-09-02 reyk conf->sc_conf.flags |= F_SCRIPT;
1016 30640247 2007-02-22 reyk free($2);
1017 30640247 2007-02-22 reyk }
1018 41042ecc 2006-12-16 reyk ;
1019 41042ecc 2006-12-16 reyk
1020 8a025509 2007-11-21 reyk digest : DIGEST STRING
1021 8a025509 2007-11-21 reyk {
1022 8a025509 2007-11-21 reyk switch (strlen($2)) {
1023 8a025509 2007-11-21 reyk case 40:
1024 8a025509 2007-11-21 reyk $$.type = DIGEST_SHA1;
1025 8a025509 2007-11-21 reyk break;
1026 8a025509 2007-11-21 reyk case 32:
1027 8a025509 2007-11-21 reyk $$.type = DIGEST_MD5;
1028 8a025509 2007-11-21 reyk break;
1029 8a025509 2007-11-21 reyk default:
1030 8a025509 2007-11-21 reyk yyerror("invalid http digest");
1031 8a025509 2007-11-21 reyk free($2);
1032 8a025509 2007-11-21 reyk YYERROR;
1033 8a025509 2007-11-21 reyk }
1034 8a025509 2007-11-21 reyk $$.digest = $2;
1035 8a025509 2007-11-21 reyk }
1036 8a025509 2007-11-21 reyk ;
1037 8a025509 2007-11-21 reyk
1038 69fde657 2014-07-09 reyk optdigest : digest {
1039 69fde657 2014-07-09 reyk $$.digest = $1.digest;
1040 69fde657 2014-07-09 reyk $$.type = $1.type;
1041 69fde657 2014-07-09 reyk }
1042 69fde657 2014-07-09 reyk | STRING {
1043 69fde657 2014-07-09 reyk $$.digest = $1;
1044 69fde657 2014-07-09 reyk $$.type = DIGEST_NONE;
1045 69fde657 2014-07-09 reyk }
1046 69fde657 2014-07-09 reyk ;
1047 69fde657 2014-07-09 reyk
1048 d250825b 2009-04-24 reyk proto : relay_proto PROTO STRING {
1049 3b232a62 2019-05-29 reyk struct protocol *p;
1050 30640247 2007-02-22 reyk
1051 591e6ab5 2011-05-19 reyk if (!loadcfg) {
1052 591e6ab5 2011-05-19 reyk free($3);
1053 591e6ab5 2011-05-19 reyk YYACCEPT;
1054 591e6ab5 2011-05-19 reyk }
1055 591e6ab5 2011-05-19 reyk
1056 d7758aba 2007-12-08 reyk if (strcmp($3, "default") == 0) {
1057 23fba4ad 2008-01-31 reyk p = &conf->sc_proto_default;
1058 71840ae2 2007-11-15 pyr } else {
1059 23fba4ad 2008-01-31 reyk TAILQ_FOREACH(p, conf->sc_protos, entry)
1060 d7758aba 2007-12-08 reyk if (!strcmp(p->name, $3))
1061 71840ae2 2007-11-15 pyr break;
1062 71840ae2 2007-11-15 pyr }
1063 30640247 2007-02-22 reyk if (p != NULL) {
1064 d7758aba 2007-12-08 reyk yyerror("protocol %s defined twice", $3);
1065 d7758aba 2007-12-08 reyk free($3);
1066 30640247 2007-02-22 reyk YYERROR;
1067 30640247 2007-02-22 reyk }
1068 30640247 2007-02-22 reyk if ((p = calloc(1, sizeof (*p))) == NULL)
1069 30640247 2007-02-22 reyk fatal("out of memory");
1070 30640247 2007-02-22 reyk
1071 d7758aba 2007-12-08 reyk if (strlcpy(p->name, $3, sizeof(p->name)) >=
1072 30640247 2007-02-22 reyk sizeof(p->name)) {
1073 30640247 2007-02-22 reyk yyerror("protocol name truncated");
1074 647e1330 2014-04-21 reyk free($3);
1075 33b0029d 2008-01-29 pyr free(p);
1076 30640247 2007-02-22 reyk YYERROR;
1077 30640247 2007-02-22 reyk }
1078 d7758aba 2007-12-08 reyk free($3);
1079 9f4dba07 2008-07-17 reyk p->id = ++last_proto_id;
1080 d7758aba 2007-12-08 reyk p->type = $1;
1081 ed29f86d 2007-02-24 reyk p->tcpflags = TCPFLAG_DEFAULT;
1082 096ff28b 2014-12-12 reyk p->tlsflags = TLSFLAG_DEFAULT;
1083 ed29f86d 2007-02-24 reyk p->tcpbacklog = RELAY_BACKLOG;
1084 b688796e 2017-11-15 benno p->httpheaderlen = RELAY_DEFHEADERLENGTH;
1085 69fde657 2014-07-09 reyk TAILQ_INIT(&p->rules);
1086 9261e0d8 2019-05-31 reyk TAILQ_INIT(&p->tlscerts);
1087 096ff28b 2014-12-12 reyk (void)strlcpy(p->tlsciphers, TLSCIPHERS_DEFAULT,
1088 096ff28b 2014-12-12 reyk sizeof(p->tlsciphers));
1089 3fe6d92f 2017-11-27 claudio (void)strlcpy(p->tlsecdhecurves, TLSECDHECURVES_DEFAULT,
1090 3fe6d92f 2017-11-27 claudio sizeof(p->tlsecdhecurves));
1091 f4a6eef3 2017-05-27 claudio (void)strlcpy(p->tlsdhparams, TLSDHPARAM_DEFAULT,
1092 f4a6eef3 2017-05-27 claudio sizeof(p->tlsdhparams));
1093 30640247 2007-02-22 reyk if (last_proto_id == INT_MAX) {
1094 30640247 2007-02-22 reyk yyerror("too many protocols defined");
1095 33b0029d 2008-01-29 pyr free(p);
1096 30640247 2007-02-22 reyk YYERROR;
1097 30640247 2007-02-22 reyk }
1098 30640247 2007-02-22 reyk proto = p;
1099 d7758aba 2007-12-08 reyk } protopts_n {
1100 23fba4ad 2008-01-31 reyk conf->sc_protocount++;
1101 ed29f86d 2007-02-24 reyk
1102 096ff28b 2014-12-12 reyk if ((proto->tlsflags & TLSFLAG_VERSION) == 0) {
1103 096ff28b 2014-12-12 reyk yyerror("invalid TLS protocol");
1104 ed29f86d 2007-02-24 reyk YYERROR;
1105 ed29f86d 2007-02-24 reyk }
1106 c812a96d 2008-07-17 reyk TAILQ_INSERT_TAIL(conf->sc_protos, proto, entry);
1107 30640247 2007-02-22 reyk }
1108 30640247 2007-02-22 reyk ;
1109 30640247 2007-02-22 reyk
1110 80347df3 2026-02-18 kirill optproxyproto : /* empty */ { $$ = 0; }
1111 80347df3 2026-02-18 kirill | PROXYPROTO V1 { $$ = F_PROXYV1; }
1112 80347df3 2026-02-18 kirill | PROXYPROTO V2 { $$ = F_PROXYV2; }
1113 80347df3 2026-02-18 kirill ;
1114 80347df3 2026-02-18 kirill
1115 d7758aba 2007-12-08 reyk protopts_n : /* empty */
1116 d7758aba 2007-12-08 reyk | '{' '}'
1117 d7758aba 2007-12-08 reyk | '{' optnl protopts_l '}'
1118 d7758aba 2007-12-08 reyk ;
1119 d7758aba 2007-12-08 reyk
1120 30640247 2007-02-22 reyk protopts_l : protopts_l protoptsl nl
1121 30640247 2007-02-22 reyk | protoptsl optnl
1122 30640247 2007-02-22 reyk ;
1123 30640247 2007-02-22 reyk
1124 fba21fa4 2023-10-29 kn protoptsl : TLS {
1125 c4809a85 2020-02-12 benno if (!(proto->type == RELAY_PROTO_TCP ||
1126 c4809a85 2020-02-12 benno proto->type == RELAY_PROTO_HTTP)) {
1127 c4809a85 2020-02-12 benno yyerror("can set tls options only for "
1128 c4809a85 2020-02-12 benno "tcp or http protocols");
1129 c4809a85 2020-02-12 benno YYERROR;
1130 c4809a85 2020-02-12 benno }
1131 c4809a85 2020-02-12 benno } tlsflags
1132 fba21fa4 2023-10-29 kn | TLS {
1133 c4809a85 2020-02-12 benno if (!(proto->type == RELAY_PROTO_TCP ||
1134 c4809a85 2020-02-12 benno proto->type == RELAY_PROTO_HTTP)) {
1135 c4809a85 2020-02-12 benno yyerror("can set tls options only for "
1136 c4809a85 2020-02-12 benno "tcp or http protocols");
1137 c4809a85 2020-02-12 benno YYERROR;
1138 c4809a85 2020-02-12 benno }
1139 c4809a85 2020-02-12 benno } '{' tlsflags_l '}'
1140 c4809a85 2020-02-12 benno | TCP {
1141 c4809a85 2020-02-12 benno if (!(proto->type == RELAY_PROTO_TCP ||
1142 c4809a85 2020-02-12 benno proto->type == RELAY_PROTO_HTTP)) {
1143 c4809a85 2020-02-12 benno yyerror("can set tcp options only for "
1144 c4809a85 2020-02-12 benno "tcp or http protocols");
1145 c4809a85 2020-02-12 benno YYERROR;
1146 c4809a85 2020-02-12 benno }
1147 c4809a85 2020-02-12 benno } tcpflags
1148 c4809a85 2020-02-12 benno | TCP {
1149 c4809a85 2020-02-12 benno if (!(proto->type == RELAY_PROTO_TCP ||
1150 c4809a85 2020-02-12 benno proto->type == RELAY_PROTO_HTTP)) {
1151 c4809a85 2020-02-12 benno yyerror("can set tcp options only for "
1152 c4809a85 2020-02-12 benno "tcp or http protocols");
1153 c4809a85 2020-02-12 benno YYERROR;
1154 c4809a85 2020-02-12 benno }
1155 c4809a85 2020-02-12 benno } '{' tcpflags_l '}'
1156 c0f9bf60 2019-03-04 benno | HTTP {
1157 c0f9bf60 2019-03-04 benno if (proto->type != RELAY_PROTO_HTTP) {
1158 c0f9bf60 2019-03-04 benno yyerror("can set http options only for "
1159 c0f9bf60 2019-03-04 benno "http protocol");
1160 c0f9bf60 2019-03-04 benno YYERROR;
1161 c0f9bf60 2019-03-04 benno }
1162 c0f9bf60 2019-03-04 benno } httpflags
1163 c0f9bf60 2019-03-04 benno | HTTP {
1164 c0f9bf60 2019-03-04 benno if (proto->type != RELAY_PROTO_HTTP) {
1165 c0f9bf60 2019-03-04 benno yyerror("can set http options only for "
1166 c0f9bf60 2019-03-04 benno "http protocol");
1167 c0f9bf60 2019-03-04 benno YYERROR;
1168 c0f9bf60 2019-03-04 benno }
1169 c0f9bf60 2019-03-04 benno } '{' httpflags_l '}'
1170 691e5d5c 2007-11-20 reyk | RETURN ERROR opteflags { proto->flags |= F_RETURN; }
1171 691e5d5c 2007-11-20 reyk | RETURN ERROR '{' eflags_l '}' { proto->flags |= F_RETURN; }
1172 69fde657 2014-07-09 reyk | filterrule
1173 29d1b5dd 2007-11-20 reyk | include
1174 30640247 2007-02-22 reyk ;
1175 30640247 2007-02-22 reyk
1176 b688796e 2017-11-15 benno
1177 b688796e 2017-11-15 benno httpflags_l : httpflags comma httpflags_l
1178 b688796e 2017-11-15 benno | httpflags
1179 b688796e 2017-11-15 benno ;
1180 b688796e 2017-11-15 benno
1181 b688796e 2017-11-15 benno httpflags : HEADERLEN NUMBER {
1182 b688796e 2017-11-15 benno if ($2 < 0 || $2 > RELAY_MAXHEADERLENGTH) {
1183 65f74224 2019-07-05 patrick yyerror("invalid headerlen: %lld", $2);
1184 b688796e 2017-11-15 benno YYERROR;
1185 b688796e 2017-11-15 benno }
1186 b688796e 2017-11-15 benno proto->httpheaderlen = $2;
1187 b688796e 2017-11-15 benno }
1188 c0f9bf60 2019-03-04 benno | WEBSOCKETS { proto->httpflags |= HTTPFLAG_WEBSOCKETS; }
1189 c0f9bf60 2019-03-04 benno | NO WEBSOCKETS { proto->httpflags &= ~HTTPFLAG_WEBSOCKETS; }
1190 b688796e 2017-11-15 benno ;
1191 b688796e 2017-11-15 benno
1192 30640247 2007-02-22 reyk tcpflags_l : tcpflags comma tcpflags_l
1193 30640247 2007-02-22 reyk | tcpflags
1194 30640247 2007-02-22 reyk ;
1195 30640247 2007-02-22 reyk
1196 ab7af3ec 2007-11-19 reyk tcpflags : SACK { proto->tcpflags |= TCPFLAG_SACK; }
1197 30640247 2007-02-22 reyk | NO SACK { proto->tcpflags |= TCPFLAG_NSACK; }
1198 30640247 2007-02-22 reyk | NODELAY { proto->tcpflags |= TCPFLAG_NODELAY; }
1199 30640247 2007-02-22 reyk | NO NODELAY { proto->tcpflags |= TCPFLAG_NNODELAY; }
1200 ee6d33e4 2011-04-12 reyk | SPLICE { /* default */ }
1201 ee6d33e4 2011-04-12 reyk | NO SPLICE { proto->tcpflags |= TCPFLAG_NSPLICE; }
1202 4c6cdd88 2007-10-01 pyr | BACKLOG NUMBER {
1203 62110500 2018-04-18 claudio if ($2 < 0 || $2 > RELAY_MAX_BACKLOG) {
1204 65f74224 2019-07-05 patrick yyerror("invalid backlog: %lld", $2);
1205 ed29f86d 2007-02-24 reyk YYERROR;
1206 ed29f86d 2007-02-24 reyk }
1207 ed29f86d 2007-02-24 reyk proto->tcpbacklog = $2;
1208 ed29f86d 2007-02-24 reyk }
1209 4c6cdd88 2007-10-01 pyr | SOCKET BUFFER NUMBER {
1210 30640247 2007-02-22 reyk proto->tcpflags |= TCPFLAG_BUFSIZ;
1211 4c6cdd88 2007-10-01 pyr if ((proto->tcpbufsiz = $3) < 0) {
1212 65f74224 2019-07-05 patrick yyerror("invalid socket buffer size: %lld", $3);
1213 4c6cdd88 2007-10-01 pyr YYERROR;
1214 4c6cdd88 2007-10-01 pyr }
1215 30640247 2007-02-22 reyk }
1216 4c6cdd88 2007-10-01 pyr | IP STRING NUMBER {
1217 4c6cdd88 2007-10-01 pyr if ($3 < 0) {
1218 65f74224 2019-07-05 patrick yyerror("invalid ttl: %lld", $3);
1219 4c6cdd88 2007-10-01 pyr free($2);
1220 4c6cdd88 2007-10-01 pyr YYERROR;
1221 4c6cdd88 2007-10-01 pyr }
1222 0a6c88ff 2007-03-13 reyk if (strcasecmp("ttl", $2) == 0) {
1223 0a6c88ff 2007-03-13 reyk proto->tcpflags |= TCPFLAG_IPTTL;
1224 0a6c88ff 2007-03-13 reyk proto->tcpipttl = $3;
1225 0a6c88ff 2007-03-13 reyk } else if (strcasecmp("minttl", $2) == 0) {
1226 0a6c88ff 2007-03-13 reyk proto->tcpflags |= TCPFLAG_IPMINTTL;
1227 0a6c88ff 2007-03-13 reyk proto->tcpipminttl = $3;
1228 0a6c88ff 2007-03-13 reyk } else {
1229 0a6c88ff 2007-03-13 reyk yyerror("invalid TCP/IP flag: %s", $2);
1230 0a6c88ff 2007-03-13 reyk free($2);
1231 0a6c88ff 2007-03-13 reyk YYERROR;
1232 0a6c88ff 2007-03-13 reyk }
1233 0a6c88ff 2007-03-13 reyk free($2);
1234 0a6c88ff 2007-03-13 reyk }
1235 30640247 2007-02-22 reyk ;
1236 30640247 2007-02-22 reyk
1237 096ff28b 2014-12-12 reyk tlsflags_l : tlsflags comma tlsflags_l
1238 096ff28b 2014-12-12 reyk | tlsflags
1239 ed29f86d 2007-02-24 reyk ;
1240 30640247 2007-02-22 reyk
1241 f4a6eef3 2017-05-27 claudio tlsflags : SESSION TICKETS { proto->tickets = 1; }
1242 f4a6eef3 2017-05-27 claudio | NO SESSION TICKETS { proto->tickets = 0; }
1243 ed29f86d 2007-02-24 reyk | CIPHERS STRING {
1244 096ff28b 2014-12-12 reyk if (strlcpy(proto->tlsciphers, $2,
1245 096ff28b 2014-12-12 reyk sizeof(proto->tlsciphers)) >=
1246 096ff28b 2014-12-12 reyk sizeof(proto->tlsciphers)) {
1247 096ff28b 2014-12-12 reyk yyerror("tlsciphers truncated");
1248 3ddd273e 2007-05-29 pyr free($2);
1249 3ddd273e 2007-05-29 pyr YYERROR;
1250 3ddd273e 2007-05-29 pyr }
1251 ed29f86d 2007-02-24 reyk free($2);
1252 ed29f86d 2007-02-24 reyk }
1253 4da92fab 2014-07-11 reyk | NO EDH {
1254 f4a6eef3 2017-05-27 claudio (void)strlcpy(proto->tlsdhparams, "none",
1255 f4a6eef3 2017-05-27 claudio sizeof(proto->tlsdhparams));
1256 2f79c52f 2013-09-09 reyk }
1257 f4a6eef3 2017-05-27 claudio | EDH {
1258 f4a6eef3 2017-05-27 claudio (void)strlcpy(proto->tlsdhparams, "auto",
1259 f4a6eef3 2017-05-27 claudio sizeof(proto->tlsdhparams));
1260 4da92fab 2014-07-11 reyk }
1261 f4a6eef3 2017-05-27 claudio | EDH PARAMS STRING {
1262 f4a6eef3 2017-05-27 claudio struct tls_config *tls_cfg;
1263 f4a6eef3 2017-05-27 claudio if ((tls_cfg = tls_config_new()) == NULL) {
1264 f4a6eef3 2017-05-27 claudio yyerror("tls_config_new failed");
1265 f4a6eef3 2017-05-27 claudio free($3);
1266 f4a6eef3 2017-05-27 claudio YYERROR;
1267 f4a6eef3 2017-05-27 claudio }
1268 f4a6eef3 2017-05-27 claudio if (tls_config_set_dheparams(tls_cfg, $3) != 0) {
1269 f4a6eef3 2017-05-27 claudio yyerror("tls edh params %s: %s", $3,
1270 f4a6eef3 2017-05-27 claudio tls_config_error(tls_cfg));
1271 f4a6eef3 2017-05-27 claudio tls_config_free(tls_cfg);
1272 f4a6eef3 2017-05-27 claudio free($3);
1273 f4a6eef3 2017-05-27 claudio YYERROR;
1274 f4a6eef3 2017-05-27 claudio }
1275 f4a6eef3 2017-05-27 claudio tls_config_free(tls_cfg);
1276 f4a6eef3 2017-05-27 claudio if (strlcpy(proto->tlsdhparams, $3,
1277 f4a6eef3 2017-05-27 claudio sizeof(proto->tlsdhparams)) >=
1278 f4a6eef3 2017-05-27 claudio sizeof(proto->tlsdhparams)) {
1279 f4a6eef3 2017-05-27 claudio yyerror("tls edh truncated");
1280 f4a6eef3 2017-05-27 claudio free($3);
1281 f4a6eef3 2017-05-27 claudio YYERROR;
1282 f4a6eef3 2017-05-27 claudio }
1283 f4a6eef3 2017-05-27 claudio free($3);
1284 f4a6eef3 2017-05-27 claudio }
1285 3fe6d92f 2017-11-27 claudio | ECDHE STRING {
1286 f4a6eef3 2017-05-27 claudio struct tls_config *tls_cfg;
1287 f4a6eef3 2017-05-27 claudio if ((tls_cfg = tls_config_new()) == NULL) {
1288 f4a6eef3 2017-05-27 claudio yyerror("tls_config_new failed");
1289 3fe6d92f 2017-11-27 claudio free($2);
1290 f4a6eef3 2017-05-27 claudio YYERROR;
1291 f4a6eef3 2017-05-27 claudio }
1292 3fe6d92f 2017-11-27 claudio if (tls_config_set_ecdhecurves(tls_cfg, $2) != 0) {
1293 3fe6d92f 2017-11-27 claudio yyerror("tls ecdhe %s: %s", $2,
1294 f4a6eef3 2017-05-27 claudio tls_config_error(tls_cfg));
1295 f4a6eef3 2017-05-27 claudio tls_config_free(tls_cfg);
1296 3fe6d92f 2017-11-27 claudio free($2);
1297 f4a6eef3 2017-05-27 claudio YYERROR;
1298 f4a6eef3 2017-05-27 claudio }
1299 f4a6eef3 2017-05-27 claudio tls_config_free(tls_cfg);
1300 3fe6d92f 2017-11-27 claudio if (strlcpy(proto->tlsecdhecurves, $2,
1301 3fe6d92f 2017-11-27 claudio sizeof(proto->tlsecdhecurves)) >=
1302 3fe6d92f 2017-11-27 claudio sizeof(proto->tlsecdhecurves)) {
1303 3fe6d92f 2017-11-27 claudio yyerror("tls ecdhe curves truncated");
1304 3fe6d92f 2017-11-27 claudio free($2);
1305 f4a6eef3 2017-05-27 claudio YYERROR;
1306 f4a6eef3 2017-05-27 claudio }
1307 3fe6d92f 2017-11-27 claudio free($2);
1308 f4a6eef3 2017-05-27 claudio }
1309 6e8c1015 2009-04-02 reyk | CA FILENAME STRING {
1310 096ff28b 2014-12-12 reyk if (strlcpy(proto->tlsca, $3,
1311 096ff28b 2014-12-12 reyk sizeof(proto->tlsca)) >=
1312 096ff28b 2014-12-12 reyk sizeof(proto->tlsca)) {
1313 096ff28b 2014-12-12 reyk yyerror("tlsca truncated");
1314 6e8c1015 2009-04-02 reyk free($3);
1315 6e8c1015 2009-04-02 reyk YYERROR;
1316 6e8c1015 2009-04-02 reyk }
1317 591e6ab5 2011-05-19 reyk free($3);
1318 6e8c1015 2009-04-02 reyk }
1319 03668b6b 2013-05-30 reyk | CA KEY STRING PASSWORD STRING {
1320 096ff28b 2014-12-12 reyk if (strlcpy(proto->tlscakey, $3,
1321 096ff28b 2014-12-12 reyk sizeof(proto->tlscakey)) >=
1322 096ff28b 2014-12-12 reyk sizeof(proto->tlscakey)) {
1323 096ff28b 2014-12-12 reyk yyerror("tlscakey truncated");
1324 03668b6b 2013-05-30 reyk free($3);
1325 03668b6b 2013-05-30 reyk free($5);
1326 03668b6b 2013-05-30 reyk YYERROR;
1327 03668b6b 2013-05-30 reyk }
1328 096ff28b 2014-12-12 reyk if ((proto->tlscapass = strdup($5)) == NULL) {
1329 096ff28b 2014-12-12 reyk yyerror("tlscapass");
1330 03668b6b 2013-05-30 reyk free($3);
1331 03668b6b 2013-05-30 reyk free($5);
1332 03668b6b 2013-05-30 reyk YYERROR;
1333 03668b6b 2013-05-30 reyk }
1334 03668b6b 2013-05-30 reyk free($3);
1335 03668b6b 2013-05-30 reyk free($5);
1336 03668b6b 2013-05-30 reyk }
1337 03668b6b 2013-05-30 reyk | CA CERTIFICATE STRING {
1338 096ff28b 2014-12-12 reyk if (strlcpy(proto->tlscacert, $3,
1339 096ff28b 2014-12-12 reyk sizeof(proto->tlscacert)) >=
1340 096ff28b 2014-12-12 reyk sizeof(proto->tlscacert)) {
1341 096ff28b 2014-12-12 reyk yyerror("tlscacert truncated");
1342 03668b6b 2013-05-30 reyk free($3);
1343 03668b6b 2013-05-30 reyk YYERROR;
1344 03668b6b 2013-05-30 reyk }
1345 03668b6b 2013-05-30 reyk free($3);
1346 03668b6b 2013-05-30 reyk }
1347 9261e0d8 2019-05-31 reyk | KEYPAIR STRING {
1348 36dd1e7a 2026-05-15 rsadowski struct keyname *kname = NULL;
1349 9261e0d8 2019-05-31 reyk
1350 36dd1e7a 2026-05-15 rsadowski if ((kname = proto_keyname($2)) == NULL) {
1351 9261e0d8 2019-05-31 reyk free($2);
1352 9261e0d8 2019-05-31 reyk YYERROR;
1353 9261e0d8 2019-05-31 reyk }
1354 36dd1e7a 2026-05-15 rsadowski free($2);
1355 36dd1e7a 2026-05-15 rsadowski }
1356 36dd1e7a 2026-05-15 rsadowski | KEYPAIR STRING CERTIFICATE STRING {
1357 36dd1e7a 2026-05-15 rsadowski struct keyname *kname = NULL;
1358 36dd1e7a 2026-05-15 rsadowski
1359 36dd1e7a 2026-05-15 rsadowski if ((kname = proto_keyname($2)) == NULL) {
1360 9261e0d8 2019-05-31 reyk free($2);
1361 36dd1e7a 2026-05-15 rsadowski free($4);
1362 9261e0d8 2019-05-31 reyk YYERROR;
1363 9261e0d8 2019-05-31 reyk }
1364 36dd1e7a 2026-05-15 rsadowski
1365 36dd1e7a 2026-05-15 rsadowski if (strlen($4) >= PATH_MAX) {
1366 36dd1e7a 2026-05-15 rsadowski yyerror("keypair cert too long");
1367 36dd1e7a 2026-05-15 rsadowski free($2);
1368 36dd1e7a 2026-05-15 rsadowski free($4);
1369 36dd1e7a 2026-05-15 rsadowski YYERROR;
1370 36dd1e7a 2026-05-15 rsadowski }
1371 36dd1e7a 2026-05-15 rsadowski if (strlcpy(kname->certificate, $4,
1372 36dd1e7a 2026-05-15 rsadowski sizeof(kname->certificate)) >=
1373 36dd1e7a 2026-05-15 rsadowski sizeof(kname->certificate)) {
1374 36dd1e7a 2026-05-15 rsadowski yyerror("keypair certificate truncated");
1375 36dd1e7a 2026-05-15 rsadowski free($2);
1376 36dd1e7a 2026-05-15 rsadowski free($4);
1377 36dd1e7a 2026-05-15 rsadowski YYERROR;
1378 36dd1e7a 2026-05-15 rsadowski }
1379 36dd1e7a 2026-05-15 rsadowski free($2);
1380 36dd1e7a 2026-05-15 rsadowski free($4);
1381 9261e0d8 2019-05-31 reyk }
1382 36dd1e7a 2026-05-15 rsadowski | KEYPAIR STRING KEY STRING {
1383 36dd1e7a 2026-05-15 rsadowski struct keyname *kname = NULL;
1384 36dd1e7a 2026-05-15 rsadowski
1385 36dd1e7a 2026-05-15 rsadowski if ((kname = proto_keyname($2)) == NULL) {
1386 36dd1e7a 2026-05-15 rsadowski free($2);
1387 36dd1e7a 2026-05-15 rsadowski free($4);
1388 36dd1e7a 2026-05-15 rsadowski YYERROR;
1389 36dd1e7a 2026-05-15 rsadowski }
1390 36dd1e7a 2026-05-15 rsadowski
1391 36dd1e7a 2026-05-15 rsadowski if (strlen($4) >= PATH_MAX) {
1392 36dd1e7a 2026-05-15 rsadowski yyerror("keypair certificate key too long");
1393 36dd1e7a 2026-05-15 rsadowski free($2);
1394 36dd1e7a 2026-05-15 rsadowski free($4);
1395 36dd1e7a 2026-05-15 rsadowski YYERROR;
1396 36dd1e7a 2026-05-15 rsadowski }
1397 36dd1e7a 2026-05-15 rsadowski
1398 36dd1e7a 2026-05-15 rsadowski if (strlcpy(kname->key, $4,
1399 36dd1e7a 2026-05-15 rsadowski sizeof(kname->key)) >=
1400 36dd1e7a 2026-05-15 rsadowski sizeof(kname->key)) {
1401 36dd1e7a 2026-05-15 rsadowski yyerror("keypair certificate key truncated");
1402 36dd1e7a 2026-05-15 rsadowski free($2);
1403 36dd1e7a 2026-05-15 rsadowski free($4);
1404 36dd1e7a 2026-05-15 rsadowski YYERROR;
1405 36dd1e7a 2026-05-15 rsadowski }
1406 36dd1e7a 2026-05-15 rsadowski free($2);
1407 36dd1e7a 2026-05-15 rsadowski free($4);
1408 36dd1e7a 2026-05-15 rsadowski }
1409 36dd1e7a 2026-05-15 rsadowski | KEYPAIR STRING OCSP STRING {
1410 36dd1e7a 2026-05-15 rsadowski struct keyname *kname = NULL;
1411 36dd1e7a 2026-05-15 rsadowski
1412 36dd1e7a 2026-05-15 rsadowski if ((kname = proto_keyname($2)) == NULL) {
1413 36dd1e7a 2026-05-15 rsadowski free($2);
1414 36dd1e7a 2026-05-15 rsadowski free($4);
1415 36dd1e7a 2026-05-15 rsadowski YYERROR;
1416 36dd1e7a 2026-05-15 rsadowski }
1417 36dd1e7a 2026-05-15 rsadowski
1418 36dd1e7a 2026-05-15 rsadowski if (strlen($4) >= PATH_MAX) {
1419 36dd1e7a 2026-05-15 rsadowski yyerror("keypair ocsp file too long");
1420 36dd1e7a 2026-05-15 rsadowski free($2);
1421 36dd1e7a 2026-05-15 rsadowski free($4);
1422 36dd1e7a 2026-05-15 rsadowski YYERROR;
1423 36dd1e7a 2026-05-15 rsadowski }
1424 36dd1e7a 2026-05-15 rsadowski
1425 36dd1e7a 2026-05-15 rsadowski if (strlcpy(kname->ocsp, $4,
1426 36dd1e7a 2026-05-15 rsadowski sizeof(kname->ocsp)) >=
1427 36dd1e7a 2026-05-15 rsadowski sizeof(kname->ocsp)) {
1428 36dd1e7a 2026-05-15 rsadowski yyerror("ocsp truncated");
1429 36dd1e7a 2026-05-15 rsadowski free($2);
1430 36dd1e7a 2026-05-15 rsadowski free($4);
1431 36dd1e7a 2026-05-15 rsadowski YYERROR;
1432 36dd1e7a 2026-05-15 rsadowski }
1433 36dd1e7a 2026-05-15 rsadowski free($2);
1434 36dd1e7a 2026-05-15 rsadowski free($4);
1435 36dd1e7a 2026-05-15 rsadowski }
1436 c4efe747 2024-10-28 tb | CLIENT CA STRING {
1437 c4efe747 2024-10-28 tb if (strlcpy(proto->tlsclientca, $3,
1438 c4efe747 2024-10-28 tb sizeof(proto->tlsclientca)) >=
1439 c4efe747 2024-10-28 tb sizeof(proto->tlsclientca)) {
1440 c4efe747 2024-10-28 tb yyerror("tlsclientca truncated");
1441 c4efe747 2024-10-28 tb free($3);
1442 c4efe747 2024-10-28 tb YYERROR;
1443 c4efe747 2024-10-28 tb }
1444 c4efe747 2024-10-28 tb free($3);
1445 c4efe747 2024-10-28 tb }
1446 096ff28b 2014-12-12 reyk | NO flag { proto->tlsflags &= ~($2); }
1447 096ff28b 2014-12-12 reyk | flag { proto->tlsflags |= $1; }
1448 b217f480 2007-02-26 pyr ;
1449 b217f480 2007-02-26 pyr
1450 b217f480 2007-02-26 pyr flag : STRING {
1451 3336038a 2014-11-07 jsing if (strcmp("sslv3", $1) == 0)
1452 096ff28b 2014-12-12 reyk $$ = TLSFLAG_SSLV3;
1453 b217f480 2007-02-26 pyr else if (strcmp("tlsv1", $1) == 0)
1454 096ff28b 2014-12-12 reyk $$ = TLSFLAG_TLSV1;
1455 05dee715 2014-10-15 reyk else if (strcmp("tlsv1.0", $1) == 0)
1456 096ff28b 2014-12-12 reyk $$ = TLSFLAG_TLSV1_0;
1457 05dee715 2014-10-15 reyk else if (strcmp("tlsv1.1", $1) == 0)
1458 096ff28b 2014-12-12 reyk $$ = TLSFLAG_TLSV1_1;
1459 05dee715 2014-10-15 reyk else if (strcmp("tlsv1.2", $1) == 0)
1460 096ff28b 2014-12-12 reyk $$ = TLSFLAG_TLSV1_2;
1461 8d09c191 2020-05-14 pvk else if (strcmp("tlsv1.3", $1) == 0)
1462 8d09c191 2020-05-14 pvk $$ = TLSFLAG_TLSV1_3;
1463 4da92fab 2014-07-11 reyk else if (strcmp("cipher-server-preference", $1) == 0)
1464 096ff28b 2014-12-12 reyk $$ = TLSFLAG_CIPHER_SERVER_PREF;
1465 4da92fab 2014-07-11 reyk else if (strcmp("client-renegotiation", $1) == 0)
1466 096ff28b 2014-12-12 reyk $$ = TLSFLAG_CLIENT_RENEG;
1467 b217f480 2007-02-26 pyr else {
1468 096ff28b 2014-12-12 reyk yyerror("invalid TLS flag: %s", $1);
1469 b217f480 2007-02-26 pyr free($1);
1470 b217f480 2007-02-26 pyr YYERROR;
1471 b217f480 2007-02-26 pyr }
1472 b217f480 2007-02-26 pyr free($1);
1473 ed29f86d 2007-02-24 reyk }
1474 ed29f86d 2007-02-24 reyk ;
1475 ed29f86d 2007-02-24 reyk
1476 69fde657 2014-07-09 reyk filterrule : action dir quick ruleaf rulesrc ruledst {
1477 69fde657 2014-07-09 reyk if ((rule = calloc(1, sizeof(*rule))) == NULL)
1478 69fde657 2014-07-09 reyk fatal("out of memory");
1479 69fde657 2014-07-09 reyk
1480 69fde657 2014-07-09 reyk rule->rule_action = $1;
1481 69fde657 2014-07-09 reyk rule->rule_proto = proto->type;
1482 69fde657 2014-07-09 reyk rule->rule_dir = $2;
1483 69fde657 2014-07-09 reyk rule->rule_flags |= $3;
1484 69fde657 2014-07-09 reyk rule->rule_af = $4;
1485 fc2c091b 2019-05-10 reyk rule->rule_src.addr = $5.ss;
1486 fc2c091b 2019-05-10 reyk rule->rule_src.addr_mask = $5.prefixlen;
1487 fc2c091b 2019-05-10 reyk rule->rule_dst.addr = $6.ss;
1488 fc2c091b 2019-05-10 reyk rule->rule_dst.addr_mask = $6.prefixlen;
1489 69fde657 2014-07-09 reyk
1490 fc2c091b 2019-05-10 reyk if (RELAY_AF_NEQ(rule->rule_af,
1491 fc2c091b 2019-05-10 reyk rule->rule_src.addr.ss_family) ||
1492 fc2c091b 2019-05-10 reyk RELAY_AF_NEQ(rule->rule_af,
1493 fc2c091b 2019-05-10 reyk rule->rule_dst.addr.ss_family) ||
1494 fc2c091b 2019-05-10 reyk RELAY_AF_NEQ(rule->rule_src.addr.ss_family,
1495 fc2c091b 2019-05-10 reyk rule->rule_dst.addr.ss_family)) {
1496 fc2c091b 2019-05-10 reyk yyerror("address family mismatch");
1497 fc2c091b 2019-05-10 reyk YYERROR;
1498 fc2c091b 2019-05-10 reyk }
1499 fc2c091b 2019-05-10 reyk
1500 69fde657 2014-07-09 reyk rulefile = NULL;
1501 69fde657 2014-07-09 reyk } ruleopts_l {
1502 69fde657 2014-07-09 reyk if (rule_add(proto, rule, rulefile) == -1) {
1503 69fde657 2014-07-09 reyk if (rulefile == NULL) {
1504 69fde657 2014-07-09 reyk yyerror("failed to load rule");
1505 69fde657 2014-07-09 reyk } else {
1506 69fde657 2014-07-09 reyk yyerror("failed to load rules from %s",
1507 69fde657 2014-07-09 reyk rulefile);
1508 69fde657 2014-07-09 reyk free(rulefile);
1509 69fde657 2014-07-09 reyk }
1510 69fde657 2014-07-09 reyk rule_free(rule);
1511 69fde657 2014-07-09 reyk free(rule);
1512 69fde657 2014-07-09 reyk YYERROR;
1513 69fde657 2014-07-09 reyk }
1514 69fde657 2014-07-09 reyk if (rulefile)
1515 69fde657 2014-07-09 reyk free(rulefile);
1516 69fde657 2014-07-09 reyk rulefile = NULL;
1517 69fde657 2014-07-09 reyk rule = NULL;
1518 69fde657 2014-07-09 reyk keytype = KEY_TYPE_NONE;
1519 69fde657 2014-07-09 reyk }
1520 69fde657 2014-07-09 reyk ;
1521 69fde657 2014-07-09 reyk
1522 69fde657 2014-07-09 reyk action : PASS { $$ = RULE_ACTION_PASS; }
1523 69fde657 2014-07-09 reyk | BLOCK { $$ = RULE_ACTION_BLOCK; }
1524 69fde657 2014-07-09 reyk | MATCH { $$ = RULE_ACTION_MATCH; }
1525 69fde657 2014-07-09 reyk ;
1526 69fde657 2014-07-09 reyk
1527 69fde657 2014-07-09 reyk dir : /* empty */ {
1528 69fde657 2014-07-09 reyk $$ = dir = RELAY_DIR_REQUEST;
1529 69fde657 2014-07-09 reyk }
1530 69fde657 2014-07-09 reyk | REQUEST {
1531 69fde657 2014-07-09 reyk $$ = dir = RELAY_DIR_REQUEST;
1532 69fde657 2014-07-09 reyk }
1533 69fde657 2014-07-09 reyk | RESPONSE {
1534 69fde657 2014-07-09 reyk $$ = dir = RELAY_DIR_RESPONSE;
1535 69fde657 2014-07-09 reyk }
1536 69fde657 2014-07-09 reyk ;
1537 69fde657 2014-07-09 reyk
1538 69fde657 2014-07-09 reyk quick : /* empty */ { $$ = 0; }
1539 69fde657 2014-07-09 reyk | QUICK { $$ = RULE_FLAG_QUICK; }
1540 69fde657 2014-07-09 reyk ;
1541 69fde657 2014-07-09 reyk
1542 69fde657 2014-07-09 reyk ruleaf : /* empty */ { $$ = AF_UNSPEC; }
1543 69fde657 2014-07-09 reyk | INET6 { $$ = AF_INET6; }
1544 69fde657 2014-07-09 reyk | INET { $$ = AF_INET; }
1545 69fde657 2014-07-09 reyk ;
1546 69fde657 2014-07-09 reyk
1547 fc2c091b 2019-05-10 reyk rulesrc : /* empty */ {
1548 fc2c091b 2019-05-10 reyk memset(&$$, 0, sizeof($$));
1549 fc2c091b 2019-05-10 reyk }
1550 fc2c091b 2019-05-10 reyk | FROM addrprefix {
1551 fc2c091b 2019-05-10 reyk $$ = $2;
1552 fc2c091b 2019-05-10 reyk }
1553 69fde657 2014-07-09 reyk ;
1554 69fde657 2014-07-09 reyk
1555 fc2c091b 2019-05-10 reyk ruledst : /* empty */ {
1556 fc2c091b 2019-05-10 reyk memset(&$$, 0, sizeof($$));
1557 fc2c091b 2019-05-10 reyk }
1558 fc2c091b 2019-05-10 reyk | TO addrprefix {
1559 fc2c091b 2019-05-10 reyk $$ = $2;
1560 fc2c091b 2019-05-10 reyk }
1561 69fde657 2014-07-09 reyk ;
1562 69fde657 2014-07-09 reyk
1563 69fde657 2014-07-09 reyk ruleopts_l : /* empty */
1564 69fde657 2014-07-09 reyk | ruleopts_t
1565 69fde657 2014-07-09 reyk ;
1566 69fde657 2014-07-09 reyk
1567 69fde657 2014-07-09 reyk ruleopts_t : ruleopts ruleopts_t
1568 69fde657 2014-07-09 reyk | ruleopts
1569 69fde657 2014-07-09 reyk ;
1570 69fde657 2014-07-09 reyk
1571 69fde657 2014-07-09 reyk ruleopts : METHOD STRING {
1572 69fde657 2014-07-09 reyk u_int id;
1573 69fde657 2014-07-09 reyk if ((id = relay_httpmethod_byname($2)) ==
1574 2d9632ee 2014-07-11 reyk HTTP_METHOD_NONE) {
1575 69fde657 2014-07-09 reyk yyerror("unknown HTTP method currently not "
1576 69fde657 2014-07-09 reyk "supported");
1577 69fde657 2014-07-09 reyk free($2);
1578 69fde657 2014-07-09 reyk YYERROR;
1579 69fde657 2014-07-09 reyk }
1580 69fde657 2014-07-09 reyk rule->rule_method = id;
1581 69fde657 2014-07-09 reyk free($2);
1582 69fde657 2014-07-09 reyk }
1583 69fde657 2014-07-09 reyk | COOKIE key_option STRING value {
1584 69fde657 2014-07-09 reyk keytype = KEY_TYPE_COOKIE;
1585 69fde657 2014-07-09 reyk rule->rule_kv[keytype].kv_key = strdup($3);
1586 69fde657 2014-07-09 reyk rule->rule_kv[keytype].kv_option = $2;
1587 69fde657 2014-07-09 reyk rule->rule_kv[keytype].kv_value = (($4 != NULL) ?
1588 69fde657 2014-07-09 reyk strdup($4) : strdup("*"));
1589 69fde657 2014-07-09 reyk if (rule->rule_kv[keytype].kv_key == NULL ||
1590 69fde657 2014-07-09 reyk rule->rule_kv[keytype].kv_value == NULL)
1591 69fde657 2014-07-09 reyk fatal("out of memory");
1592 69fde657 2014-07-09 reyk free($3);
1593 69fde657 2014-07-09 reyk if ($4)
1594 69fde657 2014-07-09 reyk free($4);
1595 69fde657 2014-07-09 reyk rule->rule_kv[keytype].kv_type = keytype;
1596 69fde657 2014-07-09 reyk }
1597 69fde657 2014-07-09 reyk | COOKIE key_option {
1598 69fde657 2014-07-09 reyk keytype = KEY_TYPE_COOKIE;
1599 69fde657 2014-07-09 reyk rule->rule_kv[keytype].kv_option = $2;
1600 69fde657 2014-07-09 reyk rule->rule_kv[keytype].kv_type = keytype;
1601 69fde657 2014-07-09 reyk }
1602 69fde657 2014-07-09 reyk | HEADER key_option STRING value {
1603 69fde657 2014-07-09 reyk keytype = KEY_TYPE_HEADER;
1604 69fde657 2014-07-09 reyk memset(&rule->rule_kv[keytype], 0,
1605 69fde657 2014-07-09 reyk sizeof(rule->rule_kv[keytype]));
1606 69fde657 2014-07-09 reyk rule->rule_kv[keytype].kv_option = $2;
1607 69fde657 2014-07-09 reyk rule->rule_kv[keytype].kv_key = strdup($3);
1608 69fde657 2014-07-09 reyk rule->rule_kv[keytype].kv_value = (($4 != NULL) ?
1609 69fde657 2014-07-09 reyk strdup($4) : strdup("*"));
1610 69fde657 2014-07-09 reyk if (rule->rule_kv[keytype].kv_key == NULL ||
1611 69fde657 2014-07-09 reyk rule->rule_kv[keytype].kv_value == NULL)
1612 69fde657 2014-07-09 reyk fatal("out of memory");
1613 69fde657 2014-07-09 reyk free($3);
1614 69fde657 2014-07-09 reyk if ($4)
1615 69fde657 2014-07-09 reyk free($4);
1616 69fde657 2014-07-09 reyk rule->rule_kv[keytype].kv_type = keytype;
1617 69fde657 2014-07-09 reyk }
1618 69fde657 2014-07-09 reyk | HEADER key_option {
1619 69fde657 2014-07-09 reyk keytype = KEY_TYPE_HEADER;
1620 69fde657 2014-07-09 reyk rule->rule_kv[keytype].kv_option = $2;
1621 69fde657 2014-07-09 reyk rule->rule_kv[keytype].kv_type = keytype;
1622 69fde657 2014-07-09 reyk }
1623 69fde657 2014-07-09 reyk | PATH key_option STRING value {
1624 69fde657 2014-07-09 reyk keytype = KEY_TYPE_PATH;
1625 69fde657 2014-07-09 reyk rule->rule_kv[keytype].kv_option = $2;
1626 69fde657 2014-07-09 reyk rule->rule_kv[keytype].kv_key = strdup($3);
1627 69fde657 2014-07-09 reyk rule->rule_kv[keytype].kv_value = (($4 != NULL) ?
1628 69fde657 2014-07-09 reyk strdup($4) : strdup("*"));
1629 69fde657 2014-07-09 reyk if (rule->rule_kv[keytype].kv_key == NULL ||
1630 69fde657 2014-07-09 reyk rule->rule_kv[keytype].kv_value == NULL)
1631 69fde657 2014-07-09 reyk fatal("out of memory");
1632 69fde657 2014-07-09 reyk free($3);
1633 69fde657 2014-07-09 reyk if ($4)
1634 69fde657 2014-07-09 reyk free($4);
1635 69fde657 2014-07-09 reyk rule->rule_kv[keytype].kv_type = keytype;
1636 69fde657 2014-07-09 reyk }
1637 69fde657 2014-07-09 reyk | PATH key_option {
1638 69fde657 2014-07-09 reyk keytype = KEY_TYPE_PATH;
1639 69fde657 2014-07-09 reyk rule->rule_kv[keytype].kv_option = $2;
1640 69fde657 2014-07-09 reyk rule->rule_kv[keytype].kv_type = keytype;
1641 69fde657 2014-07-09 reyk }
1642 d498e80a 2021-01-09 denis | PATH STRIP NUMBER {
1643 d498e80a 2021-01-09 denis char *strip = NULL;
1644 d498e80a 2021-01-09 denis
1645 d498e80a 2021-01-09 denis if ($3 < 0 || $3 > INT_MAX) {
1646 d498e80a 2021-01-09 denis yyerror("invalid strip number");
1647 d498e80a 2021-01-09 denis YYERROR;
1648 d498e80a 2021-01-09 denis }
1649 d498e80a 2021-01-09 denis if (asprintf(&strip, "%lld", $3) <= 0)
1650 d498e80a 2021-01-09 denis fatal("can't parse strip");
1651 d498e80a 2021-01-09 denis keytype = KEY_TYPE_PATH;
1652 d498e80a 2021-01-09 denis rule->rule_kv[keytype].kv_option = KEY_OPTION_STRIP;
1653 d498e80a 2021-01-09 denis rule->rule_kv[keytype].kv_value = strip;
1654 d498e80a 2021-01-09 denis rule->rule_kv[keytype].kv_type = keytype;
1655 d498e80a 2021-01-09 denis }
1656 69fde657 2014-07-09 reyk | QUERYSTR key_option STRING value {
1657 69fde657 2014-07-09 reyk switch ($2) {
1658 69fde657 2014-07-09 reyk case KEY_OPTION_APPEND:
1659 69fde657 2014-07-09 reyk case KEY_OPTION_SET:
1660 69fde657 2014-07-09 reyk case KEY_OPTION_REMOVE:
1661 69fde657 2014-07-09 reyk yyerror("combining query type and the given "
1662 69fde657 2014-07-09 reyk "option is not supported");
1663 69fde657 2014-07-09 reyk free($3);
1664 69fde657 2014-07-09 reyk if ($4)
1665 69fde657 2014-07-09 reyk free($4);
1666 69fde657 2014-07-09 reyk YYERROR;
1667 69fde657 2014-07-09 reyk break;
1668 69fde657 2014-07-09 reyk }
1669 69fde657 2014-07-09 reyk keytype = KEY_TYPE_QUERY;
1670 69fde657 2014-07-09 reyk rule->rule_kv[keytype].kv_option = $2;
1671 69fde657 2014-07-09 reyk rule->rule_kv[keytype].kv_key = strdup($3);
1672 69fde657 2014-07-09 reyk rule->rule_kv[keytype].kv_value = (($4 != NULL) ?
1673 69fde657 2014-07-09 reyk strdup($4) : strdup("*"));
1674 69fde657 2014-07-09 reyk if (rule->rule_kv[keytype].kv_key == NULL ||
1675 69fde657 2014-07-09 reyk rule->rule_kv[keytype].kv_value == NULL)
1676 69fde657 2014-07-09 reyk fatal("out of memory");
1677 69fde657 2014-07-09 reyk free($3);
1678 69fde657 2014-07-09 reyk if ($4)
1679 69fde657 2014-07-09 reyk free($4);
1680 69fde657 2014-07-09 reyk rule->rule_kv[keytype].kv_type = keytype;
1681 69fde657 2014-07-09 reyk }
1682 69fde657 2014-07-09 reyk | QUERYSTR key_option {
1683 69fde657 2014-07-09 reyk switch ($2) {
1684 69fde657 2014-07-09 reyk case KEY_OPTION_APPEND:
1685 69fde657 2014-07-09 reyk case KEY_OPTION_SET:
1686 69fde657 2014-07-09 reyk case KEY_OPTION_REMOVE:
1687 69fde657 2014-07-09 reyk yyerror("combining query type and the given "
1688 69fde657 2014-07-09 reyk "option is not supported");
1689 69fde657 2014-07-09 reyk YYERROR;
1690 69fde657 2014-07-09 reyk break;
1691 69fde657 2014-07-09 reyk }
1692 69fde657 2014-07-09 reyk keytype = KEY_TYPE_QUERY;
1693 69fde657 2014-07-09 reyk rule->rule_kv[keytype].kv_option = $2;
1694 69fde657 2014-07-09 reyk rule->rule_kv[keytype].kv_type = keytype;
1695 69fde657 2014-07-09 reyk }
1696 69fde657 2014-07-09 reyk | URL key_option optdigest value {
1697 69fde657 2014-07-09 reyk switch ($2) {
1698 69fde657 2014-07-09 reyk case KEY_OPTION_APPEND:
1699 69fde657 2014-07-09 reyk case KEY_OPTION_SET:
1700 69fde657 2014-07-09 reyk case KEY_OPTION_REMOVE:
1701 69fde657 2014-07-09 reyk yyerror("combining url type and the given "
1702 69fde657 2014-07-09 reyk "option is not supported");
1703 69fde657 2014-07-09 reyk free($3.digest);
1704 69fde657 2014-07-09 reyk free($4);
1705 69fde657 2014-07-09 reyk YYERROR;
1706 69fde657 2014-07-09 reyk break;
1707 69fde657 2014-07-09 reyk }
1708 69fde657 2014-07-09 reyk keytype = KEY_TYPE_URL;
1709 69fde657 2014-07-09 reyk rule->rule_kv[keytype].kv_option = $2;
1710 69fde657 2014-07-09 reyk rule->rule_kv[keytype].kv_key = strdup($3.digest);
1711 69fde657 2014-07-09 reyk rule->rule_kv[keytype].kv_digest = $3.type;
1712 69fde657 2014-07-09 reyk rule->rule_kv[keytype].kv_value = (($4 != NULL) ?
1713 69fde657 2014-07-09 reyk strdup($4) : strdup("*"));
1714 69fde657 2014-07-09 reyk if (rule->rule_kv[keytype].kv_key == NULL ||
1715 69fde657 2014-07-09 reyk rule->rule_kv[keytype].kv_value == NULL)
1716 69fde657 2014-07-09 reyk fatal("out of memory");
1717 69fde657 2014-07-09 reyk free($3.digest);
1718 69fde657 2014-07-09 reyk if ($4)
1719 69fde657 2014-07-09 reyk free($4);
1720 69fde657 2014-07-09 reyk rule->rule_kv[keytype].kv_type = keytype;
1721 69fde657 2014-07-09 reyk }
1722 69fde657 2014-07-09 reyk | URL key_option {
1723 69fde657 2014-07-09 reyk switch ($2) {
1724 69fde657 2014-07-09 reyk case KEY_OPTION_APPEND:
1725 69fde657 2014-07-09 reyk case KEY_OPTION_SET:
1726 69fde657 2014-07-09 reyk case KEY_OPTION_REMOVE:
1727 69fde657 2014-07-09 reyk yyerror("combining url type and the given "
1728 69fde657 2014-07-09 reyk "option is not supported");
1729 69fde657 2014-07-09 reyk YYERROR;
1730 69fde657 2014-07-09 reyk break;
1731 69fde657 2014-07-09 reyk }
1732 69fde657 2014-07-09 reyk keytype = KEY_TYPE_URL;
1733 69fde657 2014-07-09 reyk rule->rule_kv[keytype].kv_option = $2;
1734 69fde657 2014-07-09 reyk rule->rule_kv[keytype].kv_type = keytype;
1735 69fde657 2014-07-09 reyk }
1736 69fde657 2014-07-09 reyk | FORWARD TO table {
1737 69fde657 2014-07-09 reyk if (table_findbyname(conf, $3) == NULL) {
1738 69fde657 2014-07-09 reyk yyerror("undefined forward table");
1739 69fde657 2014-07-09 reyk free($3);
1740 69fde657 2014-07-09 reyk YYERROR;
1741 69fde657 2014-07-09 reyk }
1742 69fde657 2014-07-09 reyk if (strlcpy(rule->rule_tablename, $3,
1743 69fde657 2014-07-09 reyk sizeof(rule->rule_tablename)) >=
1744 69fde657 2014-07-09 reyk sizeof(rule->rule_tablename)) {
1745 69fde657 2014-07-09 reyk yyerror("invalid forward table name");
1746 69fde657 2014-07-09 reyk free($3);
1747 69fde657 2014-07-09 reyk YYERROR;
1748 69fde657 2014-07-09 reyk }
1749 69fde657 2014-07-09 reyk free($3);
1750 69fde657 2014-07-09 reyk }
1751 69fde657 2014-07-09 reyk | TAG STRING {
1752 69fde657 2014-07-09 reyk tag = tag_name2id($2);
1753 69fde657 2014-07-09 reyk if (rule->rule_tag) {
1754 69fde657 2014-07-09 reyk yyerror("tag already defined");
1755 69fde657 2014-07-09 reyk free($2);
1756 69fde657 2014-07-09 reyk rule_free(rule);
1757 69fde657 2014-07-09 reyk free(rule);
1758 69fde657 2014-07-09 reyk YYERROR;
1759 69fde657 2014-07-09 reyk }
1760 69fde657 2014-07-09 reyk if (tag == 0) {
1761 69fde657 2014-07-09 reyk yyerror("invalid tag");
1762 69fde657 2014-07-09 reyk free($2);
1763 69fde657 2014-07-09 reyk rule_free(rule);
1764 69fde657 2014-07-09 reyk free(rule);
1765 69fde657 2014-07-09 reyk YYERROR;
1766 69fde657 2014-07-09 reyk }
1767 69fde657 2014-07-09 reyk rule->rule_tag = tag;
1768 69fde657 2014-07-09 reyk if (strlcpy(rule->rule_tagname, $2,
1769 69fde657 2014-07-09 reyk sizeof(rule->rule_tagname)) >=
1770 69fde657 2014-07-09 reyk sizeof(rule->rule_tagname)) {
1771 69fde657 2014-07-09 reyk yyerror("tag truncated");
1772 69fde657 2014-07-09 reyk free($2);
1773 69fde657 2014-07-09 reyk rule_free(rule);
1774 69fde657 2014-07-09 reyk free(rule);
1775 69fde657 2014-07-09 reyk YYERROR;
1776 69fde657 2014-07-09 reyk }
1777 69fde657 2014-07-09 reyk free($2);
1778 69fde657 2014-07-09 reyk }
1779 69fde657 2014-07-09 reyk | NO TAG {
1780 69fde657 2014-07-09 reyk if (tag == 0) {
1781 69fde657 2014-07-09 reyk yyerror("no tag defined");
1782 69fde657 2014-07-09 reyk YYERROR;
1783 69fde657 2014-07-09 reyk }
1784 69fde657 2014-07-09 reyk rule->rule_tag = -1;
1785 69fde657 2014-07-09 reyk memset(rule->rule_tagname, 0,
1786 69fde657 2014-07-09 reyk sizeof(rule->rule_tagname));
1787 69fde657 2014-07-09 reyk }
1788 69fde657 2014-07-09 reyk | TAGGED STRING {
1789 69fde657 2014-07-09 reyk tagged = tag_name2id($2);
1790 69fde657 2014-07-09 reyk if (rule->rule_tagged) {
1791 69fde657 2014-07-09 reyk yyerror("tagged already defined");
1792 69fde657 2014-07-09 reyk free($2);
1793 69fde657 2014-07-09 reyk rule_free(rule);
1794 69fde657 2014-07-09 reyk free(rule);
1795 69fde657 2014-07-09 reyk YYERROR;
1796 69fde657 2014-07-09 reyk }
1797 69fde657 2014-07-09 reyk if (tagged == 0) {
1798 69fde657 2014-07-09 reyk yyerror("invalid tag");
1799 69fde657 2014-07-09 reyk free($2);
1800 69fde657 2014-07-09 reyk rule_free(rule);
1801 69fde657 2014-07-09 reyk free(rule);
1802 69fde657 2014-07-09 reyk YYERROR;
1803 69fde657 2014-07-09 reyk }
1804 69fde657 2014-07-09 reyk rule->rule_tagged = tagged;
1805 69fde657 2014-07-09 reyk if (strlcpy(rule->rule_taggedname, $2,
1806 69fde657 2014-07-09 reyk sizeof(rule->rule_taggedname)) >=
1807 69fde657 2014-07-09 reyk sizeof(rule->rule_taggedname)) {
1808 69fde657 2014-07-09 reyk yyerror("tagged truncated");
1809 69fde657 2014-07-09 reyk free($2);
1810 69fde657 2014-07-09 reyk rule_free(rule);
1811 69fde657 2014-07-09 reyk free(rule);
1812 69fde657 2014-07-09 reyk YYERROR;
1813 69fde657 2014-07-09 reyk }
1814 69fde657 2014-07-09 reyk free($2);
1815 69fde657 2014-07-09 reyk }
1816 69fde657 2014-07-09 reyk | LABEL STRING {
1817 69fde657 2014-07-09 reyk label = label_name2id($2);
1818 69fde657 2014-07-09 reyk if (rule->rule_label) {
1819 69fde657 2014-07-09 reyk yyerror("label already defined");
1820 69fde657 2014-07-09 reyk free($2);
1821 69fde657 2014-07-09 reyk rule_free(rule);
1822 69fde657 2014-07-09 reyk free(rule);
1823 69fde657 2014-07-09 reyk YYERROR;
1824 69fde657 2014-07-09 reyk }
1825 69fde657 2014-07-09 reyk if (label == 0) {
1826 69fde657 2014-07-09 reyk yyerror("invalid label");
1827 69fde657 2014-07-09 reyk free($2);
1828 69fde657 2014-07-09 reyk rule_free(rule);
1829 69fde657 2014-07-09 reyk free(rule);
1830 69fde657 2014-07-09 reyk YYERROR;
1831 69fde657 2014-07-09 reyk }
1832 69fde657 2014-07-09 reyk rule->rule_label = label;
1833 69fde657 2014-07-09 reyk if (strlcpy(rule->rule_labelname, $2,
1834 69fde657 2014-07-09 reyk sizeof(rule->rule_labelname)) >=
1835 69fde657 2014-07-09 reyk sizeof(rule->rule_labelname)) {
1836 69fde657 2014-07-09 reyk yyerror("label truncated");
1837 69fde657 2014-07-09 reyk free($2);
1838 69fde657 2014-07-09 reyk rule_free(rule);
1839 69fde657 2014-07-09 reyk free(rule);
1840 69fde657 2014-07-09 reyk YYERROR;
1841 69fde657 2014-07-09 reyk }
1842 69fde657 2014-07-09 reyk free($2);
1843 69fde657 2014-07-09 reyk }
1844 69fde657 2014-07-09 reyk | NO LABEL {
1845 69fde657 2014-07-09 reyk if (label == 0) {
1846 69fde657 2014-07-09 reyk yyerror("no label defined");
1847 69fde657 2014-07-09 reyk YYERROR;
1848 69fde657 2014-07-09 reyk }
1849 69fde657 2014-07-09 reyk rule->rule_label = -1;
1850 69fde657 2014-07-09 reyk memset(rule->rule_labelname, 0,
1851 69fde657 2014-07-09 reyk sizeof(rule->rule_labelname));
1852 69fde657 2014-07-09 reyk }
1853 69fde657 2014-07-09 reyk | FILENAME STRING value {
1854 69fde657 2014-07-09 reyk if (rulefile != NULL) {
1855 69fde657 2014-07-09 reyk yyerror("only one file per rule supported");
1856 69fde657 2014-07-09 reyk free($2);
1857 69fde657 2014-07-09 reyk free($3);
1858 69fde657 2014-07-09 reyk rule_free(rule);
1859 69fde657 2014-07-09 reyk free(rule);
1860 69fde657 2014-07-09 reyk YYERROR;
1861 69fde657 2014-07-09 reyk }
1862 69fde657 2014-07-09 reyk if ($3) {
1863 69fde657 2014-07-09 reyk if ((rule->rule_kv[keytype].kv_value =
1864 69fde657 2014-07-09 reyk strdup($3)) == NULL)
1865 69fde657 2014-07-09 reyk fatal("out of memory");
1866 69fde657 2014-07-09 reyk free($3);
1867 69fde657 2014-07-09 reyk } else
1868 69fde657 2014-07-09 reyk rule->rule_kv[keytype].kv_value = NULL;
1869 69fde657 2014-07-09 reyk rulefile = $2;
1870 69fde657 2014-07-09 reyk }
1871 69fde657 2014-07-09 reyk ;
1872 69fde657 2014-07-09 reyk
1873 69fde657 2014-07-09 reyk value : /* empty */ { $$ = NULL; }
1874 69fde657 2014-07-09 reyk | VALUE STRING { $$ = $2; }
1875 69fde657 2014-07-09 reyk ;
1876 69fde657 2014-07-09 reyk
1877 69fde657 2014-07-09 reyk key_option : /* empty */ { $$ = KEY_OPTION_NONE; }
1878 69fde657 2014-07-09 reyk | APPEND { $$ = KEY_OPTION_APPEND; }
1879 69fde657 2014-07-09 reyk | SET { $$ = KEY_OPTION_SET; }
1880 69fde657 2014-07-09 reyk | REMOVE { $$ = KEY_OPTION_REMOVE; }
1881 69fde657 2014-07-09 reyk | HASH { $$ = KEY_OPTION_HASH; }
1882 69fde657 2014-07-09 reyk | LOG { $$ = KEY_OPTION_LOG; }
1883 69fde657 2014-07-09 reyk ;
1884 69fde657 2014-07-09 reyk
1885 30640247 2007-02-22 reyk relay : RELAY STRING {
1886 30640247 2007-02-22 reyk struct relay *r;
1887 30640247 2007-02-22 reyk
1888 591e6ab5 2011-05-19 reyk if (!loadcfg) {
1889 591e6ab5 2011-05-19 reyk free($2);
1890 591e6ab5 2011-05-19 reyk YYACCEPT;
1891 591e6ab5 2011-05-19 reyk }
1892 591e6ab5 2011-05-19 reyk
1893 30640247 2007-02-22 reyk if ((r = calloc(1, sizeof (*r))) == NULL)
1894 30640247 2007-02-22 reyk fatal("out of memory");
1895 3b232a62 2019-05-29 reyk TAILQ_INIT(&relays);
1896 30640247 2007-02-22 reyk
1897 3a75ae45 2012-10-04 reyk if (strlcpy(r->rl_conf.name, $2,
1898 3a75ae45 2012-10-04 reyk sizeof(r->rl_conf.name)) >=
1899 146643ba 2008-01-31 reyk sizeof(r->rl_conf.name)) {
1900 30640247 2007-02-22 reyk yyerror("relay name truncated");
1901 647e1330 2014-04-21 reyk free($2);
1902 33b0029d 2008-01-29 pyr free(r);
1903 30640247 2007-02-22 reyk YYERROR;
1904 30640247 2007-02-22 reyk }
1905 30640247 2007-02-22 reyk free($2);
1906 fae05986 2014-04-22 reyk if (relay_id(r) == -1) {
1907 fae05986 2014-04-22 reyk yyerror("too many relays defined");
1908 fae05986 2014-04-22 reyk free(r);
1909 fae05986 2014-04-22 reyk YYERROR;
1910 fae05986 2014-04-22 reyk }
1911 146643ba 2008-01-31 reyk r->rl_conf.timeout.tv_sec = RELAY_TIMEOUT;
1912 146643ba 2008-01-31 reyk r->rl_proto = NULL;
1913 146643ba 2008-01-31 reyk r->rl_conf.proto = EMPTY_ID;
1914 146643ba 2008-01-31 reyk r->rl_conf.dstretry = 0;
1915 ce78c3f2 2017-11-27 claudio r->rl_tls_ca_fd = -1;
1916 ce78c3f2 2017-11-27 claudio r->rl_tls_cacert_fd = -1;
1917 c4efe747 2024-10-28 tb r->rl_tls_client_ca_fd = -1;
1918 0f7a5e2e 2012-10-03 reyk TAILQ_INIT(&r->rl_tables);
1919 30640247 2007-02-22 reyk if (last_relay_id == INT_MAX) {
1920 30640247 2007-02-22 reyk yyerror("too many relays defined");
1921 33b0029d 2008-01-29 pyr free(r);
1922 30640247 2007-02-22 reyk YYERROR;
1923 30640247 2007-02-22 reyk }
1924 0f7a5e2e 2012-10-03 reyk dstmode = RELAY_DSTMODE_DEFAULT;
1925 30640247 2007-02-22 reyk rlay = r;
1926 30640247 2007-02-22 reyk } '{' optnl relayopts_l '}' {
1927 3b232a62 2019-05-29 reyk struct relay *r;
1928 3b232a62 2019-05-29 reyk struct relay_config *rlconf = &rlay->rl_conf;
1929 36dd1e7a 2026-05-15 rsadowski struct keyname *kname;
1930 f8a7ea4c 2009-08-05 reyk
1931 3b232a62 2019-05-29 reyk if (relay_findbyname(conf, rlconf->name) != NULL ||
1932 3b232a62 2019-05-29 reyk relay_findbyaddr(conf, rlconf) != NULL) {
1933 3b232a62 2019-05-29 reyk yyerror("relay %s or listener defined twice",
1934 3b232a62 2019-05-29 reyk rlconf->name);
1935 3b232a62 2019-05-29 reyk YYERROR;
1936 3b232a62 2019-05-29 reyk }
1937 3b232a62 2019-05-29 reyk
1938 146643ba 2008-01-31 reyk if (rlay->rl_conf.ss.ss_family == AF_UNSPEC) {
1939 30640247 2007-02-22 reyk yyerror("relay %s has no listener",
1940 146643ba 2008-01-31 reyk rlay->rl_conf.name);
1941 30640247 2007-02-22 reyk YYERROR;
1942 30640247 2007-02-22 reyk }
1943 9c52a29e 2011-04-07 reyk if ((rlay->rl_conf.flags & (F_NATLOOK|F_DIVERT)) ==
1944 9c52a29e 2011-04-07 reyk (F_NATLOOK|F_DIVERT)) {
1945 9c52a29e 2011-04-07 reyk yyerror("relay %s with conflicting nat lookup "
1946 9c52a29e 2011-04-07 reyk "and peer options", rlay->rl_conf.name);
1947 9c52a29e 2011-04-07 reyk YYERROR;
1948 9c52a29e 2011-04-07 reyk }
1949 9c52a29e 2011-04-07 reyk if ((rlay->rl_conf.flags & (F_NATLOOK|F_DIVERT)) == 0 &&
1950 146643ba 2008-01-31 reyk rlay->rl_conf.dstss.ss_family == AF_UNSPEC &&
1951 0f7a5e2e 2012-10-03 reyk TAILQ_EMPTY(&rlay->rl_tables)) {
1952 c8f9d8e3 2007-12-08 pyr yyerror("relay %s has no target, rdr, "
1953 146643ba 2008-01-31 reyk "or table", rlay->rl_conf.name);
1954 30640247 2007-02-22 reyk YYERROR;
1955 30640247 2007-02-22 reyk }
1956 146643ba 2008-01-31 reyk if (rlay->rl_conf.proto == EMPTY_ID) {
1957 146643ba 2008-01-31 reyk rlay->rl_proto = &conf->sc_proto_default;
1958 146643ba 2008-01-31 reyk rlay->rl_conf.proto = conf->sc_proto_default.id;
1959 c06cb0e1 2007-05-29 pyr }
1960 3b232a62 2019-05-29 reyk
1961 9261e0d8 2019-05-31 reyk if (TAILQ_EMPTY(&rlay->rl_proto->tlscerts) &&
1962 9261e0d8 2019-05-31 reyk relay_load_certfiles(conf, rlay, NULL) == -1) {
1963 22e4bee4 2007-10-22 pyr yyerror("cannot load certificates for relay %s",
1964 146643ba 2008-01-31 reyk rlay->rl_conf.name);
1965 22e4bee4 2007-10-22 pyr YYERROR;
1966 22e4bee4 2007-10-22 pyr }
1967 36dd1e7a 2026-05-15 rsadowski TAILQ_FOREACH(kname, &rlay->rl_proto->tlscerts, entry) {
1968 9261e0d8 2019-05-31 reyk if (relay_load_certfiles(conf,
1969 36dd1e7a 2026-05-15 rsadowski rlay, kname) == -1) {
1970 9261e0d8 2019-05-31 reyk yyerror("cannot load keypair %s"
1971 36dd1e7a 2026-05-15 rsadowski " for relay %s", kname->name,
1972 9261e0d8 2019-05-31 reyk rlay->rl_conf.name);
1973 9261e0d8 2019-05-31 reyk YYERROR;
1974 9261e0d8 2019-05-31 reyk }
1975 9261e0d8 2019-05-31 reyk }
1976 3b232a62 2019-05-29 reyk
1977 23fba4ad 2008-01-31 reyk conf->sc_relaycount++;
1978 146643ba 2008-01-31 reyk SPLAY_INIT(&rlay->rl_sessions);
1979 c812a96d 2008-07-17 reyk TAILQ_INSERT_TAIL(conf->sc_relays, rlay, rl_entry);
1980 dbef7d4f 2011-05-09 reyk
1981 d7758aba 2007-12-08 reyk tableport = 0;
1982 f8a7ea4c 2009-08-05 reyk
1983 f8a7ea4c 2009-08-05 reyk while ((r = TAILQ_FIRST(&relays)) != NULL) {
1984 f8a7ea4c 2009-08-05 reyk TAILQ_REMOVE(&relays, r, rl_entry);
1985 f8a7ea4c 2009-08-05 reyk if (relay_inherit(rlay, r) == NULL) {
1986 f8a7ea4c 2009-08-05 reyk YYERROR;
1987 f8a7ea4c 2009-08-05 reyk }
1988 f8a7ea4c 2009-08-05 reyk }
1989 d7758aba 2007-12-08 reyk rlay = NULL;
1990 30640247 2007-02-22 reyk }
1991 30640247 2007-02-22 reyk ;
1992 30640247 2007-02-22 reyk
1993 30640247 2007-02-22 reyk relayopts_l : relayopts_l relayoptsl nl
1994 30640247 2007-02-22 reyk | relayoptsl optnl
1995 30640247 2007-02-22 reyk ;
1996 30640247 2007-02-22 reyk
1997 096ff28b 2014-12-12 reyk relayoptsl : LISTEN ON STRING port opttls {
1998 ab7af3ec 2007-11-19 reyk struct addresslist al;
1999 30640247 2007-02-22 reyk struct address *h;
2000 e9c39896 2026-05-17 kirill struct relay *nr, *r;
2001 e9c39896 2026-05-17 kirill int cnt = 0;
2002 30640247 2007-02-22 reyk
2003 146643ba 2008-01-31 reyk if (rlay->rl_conf.ss.ss_family != AF_UNSPEC) {
2004 e9c39896 2026-05-17 kirill if ((r = calloc(1, sizeof(*r))) == NULL)
2005 f8a7ea4c 2009-08-05 reyk fatal("out of memory");
2006 f8a7ea4c 2009-08-05 reyk } else
2007 f8a7ea4c 2009-08-05 reyk r = rlay;
2008 09913286 2008-09-29 reyk if ($4.op != PF_OP_EQ) {
2009 09913286 2008-09-29 reyk yyerror("invalid port");
2010 09913286 2008-09-29 reyk free($3);
2011 e9c39896 2026-05-17 kirill if (r != rlay)
2012 e9c39896 2026-05-17 kirill free(r);
2013 09913286 2008-09-29 reyk YYERROR;
2014 09913286 2008-09-29 reyk }
2015 30640247 2007-02-22 reyk
2016 30640247 2007-02-22 reyk TAILQ_INIT(&al);
2017 e9c39896 2026-05-17 kirill if (host($3, &al, SRV_MAX_VIRTS, &$4, NULL, -1) <= 0) {
2018 30640247 2007-02-22 reyk yyerror("invalid listen ip: %s", $3);
2019 30640247 2007-02-22 reyk free($3);
2020 e9c39896 2026-05-17 kirill if (r != rlay)
2021 e9c39896 2026-05-17 kirill free(r);
2022 30640247 2007-02-22 reyk YYERROR;
2023 30640247 2007-02-22 reyk }
2024 e9c39896 2026-05-17 kirill if (host_local(&al) == 0) {
2025 e9c39896 2026-05-17 kirill yyerror("no local listen ip: %s", $3);
2026 e9c39896 2026-05-17 kirill free($3);
2027 e9c39896 2026-05-17 kirill host_free(&al);
2028 e9c39896 2026-05-17 kirill if (r != rlay)
2029 e9c39896 2026-05-17 kirill free(r);
2030 e9c39896 2026-05-17 kirill YYERROR;
2031 e9c39896 2026-05-17 kirill }
2032 30640247 2007-02-22 reyk free($3);
2033 e9c39896 2026-05-17 kirill TAILQ_FOREACH(h, &al, entry) {
2034 e9c39896 2026-05-17 kirill if (cnt == 0) {
2035 e9c39896 2026-05-17 kirill nr = r;
2036 e9c39896 2026-05-17 kirill if (nr != rlay)
2037 e9c39896 2026-05-17 kirill TAILQ_INSERT_TAIL(&relays, nr,
2038 e9c39896 2026-05-17 kirill rl_entry);
2039 e9c39896 2026-05-17 kirill } else {
2040 e9c39896 2026-05-17 kirill if ((nr = calloc(1, sizeof(*nr))) == NULL)
2041 e9c39896 2026-05-17 kirill fatal("out of memory");
2042 e9c39896 2026-05-17 kirill TAILQ_INSERT_TAIL(&relays, nr, rl_entry);
2043 e9c39896 2026-05-17 kirill }
2044 e9c39896 2026-05-17 kirill bcopy(&h->ss, &nr->rl_conf.ss,
2045 e9c39896 2026-05-17 kirill sizeof(nr->rl_conf.ss));
2046 e9c39896 2026-05-17 kirill nr->rl_conf.port = h->port.val[0];
2047 e9c39896 2026-05-17 kirill if ($5)
2048 e9c39896 2026-05-17 kirill nr->rl_conf.flags |= F_TLS;
2049 e9c39896 2026-05-17 kirill cnt++;
2050 e9c39896 2026-05-17 kirill }
2051 e9c39896 2026-05-17 kirill if ($5)
2052 58fc320c 2016-09-02 reyk conf->sc_conf.flags |= F_TLS;
2053 e9c39896 2026-05-17 kirill tableport = $4.val[0];
2054 591e6ab5 2011-05-19 reyk host_free(&al);
2055 30640247 2007-02-22 reyk }
2056 80347df3 2026-02-18 kirill | forwardmode opttlsclient TO forwardspec dstaf optproxyproto {
2057 6d5340e6 2008-06-11 reyk rlay->rl_conf.fwdmode = $1;
2058 538d2229 2014-10-20 reyk if ($1 == FWD_ROUTE) {
2059 538d2229 2014-10-20 reyk yyerror("no route for relays");
2060 6d5340e6 2008-06-11 reyk YYERROR;
2061 6d5340e6 2008-06-11 reyk }
2062 6024acb8 2009-04-01 reyk if ($2) {
2063 096ff28b 2014-12-12 reyk rlay->rl_conf.flags |= F_TLSCLIENT;
2064 58fc320c 2016-09-02 reyk conf->sc_conf.flags |= F_TLSCLIENT;
2065 6024acb8 2009-04-01 reyk }
2066 80347df3 2026-02-18 kirill
2067 80347df3 2026-02-18 kirill rlay->rl_conf.flags |= $6;
2068 6d5340e6 2008-06-11 reyk }
2069 87e43bd7 2008-05-06 reyk | SESSION TIMEOUT NUMBER {
2070 146643ba 2008-01-31 reyk if ((rlay->rl_conf.timeout.tv_sec = $3) < 0) {
2071 983a954b 2013-04-27 benno yyerror("invalid timeout: %lld", $3);
2072 30640247 2007-02-22 reyk YYERROR;
2073 30640247 2007-02-22 reyk }
2074 983a954b 2013-04-27 benno if (rlay->rl_conf.timeout.tv_sec > INT_MAX) {
2075 983a954b 2013-04-27 benno yyerror("timeout too large: %lld", $3);
2076 983a954b 2013-04-27 benno YYERROR;
2077 983a954b 2013-04-27 benno }
2078 30640247 2007-02-22 reyk }
2079 d7758aba 2007-12-08 reyk | PROTO STRING {
2080 30640247 2007-02-22 reyk struct protocol *p;
2081 30640247 2007-02-22 reyk
2082 c4809a85 2020-02-12 benno if (rlay->rl_conf.proto != EMPTY_ID) {
2083 c4809a85 2020-02-12 benno yyerror("more than one protocol specified");
2084 c4809a85 2020-02-12 benno YYERROR;
2085 c4809a85 2020-02-12 benno }
2086 fe4b71bd 2020-10-25 denis
2087 23fba4ad 2008-01-31 reyk TAILQ_FOREACH(p, conf->sc_protos, entry)
2088 30640247 2007-02-22 reyk if (!strcmp(p->name, $2))
2089 30640247 2007-02-22 reyk break;
2090 30640247 2007-02-22 reyk if (p == NULL) {
2091 30640247 2007-02-22 reyk yyerror("no such protocol: %s", $2);
2092 30640247 2007-02-22 reyk free($2);
2093 30640247 2007-02-22 reyk YYERROR;
2094 30640247 2007-02-22 reyk }
2095 80347df3 2026-02-18 kirill
2096 30640247 2007-02-22 reyk p->flags |= F_USED;
2097 146643ba 2008-01-31 reyk rlay->rl_conf.proto = p->id;
2098 146643ba 2008-01-31 reyk rlay->rl_proto = p;
2099 30640247 2007-02-22 reyk free($2);
2100 30640247 2007-02-22 reyk }
2101 146643ba 2008-01-31 reyk | DISABLE { rlay->rl_conf.flags |= F_DISABLE; }
2102 29d1b5dd 2007-11-20 reyk | include
2103 30640247 2007-02-22 reyk ;
2104 30640247 2007-02-22 reyk
2105 6024acb8 2009-04-01 reyk forwardspec : STRING port retry {
2106 d7758aba 2007-12-08 reyk struct addresslist al;
2107 d7758aba 2007-12-08 reyk struct address *h;
2108 d7758aba 2007-12-08 reyk
2109 146643ba 2008-01-31 reyk if (rlay->rl_conf.dstss.ss_family != AF_UNSPEC) {
2110 3a75ae45 2012-10-04 reyk yyerror("relay %s target or redirection "
2111 3a75ae45 2012-10-04 reyk "already specified", rlay->rl_conf.name);
2112 d7758aba 2007-12-08 reyk free($1);
2113 d7758aba 2007-12-08 reyk YYERROR;
2114 d7758aba 2007-12-08 reyk }
2115 09913286 2008-09-29 reyk if ($2.op != PF_OP_EQ) {
2116 09913286 2008-09-29 reyk yyerror("invalid port");
2117 09913286 2008-09-29 reyk free($1);
2118 09913286 2008-09-29 reyk YYERROR;
2119 09913286 2008-09-29 reyk }
2120 d7758aba 2007-12-08 reyk
2121 d7758aba 2007-12-08 reyk TAILQ_INIT(&al);
2122 d250825b 2009-04-24 reyk if (host($1, &al, 1, &$2, NULL, -1) <= 0) {
2123 bf37b684 2019-07-13 chrisz yyerror("invalid forward ip: %s", $1);
2124 d7758aba 2007-12-08 reyk free($1);
2125 d7758aba 2007-12-08 reyk YYERROR;
2126 d7758aba 2007-12-08 reyk }
2127 d7758aba 2007-12-08 reyk free($1);
2128 d7758aba 2007-12-08 reyk h = TAILQ_FIRST(&al);
2129 146643ba 2008-01-31 reyk bcopy(&h->ss, &rlay->rl_conf.dstss,
2130 146643ba 2008-01-31 reyk sizeof(rlay->rl_conf.dstss));
2131 09913286 2008-09-29 reyk rlay->rl_conf.dstport = h->port.val[0];
2132 146643ba 2008-01-31 reyk rlay->rl_conf.dstretry = $3;
2133 591e6ab5 2011-05-19 reyk host_free(&al);
2134 d7758aba 2007-12-08 reyk }
2135 6024acb8 2009-04-01 reyk | NAT LOOKUP retry {
2136 58fc320c 2016-09-02 reyk conf->sc_conf.flags |= F_NEEDPF;
2137 146643ba 2008-01-31 reyk rlay->rl_conf.flags |= F_NATLOOK;
2138 146643ba 2008-01-31 reyk rlay->rl_conf.dstretry = $3;
2139 d7758aba 2007-12-08 reyk }
2140 9c52a29e 2011-04-07 reyk | DESTINATION retry {
2141 58fc320c 2016-09-02 reyk conf->sc_conf.flags |= F_NEEDPF;
2142 9c52a29e 2011-04-07 reyk rlay->rl_conf.flags |= F_DIVERT;
2143 9c52a29e 2011-04-07 reyk rlay->rl_conf.dstretry = $2;
2144 9c52a29e 2011-04-07 reyk }
2145 6024acb8 2009-04-01 reyk | tablespec {
2146 0f7a5e2e 2012-10-03 reyk struct relay_table *rlt;
2147 0f7a5e2e 2012-10-03 reyk
2148 0f7a5e2e 2012-10-03 reyk if ((rlt = calloc(1, sizeof(*rlt))) == NULL) {
2149 0f7a5e2e 2012-10-03 reyk yyerror("failed to allocate table reference");
2150 6024acb8 2009-04-01 reyk YYERROR;
2151 6024acb8 2009-04-01 reyk }
2152 0f7a5e2e 2012-10-03 reyk
2153 0f7a5e2e 2012-10-03 reyk rlt->rlt_table = $1;
2154 0f7a5e2e 2012-10-03 reyk rlt->rlt_table->conf.flags |= F_USED;
2155 0f7a5e2e 2012-10-03 reyk rlt->rlt_mode = dstmode;
2156 0f7a5e2e 2012-10-03 reyk rlt->rlt_flags = F_USED;
2157 0f7a5e2e 2012-10-03 reyk if (!TAILQ_EMPTY(&rlay->rl_tables))
2158 0f7a5e2e 2012-10-03 reyk rlt->rlt_flags |= F_BACKUP;
2159 0f7a5e2e 2012-10-03 reyk
2160 3e04b122 2014-12-18 reyk if (hashkey != NULL &&
2161 3e04b122 2014-12-18 reyk (rlay->rl_conf.flags & F_HASHKEY) == 0) {
2162 3e04b122 2014-12-18 reyk memcpy(&rlay->rl_conf.hashkey,
2163 3e04b122 2014-12-18 reyk hashkey, sizeof(rlay->rl_conf.hashkey));
2164 3e04b122 2014-12-18 reyk rlay->rl_conf.flags |= F_HASHKEY;
2165 3e04b122 2014-12-18 reyk }
2166 3e04b122 2014-12-18 reyk free(hashkey);
2167 3e04b122 2014-12-18 reyk hashkey = NULL;
2168 3e04b122 2014-12-18 reyk
2169 0f7a5e2e 2012-10-03 reyk TAILQ_INSERT_TAIL(&rlay->rl_tables, rlt, rlt_entry);
2170 6024acb8 2009-04-01 reyk }
2171 d7758aba 2007-12-08 reyk ;
2172 d7758aba 2007-12-08 reyk
2173 30640247 2007-02-22 reyk dstmode : /* empty */ { $$ = RELAY_DSTMODE_DEFAULT; }
2174 30640247 2007-02-22 reyk | LOADBALANCE { $$ = RELAY_DSTMODE_LOADBALANCE; }
2175 30640247 2007-02-22 reyk | ROUNDROBIN { $$ = RELAY_DSTMODE_ROUNDROBIN; }
2176 30640247 2007-02-22 reyk | HASH { $$ = RELAY_DSTMODE_HASH; }
2177 d6c9879f 2012-10-19 reyk | LEASTSTATES { $$ = RELAY_DSTMODE_LEASTSTATES; }
2178 d6c9879f 2012-10-19 reyk | SRCHASH { $$ = RELAY_DSTMODE_SRCHASH; }
2179 d6c9879f 2012-10-19 reyk | RANDOM { $$ = RELAY_DSTMODE_RANDOM; }
2180 30640247 2007-02-22 reyk ;
2181 30640247 2007-02-22 reyk
2182 39bc6125 2009-08-13 reyk router : ROUTER STRING {
2183 39bc6125 2009-08-13 reyk struct router *rt = NULL;
2184 39bc6125 2009-08-13 reyk
2185 591e6ab5 2011-05-19 reyk if (!loadcfg) {
2186 591e6ab5 2011-05-19 reyk free($2);
2187 591e6ab5 2011-05-19 reyk YYACCEPT;
2188 591e6ab5 2011-05-19 reyk }
2189 591e6ab5 2011-05-19 reyk
2190 58fc320c 2016-09-02 reyk conf->sc_conf.flags |= F_NEEDRT;
2191 39bc6125 2009-08-13 reyk TAILQ_FOREACH(rt, conf->sc_rts, rt_entry)
2192 39bc6125 2009-08-13 reyk if (!strcmp(rt->rt_conf.name, $2))
2193 39bc6125 2009-08-13 reyk break;
2194 39bc6125 2009-08-13 reyk if (rt != NULL) {
2195 39bc6125 2009-08-13 reyk yyerror("router %s defined twice", $2);
2196 39bc6125 2009-08-13 reyk free($2);
2197 39bc6125 2009-08-13 reyk YYERROR;
2198 39bc6125 2009-08-13 reyk }
2199 39bc6125 2009-08-13 reyk
2200 39bc6125 2009-08-13 reyk if ((rt = calloc(1, sizeof (*rt))) == NULL)
2201 39bc6125 2009-08-13 reyk fatal("out of memory");
2202 39bc6125 2009-08-13 reyk
2203 39bc6125 2009-08-13 reyk if (strlcpy(rt->rt_conf.name, $2,
2204 39bc6125 2009-08-13 reyk sizeof(rt->rt_conf.name)) >=
2205 39bc6125 2009-08-13 reyk sizeof(rt->rt_conf.name)) {
2206 39bc6125 2009-08-13 reyk yyerror("router name truncated");
2207 39bc6125 2009-08-13 reyk free(rt);
2208 39bc6125 2009-08-13 reyk YYERROR;
2209 39bc6125 2009-08-13 reyk }
2210 39bc6125 2009-08-13 reyk free($2);
2211 39bc6125 2009-08-13 reyk rt->rt_conf.id = ++last_rt_id;
2212 39bc6125 2009-08-13 reyk if (last_rt_id == INT_MAX) {
2213 39bc6125 2009-08-13 reyk yyerror("too many routers defined");
2214 39bc6125 2009-08-13 reyk free(rt);
2215 39bc6125 2009-08-13 reyk YYERROR;
2216 39bc6125 2009-08-13 reyk }
2217 39bc6125 2009-08-13 reyk TAILQ_INIT(&rt->rt_netroutes);
2218 39bc6125 2009-08-13 reyk router = rt;
2219 39bc6125 2009-08-13 reyk
2220 39bc6125 2009-08-13 reyk tableport = -1;
2221 39bc6125 2009-08-13 reyk } '{' optnl routeopts_l '}' {
2222 39bc6125 2009-08-13 reyk if (!router->rt_conf.nroutes) {
2223 39bc6125 2009-08-13 reyk yyerror("router %s without routes",
2224 39bc6125 2009-08-13 reyk router->rt_conf.name);
2225 39bc6125 2009-08-13 reyk free(router);
2226 39bc6125 2009-08-13 reyk router = NULL;
2227 39bc6125 2009-08-13 reyk YYERROR;
2228 39bc6125 2009-08-13 reyk }
2229 39bc6125 2009-08-13 reyk
2230 39bc6125 2009-08-13 reyk conf->sc_routercount++;
2231 39bc6125 2009-08-13 reyk TAILQ_INSERT_TAIL(conf->sc_rts, router, rt_entry);
2232 39bc6125 2009-08-13 reyk router = NULL;
2233 39bc6125 2009-08-13 reyk
2234 39bc6125 2009-08-13 reyk tableport = 0;
2235 39bc6125 2009-08-13 reyk }
2236 39bc6125 2009-08-13 reyk ;
2237 39bc6125 2009-08-13 reyk
2238 39bc6125 2009-08-13 reyk routeopts_l : routeopts_l routeoptsl nl
2239 39bc6125 2009-08-13 reyk | routeoptsl optnl
2240 39bc6125 2009-08-13 reyk ;
2241 39bc6125 2009-08-13 reyk
2242 fc2c091b 2019-05-10 reyk routeoptsl : ROUTE addrprefix {
2243 39bc6125 2009-08-13 reyk struct netroute *nr;
2244 39bc6125 2009-08-13 reyk
2245 591e6ab5 2011-05-19 reyk if (router->rt_conf.af == AF_UNSPEC)
2246 591e6ab5 2011-05-19 reyk router->rt_conf.af = $2.ss.ss_family;
2247 591e6ab5 2011-05-19 reyk else if (router->rt_conf.af != $2.ss.ss_family) {
2248 39bc6125 2009-08-13 reyk yyerror("router %s address family mismatch",
2249 39bc6125 2009-08-13 reyk router->rt_conf.name);
2250 39bc6125 2009-08-13 reyk YYERROR;
2251 39bc6125 2009-08-13 reyk }
2252 39bc6125 2009-08-13 reyk
2253 39bc6125 2009-08-13 reyk if ((nr = calloc(1, sizeof(*nr))) == NULL)
2254 39bc6125 2009-08-13 reyk fatal("out of memory");
2255 39bc6125 2009-08-13 reyk
2256 39bc6125 2009-08-13 reyk nr->nr_conf.id = ++last_nr_id;
2257 39bc6125 2009-08-13 reyk if (last_nr_id == INT_MAX) {
2258 39bc6125 2009-08-13 reyk yyerror("too many routes defined");
2259 39bc6125 2009-08-13 reyk free(nr);
2260 39bc6125 2009-08-13 reyk YYERROR;
2261 39bc6125 2009-08-13 reyk }
2262 fc2c091b 2019-05-10 reyk nr->nr_conf.prefixlen = $2.prefixlen;
2263 39bc6125 2009-08-13 reyk nr->nr_conf.routerid = router->rt_conf.id;
2264 39bc6125 2009-08-13 reyk nr->nr_router = router;
2265 39bc6125 2009-08-13 reyk bcopy(&$2.ss, &nr->nr_conf.ss, sizeof($2.ss));
2266 39bc6125 2009-08-13 reyk
2267 39bc6125 2009-08-13 reyk router->rt_conf.nroutes++;
2268 39bc6125 2009-08-13 reyk conf->sc_routecount++;
2269 39bc6125 2009-08-13 reyk TAILQ_INSERT_TAIL(&router->rt_netroutes, nr, nr_entry);
2270 39bc6125 2009-08-13 reyk TAILQ_INSERT_TAIL(conf->sc_routes, nr, nr_route);
2271 39bc6125 2009-08-13 reyk }
2272 39bc6125 2009-08-13 reyk | FORWARD TO tablespec {
2273 3e04b122 2014-12-18 reyk free(hashkey);
2274 3e04b122 2014-12-18 reyk hashkey = NULL;
2275 3e04b122 2014-12-18 reyk
2276 39bc6125 2009-08-13 reyk if (router->rt_gwtable) {
2277 39bc6125 2009-08-13 reyk yyerror("router %s table already specified",
2278 39bc6125 2009-08-13 reyk router->rt_conf.name);
2279 2f479274 2015-05-02 claudio purge_table(conf, conf->sc_tables, $3);
2280 39bc6125 2009-08-13 reyk YYERROR;
2281 39bc6125 2009-08-13 reyk }
2282 39bc6125 2009-08-13 reyk router->rt_gwtable = $3;
2283 39bc6125 2009-08-13 reyk router->rt_gwtable->conf.flags |= F_USED;
2284 39bc6125 2009-08-13 reyk router->rt_conf.gwtable = $3->conf.id;
2285 39bc6125 2009-08-13 reyk router->rt_conf.gwport = $3->conf.port;
2286 39bc6125 2009-08-13 reyk }
2287 39bc6125 2009-08-13 reyk | RTABLE NUMBER {
2288 39bc6125 2009-08-13 reyk if (router->rt_conf.rtable) {
2289 39bc6125 2009-08-13 reyk yyerror("router %s rtable already specified",
2290 39bc6125 2009-08-13 reyk router->rt_conf.name);
2291 39bc6125 2009-08-13 reyk YYERROR;
2292 39bc6125 2009-08-13 reyk }
2293 39bc6125 2009-08-13 reyk if ($2 < 0 || $2 > RT_TABLEID_MAX) {
2294 65f74224 2019-07-05 patrick yyerror("invalid rtable id %lld", $2);
2295 39bc6125 2009-08-13 reyk YYERROR;
2296 39bc6125 2009-08-13 reyk }
2297 39bc6125 2009-08-13 reyk router->rt_conf.rtable = $2;
2298 39bc6125 2009-08-13 reyk }
2299 39bc6125 2009-08-13 reyk | RTLABEL STRING {
2300 39bc6125 2009-08-13 reyk if (strlcpy(router->rt_conf.label, $2,
2301 39bc6125 2009-08-13 reyk sizeof(router->rt_conf.label)) >=
2302 39bc6125 2009-08-13 reyk sizeof(router->rt_conf.label)) {
2303 39bc6125 2009-08-13 reyk yyerror("route label truncated");
2304 39bc6125 2009-08-13 reyk free($2);
2305 39bc6125 2009-08-13 reyk YYERROR;
2306 39bc6125 2009-08-13 reyk }
2307 39bc6125 2009-08-13 reyk free($2);
2308 39bc6125 2009-08-13 reyk }
2309 39bc6125 2009-08-13 reyk | DISABLE { rlay->rl_conf.flags |= F_DISABLE; }
2310 39bc6125 2009-08-13 reyk | include
2311 39bc6125 2009-08-13 reyk ;
2312 39bc6125 2009-08-13 reyk
2313 2e5903be 2008-07-22 reyk dstaf : /* empty */ {
2314 2e5903be 2008-07-22 reyk rlay->rl_conf.dstaf.ss_family = AF_UNSPEC;
2315 2e5903be 2008-07-22 reyk }
2316 2e5903be 2008-07-22 reyk | INET {
2317 2e5903be 2008-07-22 reyk rlay->rl_conf.dstaf.ss_family = AF_INET;
2318 2e5903be 2008-07-22 reyk }
2319 2e5903be 2008-07-22 reyk | INET6 STRING {
2320 2e5903be 2008-07-22 reyk struct sockaddr_in6 *sin6;
2321 2e5903be 2008-07-22 reyk
2322 2e5903be 2008-07-22 reyk sin6 = (struct sockaddr_in6 *)&rlay->rl_conf.dstaf;
2323 2e5903be 2008-07-22 reyk if (inet_pton(AF_INET6, $2, &sin6->sin6_addr) == -1) {
2324 2e5903be 2008-07-22 reyk yyerror("invalid ipv6 address %s", $2);
2325 2e5903be 2008-07-22 reyk free($2);
2326 2e5903be 2008-07-22 reyk YYERROR;
2327 2e5903be 2008-07-22 reyk }
2328 2e5903be 2008-07-22 reyk free($2);
2329 2e5903be 2008-07-22 reyk
2330 2e5903be 2008-07-22 reyk sin6->sin6_family = AF_INET6;
2331 2e5903be 2008-07-22 reyk sin6->sin6_len = sizeof(*sin6);
2332 2e5903be 2008-07-22 reyk }
2333 2e5903be 2008-07-22 reyk ;
2334 2e5903be 2008-07-22 reyk
2335 69fde657 2014-07-09 reyk interface : /* empty */ { $$ = NULL; }
2336 41042ecc 2006-12-16 reyk | INTERFACE STRING { $$ = $2; }
2337 41042ecc 2006-12-16 reyk ;
2338 41042ecc 2006-12-16 reyk
2339 9b90e758 2009-08-07 reyk host : address {
2340 9b90e758 2009-08-07 reyk if ((hst = calloc(1, sizeof(*(hst)))) == NULL)
2341 4ab45c57 2006-12-16 reyk fatal("out of memory");
2342 41042ecc 2006-12-16 reyk
2343 9b90e758 2009-08-07 reyk if (strlcpy(hst->conf.name, $1.name,
2344 9b90e758 2009-08-07 reyk sizeof(hst->conf.name)) >= sizeof(hst->conf.name)) {
2345 41042ecc 2006-12-16 reyk yyerror("host name truncated");
2346 9b90e758 2009-08-07 reyk free(hst);
2347 41042ecc 2006-12-16 reyk YYERROR;
2348 41042ecc 2006-12-16 reyk }
2349 53eb3c65 2009-08-07 reyk bcopy(&$1.ss, &hst->conf.ss, sizeof($1.ss));
2350 9b90e758 2009-08-07 reyk hst->conf.id = 0; /* will be set later */
2351 9b90e758 2009-08-07 reyk SLIST_INIT(&hst->children);
2352 9b90e758 2009-08-07 reyk } opthostflags {
2353 9b90e758 2009-08-07 reyk $$ = hst;
2354 9b90e758 2009-08-07 reyk hst = NULL;
2355 41042ecc 2006-12-16 reyk }
2356 41042ecc 2006-12-16 reyk ;
2357 41042ecc 2006-12-16 reyk
2358 9b90e758 2009-08-07 reyk opthostflags : /* empty */
2359 9b90e758 2009-08-07 reyk | hostflags_l
2360 9b90e758 2009-08-07 reyk ;
2361 9b90e758 2009-08-07 reyk
2362 9b90e758 2009-08-07 reyk hostflags_l : hostflags hostflags_l
2363 9b90e758 2009-08-07 reyk | hostflags
2364 9b90e758 2009-08-07 reyk ;
2365 9b90e758 2009-08-07 reyk
2366 9b90e758 2009-08-07 reyk hostflags : RETRY NUMBER {
2367 9b90e758 2009-08-07 reyk if (hst->conf.retry) {
2368 9b90e758 2009-08-07 reyk yyerror("retry value already set");
2369 9b90e758 2009-08-07 reyk YYERROR;
2370 9b90e758 2009-08-07 reyk }
2371 9b90e758 2009-08-07 reyk if ($2 < 0) {
2372 65f74224 2019-07-05 patrick yyerror("invalid retry value: %lld\n", $2);
2373 9b90e758 2009-08-07 reyk YYERROR;
2374 9b90e758 2009-08-07 reyk }
2375 9b90e758 2009-08-07 reyk hst->conf.retry = $2;
2376 9b90e758 2009-08-07 reyk }
2377 9b90e758 2009-08-07 reyk | PARENT NUMBER {
2378 9b90e758 2009-08-07 reyk if (hst->conf.parentid) {
2379 9b90e758 2009-08-07 reyk yyerror("parent value already set");
2380 9b90e758 2009-08-07 reyk YYERROR;
2381 9b90e758 2009-08-07 reyk }
2382 9b90e758 2009-08-07 reyk if ($2 < 0) {
2383 65f74224 2019-07-05 patrick yyerror("invalid parent value: %lld\n", $2);
2384 9b90e758 2009-08-07 reyk YYERROR;
2385 9b90e758 2009-08-07 reyk }
2386 9b90e758 2009-08-07 reyk hst->conf.parentid = $2;
2387 9b90e758 2009-08-07 reyk }
2388 246e5b16 2011-05-05 phessler | PRIORITY NUMBER {
2389 246e5b16 2011-05-05 phessler if (hst->conf.priority) {
2390 246e5b16 2011-05-05 phessler yyerror("priority already set");
2391 246e5b16 2011-05-05 phessler YYERROR;
2392 246e5b16 2011-05-05 phessler }
2393 246e5b16 2011-05-05 phessler if ($2 < 0 || $2 > RTP_MAX) {
2394 65f74224 2019-07-05 patrick yyerror("invalid priority value: %lld\n", $2);
2395 246e5b16 2011-05-05 phessler YYERROR;
2396 246e5b16 2011-05-05 phessler }
2397 246e5b16 2011-05-05 phessler hst->conf.priority = $2;
2398 246e5b16 2011-05-05 phessler }
2399 c3895d83 2009-08-07 reyk | IP TTL NUMBER {
2400 c3895d83 2009-08-07 reyk if (hst->conf.ttl) {
2401 c3895d83 2009-08-07 reyk yyerror("ttl value already set");
2402 c3895d83 2009-08-07 reyk YYERROR;
2403 c3895d83 2009-08-07 reyk }
2404 c3895d83 2009-08-07 reyk if ($3 < 0) {
2405 65f74224 2019-07-05 patrick yyerror("invalid ttl value: %lld\n", $3);
2406 c3895d83 2009-08-07 reyk YYERROR;
2407 c3895d83 2009-08-07 reyk }
2408 c3895d83 2009-08-07 reyk hst->conf.ttl = $3;
2409 c3895d83 2009-08-07 reyk }
2410 9b90e758 2009-08-07 reyk ;
2411 9b90e758 2009-08-07 reyk
2412 3cce92a3 2009-08-07 reyk address : STRING {
2413 591e6ab5 2011-05-19 reyk struct address *h;
2414 3cce92a3 2009-08-07 reyk struct addresslist al;
2415 3cce92a3 2009-08-07 reyk
2416 3cce92a3 2009-08-07 reyk if (strlcpy($$.name, $1,
2417 3cce92a3 2009-08-07 reyk sizeof($$.name)) >= sizeof($$.name)) {
2418 3cce92a3 2009-08-07 reyk yyerror("host name truncated");
2419 3cce92a3 2009-08-07 reyk free($1);
2420 3cce92a3 2009-08-07 reyk YYERROR;
2421 3cce92a3 2009-08-07 reyk }
2422 3cce92a3 2009-08-07 reyk
2423 3cce92a3 2009-08-07 reyk TAILQ_INIT(&al);
2424 3cce92a3 2009-08-07 reyk if (host($1, &al, 1, NULL, NULL, -1) <= 0) {
2425 3cce92a3 2009-08-07 reyk yyerror("invalid host %s", $1);
2426 3cce92a3 2009-08-07 reyk free($1);
2427 3cce92a3 2009-08-07 reyk YYERROR;
2428 3cce92a3 2009-08-07 reyk }
2429 3cce92a3 2009-08-07 reyk free($1);
2430 591e6ab5 2011-05-19 reyk h = TAILQ_FIRST(&al);
2431 591e6ab5 2011-05-19 reyk memcpy(&$$.ss, &h->ss, sizeof($$.ss));
2432 591e6ab5 2011-05-19 reyk host_free(&al);
2433 3cce92a3 2009-08-07 reyk }
2434 3cce92a3 2009-08-07 reyk ;
2435 3cce92a3 2009-08-07 reyk
2436 fc2c091b 2019-05-10 reyk addrprefix : address '/' NUMBER {
2437 fc2c091b 2019-05-10 reyk $$ = $1;
2438 fc2c091b 2019-05-10 reyk if (($$.ss.ss_family == AF_INET &&
2439 fc2c091b 2019-05-10 reyk ($3 > 32 || $3 < 0)) ||
2440 fc2c091b 2019-05-10 reyk ($$.ss.ss_family == AF_INET6 &&
2441 fc2c091b 2019-05-10 reyk ($3 > 128 || $3 < 0))) {
2442 65f74224 2019-07-05 patrick yyerror("invalid prefixlen %lld", $3);
2443 fc2c091b 2019-05-10 reyk YYERROR;
2444 fc2c091b 2019-05-10 reyk }
2445 fc2c091b 2019-05-10 reyk $$.prefixlen = $3;
2446 fc2c091b 2019-05-10 reyk }
2447 fc2c091b 2019-05-10 reyk | address {
2448 fc2c091b 2019-05-10 reyk $$ = $1;
2449 fc2c091b 2019-05-10 reyk if ($$.ss.ss_family == AF_INET)
2450 fc2c091b 2019-05-10 reyk $$.prefixlen = 32;
2451 fc2c091b 2019-05-10 reyk else if ($$.ss.ss_family == AF_INET6)
2452 fc2c091b 2019-05-10 reyk $$.prefixlen = 128;
2453 fc2c091b 2019-05-10 reyk }
2454 fc2c091b 2019-05-10 reyk ;
2455 fc2c091b 2019-05-10 reyk
2456 9b90e758 2009-08-07 reyk retry : /* empty */ { $$ = 0; }
2457 4c6cdd88 2007-10-01 pyr | RETRY NUMBER {
2458 4c6cdd88 2007-10-01 pyr if (($$ = $2) < 0) {
2459 65f74224 2019-07-05 patrick yyerror("invalid retry value: %lld\n", $2);
2460 4c6cdd88 2007-10-01 pyr YYERROR;
2461 4c6cdd88 2007-10-01 pyr }
2462 4c6cdd88 2007-10-01 pyr }
2463 30640247 2007-02-22 reyk ;
2464 30640247 2007-02-22 reyk
2465 4c6cdd88 2007-10-01 pyr timeout : NUMBER
2466 90aa962e 2006-12-25 reyk {
2467 4c6cdd88 2007-10-01 pyr if ($1 < 0) {
2468 65f74224 2019-07-05 patrick yyerror("invalid timeout: %lld\n", $1);
2469 4c6cdd88 2007-10-01 pyr YYERROR;
2470 4c6cdd88 2007-10-01 pyr }
2471 90aa962e 2006-12-25 reyk $$.tv_sec = $1 / 1000;
2472 90aa962e 2006-12-25 reyk $$.tv_usec = ($1 % 1000) * 1000;
2473 90aa962e 2006-12-25 reyk }
2474 90aa962e 2006-12-25 reyk ;
2475 90aa962e 2006-12-25 reyk
2476 30640247 2007-02-22 reyk comma : ','
2477 d7758aba 2007-12-08 reyk | nl
2478 30640247 2007-02-22 reyk | /* empty */
2479 30640247 2007-02-22 reyk ;
2480 30640247 2007-02-22 reyk
2481 41042ecc 2006-12-16 reyk optnl : '\n' optnl
2482 41042ecc 2006-12-16 reyk |
2483 41042ecc 2006-12-16 reyk ;
2484 41042ecc 2006-12-16 reyk
2485 41042ecc 2006-12-16 reyk nl : '\n' optnl
2486 41042ecc 2006-12-16 reyk ;
2487 41042ecc 2006-12-16 reyk %%
2488 41042ecc 2006-12-16 reyk
2489 41042ecc 2006-12-16 reyk struct keywords {
2490 41042ecc 2006-12-16 reyk const char *k_name;
2491 41042ecc 2006-12-16 reyk int k_val;
2492 41042ecc 2006-12-16 reyk };
2493 41042ecc 2006-12-16 reyk
2494 41042ecc 2006-12-16 reyk int
2495 41042ecc 2006-12-16 reyk yyerror(const char *fmt, ...)
2496 41042ecc 2006-12-16 reyk {
2497 19437691 2007-10-13 deraadt va_list ap;
2498 787fd677 2014-11-02 bluhm char *msg;
2499 41042ecc 2006-12-16 reyk
2500 19437691 2007-10-13 deraadt file->errors++;
2501 41042ecc 2006-12-16 reyk va_start(ap, fmt);
2502 787fd677 2014-11-02 bluhm if (vasprintf(&msg, fmt, ap) == -1)
2503 787fd677 2014-11-02 bluhm fatalx("yyerror vasprintf");
2504 41042ecc 2006-12-16 reyk va_end(ap);
2505 787fd677 2014-11-02 bluhm logit(LOG_CRIT, "%s:%d: %s", file->name, yylval.lineno, msg);
2506 787fd677 2014-11-02 bluhm free(msg);
2507 41042ecc 2006-12-16 reyk return (0);
2508 41042ecc 2006-12-16 reyk }
2509 41042ecc 2006-12-16 reyk
2510 41042ecc 2006-12-16 reyk int
2511 41042ecc 2006-12-16 reyk kw_cmp(const void *k, const void *e)
2512 41042ecc 2006-12-16 reyk {
2513 41042ecc 2006-12-16 reyk return (strcmp(k, ((const struct keywords *)e)->k_name));
2514 41042ecc 2006-12-16 reyk }
2515 41042ecc 2006-12-16 reyk
2516 41042ecc 2006-12-16 reyk int
2517 41042ecc 2006-12-16 reyk lookup(char *s)
2518 41042ecc 2006-12-16 reyk {
2519 41042ecc 2006-12-16 reyk /* this has to be sorted always */
2520 41042ecc 2006-12-16 reyk static const struct keywords keywords[] = {
2521 04a2f953 2020-09-14 martijn { "agentx", AGENTX },
2522 30640247 2007-02-22 reyk { "append", APPEND },
2523 ed29f86d 2007-02-24 reyk { "backlog", BACKLOG },
2524 3a00da24 2006-12-16 deraadt { "backup", BACKUP },
2525 738b3cc9 2019-09-15 rob { "binary", BINARY },
2526 69fde657 2014-07-09 reyk { "block", BLOCK },
2527 30640247 2007-02-22 reyk { "buffer", BUFFER },
2528 6e8c1015 2009-04-02 reyk { "ca", CA },
2529 30640247 2007-02-22 reyk { "cache", CACHE },
2530 03668b6b 2013-05-30 reyk { "cert", CERTIFICATE },
2531 37ed6014 2018-08-06 benno { "changes", CHANGES },
2532 3a00da24 2006-12-16 deraadt { "check", CHECK },
2533 37ed6014 2018-08-06 benno { "checks", CHECKS },
2534 ed29f86d 2007-02-24 reyk { "ciphers", CIPHERS },
2535 c4efe747 2024-10-28 tb { "client", CLIENT },
2536 3a00da24 2006-12-16 deraadt { "code", CODE },
2537 37ed6014 2018-08-06 benno { "connection", CONNECTION },
2538 04a2f953 2020-09-14 martijn { "context", CONTEXT },
2539 55f47df4 2007-03-06 reyk { "cookie", COOKIE },
2540 30640247 2007-02-22 reyk { "demote", DEMOTE },
2541 9c52a29e 2011-04-07 reyk { "destination", DESTINATION },
2542 3a00da24 2006-12-16 deraadt { "digest", DIGEST },
2543 3a00da24 2006-12-16 deraadt { "disable", DISABLE },
2544 3fe6d92f 2017-11-27 claudio { "ecdhe", ECDHE },
2545 4da92fab 2014-07-11 reyk { "edh", EDH },
2546 691e5d5c 2007-11-20 reyk { "error", ERROR },
2547 37ed6014 2018-08-06 benno { "errors", ERRORS },
2548 7c36f315 2007-01-08 reyk { "expect", EXPECT },
2549 3a00da24 2006-12-16 deraadt { "external", EXTERNAL },
2550 0d64d91a 2008-09-29 reyk { "file", FILENAME },
2551 30640247 2007-02-22 reyk { "forward", FORWARD },
2552 30640247 2007-02-22 reyk { "from", FROM },
2553 30640247 2007-02-22 reyk { "hash", HASH },
2554 b217f480 2007-02-26 pyr { "header", HEADER },
2555 b688796e 2017-11-15 benno { "headerlen", HEADERLEN },
2556 3a00da24 2006-12-16 deraadt { "host", HOST },
2557 b688796e 2017-11-15 benno { "http", HTTP },
2558 3a00da24 2006-12-16 deraadt { "icmp", ICMP },
2559 002d9ce9 2007-10-22 reyk { "include", INCLUDE },
2560 2e5903be 2008-07-22 reyk { "inet", INET },
2561 2e5903be 2008-07-22 reyk { "inet6", INET6 },
2562 3a00da24 2006-12-16 deraadt { "interface", INTERFACE },
2563 3a00da24 2006-12-16 deraadt { "interval", INTERVAL },
2564 0a6c88ff 2007-03-13 reyk { "ip", IP },
2565 03668b6b 2013-05-30 reyk { "key", KEY },
2566 9261e0d8 2019-05-31 reyk { "keypair", KEYPAIR },
2567 cd2aab3b 2007-11-26 reyk { "label", LABEL },
2568 d6c9879f 2012-10-19 reyk { "least-states", LEASTSTATES },
2569 30640247 2007-02-22 reyk { "listen", LISTEN },
2570 30640247 2007-02-22 reyk { "loadbalance", LOADBALANCE },
2571 f802d393 2007-02-07 reyk { "log", LOG },
2572 30640247 2007-02-22 reyk { "lookup", LOOKUP },
2573 9832d300 2010-10-26 reyk { "match", MATCH },
2574 69fde657 2014-07-09 reyk { "method", METHOD },
2575 d7758aba 2007-12-08 reyk { "mode", MODE },
2576 30640247 2007-02-22 reyk { "nat", NAT },
2577 30640247 2007-02-22 reyk { "no", NO },
2578 30640247 2007-02-22 reyk { "nodelay", NODELAY },
2579 7c36f315 2007-01-08 reyk { "nothing", NOTHING },
2580 30640247 2007-02-22 reyk { "on", ON },
2581 4da92fab 2014-07-11 reyk { "params", PARAMS },
2582 17acabee 2008-07-19 reyk { "parent", PARENT },
2583 69fde657 2014-07-09 reyk { "pass", PASS },
2584 03668b6b 2013-05-30 reyk { "password", PASSWORD },
2585 2b4db924 2007-04-12 reyk { "path", PATH },
2586 199fb283 2024-06-17 sashan { "pflog", PFLOG },
2587 69fde657 2014-07-09 reyk { "pftag", PFTAG },
2588 3a00da24 2006-12-16 deraadt { "port", PORT },
2589 30640247 2007-02-22 reyk { "prefork", PREFORK },
2590 246e5b16 2011-05-05 phessler { "priority", PRIORITY },
2591 30640247 2007-02-22 reyk { "protocol", PROTO },
2592 80347df3 2026-02-18 kirill { "proxy-protocol", PROXYPROTO },
2593 b04edc92 2007-11-21 reyk { "query", QUERYSTR },
2594 69fde657 2014-07-09 reyk { "quick", QUICK },
2595 d6c9879f 2012-10-19 reyk { "random", RANDOM },
2596 3a00da24 2006-12-16 deraadt { "real", REAL },
2597 d7758aba 2007-12-08 reyk { "redirect", REDIRECT },
2598 30640247 2007-02-22 reyk { "relay", RELAY },
2599 30640247 2007-02-22 reyk { "remove", REMOVE },
2600 e624e530 2007-02-27 reyk { "request", REQUEST },
2601 e624e530 2007-02-27 reyk { "response", RESPONSE },
2602 30640247 2007-02-22 reyk { "retry", RETRY },
2603 691e5d5c 2007-11-20 reyk { "return", RETURN },
2604 30640247 2007-02-22 reyk { "roundrobin", ROUNDROBIN },
2605 2ac5660d 2008-05-07 reyk { "route", ROUTE },
2606 39bc6125 2009-08-13 reyk { "router", ROUTER },
2607 39bc6125 2009-08-13 reyk { "rtable", RTABLE },
2608 39bc6125 2009-08-13 reyk { "rtlabel", RTLABEL },
2609 30640247 2007-02-22 reyk { "sack", SACK },
2610 292100ef 2007-05-29 reyk { "script", SCRIPT },
2611 7c36f315 2007-01-08 reyk { "send", SEND },
2612 30640247 2007-02-22 reyk { "session", SESSION },
2613 69fde657 2014-07-09 reyk { "set", SET },
2614 30640247 2007-02-22 reyk { "socket", SOCKET },
2615 d6c9879f 2012-10-19 reyk { "source-hash", SRCHASH },
2616 ee6d33e4 2011-04-12 reyk { "splice", SPLICE },
2617 37ed6014 2018-08-06 benno { "state", STATE },
2618 59754064 2007-01-03 reyk { "sticky-address", STICKYADDR },
2619 d498e80a 2021-01-09 denis { "strip", STRIP },
2620 691e5d5c 2007-11-20 reyk { "style", STYLE },
2621 3a00da24 2006-12-16 deraadt { "table", TABLE },
2622 3a00da24 2006-12-16 deraadt { "tag", TAG },
2623 69fde657 2014-07-09 reyk { "tagged", TAGGED },
2624 3a00da24 2006-12-16 deraadt { "tcp", TCP },
2625 e5c598d0 2016-09-01 claudio { "tickets", TICKETS },
2626 3a00da24 2006-12-16 deraadt { "timeout", TIMEOUT },
2627 096ff28b 2014-12-12 reyk { "tls", TLS },
2628 30640247 2007-02-22 reyk { "to", TO },
2629 6d5340e6 2008-06-11 reyk { "transparent", TRANSPARENT },
2630 c3895d83 2009-08-07 reyk { "ttl", TTL },
2631 3565f018 2007-11-22 reyk { "url", URL },
2632 80347df3 2026-02-18 kirill { "v1", V1 },
2633 80347df3 2026-02-18 kirill { "v2", V2 },
2634 69fde657 2014-07-09 reyk { "value", VALUE },
2635 c0f9bf60 2019-03-04 benno { "websockets", WEBSOCKETS },
2636 ab90ef43 2007-11-23 reyk { "with", WITH }
2637 41042ecc 2006-12-16 reyk };
2638 41042ecc 2006-12-16 reyk const struct keywords *p;
2639 41042ecc 2006-12-16 reyk
2640 41042ecc 2006-12-16 reyk p = bsearch(s, keywords, sizeof(keywords)/sizeof(keywords[0]),
2641 41042ecc 2006-12-16 reyk sizeof(keywords[0]), kw_cmp);
2642 41042ecc 2006-12-16 reyk
2643 41042ecc 2006-12-16 reyk if (p)
2644 41042ecc 2006-12-16 reyk return (p->k_val);
2645 41042ecc 2006-12-16 reyk else
2646 41042ecc 2006-12-16 reyk return (STRING);
2647 41042ecc 2006-12-16 reyk }
2648 41042ecc 2006-12-16 reyk
2649 41042ecc 2006-12-16 reyk
2650 32a6aa4e 2018-06-11 denis #define START_EXPAND 1
2651 32a6aa4e 2018-06-11 denis #define DONE_EXPAND 2
2652 41042ecc 2006-12-16 reyk
2653 32a6aa4e 2018-06-11 denis static int expanding;
2654 32a6aa4e 2018-06-11 denis
2655 41042ecc 2006-12-16 reyk int
2656 32a6aa4e 2018-06-11 denis igetc(void)
2657 32a6aa4e 2018-06-11 denis {
2658 32a6aa4e 2018-06-11 denis int c;
2659 32a6aa4e 2018-06-11 denis
2660 32a6aa4e 2018-06-11 denis while (1) {
2661 32a6aa4e 2018-06-11 denis if (file->ungetpos > 0)
2662 32a6aa4e 2018-06-11 denis c = file->ungetbuf[--file->ungetpos];
2663 32a6aa4e 2018-06-11 denis else c = getc(file->stream);
2664 32a6aa4e 2018-06-11 denis
2665 32a6aa4e 2018-06-11 denis if (c == START_EXPAND)
2666 32a6aa4e 2018-06-11 denis expanding = 1;
2667 32a6aa4e 2018-06-11 denis else if (c == DONE_EXPAND)
2668 32a6aa4e 2018-06-11 denis expanding = 0;
2669 32a6aa4e 2018-06-11 denis else
2670 32a6aa4e 2018-06-11 denis break;
2671 32a6aa4e 2018-06-11 denis }
2672 32a6aa4e 2018-06-11 denis return (c);
2673 32a6aa4e 2018-06-11 denis }
2674 32a6aa4e 2018-06-11 denis
2675 32a6aa4e 2018-06-11 denis int
2676 19437691 2007-10-13 deraadt lgetc(int quotec)
2677 41042ecc 2006-12-16 reyk {
2678 19437691 2007-10-13 deraadt int c, next;
2679 41042ecc 2006-12-16 reyk
2680 19437691 2007-10-13 deraadt if (quotec) {
2681 32a6aa4e 2018-06-11 denis if ((c = igetc()) == EOF) {
2682 ab7af3ec 2007-11-19 reyk yyerror("reached end of file while parsing "
2683 ab7af3ec 2007-11-19 reyk "quoted string");
2684 107f759e 2008-02-26 mpf if (file == topfile || popfile() == EOF)
2685 19437691 2007-10-13 deraadt return (EOF);
2686 19437691 2007-10-13 deraadt return (quotec);
2687 19437691 2007-10-13 deraadt }
2688 b279fb39 2007-10-02 pyr return (c);
2689 b279fb39 2007-10-02 pyr }
2690 b279fb39 2007-10-02 pyr
2691 32a6aa4e 2018-06-11 denis while ((c = igetc()) == '\\') {
2692 32a6aa4e 2018-06-11 denis next = igetc();
2693 b279fb39 2007-10-02 pyr if (next != '\n') {
2694 41042ecc 2006-12-16 reyk c = next;
2695 41042ecc 2006-12-16 reyk break;
2696 41042ecc 2006-12-16 reyk }
2697 19437691 2007-10-13 deraadt yylval.lineno = file->lineno;
2698 19437691 2007-10-13 deraadt file->lineno++;
2699 41042ecc 2006-12-16 reyk }
2700 41042ecc 2006-12-16 reyk
2701 32a6aa4e 2018-06-11 denis if (c == EOF) {
2702 32a6aa4e 2018-06-11 denis /*
2703 32a6aa4e 2018-06-11 denis * Fake EOL when hit EOF for the first time. This gets line
2704 32a6aa4e 2018-06-11 denis * count right if last line in included file is syntactically
2705 32a6aa4e 2018-06-11 denis * invalid and has no newline.
2706 32a6aa4e 2018-06-11 denis */
2707 32a6aa4e 2018-06-11 denis if (file->eof_reached == 0) {
2708 32a6aa4e 2018-06-11 denis file->eof_reached = 1;
2709 32a6aa4e 2018-06-11 denis return ('\n');
2710 32a6aa4e 2018-06-11 denis }
2711 32a6aa4e 2018-06-11 denis while (c == EOF) {
2712 32a6aa4e 2018-06-11 denis if (file == topfile || popfile() == EOF)
2713 32a6aa4e 2018-06-11 denis return (EOF);
2714 32a6aa4e 2018-06-11 denis c = igetc();
2715 32a6aa4e 2018-06-11 denis }
2716 19437691 2007-10-13 deraadt }
2717 41042ecc 2006-12-16 reyk return (c);
2718 41042ecc 2006-12-16 reyk }
2719 41042ecc 2006-12-16 reyk
2720 32a6aa4e 2018-06-11 denis void
2721 41042ecc 2006-12-16 reyk lungetc(int c)
2722 41042ecc 2006-12-16 reyk {
2723 41042ecc 2006-12-16 reyk if (c == EOF)
2724 32a6aa4e 2018-06-11 denis return;
2725 32a6aa4e 2018-06-11 denis
2726 32a6aa4e 2018-06-11 denis if (file->ungetpos >= file->ungetsize) {
2727 32a6aa4e 2018-06-11 denis void *p = reallocarray(file->ungetbuf, file->ungetsize, 2);
2728 32a6aa4e 2018-06-11 denis if (p == NULL)
2729 5d394e24 2018-07-11 krw err(1, "%s", __func__);
2730 32a6aa4e 2018-06-11 denis file->ungetbuf = p;
2731 32a6aa4e 2018-06-11 denis file->ungetsize *= 2;
2732 41042ecc 2006-12-16 reyk }
2733 32a6aa4e 2018-06-11 denis file->ungetbuf[file->ungetpos++] = c;
2734 41042ecc 2006-12-16 reyk }
2735 41042ecc 2006-12-16 reyk
2736 41042ecc 2006-12-16 reyk int
2737 41042ecc 2006-12-16 reyk findeol(void)
2738 41042ecc 2006-12-16 reyk {
2739 41042ecc 2006-12-16 reyk int c;
2740 41042ecc 2006-12-16 reyk
2741 41042ecc 2006-12-16 reyk /* skip to either EOF or the first real EOL */
2742 41042ecc 2006-12-16 reyk while (1) {
2743 32a6aa4e 2018-06-11 denis c = lgetc(0);
2744 b279fb39 2007-10-02 pyr if (c == '\n') {
2745 19437691 2007-10-13 deraadt file->lineno++;
2746 41042ecc 2006-12-16 reyk break;
2747 41042ecc 2006-12-16 reyk }
2748 41042ecc 2006-12-16 reyk if (c == EOF)
2749 41042ecc 2006-12-16 reyk break;
2750 41042ecc 2006-12-16 reyk }
2751 41042ecc 2006-12-16 reyk return (ERROR);
2752 41042ecc 2006-12-16 reyk }
2753 41042ecc 2006-12-16 reyk
2754 41042ecc 2006-12-16 reyk int
2755 41042ecc 2006-12-16 reyk yylex(void)
2756 41042ecc 2006-12-16 reyk {
2757 93b6fda0 2021-10-15 naddy char buf[8096];
2758 93b6fda0 2021-10-15 naddy char *p, *val;
2759 19437691 2007-10-13 deraadt int quotec, next, c;
2760 41042ecc 2006-12-16 reyk int token;
2761 41042ecc 2006-12-16 reyk
2762 41042ecc 2006-12-16 reyk top:
2763 41042ecc 2006-12-16 reyk p = buf;
2764 7009c930 2007-11-12 mpf while ((c = lgetc(0)) == ' ' || c == '\t')
2765 41042ecc 2006-12-16 reyk ; /* nothing */
2766 41042ecc 2006-12-16 reyk
2767 19437691 2007-10-13 deraadt yylval.lineno = file->lineno;
2768 41042ecc 2006-12-16 reyk if (c == '#')
2769 e2121261 2007-10-11 deraadt while ((c = lgetc(0)) != '\n' && c != EOF)
2770 b279fb39 2007-10-02 pyr ; /* nothing */
2771 32a6aa4e 2018-06-11 denis if (c == '$' && !expanding) {
2772 41042ecc 2006-12-16 reyk while (1) {
2773 e2121261 2007-10-11 deraadt if ((c = lgetc(0)) == EOF)
2774 41042ecc 2006-12-16 reyk return (0);
2775 41042ecc 2006-12-16 reyk
2776 41042ecc 2006-12-16 reyk if (p + 1 >= buf + sizeof(buf) - 1) {
2777 41042ecc 2006-12-16 reyk yyerror("string too long");
2778 41042ecc 2006-12-16 reyk return (findeol());
2779 41042ecc 2006-12-16 reyk }
2780 41042ecc 2006-12-16 reyk if (isalnum(c) || c == '_') {
2781 9e79ee8c 2013-11-25 benno *p++ = c;
2782 41042ecc 2006-12-16 reyk continue;
2783 41042ecc 2006-12-16 reyk }
2784 41042ecc 2006-12-16 reyk *p = '\0';
2785 41042ecc 2006-12-16 reyk lungetc(c);
2786 41042ecc 2006-12-16 reyk break;
2787 41042ecc 2006-12-16 reyk }
2788 41042ecc 2006-12-16 reyk val = symget(buf);
2789 41042ecc 2006-12-16 reyk if (val == NULL) {
2790 41042ecc 2006-12-16 reyk yyerror("macro '%s' not defined", buf);
2791 41042ecc 2006-12-16 reyk return (findeol());
2792 41042ecc 2006-12-16 reyk }
2793 32a6aa4e 2018-06-11 denis p = val + strlen(val) - 1;
2794 32a6aa4e 2018-06-11 denis lungetc(DONE_EXPAND);
2795 32a6aa4e 2018-06-11 denis while (p >= val) {
2796 93b6fda0 2021-10-15 naddy lungetc((unsigned char)*p);
2797 32a6aa4e 2018-06-11 denis p--;
2798 32a6aa4e 2018-06-11 denis }
2799 32a6aa4e 2018-06-11 denis lungetc(START_EXPAND);
2800 41042ecc 2006-12-16 reyk goto top;
2801 41042ecc 2006-12-16 reyk }
2802 41042ecc 2006-12-16 reyk
2803 41042ecc 2006-12-16 reyk switch (c) {
2804 41042ecc 2006-12-16 reyk case '\'':
2805 41042ecc 2006-12-16 reyk case '"':
2806 19437691 2007-10-13 deraadt quotec = c;
2807 41042ecc 2006-12-16 reyk while (1) {
2808 19437691 2007-10-13 deraadt if ((c = lgetc(quotec)) == EOF)
2809 41042ecc 2006-12-16 reyk return (0);
2810 e2121261 2007-10-11 deraadt if (c == '\n') {
2811 19437691 2007-10-13 deraadt file->lineno++;
2812 e2121261 2007-10-11 deraadt continue;
2813 e2121261 2007-10-11 deraadt } else if (c == '\\') {
2814 19437691 2007-10-13 deraadt if ((next = lgetc(quotec)) == EOF)
2815 e2121261 2007-10-11 deraadt return (0);
2816 de4d4ac0 2018-11-01 sashan if (next == quotec || next == ' ' ||
2817 de4d4ac0 2018-11-01 sashan next == '\t')
2818 b279fb39 2007-10-02 pyr c = next;
2819 73573bfd 2010-08-03 henning else if (next == '\n') {
2820 73573bfd 2010-08-03 henning file->lineno++;
2821 65f89d3e 2007-10-16 deraadt continue;
2822 73573bfd 2010-08-03 henning } else
2823 b279fb39 2007-10-02 pyr lungetc(next);
2824 19437691 2007-10-13 deraadt } else if (c == quotec) {
2825 41042ecc 2006-12-16 reyk *p = '\0';
2826 41042ecc 2006-12-16 reyk break;
2827 60c86de5 2014-11-20 jsg } else if (c == '\0') {
2828 60c86de5 2014-11-20 jsg yyerror("syntax error");
2829 60c86de5 2014-11-20 jsg return (findeol());
2830 41042ecc 2006-12-16 reyk }
2831 41042ecc 2006-12-16 reyk if (p + 1 >= buf + sizeof(buf) - 1) {
2832 41042ecc 2006-12-16 reyk yyerror("string too long");
2833 41042ecc 2006-12-16 reyk return (findeol());
2834 41042ecc 2006-12-16 reyk }
2835 9e79ee8c 2013-11-25 benno *p++ = c;
2836 41042ecc 2006-12-16 reyk }
2837 41042ecc 2006-12-16 reyk yylval.v.string = strdup(buf);
2838 41042ecc 2006-12-16 reyk if (yylval.v.string == NULL)
2839 5d394e24 2018-07-11 krw err(1, "%s", __func__);
2840 41042ecc 2006-12-16 reyk return (STRING);
2841 41042ecc 2006-12-16 reyk }
2842 41042ecc 2006-12-16 reyk
2843 4c6cdd88 2007-10-01 pyr #define allowed_to_end_number(x) \
2844 b04472b9 2007-10-16 mpf (isspace(x) || x == ')' || x ==',' || x == '/' || x == '}' || x == '=')
2845 4c6cdd88 2007-10-01 pyr
2846 4c6cdd88 2007-10-01 pyr if (c == '-' || isdigit(c)) {
2847 4c6cdd88 2007-10-01 pyr do {
2848 4c6cdd88 2007-10-01 pyr *p++ = c;
2849 7e42cb61 2019-02-13 deraadt if ((size_t)(p-buf) >= sizeof(buf)) {
2850 4c6cdd88 2007-10-01 pyr yyerror("string too long");
2851 4c6cdd88 2007-10-01 pyr return (findeol());
2852 4c6cdd88 2007-10-01 pyr }
2853 e2121261 2007-10-11 deraadt } while ((c = lgetc(0)) != EOF && isdigit(c));
2854 4c6cdd88 2007-10-01 pyr lungetc(c);
2855 4c6cdd88 2007-10-01 pyr if (p == buf + 1 && buf[0] == '-')
2856 4c6cdd88 2007-10-01 pyr goto nodigits;
2857 4c6cdd88 2007-10-01 pyr if (c == EOF || allowed_to_end_number(c)) {
2858 4c6cdd88 2007-10-01 pyr const char *errstr = NULL;
2859 4c6cdd88 2007-10-01 pyr
2860 4c6cdd88 2007-10-01 pyr *p = '\0';
2861 e2121261 2007-10-11 deraadt yylval.v.number = strtonum(buf, LLONG_MIN,
2862 e2121261 2007-10-11 deraadt LLONG_MAX, &errstr);
2863 4c6cdd88 2007-10-01 pyr if (errstr) {
2864 c3d83b55 2007-10-02 pyr yyerror("\"%s\" invalid number: %s",
2865 c3d83b55 2007-10-02 pyr buf, errstr);
2866 4c6cdd88 2007-10-01 pyr return (findeol());
2867 4c6cdd88 2007-10-01 pyr }
2868 4c6cdd88 2007-10-01 pyr return (NUMBER);
2869 4c6cdd88 2007-10-01 pyr } else {
2870 4c6cdd88 2007-10-01 pyr nodigits:
2871 4c6cdd88 2007-10-01 pyr while (p > buf + 1)
2872 93b6fda0 2021-10-15 naddy lungetc((unsigned char)*--p);
2873 93b6fda0 2021-10-15 naddy c = (unsigned char)*--p;
2874 4c6cdd88 2007-10-01 pyr if (c == '-')
2875 4c6cdd88 2007-10-01 pyr return (c);
2876 4c6cdd88 2007-10-01 pyr }
2877 4c6cdd88 2007-10-01 pyr }
2878 4c6cdd88 2007-10-01 pyr
2879 41042ecc 2006-12-16 reyk #define allowed_in_string(x) \
2880 41042ecc 2006-12-16 reyk (isalnum(x) || (ispunct(x) && x != '(' && x != ')' && \
2881 d7758aba 2007-12-08 reyk x != '{' && x != '}' && x != '<' && x != '>' && \
2882 41042ecc 2006-12-16 reyk x != '!' && x != '=' && x != '#' && \
2883 39bc6125 2009-08-13 reyk x != ',' && x != '/'))
2884 41042ecc 2006-12-16 reyk
2885 41042ecc 2006-12-16 reyk if (isalnum(c) || c == ':' || c == '_') {
2886 41042ecc 2006-12-16 reyk do {
2887 41042ecc 2006-12-16 reyk *p++ = c;
2888 7e42cb61 2019-02-13 deraadt if ((size_t)(p-buf) >= sizeof(buf)) {
2889 41042ecc 2006-12-16 reyk yyerror("string too long");
2890 41042ecc 2006-12-16 reyk return (findeol());
2891 41042ecc 2006-12-16 reyk }
2892 e2121261 2007-10-11 deraadt } while ((c = lgetc(0)) != EOF && (allowed_in_string(c)));
2893 41042ecc 2006-12-16 reyk lungetc(c);
2894 41042ecc 2006-12-16 reyk *p = '\0';
2895 41042ecc 2006-12-16 reyk if ((token = lookup(buf)) == STRING)
2896 41042ecc 2006-12-16 reyk if ((yylval.v.string = strdup(buf)) == NULL)
2897 5d394e24 2018-07-11 krw err(1, "%s", __func__);
2898 41042ecc 2006-12-16 reyk return (token);
2899 41042ecc 2006-12-16 reyk }
2900 41042ecc 2006-12-16 reyk if (c == '\n') {
2901 19437691 2007-10-13 deraadt yylval.lineno = file->lineno;
2902 19437691 2007-10-13 deraadt file->lineno++;
2903 41042ecc 2006-12-16 reyk }
2904 41042ecc 2006-12-16 reyk if (c == EOF)
2905 41042ecc 2006-12-16 reyk return (0);
2906 41042ecc 2006-12-16 reyk return (c);
2907 41042ecc 2006-12-16 reyk }
2908 41042ecc 2006-12-16 reyk
2909 19437691 2007-10-13 deraadt int
2910 19437691 2007-10-13 deraadt check_file_secrecy(int fd, const char *fname)
2911 19437691 2007-10-13 deraadt {
2912 19437691 2007-10-13 deraadt struct stat st;
2913 19437691 2007-10-13 deraadt
2914 19437691 2007-10-13 deraadt if (fstat(fd, &st)) {
2915 6e48423b 2007-10-19 pyr log_warn("cannot stat %s", fname);
2916 19437691 2007-10-13 deraadt return (-1);
2917 19437691 2007-10-13 deraadt }
2918 19437691 2007-10-13 deraadt if (st.st_uid != 0 && st.st_uid != getuid()) {
2919 6e48423b 2007-10-19 pyr log_warnx("%s: owner not root or current user", fname);
2920 19437691 2007-10-13 deraadt return (-1);
2921 19437691 2007-10-13 deraadt }
2922 ea289352 2014-01-22 henning if (st.st_mode & (S_IWGRP | S_IXGRP | S_IRWXO)) {
2923 ea289352 2014-01-22 henning log_warnx("%s: group writable or world read/writable", fname);
2924 19437691 2007-10-13 deraadt return (-1);
2925 19437691 2007-10-13 deraadt }
2926 19437691 2007-10-13 deraadt return (0);
2927 19437691 2007-10-13 deraadt }
2928 19437691 2007-10-13 deraadt
2929 19437691 2007-10-13 deraadt struct file *
2930 19437691 2007-10-13 deraadt pushfile(const char *name, int secret)
2931 19437691 2007-10-13 deraadt {
2932 19437691 2007-10-13 deraadt struct file *nfile;
2933 19437691 2007-10-13 deraadt
2934 57c813c3 2009-03-31 tobias if ((nfile = calloc(1, sizeof(struct file))) == NULL) {
2935 5dde474a 2018-07-09 krw log_warn("%s", __func__);
2936 19437691 2007-10-13 deraadt return (NULL);
2937 0c6a49e6 2007-10-18 deraadt }
2938 57c813c3 2009-03-31 tobias if ((nfile->name = strdup(name)) == NULL) {
2939 5dde474a 2018-07-09 krw log_warn("%s", __func__);
2940 57c813c3 2009-03-31 tobias free(nfile);
2941 57c813c3 2009-03-31 tobias return (NULL);
2942 57c813c3 2009-03-31 tobias }
2943 19437691 2007-10-13 deraadt if ((nfile->stream = fopen(nfile->name, "r")) == NULL) {
2944 666bd316 2011-05-05 reyk log_warn("%s: %s", __func__, nfile->name);
2945 19437691 2007-10-13 deraadt free(nfile->name);
2946 19437691 2007-10-13 deraadt free(nfile);
2947 19437691 2007-10-13 deraadt return (NULL);
2948 19437691 2007-10-13 deraadt } else if (secret &&
2949 19437691 2007-10-13 deraadt check_file_secrecy(fileno(nfile->stream), nfile->name)) {
2950 19437691 2007-10-13 deraadt fclose(nfile->stream);
2951 19437691 2007-10-13 deraadt free(nfile->name);
2952 19437691 2007-10-13 deraadt free(nfile);
2953 19437691 2007-10-13 deraadt return (NULL);
2954 19437691 2007-10-13 deraadt }
2955 32a6aa4e 2018-06-11 denis nfile->lineno = TAILQ_EMPTY(&files) ? 1 : 0;
2956 32a6aa4e 2018-06-11 denis nfile->ungetsize = 16;
2957 32a6aa4e 2018-06-11 denis nfile->ungetbuf = malloc(nfile->ungetsize);
2958 32a6aa4e 2018-06-11 denis if (nfile->ungetbuf == NULL) {
2959 5dde474a 2018-07-09 krw log_warn("%s", __func__);
2960 32a6aa4e 2018-06-11 denis fclose(nfile->stream);
2961 32a6aa4e 2018-06-11 denis free(nfile->name);
2962 32a6aa4e 2018-06-11 denis free(nfile);
2963 32a6aa4e 2018-06-11 denis return (NULL);
2964 32a6aa4e 2018-06-11 denis }
2965 19437691 2007-10-13 deraadt TAILQ_INSERT_TAIL(&files, nfile, entry);
2966 19437691 2007-10-13 deraadt return (nfile);
2967 19437691 2007-10-13 deraadt }
2968 19437691 2007-10-13 deraadt
2969 19437691 2007-10-13 deraadt int
2970 19437691 2007-10-13 deraadt popfile(void)
2971 19437691 2007-10-13 deraadt {
2972 19437691 2007-10-13 deraadt struct file *prev;
2973 19437691 2007-10-13 deraadt
2974 107f759e 2008-02-26 mpf if ((prev = TAILQ_PREV(file, files, entry)) != NULL)
2975 19437691 2007-10-13 deraadt prev->errors += file->errors;
2976 107f759e 2008-02-26 mpf
2977 107f759e 2008-02-26 mpf TAILQ_REMOVE(&files, file, entry);
2978 107f759e 2008-02-26 mpf fclose(file->stream);
2979 107f759e 2008-02-26 mpf free(file->name);
2980 32a6aa4e 2018-06-11 denis free(file->ungetbuf);
2981 107f759e 2008-02-26 mpf free(file);
2982 107f759e 2008-02-26 mpf file = prev;
2983 107f759e 2008-02-26 mpf return (file ? 0 : EOF);
2984 19437691 2007-10-13 deraadt }
2985 19437691 2007-10-13 deraadt
2986 591e6ab5 2011-05-19 reyk int
2987 591e6ab5 2011-05-19 reyk parse_config(const char *filename, struct relayd *x_conf)
2988 41042ecc 2006-12-16 reyk {
2989 41042ecc 2006-12-16 reyk struct sym *sym, *next;
2990 591e6ab5 2011-05-19 reyk
2991 591e6ab5 2011-05-19 reyk conf = x_conf;
2992 591e6ab5 2011-05-19 reyk if (config_init(conf) == -1) {
2993 591e6ab5 2011-05-19 reyk log_warn("%s: cannot initialize configuration", __func__);
2994 591e6ab5 2011-05-19 reyk return (-1);
2995 591e6ab5 2011-05-19 reyk }
2996 591e6ab5 2011-05-19 reyk
2997 591e6ab5 2011-05-19 reyk errors = 0;
2998 591e6ab5 2011-05-19 reyk
2999 591e6ab5 2011-05-19 reyk if ((file = pushfile(filename, 0)) == NULL)
3000 591e6ab5 2011-05-19 reyk return (-1);
3001 591e6ab5 2011-05-19 reyk
3002 591e6ab5 2011-05-19 reyk topfile = file;
3003 591e6ab5 2011-05-19 reyk setservent(1);
3004 591e6ab5 2011-05-19 reyk
3005 591e6ab5 2011-05-19 reyk yyparse();
3006 591e6ab5 2011-05-19 reyk errors = file->errors;
3007 32a6aa4e 2018-06-11 denis while (popfile() != EOF)
3008 32a6aa4e 2018-06-11 denis ;
3009 591e6ab5 2011-05-19 reyk
3010 591e6ab5 2011-05-19 reyk endservent();
3011 591e6ab5 2011-05-19 reyk endprotoent();
3012 591e6ab5 2011-05-19 reyk
3013 591e6ab5 2011-05-19 reyk /* Free macros */
3014 3609036d 2017-01-05 krw TAILQ_FOREACH_SAFE(sym, &symhead, entry, next) {
3015 591e6ab5 2011-05-19 reyk if (!sym->persist) {
3016 591e6ab5 2011-05-19 reyk free(sym->nam);
3017 591e6ab5 2011-05-19 reyk free(sym->val);
3018 591e6ab5 2011-05-19 reyk TAILQ_REMOVE(&symhead, sym, entry);
3019 591e6ab5 2011-05-19 reyk free(sym);
3020 591e6ab5 2011-05-19 reyk }
3021 591e6ab5 2011-05-19 reyk }
3022 591e6ab5 2011-05-19 reyk
3023 591e6ab5 2011-05-19 reyk return (errors ? -1 : 0);
3024 591e6ab5 2011-05-19 reyk }
3025 591e6ab5 2011-05-19 reyk
3026 591e6ab5 2011-05-19 reyk int
3027 591e6ab5 2011-05-19 reyk load_config(const char *filename, struct relayd *x_conf)
3028 591e6ab5 2011-05-19 reyk {
3029 0f7a5e2e 2012-10-03 reyk struct sym *sym, *next;
3030 0f7a5e2e 2012-10-03 reyk struct table *nexttb;
3031 0f7a5e2e 2012-10-03 reyk struct host *h, *ph;
3032 0f7a5e2e 2012-10-03 reyk struct relay_table *rlt;
3033 41042ecc 2006-12-16 reyk
3034 591e6ab5 2011-05-19 reyk conf = x_conf;
3035 58fc320c 2016-09-02 reyk conf->sc_conf.flags = 0;
3036 12566ac9 2011-05-26 reyk
3037 591e6ab5 2011-05-19 reyk loadcfg = 1;
3038 d2114554 2007-11-14 pyr errors = 0;
3039 c8f9d8e3 2007-12-08 pyr last_host_id = last_table_id = last_rdr_id = last_proto_id =
3040 39bc6125 2009-08-13 reyk last_relay_id = last_rt_id = last_nr_id = 0;
3041 adfc8831 2007-05-31 pyr
3042 c8f9d8e3 2007-12-08 pyr rdr = NULL;
3043 d2114554 2007-11-14 pyr table = NULL;
3044 d2114554 2007-11-14 pyr rlay = NULL;
3045 d2114554 2007-11-14 pyr proto = NULL;
3046 39bc6125 2009-08-13 reyk router = NULL;
3047 d2114554 2007-11-14 pyr
3048 591e6ab5 2011-05-19 reyk if ((file = pushfile(filename, 0)) == NULL)
3049 591e6ab5 2011-05-19 reyk return (-1);
3050 30640247 2007-02-22 reyk
3051 0797e6bd 2008-02-27 mpf topfile = file;
3052 48c4b3ed 2007-01-08 reyk setservent(1);
3053 19437691 2007-10-13 deraadt
3054 41042ecc 2006-12-16 reyk yyparse();
3055 19437691 2007-10-13 deraadt errors = file->errors;
3056 32a6aa4e 2018-06-11 denis while (popfile() != EOF)
3057 32a6aa4e 2018-06-11 denis ;
3058 19437691 2007-10-13 deraadt
3059 48c4b3ed 2007-01-08 reyk endservent();
3060 d250825b 2009-04-24 reyk endprotoent();
3061 41042ecc 2006-12-16 reyk
3062 41042ecc 2006-12-16 reyk /* Free macros and check which have not been used. */
3063 41042ecc 2006-12-16 reyk for (sym = TAILQ_FIRST(&symhead); sym != NULL; sym = next) {
3064 19437691 2007-10-13 deraadt next = TAILQ_NEXT(sym, entry);
3065 58fc320c 2016-09-02 reyk if ((conf->sc_conf.opts & RELAYD_OPT_VERBOSE) && !sym->used)
3066 41042ecc 2006-12-16 reyk fprintf(stderr, "warning: macro '%s' not "
3067 41042ecc 2006-12-16 reyk "used\n", sym->nam);
3068 41042ecc 2006-12-16 reyk if (!sym->persist) {
3069 41042ecc 2006-12-16 reyk free(sym->nam);
3070 41042ecc 2006-12-16 reyk free(sym->val);
3071 19437691 2007-10-13 deraadt TAILQ_REMOVE(&symhead, sym, entry);
3072 41042ecc 2006-12-16 reyk free(sym);
3073 41042ecc 2006-12-16 reyk }
3074 41042ecc 2006-12-16 reyk }
3075 41042ecc 2006-12-16 reyk
3076 39bc6125 2009-08-13 reyk if (TAILQ_EMPTY(conf->sc_rdrs) &&
3077 39bc6125 2009-08-13 reyk TAILQ_EMPTY(conf->sc_relays) &&
3078 39bc6125 2009-08-13 reyk TAILQ_EMPTY(conf->sc_rts)) {
3079 39bc6125 2009-08-13 reyk log_warnx("no actions, nothing to do");
3080 41042ecc 2006-12-16 reyk errors++;
3081 41042ecc 2006-12-16 reyk }
3082 41042ecc 2006-12-16 reyk
3083 f8a7ea4c 2009-08-05 reyk /* Cleanup relay list to inherit */
3084 f8a7ea4c 2009-08-05 reyk while ((rlay = TAILQ_FIRST(&relays)) != NULL) {
3085 f8a7ea4c 2009-08-05 reyk TAILQ_REMOVE(&relays, rlay, rl_entry);
3086 0f7a5e2e 2012-10-03 reyk while ((rlt = TAILQ_FIRST(&rlay->rl_tables))) {
3087 0f7a5e2e 2012-10-03 reyk TAILQ_REMOVE(&rlay->rl_tables, rlt, rlt_entry);
3088 0f7a5e2e 2012-10-03 reyk free(rlt);
3089 0f7a5e2e 2012-10-03 reyk }
3090 f8a7ea4c 2009-08-05 reyk free(rlay);
3091 f8a7ea4c 2009-08-05 reyk }
3092 f8a7ea4c 2009-08-05 reyk
3093 58fc320c 2016-09-02 reyk if (timercmp(&conf->sc_conf.timeout, &conf->sc_conf.interval, >=)) {
3094 a24ab970 2007-01-08 reyk log_warnx("global timeout exceeds interval");
3095 a24ab970 2007-01-08 reyk errors++;
3096 a24ab970 2007-01-08 reyk }
3097 a24ab970 2007-01-08 reyk
3098 41042ecc 2006-12-16 reyk /* Verify that every table is used */
3099 23fba4ad 2008-01-31 reyk for (table = TAILQ_FIRST(conf->sc_tables); table != NULL;
3100 6f706db5 2007-05-27 reyk table = nexttb) {
3101 6f706db5 2007-05-27 reyk nexttb = TAILQ_NEXT(table, entry);
3102 87178699 2007-05-27 pyr if (table->conf.port == 0) {
3103 23fba4ad 2008-01-31 reyk TAILQ_REMOVE(conf->sc_tables, table, entry);
3104 6f706db5 2007-05-27 reyk while ((h = TAILQ_FIRST(&table->hosts)) != NULL) {
3105 6f706db5 2007-05-27 reyk TAILQ_REMOVE(&table->hosts, h, entry);
3106 6f706db5 2007-05-27 reyk free(h);
3107 6f706db5 2007-05-27 reyk }
3108 6f706db5 2007-05-27 reyk if (table->sendbuf != NULL)
3109 6f706db5 2007-05-27 reyk free(table->sendbuf);
3110 738b3cc9 2019-09-15 rob if (table->sendbinbuf != NULL)
3111 738b3cc9 2019-09-15 rob ibuf_free(table->sendbinbuf);
3112 6f706db5 2007-05-27 reyk free(table);
3113 6f706db5 2007-05-27 reyk continue;
3114 6f706db5 2007-05-27 reyk }
3115 17acabee 2008-07-19 reyk
3116 17acabee 2008-07-19 reyk TAILQ_FOREACH(h, &table->hosts, entry) {
3117 17acabee 2008-07-19 reyk if (h->conf.parentid) {
3118 17acabee 2008-07-19 reyk ph = host_find(conf, h->conf.parentid);
3119 17acabee 2008-07-19 reyk
3120 17acabee 2008-07-19 reyk /* Validate the parent id */
3121 17acabee 2008-07-19 reyk if (h->conf.id == h->conf.parentid ||
3122 17acabee 2008-07-19 reyk ph == NULL || ph->conf.parentid)
3123 17acabee 2008-07-19 reyk ph = NULL;
3124 17acabee 2008-07-19 reyk
3125 17acabee 2008-07-19 reyk if (ph == NULL) {
3126 17acabee 2008-07-19 reyk log_warnx("host parent id %d invalid",
3127 17acabee 2008-07-19 reyk h->conf.parentid);
3128 17acabee 2008-07-19 reyk errors++;
3129 17acabee 2008-07-19 reyk } else
3130 aebf7fd4 2008-07-19 reyk SLIST_INSERT_HEAD(&ph->children,
3131 17acabee 2008-07-19 reyk h, child);
3132 17acabee 2008-07-19 reyk }
3133 17acabee 2008-07-19 reyk }
3134 17acabee 2008-07-19 reyk
3135 87178699 2007-05-27 pyr if (!(table->conf.flags & F_USED)) {
3136 87178699 2007-05-27 pyr log_warnx("unused table: %s", table->conf.name);
3137 41042ecc 2006-12-16 reyk errors++;
3138 41042ecc 2006-12-16 reyk }
3139 58fc320c 2016-09-02 reyk if (timercmp(&table->conf.timeout,
3140 58fc320c 2016-09-02 reyk &conf->sc_conf.interval, >=)) {
3141 a24ab970 2007-01-08 reyk log_warnx("table timeout exceeds interval: %s",
3142 87178699 2007-05-27 pyr table->conf.name);
3143 a24ab970 2007-01-08 reyk errors++;
3144 a24ab970 2007-01-08 reyk }
3145 a24ab970 2007-01-08 reyk }
3146 41042ecc 2006-12-16 reyk
3147 30640247 2007-02-22 reyk /* Verify that every non-default protocol is used */
3148 23fba4ad 2008-01-31 reyk TAILQ_FOREACH(proto, conf->sc_protos, entry) {
3149 30640247 2007-02-22 reyk if (!(proto->flags & F_USED)) {
3150 30640247 2007-02-22 reyk log_warnx("unused protocol: %s", proto->name);
3151 30640247 2007-02-22 reyk }
3152 30640247 2007-02-22 reyk }
3153 30640247 2007-02-22 reyk
3154 591e6ab5 2011-05-19 reyk return (errors ? -1 : 0);
3155 41042ecc 2006-12-16 reyk }
3156 41042ecc 2006-12-16 reyk
3157 41042ecc 2006-12-16 reyk int
3158 41042ecc 2006-12-16 reyk symset(const char *nam, const char *val, int persist)
3159 41042ecc 2006-12-16 reyk {
3160 41042ecc 2006-12-16 reyk struct sym *sym;
3161 41042ecc 2006-12-16 reyk
3162 86936aaf 2017-01-05 krw TAILQ_FOREACH(sym, &symhead, entry) {
3163 86936aaf 2017-01-05 krw if (strcmp(nam, sym->nam) == 0)
3164 86936aaf 2017-01-05 krw break;
3165 86936aaf 2017-01-05 krw }
3166 41042ecc 2006-12-16 reyk
3167 41042ecc 2006-12-16 reyk if (sym != NULL) {
3168 41042ecc 2006-12-16 reyk if (sym->persist == 1)
3169 41042ecc 2006-12-16 reyk return (0);
3170 41042ecc 2006-12-16 reyk else {
3171 41042ecc 2006-12-16 reyk free(sym->nam);
3172 41042ecc 2006-12-16 reyk free(sym->val);
3173 19437691 2007-10-13 deraadt TAILQ_REMOVE(&symhead, sym, entry);
3174 41042ecc 2006-12-16 reyk free(sym);
3175 41042ecc 2006-12-16 reyk }
3176 41042ecc 2006-12-16 reyk }
3177 41042ecc 2006-12-16 reyk if ((sym = calloc(1, sizeof(*sym))) == NULL)
3178 41042ecc 2006-12-16 reyk return (-1);
3179 41042ecc 2006-12-16 reyk
3180 41042ecc 2006-12-16 reyk sym->nam = strdup(nam);
3181 41042ecc 2006-12-16 reyk if (sym->nam == NULL) {
3182 41042ecc 2006-12-16 reyk free(sym);
3183 41042ecc 2006-12-16 reyk return (-1);
3184 41042ecc 2006-12-16 reyk }
3185 41042ecc 2006-12-16 reyk sym->val = strdup(val);
3186 41042ecc 2006-12-16 reyk if (sym->val == NULL) {
3187 41042ecc 2006-12-16 reyk free(sym->nam);
3188 41042ecc 2006-12-16 reyk free(sym);
3189 41042ecc 2006-12-16 reyk return (-1);
3190 41042ecc 2006-12-16 reyk }
3191 41042ecc 2006-12-16 reyk sym->used = 0;
3192 41042ecc 2006-12-16 reyk sym->persist = persist;
3193 19437691 2007-10-13 deraadt TAILQ_INSERT_TAIL(&symhead, sym, entry);
3194 41042ecc 2006-12-16 reyk return (0);
3195 41042ecc 2006-12-16 reyk }
3196 41042ecc 2006-12-16 reyk
3197 41042ecc 2006-12-16 reyk int
3198 41042ecc 2006-12-16 reyk cmdline_symset(char *s)
3199 41042ecc 2006-12-16 reyk {
3200 41042ecc 2006-12-16 reyk char *sym, *val;
3201 41042ecc 2006-12-16 reyk int ret;
3202 41042ecc 2006-12-16 reyk
3203 41042ecc 2006-12-16 reyk if ((val = strrchr(s, '=')) == NULL)
3204 41042ecc 2006-12-16 reyk return (-1);
3205 40935c75 2018-09-07 miko sym = strndup(s, val - s);
3206 40935c75 2018-09-07 miko if (sym == NULL)
3207 40935c75 2018-09-07 miko errx(1, "%s: strndup", __func__);
3208 41042ecc 2006-12-16 reyk ret = symset(sym, val + 1, 1);
3209 41042ecc 2006-12-16 reyk free(sym);
3210 41042ecc 2006-12-16 reyk
3211 41042ecc 2006-12-16 reyk return (ret);
3212 41042ecc 2006-12-16 reyk }
3213 41042ecc 2006-12-16 reyk
3214 41042ecc 2006-12-16 reyk char *
3215 41042ecc 2006-12-16 reyk symget(const char *nam)
3216 41042ecc 2006-12-16 reyk {
3217 41042ecc 2006-12-16 reyk struct sym *sym;
3218 41042ecc 2006-12-16 reyk
3219 86936aaf 2017-01-05 krw TAILQ_FOREACH(sym, &symhead, entry) {
3220 41042ecc 2006-12-16 reyk if (strcmp(nam, sym->nam) == 0) {
3221 41042ecc 2006-12-16 reyk sym->used = 1;
3222 41042ecc 2006-12-16 reyk return (sym->val);
3223 41042ecc 2006-12-16 reyk }
3224 86936aaf 2017-01-05 krw }
3225 41042ecc 2006-12-16 reyk return (NULL);
3226 41042ecc 2006-12-16 reyk }
3227 41042ecc 2006-12-16 reyk
3228 41042ecc 2006-12-16 reyk struct address *
3229 ebf0f4ca 2018-10-22 denis host_ip(const char *s)
3230 41042ecc 2006-12-16 reyk {
3231 ebf0f4ca 2018-10-22 denis struct addrinfo hints, *res;
3232 ebf0f4ca 2018-10-22 denis struct address *h = NULL;
3233 41042ecc 2006-12-16 reyk
3234 ebf0f4ca 2018-10-22 denis memset(&hints, 0, sizeof(hints));
3235 ebf0f4ca 2018-10-22 denis hints.ai_family = AF_UNSPEC;
3236 ebf0f4ca 2018-10-22 denis hints.ai_socktype = SOCK_DGRAM; /*dummy*/
3237 dac86564 2008-07-17 reyk hints.ai_flags = AI_NUMERICHOST;
3238 dac86564 2008-07-17 reyk if (getaddrinfo(s, "0", &hints, &res) == 0) {
3239 ebf0f4ca 2018-10-22 denis if (res->ai_family == AF_INET ||
3240 ebf0f4ca 2018-10-22 denis res->ai_family == AF_INET6) {
3241 ebf0f4ca 2018-10-22 denis if ((h = calloc(1, sizeof(*h))) == NULL)
3242 ebf0f4ca 2018-10-22 denis fatal(NULL);
3243 ebf0f4ca 2018-10-22 denis memcpy(&h->ss, res->ai_addr, res->ai_addrlen);
3244 ebf0f4ca 2018-10-22 denis }
3245 dac86564 2008-07-17 reyk freeaddrinfo(res);
3246 dac86564 2008-07-17 reyk }
3247 41042ecc 2006-12-16 reyk
3248 41042ecc 2006-12-16 reyk return (h);
3249 41042ecc 2006-12-16 reyk }
3250 41042ecc 2006-12-16 reyk
3251 41042ecc 2006-12-16 reyk int
3252 41042ecc 2006-12-16 reyk host_dns(const char *s, struct addresslist *al, int max,
3253 d250825b 2009-04-24 reyk struct portrange *port, const char *ifname, int ipproto)
3254 41042ecc 2006-12-16 reyk {
3255 41042ecc 2006-12-16 reyk struct addrinfo hints, *res0, *res;
3256 41042ecc 2006-12-16 reyk int error, cnt = 0;
3257 41042ecc 2006-12-16 reyk struct address *h;
3258 41042ecc 2006-12-16 reyk
3259 b0d88a11 2009-08-27 reyk if ((cnt = host_if(s, al, max, port, ifname, ipproto)) != 0)
3260 b0d88a11 2009-08-27 reyk return (cnt);
3261 b0d88a11 2009-08-27 reyk
3262 41042ecc 2006-12-16 reyk bzero(&hints, sizeof(hints));
3263 ebf0f4ca 2018-10-22 denis hints.ai_family = AF_UNSPEC;
3264 41042ecc 2006-12-16 reyk hints.ai_socktype = SOCK_DGRAM; /* DUMMY */
3265 c55be08f 2015-02-08 reyk hints.ai_flags = AI_ADDRCONFIG;
3266 41042ecc 2006-12-16 reyk error = getaddrinfo(s, NULL, &hints, &res0);
3267 41042ecc 2006-12-16 reyk if (error == EAI_AGAIN || error == EAI_NODATA || error == EAI_NONAME)
3268 3a00da24 2006-12-16 deraadt return (0);
3269 41042ecc 2006-12-16 reyk if (error) {
3270 666bd316 2011-05-05 reyk log_warnx("%s: could not parse \"%s\": %s", __func__, s,
3271 41042ecc 2006-12-16 reyk gai_strerror(error));
3272 41042ecc 2006-12-16 reyk return (-1);
3273 41042ecc 2006-12-16 reyk }
3274 41042ecc 2006-12-16 reyk
3275 41042ecc 2006-12-16 reyk for (res = res0; res && cnt < max; res = res->ai_next) {
3276 41042ecc 2006-12-16 reyk if (res->ai_family != AF_INET &&
3277 41042ecc 2006-12-16 reyk res->ai_family != AF_INET6)
3278 41042ecc 2006-12-16 reyk continue;
3279 41042ecc 2006-12-16 reyk if ((h = calloc(1, sizeof(*h))) == NULL)
3280 9787a4f4 2015-11-22 reyk fatal(__func__);
3281 41042ecc 2006-12-16 reyk
3282 09913286 2008-09-29 reyk if (port != NULL)
3283 09913286 2008-09-29 reyk bcopy(port, &h->port, sizeof(h->port));
3284 41042ecc 2006-12-16 reyk if (ifname != NULL) {
3285 41042ecc 2006-12-16 reyk if (strlcpy(h->ifname, ifname, sizeof(h->ifname)) >=
3286 41042ecc 2006-12-16 reyk sizeof(h->ifname))
3287 666bd316 2011-05-05 reyk log_warnx("%s: interface name truncated",
3288 666bd316 2011-05-05 reyk __func__);
3289 33b0029d 2008-01-29 pyr freeaddrinfo(res0);
3290 591e6ab5 2011-05-19 reyk free(h);
3291 41042ecc 2006-12-16 reyk return (-1);
3292 41042ecc 2006-12-16 reyk }
3293 d250825b 2009-04-24 reyk if (ipproto != -1)
3294 d250825b 2009-04-24 reyk h->ipproto = ipproto;
3295 d250825b 2009-04-24 reyk
3296 ebf0f4ca 2018-10-22 denis memcpy(&h->ss, res->ai_addr, res->ai_addrlen);
3297 41042ecc 2006-12-16 reyk
3298 41042ecc 2006-12-16 reyk TAILQ_INSERT_HEAD(al, h, entry);
3299 41042ecc 2006-12-16 reyk cnt++;
3300 41042ecc 2006-12-16 reyk }
3301 41042ecc 2006-12-16 reyk if (cnt == max && res) {
3302 666bd316 2011-05-05 reyk log_warnx("%s: %s resolves to more than %d hosts", __func__,
3303 3a00da24 2006-12-16 deraadt s, max);
3304 41042ecc 2006-12-16 reyk }
3305 41042ecc 2006-12-16 reyk freeaddrinfo(res0);
3306 41042ecc 2006-12-16 reyk return (cnt);
3307 41042ecc 2006-12-16 reyk }
3308 41042ecc 2006-12-16 reyk
3309 41042ecc 2006-12-16 reyk int
3310 b0d88a11 2009-08-27 reyk host_if(const char *s, struct addresslist *al, int max,
3311 b0d88a11 2009-08-27 reyk struct portrange *port, const char *ifname, int ipproto)
3312 b0d88a11 2009-08-27 reyk {
3313 b0d88a11 2009-08-27 reyk struct ifaddrs *ifap, *p;
3314 b0d88a11 2009-08-27 reyk struct sockaddr_in *sain;
3315 b0d88a11 2009-08-27 reyk struct sockaddr_in6 *sin6;
3316 b0d88a11 2009-08-27 reyk struct address *h;
3317 b0d88a11 2009-08-27 reyk int cnt = 0, af;
3318 b0d88a11 2009-08-27 reyk
3319 b0d88a11 2009-08-27 reyk if (getifaddrs(&ifap) == -1)
3320 b0d88a11 2009-08-27 reyk fatal("getifaddrs");
3321 b0d88a11 2009-08-27 reyk
3322 b0d88a11 2009-08-27 reyk /* First search for IPv4 addresses */
3323 b0d88a11 2009-08-27 reyk af = AF_INET;
3324 b0d88a11 2009-08-27 reyk
3325 b0d88a11 2009-08-27 reyk nextaf:
3326 b0d88a11 2009-08-27 reyk for (p = ifap; p != NULL && cnt < max; p = p->ifa_next) {
3327 0d85c79e 2020-12-29 benno if (p->ifa_addr == NULL ||
3328 0d85c79e 2020-12-29 benno p->ifa_addr->sa_family != af ||
3329 bdd13866 2011-05-23 reyk (strcmp(s, p->ifa_name) != 0 &&
3330 bdd13866 2011-05-23 reyk !is_if_in_group(p->ifa_name, s)))
3331 b0d88a11 2009-08-27 reyk continue;
3332 b0d88a11 2009-08-27 reyk if ((h = calloc(1, sizeof(*h))) == NULL)
3333 b0d88a11 2009-08-27 reyk fatal("calloc");
3334 b0d88a11 2009-08-27 reyk
3335 b0d88a11 2009-08-27 reyk if (port != NULL)
3336 b0d88a11 2009-08-27 reyk bcopy(port, &h->port, sizeof(h->port));
3337 b0d88a11 2009-08-27 reyk if (ifname != NULL) {
3338 b0d88a11 2009-08-27 reyk if (strlcpy(h->ifname, ifname, sizeof(h->ifname)) >=
3339 b0d88a11 2009-08-27 reyk sizeof(h->ifname))
3340 666bd316 2011-05-05 reyk log_warnx("%s: interface name truncated",
3341 666bd316 2011-05-05 reyk __func__);
3342 b0d88a11 2009-08-27 reyk freeifaddrs(ifap);
3343 6480c6df 2021-01-17 rob free(h);
3344 b0d88a11 2009-08-27 reyk return (-1);
3345 b0d88a11 2009-08-27 reyk }
3346 b0d88a11 2009-08-27 reyk if (ipproto != -1)
3347 b0d88a11 2009-08-27 reyk h->ipproto = ipproto;
3348 b0d88a11 2009-08-27 reyk h->ss.ss_family = af;
3349 b0d88a11 2009-08-27 reyk
3350 b0d88a11 2009-08-27 reyk if (af == AF_INET) {
3351 b0d88a11 2009-08-27 reyk sain = (struct sockaddr_in *)&h->ss;
3352 b0d88a11 2009-08-27 reyk sain->sin_len = sizeof(struct sockaddr_in);
3353 b0d88a11 2009-08-27 reyk sain->sin_addr.s_addr = ((struct sockaddr_in *)
3354 b0d88a11 2009-08-27 reyk p->ifa_addr)->sin_addr.s_addr;
3355 b0d88a11 2009-08-27 reyk } else {
3356 b0d88a11 2009-08-27 reyk sin6 = (struct sockaddr_in6 *)&h->ss;
3357 b0d88a11 2009-08-27 reyk sin6->sin6_len = sizeof(struct sockaddr_in6);
3358 b0d88a11 2009-08-27 reyk memcpy(&sin6->sin6_addr, &((struct sockaddr_in6 *)
3359 b0d88a11 2009-08-27 reyk p->ifa_addr)->sin6_addr, sizeof(struct in6_addr));
3360 b0d88a11 2009-08-27 reyk sin6->sin6_scope_id = ((struct sockaddr_in6 *)
3361 b0d88a11 2009-08-27 reyk p->ifa_addr)->sin6_scope_id;
3362 b0d88a11 2009-08-27 reyk }
3363 b0d88a11 2009-08-27 reyk
3364 b0d88a11 2009-08-27 reyk TAILQ_INSERT_HEAD(al, h, entry);
3365 b0d88a11 2009-08-27 reyk cnt++;
3366 b0d88a11 2009-08-27 reyk }
3367 b0d88a11 2009-08-27 reyk if (af == AF_INET) {
3368 b0d88a11 2009-08-27 reyk /* Next search for IPv6 addresses */
3369 b0d88a11 2009-08-27 reyk af = AF_INET6;
3370 b0d88a11 2009-08-27 reyk goto nextaf;
3371 b0d88a11 2009-08-27 reyk }
3372 b0d88a11 2009-08-27 reyk
3373 b0d88a11 2009-08-27 reyk if (cnt > max) {
3374 666bd316 2011-05-05 reyk log_warnx("%s: %s resolves to more than %d hosts", __func__,
3375 b0d88a11 2009-08-27 reyk s, max);
3376 b0d88a11 2009-08-27 reyk }
3377 b0d88a11 2009-08-27 reyk freeifaddrs(ifap);
3378 b0d88a11 2009-08-27 reyk return (cnt);
3379 b0d88a11 2009-08-27 reyk }
3380 b0d88a11 2009-08-27 reyk
3381 b0d88a11 2009-08-27 reyk int
3382 41042ecc 2006-12-16 reyk host(const char *s, struct addresslist *al, int max,
3383 d250825b 2009-04-24 reyk struct portrange *port, const char *ifname, int ipproto)
3384 41042ecc 2006-12-16 reyk {
3385 ebf0f4ca 2018-10-22 denis struct address *h;
3386 4ab45c57 2006-12-16 reyk
3387 ebf0f4ca 2018-10-22 denis if ((h = host_ip(s)) == NULL)
3388 ebf0f4ca 2018-10-22 denis return (host_dns(s, al, max, port, ifname, ipproto));
3389 41042ecc 2006-12-16 reyk
3390 ebf0f4ca 2018-10-22 denis if (port != NULL)
3391 ebf0f4ca 2018-10-22 denis bcopy(port, &h->port, sizeof(h->port));
3392 ebf0f4ca 2018-10-22 denis if (ifname != NULL) {
3393 ebf0f4ca 2018-10-22 denis if (strlcpy(h->ifname, ifname, sizeof(h->ifname)) >=
3394 ebf0f4ca 2018-10-22 denis sizeof(h->ifname)) {
3395 ebf0f4ca 2018-10-22 denis log_warnx("%s: interface name truncated",
3396 ebf0f4ca 2018-10-22 denis __func__);
3397 ebf0f4ca 2018-10-22 denis free(h);
3398 ebf0f4ca 2018-10-22 denis return (-1);
3399 41042ecc 2006-12-16 reyk }
3400 41042ecc 2006-12-16 reyk }
3401 ebf0f4ca 2018-10-22 denis if (ipproto != -1)
3402 ebf0f4ca 2018-10-22 denis h->ipproto = ipproto;
3403 41042ecc 2006-12-16 reyk
3404 ebf0f4ca 2018-10-22 denis TAILQ_INSERT_HEAD(al, h, entry);
3405 ebf0f4ca 2018-10-22 denis return (1);
3406 41042ecc 2006-12-16 reyk }
3407 6f706db5 2007-05-27 reyk
3408 e9c39896 2026-05-17 kirill int
3409 e9c39896 2026-05-17 kirill host_ifaddr(struct sockaddr_storage *ss, struct ifaddrs *ifap)
3410 e9c39896 2026-05-17 kirill {
3411 e9c39896 2026-05-17 kirill struct ifaddrs *p;
3412 e9c39896 2026-05-17 kirill struct sockaddr_in *sin;
3413 e9c39896 2026-05-17 kirill struct sockaddr_in6 *sin6;
3414 e9c39896 2026-05-17 kirill
3415 e9c39896 2026-05-17 kirill switch (ss->ss_family) {
3416 e9c39896 2026-05-17 kirill case AF_INET:
3417 e9c39896 2026-05-17 kirill sin = (struct sockaddr_in *)ss;
3418 e9c39896 2026-05-17 kirill if (sin->sin_addr.s_addr == INADDR_ANY)
3419 e9c39896 2026-05-17 kirill return (1);
3420 e9c39896 2026-05-17 kirill break;
3421 e9c39896 2026-05-17 kirill case AF_INET6:
3422 e9c39896 2026-05-17 kirill sin6 = (struct sockaddr_in6 *)ss;
3423 e9c39896 2026-05-17 kirill if (IN6_IS_ADDR_UNSPECIFIED(&sin6->sin6_addr))
3424 e9c39896 2026-05-17 kirill return (1);
3425 e9c39896 2026-05-17 kirill break;
3426 e9c39896 2026-05-17 kirill default:
3427 e9c39896 2026-05-17 kirill return (0);
3428 e9c39896 2026-05-17 kirill }
3429 e9c39896 2026-05-17 kirill
3430 e9c39896 2026-05-17 kirill for (p = ifap; p != NULL; p = p->ifa_next) {
3431 e9c39896 2026-05-17 kirill if (p->ifa_addr == NULL ||
3432 e9c39896 2026-05-17 kirill p->ifa_addr->sa_family != ss->ss_family ||
3433 e9c39896 2026-05-17 kirill sockaddr_cmp((struct sockaddr *)ss, p->ifa_addr, -1) != 0)
3434 e9c39896 2026-05-17 kirill continue;
3435 e9c39896 2026-05-17 kirill bzero(ss, sizeof(*ss));
3436 e9c39896 2026-05-17 kirill memcpy(ss, p->ifa_addr, p->ifa_addr->sa_len);
3437 e9c39896 2026-05-17 kirill return (1);
3438 e9c39896 2026-05-17 kirill }
3439 e9c39896 2026-05-17 kirill
3440 e9c39896 2026-05-17 kirill return (0);
3441 e9c39896 2026-05-17 kirill }
3442 e9c39896 2026-05-17 kirill
3443 e9c39896 2026-05-17 kirill int
3444 e9c39896 2026-05-17 kirill host_local(struct addresslist *al)
3445 e9c39896 2026-05-17 kirill {
3446 e9c39896 2026-05-17 kirill struct ifaddrs *ifap;
3447 e9c39896 2026-05-17 kirill struct address *h, *next;
3448 e9c39896 2026-05-17 kirill int cnt = 0;
3449 e9c39896 2026-05-17 kirill
3450 e9c39896 2026-05-17 kirill if (getifaddrs(&ifap) == -1)
3451 e9c39896 2026-05-17 kirill fatal("getifaddrs");
3452 e9c39896 2026-05-17 kirill
3453 e9c39896 2026-05-17 kirill TAILQ_FOREACH_SAFE(h, al, entry, next) {
3454 e9c39896 2026-05-17 kirill if (host_ifaddr(&h->ss, ifap)) {
3455 e9c39896 2026-05-17 kirill cnt++;
3456 e9c39896 2026-05-17 kirill continue;
3457 e9c39896 2026-05-17 kirill }
3458 e9c39896 2026-05-17 kirill TAILQ_REMOVE(al, h, entry);
3459 e9c39896 2026-05-17 kirill free(h);
3460 e9c39896 2026-05-17 kirill }
3461 e9c39896 2026-05-17 kirill
3462 e9c39896 2026-05-17 kirill freeifaddrs(ifap);
3463 e9c39896 2026-05-17 kirill return (cnt);
3464 e9c39896 2026-05-17 kirill }
3465 e9c39896 2026-05-17 kirill
3466 591e6ab5 2011-05-19 reyk void
3467 591e6ab5 2011-05-19 reyk host_free(struct addresslist *al)
3468 591e6ab5 2011-05-19 reyk {
3469 591e6ab5 2011-05-19 reyk struct address *h;
3470 591e6ab5 2011-05-19 reyk
3471 591e6ab5 2011-05-19 reyk while ((h = TAILQ_FIRST(al)) != NULL) {
3472 591e6ab5 2011-05-19 reyk TAILQ_REMOVE(al, h, entry);
3473 591e6ab5 2011-05-19 reyk free(h);
3474 591e6ab5 2011-05-19 reyk }
3475 591e6ab5 2011-05-19 reyk }
3476 591e6ab5 2011-05-19 reyk
3477 6f706db5 2007-05-27 reyk struct table *
3478 d7758aba 2007-12-08 reyk table_inherit(struct table *tb)
3479 6f706db5 2007-05-27 reyk {
3480 6f706db5 2007-05-27 reyk char pname[TABLE_NAME_SIZE + 6];
3481 6f706db5 2007-05-27 reyk struct host *h, *dsth;
3482 d7758aba 2007-12-08 reyk struct table *dsttb, *oldtb;
3483 6f706db5 2007-05-27 reyk
3484 6f706db5 2007-05-27 reyk /* Get the table or table template */
3485 d7758aba 2007-12-08 reyk if ((dsttb = table_findbyname(conf, tb->conf.name)) == NULL) {
3486 d7758aba 2007-12-08 reyk yyerror("unknown table %s", tb->conf.name);
3487 591e6ab5 2011-05-19 reyk goto fail;
3488 6f706db5 2007-05-27 reyk }
3489 87178699 2007-05-27 pyr if (dsttb->conf.port != 0)
3490 d7758aba 2007-12-08 reyk fatal("invalid table"); /* should not happen */
3491 6f706db5 2007-05-27 reyk
3492 d7758aba 2007-12-08 reyk if (tb->conf.port == 0) {
3493 6f706db5 2007-05-27 reyk yyerror("invalid port");
3494 591e6ab5 2011-05-19 reyk goto fail;
3495 6f706db5 2007-05-27 reyk }
3496 6f706db5 2007-05-27 reyk
3497 6f706db5 2007-05-27 reyk /* Check if a matching table already exists */
3498 d7758aba 2007-12-08 reyk if (snprintf(pname, sizeof(pname), "%s:%u",
3499 d7758aba 2007-12-08 reyk tb->conf.name, ntohs(tb->conf.port)) >= (int)sizeof(pname)) {
3500 d7758aba 2007-12-08 reyk yyerror("invalid table name");
3501 591e6ab5 2011-05-19 reyk goto fail;
3502 6f706db5 2007-05-27 reyk }
3503 45c9097e 2014-04-20 reyk if (strlcpy(tb->conf.name, pname, sizeof(tb->conf.name)) >=
3504 45c9097e 2014-04-20 reyk sizeof(tb->conf.name)) {
3505 45c9097e 2014-04-20 reyk yyerror("invalid table mame");
3506 45c9097e 2014-04-20 reyk goto fail;
3507 45c9097e 2014-04-20 reyk }
3508 a8260bef 2010-08-07 claudio if ((oldtb = table_findbyconf(conf, tb)) != NULL) {
3509 2f479274 2015-05-02 claudio purge_table(conf, NULL, tb);
3510 d7758aba 2007-12-08 reyk return (oldtb);
3511 a8260bef 2010-08-07 claudio }
3512 6f706db5 2007-05-27 reyk
3513 6f706db5 2007-05-27 reyk /* Create a new table */
3514 9f4dba07 2008-07-17 reyk tb->conf.id = ++last_table_id;
3515 6f706db5 2007-05-27 reyk if (last_table_id == INT_MAX) {
3516 6f706db5 2007-05-27 reyk yyerror("too many tables defined");
3517 591e6ab5 2011-05-19 reyk goto fail;
3518 6f706db5 2007-05-27 reyk }
3519 d7758aba 2007-12-08 reyk tb->conf.flags |= dsttb->conf.flags;
3520 6f706db5 2007-05-27 reyk
3521 378c5758 2008-03-03 reyk /* Inherit global table options */
3522 b20ba866 2012-05-29 benno if (tb->conf.timeout.tv_sec == 0 && tb->conf.timeout.tv_usec == 0)
3523 b20ba866 2012-05-29 benno bcopy(&dsttb->conf.timeout, &tb->conf.timeout,
3524 b20ba866 2012-05-29 benno sizeof(struct timeval));
3525 378c5758 2008-03-03 reyk
3526 6f706db5 2007-05-27 reyk /* Copy the associated hosts */
3527 33a2ceaa 2008-07-17 reyk TAILQ_INIT(&tb->hosts);
3528 6f706db5 2007-05-27 reyk TAILQ_FOREACH(dsth, &dsttb->hosts, entry) {
3529 6f706db5 2007-05-27 reyk if ((h = (struct host *)
3530 6f706db5 2007-05-27 reyk calloc(1, sizeof (*h))) == NULL)
3531 6f706db5 2007-05-27 reyk fatal("out of memory");
3532 6f706db5 2007-05-27 reyk bcopy(dsth, h, sizeof(*h));
3533 9f4dba07 2008-07-17 reyk h->conf.id = ++last_host_id;
3534 6f706db5 2007-05-27 reyk if (last_host_id == INT_MAX) {
3535 6f706db5 2007-05-27 reyk yyerror("too many hosts defined");
3536 b941b259 2012-04-15 jsg free(h);
3537 591e6ab5 2011-05-19 reyk goto fail;
3538 6f706db5 2007-05-27 reyk }
3539 87178699 2007-05-27 pyr h->conf.tableid = tb->conf.id;
3540 87178699 2007-05-27 pyr h->tablename = tb->conf.name;
3541 aebf7fd4 2008-07-19 reyk SLIST_INIT(&h->children);
3542 33a2ceaa 2008-07-17 reyk TAILQ_INSERT_TAIL(&tb->hosts, h, entry);
3543 28bd28ce 2014-11-19 blambert TAILQ_INSERT_TAIL(&conf->sc_hosts, h, globalentry);
3544 6f706db5 2007-05-27 reyk }
3545 6f706db5 2007-05-27 reyk
3546 23fba4ad 2008-01-31 reyk conf->sc_tablecount++;
3547 c812a96d 2008-07-17 reyk TAILQ_INSERT_TAIL(conf->sc_tables, tb, entry);
3548 6f706db5 2007-05-27 reyk
3549 6f706db5 2007-05-27 reyk return (tb);
3550 591e6ab5 2011-05-19 reyk
3551 591e6ab5 2011-05-19 reyk fail:
3552 2f479274 2015-05-02 claudio purge_table(conf, NULL, tb);
3553 591e6ab5 2011-05-19 reyk return (NULL);
3554 6f706db5 2007-05-27 reyk }
3555 09913286 2008-09-29 reyk
3556 fae05986 2014-04-22 reyk int
3557 fae05986 2014-04-22 reyk relay_id(struct relay *rl)
3558 fae05986 2014-04-22 reyk {
3559 fae05986 2014-04-22 reyk rl->rl_conf.id = ++last_relay_id;
3560 fae05986 2014-04-22 reyk
3561 ce78c3f2 2017-11-27 claudio if (last_relay_id == INT_MAX)
3562 fae05986 2014-04-22 reyk return (-1);
3563 fae05986 2014-04-22 reyk
3564 fae05986 2014-04-22 reyk return (0);
3565 fae05986 2014-04-22 reyk }
3566 fae05986 2014-04-22 reyk
3567 f8a7ea4c 2009-08-05 reyk struct relay *
3568 f8a7ea4c 2009-08-05 reyk relay_inherit(struct relay *ra, struct relay *rb)
3569 f8a7ea4c 2009-08-05 reyk {
3570 f8a7ea4c 2009-08-05 reyk struct relay_config rc;
3571 e64b43be 2026-04-06 kirill struct keyname *name;
3572 0f7a5e2e 2012-10-03 reyk struct relay_table *rta, *rtb;
3573 f8a7ea4c 2009-08-05 reyk
3574 f8a7ea4c 2009-08-05 reyk bcopy(&rb->rl_conf, &rc, sizeof(rc));
3575 f8a7ea4c 2009-08-05 reyk bcopy(ra, rb, sizeof(*rb));
3576 f8a7ea4c 2009-08-05 reyk
3577 f8a7ea4c 2009-08-05 reyk bcopy(&rc.ss, &rb->rl_conf.ss, sizeof(rb->rl_conf.ss));
3578 f8a7ea4c 2009-08-05 reyk rb->rl_conf.port = rc.port;
3579 f8a7ea4c 2009-08-05 reyk rb->rl_conf.flags =
3580 096ff28b 2014-12-12 reyk (ra->rl_conf.flags & ~F_TLS) | (rc.flags & F_TLS);
3581 096ff28b 2014-12-12 reyk if (!(rb->rl_conf.flags & F_TLS)) {
3582 ce78c3f2 2017-11-27 claudio rb->rl_tls_cacert_fd = -1;
3583 ce78c3f2 2017-11-27 claudio rb->rl_tls_ca_fd = -1;
3584 c4efe747 2024-10-28 tb rb->rl_tls_client_ca_fd = -1;
3585 b4155b18 2014-01-21 benno }
3586 0f7a5e2e 2012-10-03 reyk TAILQ_INIT(&rb->rl_tables);
3587 f8a7ea4c 2009-08-05 reyk
3588 fae05986 2014-04-22 reyk if (relay_id(rb) == -1) {
3589 f8a7ea4c 2009-08-05 reyk yyerror("too many relays defined");
3590 f8a7ea4c 2009-08-05 reyk goto err;
3591 f8a7ea4c 2009-08-05 reyk }
3592 f8a7ea4c 2009-08-05 reyk
3593 f8a7ea4c 2009-08-05 reyk if (snprintf(rb->rl_conf.name, sizeof(rb->rl_conf.name), "%s%u:%u",
3594 f8a7ea4c 2009-08-05 reyk ra->rl_conf.name, rb->rl_conf.id, ntohs(rc.port)) >=
3595 f8a7ea4c 2009-08-05 reyk (int)sizeof(rb->rl_conf.name)) {
3596 f8a7ea4c 2009-08-05 reyk yyerror("invalid relay name");
3597 f8a7ea4c 2009-08-05 reyk goto err;
3598 f8a7ea4c 2009-08-05 reyk }
3599 f8a7ea4c 2009-08-05 reyk
3600 d070188d 2009-08-05 reyk if (relay_findbyname(conf, rb->rl_conf.name) != NULL ||
3601 d070188d 2009-08-05 reyk relay_findbyaddr(conf, &rb->rl_conf) != NULL) {
3602 3b232a62 2019-05-29 reyk yyerror("relay %s or listener defined twice",
3603 3b232a62 2019-05-29 reyk rb->rl_conf.name);
3604 f8a7ea4c 2009-08-05 reyk goto err;
3605 f8a7ea4c 2009-08-05 reyk }
3606 3b232a62 2019-05-29 reyk
3607 e64b43be 2026-04-06 kirill if (TAILQ_EMPTY(&rb->rl_proto->tlscerts) &&
3608 e64b43be 2026-04-06 kirill relay_load_certfiles(conf, rb, NULL) == -1) {
3609 f8a7ea4c 2009-08-05 reyk yyerror("cannot load certificates for relay %s",
3610 f8a7ea4c 2009-08-05 reyk rb->rl_conf.name);
3611 f8a7ea4c 2009-08-05 reyk goto err;
3612 f8a7ea4c 2009-08-05 reyk }
3613 e64b43be 2026-04-06 kirill TAILQ_FOREACH(name, &rb->rl_proto->tlscerts, entry) {
3614 36dd1e7a 2026-05-15 rsadowski if (relay_load_certfiles(conf, rb, name) == -1) {
3615 e64b43be 2026-04-06 kirill yyerror("cannot load keypair %s for relay %s",
3616 e64b43be 2026-04-06 kirill name->name, rb->rl_conf.name);
3617 e64b43be 2026-04-06 kirill goto err;
3618 e64b43be 2026-04-06 kirill }
3619 e64b43be 2026-04-06 kirill }
3620 f8a7ea4c 2009-08-05 reyk
3621 0f7a5e2e 2012-10-03 reyk TAILQ_FOREACH(rta, &ra->rl_tables, rlt_entry) {
3622 0f7a5e2e 2012-10-03 reyk if ((rtb = calloc(1, sizeof(*rtb))) == NULL) {
3623 0f7a5e2e 2012-10-03 reyk yyerror("cannot allocate relay table");
3624 0f7a5e2e 2012-10-03 reyk goto err;
3625 0f7a5e2e 2012-10-03 reyk }
3626 0f7a5e2e 2012-10-03 reyk rtb->rlt_table = rta->rlt_table;
3627 0f7a5e2e 2012-10-03 reyk rtb->rlt_mode = rta->rlt_mode;
3628 016b3271 2012-10-03 reyk rtb->rlt_flags = rta->rlt_flags;
3629 0f7a5e2e 2012-10-03 reyk
3630 0f7a5e2e 2012-10-03 reyk TAILQ_INSERT_TAIL(&rb->rl_tables, rtb, rlt_entry);
3631 0f7a5e2e 2012-10-03 reyk }
3632 0f7a5e2e 2012-10-03 reyk
3633 f8a7ea4c 2009-08-05 reyk conf->sc_relaycount++;
3634 f8a7ea4c 2009-08-05 reyk SPLAY_INIT(&rlay->rl_sessions);
3635 f8a7ea4c 2009-08-05 reyk TAILQ_INSERT_TAIL(conf->sc_relays, rb, rl_entry);
3636 f8a7ea4c 2009-08-05 reyk
3637 f8a7ea4c 2009-08-05 reyk return (rb);
3638 f8a7ea4c 2009-08-05 reyk
3639 f8a7ea4c 2009-08-05 reyk err:
3640 0f7a5e2e 2012-10-03 reyk while ((rtb = TAILQ_FIRST(&rb->rl_tables))) {
3641 0f7a5e2e 2012-10-03 reyk TAILQ_REMOVE(&rb->rl_tables, rtb, rlt_entry);
3642 0f7a5e2e 2012-10-03 reyk free(rtb);
3643 0f7a5e2e 2012-10-03 reyk }
3644 f8a7ea4c 2009-08-05 reyk free(rb);
3645 f8a7ea4c 2009-08-05 reyk return (NULL);
3646 f8a7ea4c 2009-08-05 reyk }
3647 f8a7ea4c 2009-08-05 reyk
3648 09913286 2008-09-29 reyk int
3649 09913286 2008-09-29 reyk getservice(char *n)
3650 09913286 2008-09-29 reyk {
3651 09913286 2008-09-29 reyk struct servent *s;
3652 09913286 2008-09-29 reyk const char *errstr;
3653 09913286 2008-09-29 reyk long long llval;
3654 09913286 2008-09-29 reyk
3655 09913286 2008-09-29 reyk llval = strtonum(n, 0, UINT16_MAX, &errstr);
3656 09913286 2008-09-29 reyk if (errstr) {
3657 09913286 2008-09-29 reyk s = getservbyname(n, "tcp");
3658 09913286 2008-09-29 reyk if (s == NULL)
3659 09913286 2008-09-29 reyk s = getservbyname(n, "udp");
3660 09913286 2008-09-29 reyk if (s == NULL) {
3661 09913286 2008-09-29 reyk yyerror("unknown port %s", n);
3662 09913286 2008-09-29 reyk return (-1);
3663 09913286 2008-09-29 reyk }
3664 09913286 2008-09-29 reyk return (s->s_port);
3665 09913286 2008-09-29 reyk }
3666 09913286 2008-09-29 reyk
3667 09913286 2008-09-29 reyk return (htons((u_short)llval));
3668 09913286 2008-09-29 reyk }
3669 bdd13866 2011-05-23 reyk
3670 bdd13866 2011-05-23 reyk int
3671 bdd13866 2011-05-23 reyk is_if_in_group(const char *ifname, const char *groupname)
3672 bdd13866 2011-05-23 reyk {
3673 3a75ae45 2012-10-04 reyk unsigned int len;
3674 3a75ae45 2012-10-04 reyk struct ifgroupreq ifgr;
3675 3a75ae45 2012-10-04 reyk struct ifg_req *ifg;
3676 bdd13866 2011-05-23 reyk int s;
3677 bdd13866 2011-05-23 reyk int ret = 0;
3678 bdd13866 2011-05-23 reyk
3679 e475725e 2019-06-28 deraadt if ((s = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
3680 bdd13866 2011-05-23 reyk err(1, "socket");
3681 bdd13866 2011-05-23 reyk
3682 3a75ae45 2012-10-04 reyk memset(&ifgr, 0, sizeof(ifgr));
3683 45c9097e 2014-04-20 reyk if (strlcpy(ifgr.ifgr_name, ifname, IFNAMSIZ) >= IFNAMSIZ)
3684 45c9097e 2014-04-20 reyk err(1, "IFNAMSIZ");
3685 3a75ae45 2012-10-04 reyk if (ioctl(s, SIOCGIFGROUP, (caddr_t)&ifgr) == -1) {
3686 3a75ae45 2012-10-04 reyk if (errno == EINVAL || errno == ENOTTY)
3687 bdd13866 2011-05-23 reyk goto end;
3688 bdd13866 2011-05-23 reyk err(1, "SIOCGIFGROUP");
3689 3a75ae45 2012-10-04 reyk }
3690 bdd13866 2011-05-23 reyk
3691 3a75ae45 2012-10-04 reyk len = ifgr.ifgr_len;
3692 39175b3a 2015-08-20 deraadt ifgr.ifgr_groups = calloc(len / sizeof(struct ifg_req),
3693 39175b3a 2015-08-20 deraadt sizeof(struct ifg_req));
3694 3a75ae45 2012-10-04 reyk if (ifgr.ifgr_groups == NULL)
3695 3a75ae45 2012-10-04 reyk err(1, "getifgroups");
3696 3a75ae45 2012-10-04 reyk if (ioctl(s, SIOCGIFGROUP, (caddr_t)&ifgr) == -1)
3697 3a75ae45 2012-10-04 reyk err(1, "SIOCGIFGROUP");
3698 bdd13866 2011-05-23 reyk
3699 3a75ae45 2012-10-04 reyk ifg = ifgr.ifgr_groups;
3700 3a75ae45 2012-10-04 reyk for (; ifg && len >= sizeof(struct ifg_req); ifg++) {
3701 3a75ae45 2012-10-04 reyk len -= sizeof(struct ifg_req);
3702 bdd13866 2011-05-23 reyk if (strcmp(ifg->ifgrq_group, groupname) == 0) {
3703 bdd13866 2011-05-23 reyk ret = 1;
3704 bdd13866 2011-05-23 reyk break;
3705 bdd13866 2011-05-23 reyk }
3706 3a75ae45 2012-10-04 reyk }
3707 3a75ae45 2012-10-04 reyk free(ifgr.ifgr_groups);
3708 bdd13866 2011-05-23 reyk
3709 bdd13866 2011-05-23 reyk end:
3710 bdd13866 2011-05-23 reyk close(s);
3711 bdd13866 2011-05-23 reyk return (ret);
3712 bdd13866 2011-05-23 reyk }
3713 36dd1e7a 2026-05-15 rsadowski
3714 36dd1e7a 2026-05-15 rsadowski struct keyname*
3715 36dd1e7a 2026-05-15 rsadowski proto_keyname(char *name)
3716 36dd1e7a 2026-05-15 rsadowski {
3717 36dd1e7a 2026-05-15 rsadowski struct keyname *kname = NULL, *key;
3718 36dd1e7a 2026-05-15 rsadowski
3719 36dd1e7a 2026-05-15 rsadowski if (strlen(name) >= PATH_MAX) {
3720 36dd1e7a 2026-05-15 rsadowski yyerror("keypair name too long");
3721 36dd1e7a 2026-05-15 rsadowski return NULL;
3722 36dd1e7a 2026-05-15 rsadowski }
3723 36dd1e7a 2026-05-15 rsadowski
3724 36dd1e7a 2026-05-15 rsadowski
3725 36dd1e7a 2026-05-15 rsadowski TAILQ_FOREACH(key, &proto->tlscerts, entry) {
3726 36dd1e7a 2026-05-15 rsadowski if (strcmp(key->name, name) == 0)
3727 36dd1e7a 2026-05-15 rsadowski return key;
3728 36dd1e7a 2026-05-15 rsadowski }
3729 36dd1e7a 2026-05-15 rsadowski
3730 36dd1e7a 2026-05-15 rsadowski if ((kname = calloc(1, sizeof(*kname))) == NULL) {
3731 36dd1e7a 2026-05-15 rsadowski return NULL;
3732 36dd1e7a 2026-05-15 rsadowski }
3733 36dd1e7a 2026-05-15 rsadowski
3734 36dd1e7a 2026-05-15 rsadowski if ((kname->name = strdup(name)) == NULL) {
3735 36dd1e7a 2026-05-15 rsadowski free(kname);
3736 36dd1e7a 2026-05-15 rsadowski return NULL;
3737 36dd1e7a 2026-05-15 rsadowski }
3738 36dd1e7a 2026-05-15 rsadowski TAILQ_INSERT_TAIL(&proto->tlscerts, kname, entry);
3739 36dd1e7a 2026-05-15 rsadowski return kname;
3740 36dd1e7a 2026-05-15 rsadowski }