xref: /freebsd/sbin/hastd/parse.y (revision b3e7694832e81d7a904a10f525f8797b753bf0d3)
132115b10SPawel Jakub Dawidek %{
232115b10SPawel Jakub Dawidek /*-
3*4d846d26SWarner Losh  * SPDX-License-Identifier: BSD-2-Clause
41de7b4b8SPedro F. Giffuni  *
532115b10SPawel Jakub Dawidek  * Copyright (c) 2009-2010 The FreeBSD Foundation
61fee97b0SPawel Jakub Dawidek  * Copyright (c) 2011 Pawel Jakub Dawidek <pawel@dawidek.net>
732115b10SPawel Jakub Dawidek  * All rights reserved.
832115b10SPawel Jakub Dawidek  *
932115b10SPawel Jakub Dawidek  * This software was developed by Pawel Jakub Dawidek under sponsorship from
1032115b10SPawel Jakub Dawidek  * the FreeBSD Foundation.
1132115b10SPawel Jakub Dawidek  *
1232115b10SPawel Jakub Dawidek  * Redistribution and use in source and binary forms, with or without
1332115b10SPawel Jakub Dawidek  * modification, are permitted provided that the following conditions
1432115b10SPawel Jakub Dawidek  * are met:
1532115b10SPawel Jakub Dawidek  * 1. Redistributions of source code must retain the above copyright
1632115b10SPawel Jakub Dawidek  *    notice, this list of conditions and the following disclaimer.
1732115b10SPawel Jakub Dawidek  * 2. Redistributions in binary form must reproduce the above copyright
1832115b10SPawel Jakub Dawidek  *    notice, this list of conditions and the following disclaimer in the
1932115b10SPawel Jakub Dawidek  *    documentation and/or other materials provided with the distribution.
2032115b10SPawel Jakub Dawidek  *
2132115b10SPawel Jakub Dawidek  * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
2232115b10SPawel Jakub Dawidek  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2332115b10SPawel Jakub Dawidek  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2432115b10SPawel Jakub Dawidek  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
2532115b10SPawel Jakub Dawidek  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2632115b10SPawel Jakub Dawidek  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2732115b10SPawel Jakub Dawidek  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2832115b10SPawel Jakub Dawidek  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2932115b10SPawel Jakub Dawidek  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
3032115b10SPawel Jakub Dawidek  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
3132115b10SPawel Jakub Dawidek  * SUCH DAMAGE.
3232115b10SPawel Jakub Dawidek  */
3332115b10SPawel Jakub Dawidek 
3432115b10SPawel Jakub Dawidek #include <sys/param.h>	/* MAXHOSTNAMELEN */
3532115b10SPawel Jakub Dawidek #include <sys/queue.h>
36d4cb6369SPawel Jakub Dawidek #include <sys/socket.h>
3732115b10SPawel Jakub Dawidek #include <sys/sysctl.h>
3832115b10SPawel Jakub Dawidek 
3932115b10SPawel Jakub Dawidek #include <arpa/inet.h>
4032115b10SPawel Jakub Dawidek 
4132115b10SPawel Jakub Dawidek #include <err.h>
42d4cb6369SPawel Jakub Dawidek #include <errno.h>
4332115b10SPawel Jakub Dawidek #include <stdio.h>
4432115b10SPawel Jakub Dawidek #include <string.h>
4532115b10SPawel Jakub Dawidek #include <sysexits.h>
4632115b10SPawel Jakub Dawidek #include <unistd.h>
4732115b10SPawel Jakub Dawidek 
48bbbb114cSPawel Jakub Dawidek #include <pjdlog.h>
49bbbb114cSPawel Jakub Dawidek 
5032115b10SPawel Jakub Dawidek #include "hast.h"
5132115b10SPawel Jakub Dawidek 
5232115b10SPawel Jakub Dawidek extern int depth;
5332115b10SPawel Jakub Dawidek extern int lineno;
5432115b10SPawel Jakub Dawidek 
5532115b10SPawel Jakub Dawidek extern FILE *yyin;
5632115b10SPawel Jakub Dawidek extern char *yytext;
5732115b10SPawel Jakub Dawidek 
58bbbb114cSPawel Jakub Dawidek static struct hastd_config *lconfig;
5932115b10SPawel Jakub Dawidek static struct hast_resource *curres;
6066db33a1SPawel Jakub Dawidek static bool mynode, hadmynode;
6132115b10SPawel Jakub Dawidek 
6232115b10SPawel Jakub Dawidek static char depth0_control[HAST_ADDRSIZE];
63bd738d63SPawel Jakub Dawidek static char depth0_pidfile[PATH_MAX];
64a87399baSPawel Jakub Dawidek static char depth0_listen_tcp4[HAST_ADDRSIZE];
65a87399baSPawel Jakub Dawidek static char depth0_listen_tcp6[HAST_ADDRSIZE];
66d4cb6369SPawel Jakub Dawidek static TAILQ_HEAD(, hastd_listen) depth0_listen;
6732115b10SPawel Jakub Dawidek static int depth0_replication;
681fee97b0SPawel Jakub Dawidek static int depth0_checksum;
698cd3d45aSPawel Jakub Dawidek static int depth0_compression;
705571414cSPawel Jakub Dawidek static int depth0_timeout;
710becad39SPawel Jakub Dawidek static char depth0_exec[PATH_MAX];
72518dd4c0SPawel Jakub Dawidek static int depth0_metaflush;
7332115b10SPawel Jakub Dawidek 
7432115b10SPawel Jakub Dawidek static char depth1_provname[PATH_MAX];
7532115b10SPawel Jakub Dawidek static char depth1_localpath[PATH_MAX];
76518dd4c0SPawel Jakub Dawidek static int depth1_metaflush;
7732115b10SPawel Jakub Dawidek 
78eb8b73d6SJung-uk Kim extern void yyerror(const char *);
79eb8b73d6SJung-uk Kim extern int yylex(void);
80bbbb114cSPawel Jakub Dawidek extern void yyrestart(FILE *);
81bbbb114cSPawel Jakub Dawidek 
825e2a209aSBaptiste Daroussin static int isitme(const char *name);
835e2a209aSBaptiste Daroussin static bool family_supported(int family);
845e2a209aSBaptiste Daroussin static int node_names(char **namesp);
8532115b10SPawel Jakub Dawidek %}
8632115b10SPawel Jakub Dawidek 
8777213228SPawel Jakub Dawidek %token CONTROL PIDFILE LISTEN REPLICATION CHECKSUM COMPRESSION METAFLUSH
88ba1fa0f1SPawel Jakub Dawidek %token TIMEOUT EXEC RESOURCE NAME LOCAL REMOTE SOURCE ON OFF
898cd3d45aSPawel Jakub Dawidek %token FULLSYNC MEMSYNC ASYNC NONE CRC32 SHA256 HOLE LZF
9032115b10SPawel Jakub Dawidek %token NUM STR OB CB
9132115b10SPawel Jakub Dawidek 
92b64a692bSPawel Jakub Dawidek %type <str> remote_str
9332115b10SPawel Jakub Dawidek %type <num> replication_type
941fee97b0SPawel Jakub Dawidek %type <num> checksum_type
958cd3d45aSPawel Jakub Dawidek %type <num> compression_type
96518dd4c0SPawel Jakub Dawidek %type <num> boolean
9732115b10SPawel Jakub Dawidek 
9832115b10SPawel Jakub Dawidek %union
9932115b10SPawel Jakub Dawidek {
10032115b10SPawel Jakub Dawidek 	int num;
10132115b10SPawel Jakub Dawidek 	char *str;
10232115b10SPawel Jakub Dawidek }
10332115b10SPawel Jakub Dawidek 
10432115b10SPawel Jakub Dawidek %token <num> NUM
10532115b10SPawel Jakub Dawidek %token <str> STR
10632115b10SPawel Jakub Dawidek 
10732115b10SPawel Jakub Dawidek %%
10832115b10SPawel Jakub Dawidek 
10932115b10SPawel Jakub Dawidek statements:
11032115b10SPawel Jakub Dawidek 	|
11132115b10SPawel Jakub Dawidek 	statements statement
11232115b10SPawel Jakub Dawidek 	;
11332115b10SPawel Jakub Dawidek 
11432115b10SPawel Jakub Dawidek statement:
11532115b10SPawel Jakub Dawidek 	control_statement
11632115b10SPawel Jakub Dawidek 	|
117bd738d63SPawel Jakub Dawidek 	pidfile_statement
118bd738d63SPawel Jakub Dawidek 	|
11932115b10SPawel Jakub Dawidek 	listen_statement
12032115b10SPawel Jakub Dawidek 	|
12132115b10SPawel Jakub Dawidek 	replication_statement
12232115b10SPawel Jakub Dawidek 	|
1231fee97b0SPawel Jakub Dawidek 	checksum_statement
1241fee97b0SPawel Jakub Dawidek 	|
1258cd3d45aSPawel Jakub Dawidek 	compression_statement
1268cd3d45aSPawel Jakub Dawidek 	|
1275571414cSPawel Jakub Dawidek 	timeout_statement
1285571414cSPawel Jakub Dawidek 	|
1290becad39SPawel Jakub Dawidek 	exec_statement
1300becad39SPawel Jakub Dawidek 	|
131518dd4c0SPawel Jakub Dawidek 	metaflush_statement
132518dd4c0SPawel Jakub Dawidek 	|
13332115b10SPawel Jakub Dawidek 	node_statement
13432115b10SPawel Jakub Dawidek 	|
13532115b10SPawel Jakub Dawidek 	resource_statement
13632115b10SPawel Jakub Dawidek 	;
13732115b10SPawel Jakub Dawidek 
13832115b10SPawel Jakub Dawidek control_statement:	CONTROL STR
13932115b10SPawel Jakub Dawidek 	{
14032115b10SPawel Jakub Dawidek 		switch (depth) {
14132115b10SPawel Jakub Dawidek 		case 0:
14232115b10SPawel Jakub Dawidek 			if (strlcpy(depth0_control, $2,
14332115b10SPawel Jakub Dawidek 			    sizeof(depth0_control)) >=
14432115b10SPawel Jakub Dawidek 			    sizeof(depth0_control)) {
145bbbb114cSPawel Jakub Dawidek 				pjdlog_error("control argument is too long.");
146584a9bc3SPawel Jakub Dawidek 				free($2);
147bbbb114cSPawel Jakub Dawidek 				return (1);
14832115b10SPawel Jakub Dawidek 			}
14932115b10SPawel Jakub Dawidek 			break;
15032115b10SPawel Jakub Dawidek 		case 1:
1513f828c18SPawel Jakub Dawidek 			if (!mynode)
1523f828c18SPawel Jakub Dawidek 				break;
153bbbb114cSPawel Jakub Dawidek 			if (strlcpy(lconfig->hc_controladdr, $2,
154bbbb114cSPawel Jakub Dawidek 			    sizeof(lconfig->hc_controladdr)) >=
155bbbb114cSPawel Jakub Dawidek 			    sizeof(lconfig->hc_controladdr)) {
156bbbb114cSPawel Jakub Dawidek 				pjdlog_error("control argument is too long.");
157584a9bc3SPawel Jakub Dawidek 				free($2);
158bbbb114cSPawel Jakub Dawidek 				return (1);
15932115b10SPawel Jakub Dawidek 			}
16032115b10SPawel Jakub Dawidek 			break;
16132115b10SPawel Jakub Dawidek 		default:
162571fdd7eSPawel Jakub Dawidek 			PJDLOG_ABORT("control at wrong depth level");
16332115b10SPawel Jakub Dawidek 		}
164584a9bc3SPawel Jakub Dawidek 		free($2);
16532115b10SPawel Jakub Dawidek 	}
16632115b10SPawel Jakub Dawidek 	;
16732115b10SPawel Jakub Dawidek 
168bd738d63SPawel Jakub Dawidek pidfile_statement:	PIDFILE STR
169bd738d63SPawel Jakub Dawidek 	{
170bd738d63SPawel Jakub Dawidek 		switch (depth) {
171bd738d63SPawel Jakub Dawidek 		case 0:
172bd738d63SPawel Jakub Dawidek 			if (strlcpy(depth0_pidfile, $2,
173bd738d63SPawel Jakub Dawidek 			    sizeof(depth0_pidfile)) >=
174bd738d63SPawel Jakub Dawidek 			    sizeof(depth0_pidfile)) {
175bd738d63SPawel Jakub Dawidek 				pjdlog_error("pidfile argument is too long.");
176bd738d63SPawel Jakub Dawidek 				free($2);
177bd738d63SPawel Jakub Dawidek 				return (1);
178bd738d63SPawel Jakub Dawidek 			}
179bd738d63SPawel Jakub Dawidek 			break;
180bd738d63SPawel Jakub Dawidek 		case 1:
181bd738d63SPawel Jakub Dawidek 			if (!mynode)
182bd738d63SPawel Jakub Dawidek 				break;
183bd738d63SPawel Jakub Dawidek 			if (strlcpy(lconfig->hc_pidfile, $2,
184bd738d63SPawel Jakub Dawidek 			    sizeof(lconfig->hc_pidfile)) >=
185bd738d63SPawel Jakub Dawidek 			    sizeof(lconfig->hc_pidfile)) {
186bd738d63SPawel Jakub Dawidek 				pjdlog_error("pidfile argument is too long.");
187bd738d63SPawel Jakub Dawidek 				free($2);
188bd738d63SPawel Jakub Dawidek 				return (1);
189bd738d63SPawel Jakub Dawidek 			}
190bd738d63SPawel Jakub Dawidek 			break;
191bd738d63SPawel Jakub Dawidek 		default:
192bd738d63SPawel Jakub Dawidek 			PJDLOG_ABORT("pidfile at wrong depth level");
193bd738d63SPawel Jakub Dawidek 		}
194bd738d63SPawel Jakub Dawidek 		free($2);
195bd738d63SPawel Jakub Dawidek 	}
196bd738d63SPawel Jakub Dawidek 	;
197bd738d63SPawel Jakub Dawidek 
19832115b10SPawel Jakub Dawidek listen_statement:	LISTEN STR
19932115b10SPawel Jakub Dawidek 	{
200d4cb6369SPawel Jakub Dawidek 		struct hastd_listen *lst;
201d4cb6369SPawel Jakub Dawidek 
202d4cb6369SPawel Jakub Dawidek 		lst = calloc(1, sizeof(*lst));
203d4cb6369SPawel Jakub Dawidek 		if (lst == NULL) {
204d4cb6369SPawel Jakub Dawidek 			pjdlog_error("Unable to allocate memory for listen address.");
205d4cb6369SPawel Jakub Dawidek 			free($2);
206d4cb6369SPawel Jakub Dawidek 			return (1);
207d4cb6369SPawel Jakub Dawidek 		}
208d4cb6369SPawel Jakub Dawidek 		if (strlcpy(lst->hl_addr, $2, sizeof(lst->hl_addr)) >=
209d4cb6369SPawel Jakub Dawidek 		    sizeof(lst->hl_addr)) {
210d4cb6369SPawel Jakub Dawidek 			pjdlog_error("listen argument is too long.");
211d4cb6369SPawel Jakub Dawidek 			free($2);
212d4cb6369SPawel Jakub Dawidek 			free(lst);
213d4cb6369SPawel Jakub Dawidek 			return (1);
214d4cb6369SPawel Jakub Dawidek 		}
21532115b10SPawel Jakub Dawidek 		switch (depth) {
21632115b10SPawel Jakub Dawidek 		case 0:
217d4cb6369SPawel Jakub Dawidek 			TAILQ_INSERT_TAIL(&depth0_listen, lst, hl_next);
21832115b10SPawel Jakub Dawidek 			break;
21932115b10SPawel Jakub Dawidek 		case 1:
220d4cb6369SPawel Jakub Dawidek 			if (mynode)
221d4cb6369SPawel Jakub Dawidek 				TAILQ_INSERT_TAIL(&depth0_listen, lst, hl_next);
222d4cb6369SPawel Jakub Dawidek 			else
223d4cb6369SPawel Jakub Dawidek 				free(lst);
22432115b10SPawel Jakub Dawidek 			break;
22532115b10SPawel Jakub Dawidek 		default:
226571fdd7eSPawel Jakub Dawidek 			PJDLOG_ABORT("listen at wrong depth level");
22732115b10SPawel Jakub Dawidek 		}
228584a9bc3SPawel Jakub Dawidek 		free($2);
22932115b10SPawel Jakub Dawidek 	}
23032115b10SPawel Jakub Dawidek 	;
23132115b10SPawel Jakub Dawidek 
23232115b10SPawel Jakub Dawidek replication_statement:	REPLICATION replication_type
23332115b10SPawel Jakub Dawidek 	{
23432115b10SPawel Jakub Dawidek 		switch (depth) {
23532115b10SPawel Jakub Dawidek 		case 0:
23632115b10SPawel Jakub Dawidek 			depth0_replication = $2;
23732115b10SPawel Jakub Dawidek 			break;
23832115b10SPawel Jakub Dawidek 		case 1:
2397f46e21dSPawel Jakub Dawidek 			PJDLOG_ASSERT(curres != NULL);
24032115b10SPawel Jakub Dawidek 			curres->hr_replication = $2;
241d6e636c9SPawel Jakub Dawidek 			curres->hr_original_replication = $2;
24232115b10SPawel Jakub Dawidek 			break;
24332115b10SPawel Jakub Dawidek 		default:
244571fdd7eSPawel Jakub Dawidek 			PJDLOG_ABORT("replication at wrong depth level");
24532115b10SPawel Jakub Dawidek 		}
24632115b10SPawel Jakub Dawidek 	}
24732115b10SPawel Jakub Dawidek 	;
24832115b10SPawel Jakub Dawidek 
24932115b10SPawel Jakub Dawidek replication_type:
25032115b10SPawel Jakub Dawidek 	FULLSYNC	{ $$ = HAST_REPLICATION_FULLSYNC; }
25132115b10SPawel Jakub Dawidek 	|
25232115b10SPawel Jakub Dawidek 	MEMSYNC		{ $$ = HAST_REPLICATION_MEMSYNC; }
25332115b10SPawel Jakub Dawidek 	|
25432115b10SPawel Jakub Dawidek 	ASYNC		{ $$ = HAST_REPLICATION_ASYNC; }
25532115b10SPawel Jakub Dawidek 	;
25632115b10SPawel Jakub Dawidek 
2571fee97b0SPawel Jakub Dawidek checksum_statement:	CHECKSUM checksum_type
2581fee97b0SPawel Jakub Dawidek 	{
2591fee97b0SPawel Jakub Dawidek 		switch (depth) {
2601fee97b0SPawel Jakub Dawidek 		case 0:
2611fee97b0SPawel Jakub Dawidek 			depth0_checksum = $2;
2621fee97b0SPawel Jakub Dawidek 			break;
2631fee97b0SPawel Jakub Dawidek 		case 1:
2647f46e21dSPawel Jakub Dawidek 			PJDLOG_ASSERT(curres != NULL);
2651fee97b0SPawel Jakub Dawidek 			curres->hr_checksum = $2;
2661fee97b0SPawel Jakub Dawidek 			break;
2671fee97b0SPawel Jakub Dawidek 		default:
268571fdd7eSPawel Jakub Dawidek 			PJDLOG_ABORT("checksum at wrong depth level");
2691fee97b0SPawel Jakub Dawidek 		}
2701fee97b0SPawel Jakub Dawidek 	}
2711fee97b0SPawel Jakub Dawidek 	;
2721fee97b0SPawel Jakub Dawidek 
2731fee97b0SPawel Jakub Dawidek checksum_type:
2741fee97b0SPawel Jakub Dawidek 	NONE		{ $$ = HAST_CHECKSUM_NONE; }
2751fee97b0SPawel Jakub Dawidek 	|
2761fee97b0SPawel Jakub Dawidek 	CRC32		{ $$ = HAST_CHECKSUM_CRC32; }
2771fee97b0SPawel Jakub Dawidek 	|
2781fee97b0SPawel Jakub Dawidek 	SHA256		{ $$ = HAST_CHECKSUM_SHA256; }
2791fee97b0SPawel Jakub Dawidek 	;
2801fee97b0SPawel Jakub Dawidek 
2818cd3d45aSPawel Jakub Dawidek compression_statement:	COMPRESSION compression_type
2828cd3d45aSPawel Jakub Dawidek 	{
2838cd3d45aSPawel Jakub Dawidek 		switch (depth) {
2848cd3d45aSPawel Jakub Dawidek 		case 0:
2858cd3d45aSPawel Jakub Dawidek 			depth0_compression = $2;
2868cd3d45aSPawel Jakub Dawidek 			break;
2878cd3d45aSPawel Jakub Dawidek 		case 1:
2887f46e21dSPawel Jakub Dawidek 			PJDLOG_ASSERT(curres != NULL);
2898cd3d45aSPawel Jakub Dawidek 			curres->hr_compression = $2;
2908cd3d45aSPawel Jakub Dawidek 			break;
2918cd3d45aSPawel Jakub Dawidek 		default:
292571fdd7eSPawel Jakub Dawidek 			PJDLOG_ABORT("compression at wrong depth level");
2938cd3d45aSPawel Jakub Dawidek 		}
2948cd3d45aSPawel Jakub Dawidek 	}
2958cd3d45aSPawel Jakub Dawidek 	;
2968cd3d45aSPawel Jakub Dawidek 
2978cd3d45aSPawel Jakub Dawidek compression_type:
2988cd3d45aSPawel Jakub Dawidek 	NONE		{ $$ = HAST_COMPRESSION_NONE; }
2998cd3d45aSPawel Jakub Dawidek 	|
3008cd3d45aSPawel Jakub Dawidek 	HOLE		{ $$ = HAST_COMPRESSION_HOLE; }
3018cd3d45aSPawel Jakub Dawidek 	|
3028cd3d45aSPawel Jakub Dawidek 	LZF		{ $$ = HAST_COMPRESSION_LZF; }
3038cd3d45aSPawel Jakub Dawidek 	;
3048cd3d45aSPawel Jakub Dawidek 
3055571414cSPawel Jakub Dawidek timeout_statement:	TIMEOUT NUM
3065571414cSPawel Jakub Dawidek 	{
30720f32a33SPawel Jakub Dawidek 		if ($2 <= 0) {
30820f32a33SPawel Jakub Dawidek 			pjdlog_error("Negative or zero timeout.");
30920f32a33SPawel Jakub Dawidek 			return (1);
31020f32a33SPawel Jakub Dawidek 		}
3115571414cSPawel Jakub Dawidek 		switch (depth) {
3125571414cSPawel Jakub Dawidek 		case 0:
3135571414cSPawel Jakub Dawidek 			depth0_timeout = $2;
3145571414cSPawel Jakub Dawidek 			break;
3155571414cSPawel Jakub Dawidek 		case 1:
3167f46e21dSPawel Jakub Dawidek 			PJDLOG_ASSERT(curres != NULL);
3175571414cSPawel Jakub Dawidek 			curres->hr_timeout = $2;
3185571414cSPawel Jakub Dawidek 			break;
3195571414cSPawel Jakub Dawidek 		default:
320571fdd7eSPawel Jakub Dawidek 			PJDLOG_ABORT("timeout at wrong depth level");
3215571414cSPawel Jakub Dawidek 		}
3225571414cSPawel Jakub Dawidek 	}
3235571414cSPawel Jakub Dawidek 	;
3245571414cSPawel Jakub Dawidek 
3250becad39SPawel Jakub Dawidek exec_statement:		EXEC STR
3260becad39SPawel Jakub Dawidek 	{
3270becad39SPawel Jakub Dawidek 		switch (depth) {
3280becad39SPawel Jakub Dawidek 		case 0:
3290becad39SPawel Jakub Dawidek 			if (strlcpy(depth0_exec, $2, sizeof(depth0_exec)) >=
3300becad39SPawel Jakub Dawidek 			    sizeof(depth0_exec)) {
3310becad39SPawel Jakub Dawidek 				pjdlog_error("Exec path is too long.");
332584a9bc3SPawel Jakub Dawidek 				free($2);
3330becad39SPawel Jakub Dawidek 				return (1);
3340becad39SPawel Jakub Dawidek 			}
3350becad39SPawel Jakub Dawidek 			break;
3360becad39SPawel Jakub Dawidek 		case 1:
3377f46e21dSPawel Jakub Dawidek 			PJDLOG_ASSERT(curres != NULL);
3380becad39SPawel Jakub Dawidek 			if (strlcpy(curres->hr_exec, $2,
3390becad39SPawel Jakub Dawidek 			    sizeof(curres->hr_exec)) >=
3400becad39SPawel Jakub Dawidek 			    sizeof(curres->hr_exec)) {
3410becad39SPawel Jakub Dawidek 				pjdlog_error("Exec path is too long.");
342584a9bc3SPawel Jakub Dawidek 				free($2);
3430becad39SPawel Jakub Dawidek 				return (1);
3440becad39SPawel Jakub Dawidek 			}
3450becad39SPawel Jakub Dawidek 			break;
3460becad39SPawel Jakub Dawidek 		default:
347571fdd7eSPawel Jakub Dawidek 			PJDLOG_ABORT("exec at wrong depth level");
3480becad39SPawel Jakub Dawidek 		}
349584a9bc3SPawel Jakub Dawidek 		free($2);
3500becad39SPawel Jakub Dawidek 	}
3510becad39SPawel Jakub Dawidek 	;
3520becad39SPawel Jakub Dawidek 
353518dd4c0SPawel Jakub Dawidek metaflush_statement:	METAFLUSH boolean
354518dd4c0SPawel Jakub Dawidek 	{
355518dd4c0SPawel Jakub Dawidek 		switch (depth) {
356518dd4c0SPawel Jakub Dawidek 		case 0:
357518dd4c0SPawel Jakub Dawidek 			depth0_metaflush = $2;
358518dd4c0SPawel Jakub Dawidek 			break;
359518dd4c0SPawel Jakub Dawidek 		case 1:
360518dd4c0SPawel Jakub Dawidek 			PJDLOG_ASSERT(curres != NULL);
361518dd4c0SPawel Jakub Dawidek 			depth1_metaflush = $2;
362518dd4c0SPawel Jakub Dawidek 			break;
363518dd4c0SPawel Jakub Dawidek 		case 2:
364518dd4c0SPawel Jakub Dawidek 			if (!mynode)
365518dd4c0SPawel Jakub Dawidek 				break;
366518dd4c0SPawel Jakub Dawidek 			PJDLOG_ASSERT(curres != NULL);
367518dd4c0SPawel Jakub Dawidek 			curres->hr_metaflush = $2;
368518dd4c0SPawel Jakub Dawidek 			break;
369518dd4c0SPawel Jakub Dawidek 		default:
370518dd4c0SPawel Jakub Dawidek 			PJDLOG_ABORT("metaflush at wrong depth level");
371518dd4c0SPawel Jakub Dawidek 		}
372518dd4c0SPawel Jakub Dawidek 	}
373518dd4c0SPawel Jakub Dawidek 	;
374518dd4c0SPawel Jakub Dawidek 
375518dd4c0SPawel Jakub Dawidek boolean:
376518dd4c0SPawel Jakub Dawidek 	ON		{ $$ = 1; }
377518dd4c0SPawel Jakub Dawidek 	|
378518dd4c0SPawel Jakub Dawidek 	OFF		{ $$ = 0; }
379518dd4c0SPawel Jakub Dawidek 	;
380518dd4c0SPawel Jakub Dawidek 
38132115b10SPawel Jakub Dawidek node_statement:		ON node_start OB node_entries CB
38232115b10SPawel Jakub Dawidek 	{
38332115b10SPawel Jakub Dawidek 		mynode = false;
38432115b10SPawel Jakub Dawidek 	}
38532115b10SPawel Jakub Dawidek 	;
38632115b10SPawel Jakub Dawidek 
38732115b10SPawel Jakub Dawidek node_start:	STR
38832115b10SPawel Jakub Dawidek 	{
389bbbb114cSPawel Jakub Dawidek 		switch (isitme($1)) {
390bbbb114cSPawel Jakub Dawidek 		case -1:
391584a9bc3SPawel Jakub Dawidek 			free($1);
392bbbb114cSPawel Jakub Dawidek 			return (1);
393bbbb114cSPawel Jakub Dawidek 		case 0:
394bbbb114cSPawel Jakub Dawidek 			break;
395bbbb114cSPawel Jakub Dawidek 		case 1:
39632115b10SPawel Jakub Dawidek 			mynode = true;
397bbbb114cSPawel Jakub Dawidek 			break;
398bbbb114cSPawel Jakub Dawidek 		default:
399571fdd7eSPawel Jakub Dawidek 			PJDLOG_ABORT("invalid isitme() return value");
400bbbb114cSPawel Jakub Dawidek 		}
401584a9bc3SPawel Jakub Dawidek 		free($1);
40232115b10SPawel Jakub Dawidek 	}
40332115b10SPawel Jakub Dawidek 	;
40432115b10SPawel Jakub Dawidek 
40532115b10SPawel Jakub Dawidek node_entries:
40632115b10SPawel Jakub Dawidek 	|
40732115b10SPawel Jakub Dawidek 	node_entries node_entry
40832115b10SPawel Jakub Dawidek 	;
40932115b10SPawel Jakub Dawidek 
41032115b10SPawel Jakub Dawidek node_entry:
41132115b10SPawel Jakub Dawidek 	control_statement
41232115b10SPawel Jakub Dawidek 	|
413bd738d63SPawel Jakub Dawidek 	pidfile_statement
414bd738d63SPawel Jakub Dawidek 	|
41532115b10SPawel Jakub Dawidek 	listen_statement
41632115b10SPawel Jakub Dawidek 	;
41732115b10SPawel Jakub Dawidek 
41832115b10SPawel Jakub Dawidek resource_statement:	RESOURCE resource_start OB resource_entries CB
41932115b10SPawel Jakub Dawidek 	{
42032115b10SPawel Jakub Dawidek 		if (curres != NULL) {
42132115b10SPawel Jakub Dawidek 			/*
42266db33a1SPawel Jakub Dawidek 			 * There must be section for this node, at least with
42366db33a1SPawel Jakub Dawidek 			 * remote address configuration.
42466db33a1SPawel Jakub Dawidek 			 */
42566db33a1SPawel Jakub Dawidek 			if (!hadmynode) {
42666db33a1SPawel Jakub Dawidek 				char *names;
42766db33a1SPawel Jakub Dawidek 
42866db33a1SPawel Jakub Dawidek 				if (node_names(&names) != 0)
42966db33a1SPawel Jakub Dawidek 					return (1);
43066db33a1SPawel Jakub Dawidek 				pjdlog_error("No resource %s configuration for this node (acceptable node names: %s).",
43166db33a1SPawel Jakub Dawidek 				    curres->hr_name, names);
43266db33a1SPawel Jakub Dawidek 				return (1);
43366db33a1SPawel Jakub Dawidek 			}
43466db33a1SPawel Jakub Dawidek 
43566db33a1SPawel Jakub Dawidek 			/*
4367f46e21dSPawel Jakub Dawidek 			 * Let's see if there are some resource-level settings
43732115b10SPawel Jakub Dawidek 			 * that we can use for node-level settings.
43832115b10SPawel Jakub Dawidek 			 */
43932115b10SPawel Jakub Dawidek 			if (curres->hr_provname[0] == '\0' &&
44032115b10SPawel Jakub Dawidek 			    depth1_provname[0] != '\0') {
44132115b10SPawel Jakub Dawidek 				/*
44232115b10SPawel Jakub Dawidek 				 * Provider name is not set at node-level,
44332115b10SPawel Jakub Dawidek 				 * but is set at resource-level, use it.
44432115b10SPawel Jakub Dawidek 				 */
44532115b10SPawel Jakub Dawidek 				strlcpy(curres->hr_provname, depth1_provname,
44632115b10SPawel Jakub Dawidek 				    sizeof(curres->hr_provname));
44732115b10SPawel Jakub Dawidek 			}
44832115b10SPawel Jakub Dawidek 			if (curres->hr_localpath[0] == '\0' &&
44932115b10SPawel Jakub Dawidek 			    depth1_localpath[0] != '\0') {
45032115b10SPawel Jakub Dawidek 				/*
45132115b10SPawel Jakub Dawidek 				 * Path to local provider is not set at
45232115b10SPawel Jakub Dawidek 				 * node-level, but is set at resource-level,
45332115b10SPawel Jakub Dawidek 				 * use it.
45432115b10SPawel Jakub Dawidek 				 */
45532115b10SPawel Jakub Dawidek 				strlcpy(curres->hr_localpath, depth1_localpath,
45632115b10SPawel Jakub Dawidek 				    sizeof(curres->hr_localpath));
45732115b10SPawel Jakub Dawidek 			}
458518dd4c0SPawel Jakub Dawidek 			if (curres->hr_metaflush == -1 && depth1_metaflush != -1) {
459518dd4c0SPawel Jakub Dawidek 				/*
460518dd4c0SPawel Jakub Dawidek 				 * Metaflush is not set at node-level,
461518dd4c0SPawel Jakub Dawidek 				 * but is set at resource-level, use it.
462518dd4c0SPawel Jakub Dawidek 				 */
463518dd4c0SPawel Jakub Dawidek 				curres->hr_metaflush = depth1_metaflush;
464518dd4c0SPawel Jakub Dawidek 			}
46532115b10SPawel Jakub Dawidek 
46632115b10SPawel Jakub Dawidek 			/*
46732115b10SPawel Jakub Dawidek 			 * If provider name is not given, use resource name
46832115b10SPawel Jakub Dawidek 			 * as provider name.
46932115b10SPawel Jakub Dawidek 			 */
47032115b10SPawel Jakub Dawidek 			if (curres->hr_provname[0] == '\0') {
47132115b10SPawel Jakub Dawidek 				strlcpy(curres->hr_provname, curres->hr_name,
47232115b10SPawel Jakub Dawidek 				    sizeof(curres->hr_provname));
47332115b10SPawel Jakub Dawidek 			}
47432115b10SPawel Jakub Dawidek 
47532115b10SPawel Jakub Dawidek 			/*
47632115b10SPawel Jakub Dawidek 			 * Remote address has to be configured at this point.
47732115b10SPawel Jakub Dawidek 			 */
47832115b10SPawel Jakub Dawidek 			if (curres->hr_remoteaddr[0] == '\0') {
479bbbb114cSPawel Jakub Dawidek 				pjdlog_error("Remote address not configured for resource %s.",
48032115b10SPawel Jakub Dawidek 				    curres->hr_name);
481bbbb114cSPawel Jakub Dawidek 				return (1);
48232115b10SPawel Jakub Dawidek 			}
48332115b10SPawel Jakub Dawidek 			/*
48432115b10SPawel Jakub Dawidek 			 * Path to local provider has to be configured at this
48532115b10SPawel Jakub Dawidek 			 * point.
48632115b10SPawel Jakub Dawidek 			 */
48732115b10SPawel Jakub Dawidek 			if (curres->hr_localpath[0] == '\0') {
488bbbb114cSPawel Jakub Dawidek 				pjdlog_error("Path to local component not configured for resource %s.",
48932115b10SPawel Jakub Dawidek 				    curres->hr_name);
490bbbb114cSPawel Jakub Dawidek 				return (1);
49132115b10SPawel Jakub Dawidek 			}
49232115b10SPawel Jakub Dawidek 
49332115b10SPawel Jakub Dawidek 			/* Put it onto resource list. */
494bbbb114cSPawel Jakub Dawidek 			TAILQ_INSERT_TAIL(&lconfig->hc_resources, curres, hr_next);
49532115b10SPawel Jakub Dawidek 			curres = NULL;
49632115b10SPawel Jakub Dawidek 		}
49732115b10SPawel Jakub Dawidek 	}
49832115b10SPawel Jakub Dawidek 	;
49932115b10SPawel Jakub Dawidek 
50032115b10SPawel Jakub Dawidek resource_start:	STR
50132115b10SPawel Jakub Dawidek 	{
502a7130d73SPawel Jakub Dawidek 		/* Check if there is no duplicate entry. */
503a7130d73SPawel Jakub Dawidek 		TAILQ_FOREACH(curres, &lconfig->hc_resources, hr_next) {
504a7130d73SPawel Jakub Dawidek 			if (strcmp(curres->hr_name, $1) == 0) {
505a7130d73SPawel Jakub Dawidek 				pjdlog_error("Resource %s configured more than once.",
506a7130d73SPawel Jakub Dawidek 				    curres->hr_name);
507a7130d73SPawel Jakub Dawidek 				free($1);
508a7130d73SPawel Jakub Dawidek 				return (1);
509a7130d73SPawel Jakub Dawidek 			}
510a7130d73SPawel Jakub Dawidek 		}
511a7130d73SPawel Jakub Dawidek 
51232115b10SPawel Jakub Dawidek 		/*
51332115b10SPawel Jakub Dawidek 		 * Clear those, so we can tell if they were set at
51432115b10SPawel Jakub Dawidek 		 * resource-level or not.
51532115b10SPawel Jakub Dawidek 		 */
51632115b10SPawel Jakub Dawidek 		depth1_provname[0] = '\0';
51732115b10SPawel Jakub Dawidek 		depth1_localpath[0] = '\0';
518518dd4c0SPawel Jakub Dawidek 		depth1_metaflush = -1;
51966db33a1SPawel Jakub Dawidek 		hadmynode = false;
52032115b10SPawel Jakub Dawidek 
52132115b10SPawel Jakub Dawidek 		curres = calloc(1, sizeof(*curres));
52232115b10SPawel Jakub Dawidek 		if (curres == NULL) {
523bbbb114cSPawel Jakub Dawidek 			pjdlog_error("Unable to allocate memory for resource.");
524584a9bc3SPawel Jakub Dawidek 			free($1);
525bbbb114cSPawel Jakub Dawidek 			return (1);
52632115b10SPawel Jakub Dawidek 		}
52732115b10SPawel Jakub Dawidek 		if (strlcpy(curres->hr_name, $1,
52832115b10SPawel Jakub Dawidek 		    sizeof(curres->hr_name)) >=
52932115b10SPawel Jakub Dawidek 		    sizeof(curres->hr_name)) {
530bbbb114cSPawel Jakub Dawidek 			pjdlog_error("Resource name is too long.");
5312ce9c023SPawel Jakub Dawidek 			free(curres);
532584a9bc3SPawel Jakub Dawidek 			free($1);
533bbbb114cSPawel Jakub Dawidek 			return (1);
53432115b10SPawel Jakub Dawidek 		}
535584a9bc3SPawel Jakub Dawidek 		free($1);
53632115b10SPawel Jakub Dawidek 		curres->hr_role = HAST_ROLE_INIT;
53732115b10SPawel Jakub Dawidek 		curres->hr_previous_role = HAST_ROLE_INIT;
53832115b10SPawel Jakub Dawidek 		curres->hr_replication = -1;
539d6e636c9SPawel Jakub Dawidek 		curres->hr_original_replication = -1;
5401fee97b0SPawel Jakub Dawidek 		curres->hr_checksum = -1;
5418cd3d45aSPawel Jakub Dawidek 		curres->hr_compression = -1;
542d6e636c9SPawel Jakub Dawidek 		curres->hr_version = 1;
5435571414cSPawel Jakub Dawidek 		curres->hr_timeout = -1;
5440becad39SPawel Jakub Dawidek 		curres->hr_exec[0] = '\0';
54532115b10SPawel Jakub Dawidek 		curres->hr_provname[0] = '\0';
54632115b10SPawel Jakub Dawidek 		curres->hr_localpath[0] = '\0';
54732115b10SPawel Jakub Dawidek 		curres->hr_localfd = -1;
54812daf727SPawel Jakub Dawidek 		curres->hr_localflush = true;
549518dd4c0SPawel Jakub Dawidek 		curres->hr_metaflush = -1;
55032115b10SPawel Jakub Dawidek 		curres->hr_remoteaddr[0] = '\0';
5510b626a28SPawel Jakub Dawidek 		curres->hr_sourceaddr[0] = '\0';
55232115b10SPawel Jakub Dawidek 		curres->hr_ggateunit = -1;
55332115b10SPawel Jakub Dawidek 	}
55432115b10SPawel Jakub Dawidek 	;
55532115b10SPawel Jakub Dawidek 
55632115b10SPawel Jakub Dawidek resource_entries:
55732115b10SPawel Jakub Dawidek 	|
55832115b10SPawel Jakub Dawidek 	resource_entries resource_entry
55932115b10SPawel Jakub Dawidek 	;
56032115b10SPawel Jakub Dawidek 
56132115b10SPawel Jakub Dawidek resource_entry:
56232115b10SPawel Jakub Dawidek 	replication_statement
56332115b10SPawel Jakub Dawidek 	|
5641fee97b0SPawel Jakub Dawidek 	checksum_statement
5651fee97b0SPawel Jakub Dawidek 	|
5668cd3d45aSPawel Jakub Dawidek 	compression_statement
5678cd3d45aSPawel Jakub Dawidek 	|
5685571414cSPawel Jakub Dawidek 	timeout_statement
5695571414cSPawel Jakub Dawidek 	|
5700becad39SPawel Jakub Dawidek 	exec_statement
5710becad39SPawel Jakub Dawidek 	|
572518dd4c0SPawel Jakub Dawidek 	metaflush_statement
573518dd4c0SPawel Jakub Dawidek 	|
57432115b10SPawel Jakub Dawidek 	name_statement
57532115b10SPawel Jakub Dawidek 	|
57632115b10SPawel Jakub Dawidek 	local_statement
57732115b10SPawel Jakub Dawidek 	|
57832115b10SPawel Jakub Dawidek 	resource_node_statement
57932115b10SPawel Jakub Dawidek 	;
58032115b10SPawel Jakub Dawidek 
58132115b10SPawel Jakub Dawidek name_statement:		NAME STR
58232115b10SPawel Jakub Dawidek 	{
58332115b10SPawel Jakub Dawidek 		switch (depth) {
58432115b10SPawel Jakub Dawidek 		case 1:
58532115b10SPawel Jakub Dawidek 			if (strlcpy(depth1_provname, $2,
58632115b10SPawel Jakub Dawidek 			    sizeof(depth1_provname)) >=
58732115b10SPawel Jakub Dawidek 			    sizeof(depth1_provname)) {
588bbbb114cSPawel Jakub Dawidek 				pjdlog_error("name argument is too long.");
589584a9bc3SPawel Jakub Dawidek 				free($2);
590bbbb114cSPawel Jakub Dawidek 				return (1);
59132115b10SPawel Jakub Dawidek 			}
59232115b10SPawel Jakub Dawidek 			break;
59332115b10SPawel Jakub Dawidek 		case 2:
5943f828c18SPawel Jakub Dawidek 			if (!mynode)
5953f828c18SPawel Jakub Dawidek 				break;
596571fdd7eSPawel Jakub Dawidek 			PJDLOG_ASSERT(curres != NULL);
59732115b10SPawel Jakub Dawidek 			if (strlcpy(curres->hr_provname, $2,
59832115b10SPawel Jakub Dawidek 			    sizeof(curres->hr_provname)) >=
59932115b10SPawel Jakub Dawidek 			    sizeof(curres->hr_provname)) {
600bbbb114cSPawel Jakub Dawidek 				pjdlog_error("name argument is too long.");
601584a9bc3SPawel Jakub Dawidek 				free($2);
602bbbb114cSPawel Jakub Dawidek 				return (1);
60332115b10SPawel Jakub Dawidek 			}
60432115b10SPawel Jakub Dawidek 			break;
60532115b10SPawel Jakub Dawidek 		default:
606571fdd7eSPawel Jakub Dawidek 			PJDLOG_ABORT("name at wrong depth level");
60732115b10SPawel Jakub Dawidek 		}
608584a9bc3SPawel Jakub Dawidek 		free($2);
60932115b10SPawel Jakub Dawidek 	}
61032115b10SPawel Jakub Dawidek 	;
61132115b10SPawel Jakub Dawidek 
61232115b10SPawel Jakub Dawidek local_statement:	LOCAL STR
61332115b10SPawel Jakub Dawidek 	{
61432115b10SPawel Jakub Dawidek 		switch (depth) {
61532115b10SPawel Jakub Dawidek 		case 1:
61632115b10SPawel Jakub Dawidek 			if (strlcpy(depth1_localpath, $2,
61732115b10SPawel Jakub Dawidek 			    sizeof(depth1_localpath)) >=
61832115b10SPawel Jakub Dawidek 			    sizeof(depth1_localpath)) {
619bbbb114cSPawel Jakub Dawidek 				pjdlog_error("local argument is too long.");
620584a9bc3SPawel Jakub Dawidek 				free($2);
621bbbb114cSPawel Jakub Dawidek 				return (1);
62232115b10SPawel Jakub Dawidek 			}
62332115b10SPawel Jakub Dawidek 			break;
62432115b10SPawel Jakub Dawidek 		case 2:
6253f828c18SPawel Jakub Dawidek 			if (!mynode)
6263f828c18SPawel Jakub Dawidek 				break;
627571fdd7eSPawel Jakub Dawidek 			PJDLOG_ASSERT(curres != NULL);
62832115b10SPawel Jakub Dawidek 			if (strlcpy(curres->hr_localpath, $2,
62932115b10SPawel Jakub Dawidek 			    sizeof(curres->hr_localpath)) >=
63032115b10SPawel Jakub Dawidek 			    sizeof(curres->hr_localpath)) {
631bbbb114cSPawel Jakub Dawidek 				pjdlog_error("local argument is too long.");
632584a9bc3SPawel Jakub Dawidek 				free($2);
633bbbb114cSPawel Jakub Dawidek 				return (1);
63432115b10SPawel Jakub Dawidek 			}
63532115b10SPawel Jakub Dawidek 			break;
63632115b10SPawel Jakub Dawidek 		default:
637571fdd7eSPawel Jakub Dawidek 			PJDLOG_ABORT("local at wrong depth level");
63832115b10SPawel Jakub Dawidek 		}
639584a9bc3SPawel Jakub Dawidek 		free($2);
64032115b10SPawel Jakub Dawidek 	}
64132115b10SPawel Jakub Dawidek 	;
64232115b10SPawel Jakub Dawidek 
64332115b10SPawel Jakub Dawidek resource_node_statement:ON resource_node_start OB resource_node_entries CB
64432115b10SPawel Jakub Dawidek 	{
64532115b10SPawel Jakub Dawidek 		mynode = false;
64632115b10SPawel Jakub Dawidek 	}
64732115b10SPawel Jakub Dawidek 	;
64832115b10SPawel Jakub Dawidek 
64932115b10SPawel Jakub Dawidek resource_node_start:	STR
65032115b10SPawel Jakub Dawidek 	{
651bbbb114cSPawel Jakub Dawidek 		if (curres != NULL) {
652bbbb114cSPawel Jakub Dawidek 			switch (isitme($1)) {
653bbbb114cSPawel Jakub Dawidek 			case -1:
654584a9bc3SPawel Jakub Dawidek 				free($1);
655bbbb114cSPawel Jakub Dawidek 				return (1);
656bbbb114cSPawel Jakub Dawidek 			case 0:
657bbbb114cSPawel Jakub Dawidek 				break;
658bbbb114cSPawel Jakub Dawidek 			case 1:
65966db33a1SPawel Jakub Dawidek 				mynode = hadmynode = true;
660bbbb114cSPawel Jakub Dawidek 				break;
661bbbb114cSPawel Jakub Dawidek 			default:
662571fdd7eSPawel Jakub Dawidek 				PJDLOG_ABORT("invalid isitme() return value");
663bbbb114cSPawel Jakub Dawidek 			}
664bbbb114cSPawel Jakub Dawidek 		}
665584a9bc3SPawel Jakub Dawidek 		free($1);
66632115b10SPawel Jakub Dawidek 	}
66732115b10SPawel Jakub Dawidek 	;
66832115b10SPawel Jakub Dawidek 
66932115b10SPawel Jakub Dawidek resource_node_entries:
67032115b10SPawel Jakub Dawidek 	|
67132115b10SPawel Jakub Dawidek 	resource_node_entries resource_node_entry
67232115b10SPawel Jakub Dawidek 	;
67332115b10SPawel Jakub Dawidek 
67432115b10SPawel Jakub Dawidek resource_node_entry:
67532115b10SPawel Jakub Dawidek 	name_statement
67632115b10SPawel Jakub Dawidek 	|
67732115b10SPawel Jakub Dawidek 	local_statement
67832115b10SPawel Jakub Dawidek 	|
67932115b10SPawel Jakub Dawidek 	remote_statement
6800b626a28SPawel Jakub Dawidek 	|
6810b626a28SPawel Jakub Dawidek 	source_statement
682518dd4c0SPawel Jakub Dawidek 	|
683518dd4c0SPawel Jakub Dawidek 	metaflush_statement
68432115b10SPawel Jakub Dawidek 	;
68532115b10SPawel Jakub Dawidek 
686b64a692bSPawel Jakub Dawidek remote_statement:	REMOTE remote_str
68732115b10SPawel Jakub Dawidek 	{
688571fdd7eSPawel Jakub Dawidek 		PJDLOG_ASSERT(depth == 2);
68932115b10SPawel Jakub Dawidek 		if (mynode) {
690571fdd7eSPawel Jakub Dawidek 			PJDLOG_ASSERT(curres != NULL);
69132115b10SPawel Jakub Dawidek 			if (strlcpy(curres->hr_remoteaddr, $2,
69232115b10SPawel Jakub Dawidek 			    sizeof(curres->hr_remoteaddr)) >=
69332115b10SPawel Jakub Dawidek 			    sizeof(curres->hr_remoteaddr)) {
694bbbb114cSPawel Jakub Dawidek 				pjdlog_error("remote argument is too long.");
695584a9bc3SPawel Jakub Dawidek 				free($2);
696bbbb114cSPawel Jakub Dawidek 				return (1);
69732115b10SPawel Jakub Dawidek 			}
69832115b10SPawel Jakub Dawidek 		}
699584a9bc3SPawel Jakub Dawidek 		free($2);
70032115b10SPawel Jakub Dawidek 	}
70132115b10SPawel Jakub Dawidek 	;
7020b626a28SPawel Jakub Dawidek 
703b64a692bSPawel Jakub Dawidek remote_str:
704b64a692bSPawel Jakub Dawidek 	NONE		{ $$ = strdup("none"); }
705b64a692bSPawel Jakub Dawidek 	|
706b64a692bSPawel Jakub Dawidek 	STR		{ }
707b64a692bSPawel Jakub Dawidek 	;
708b64a692bSPawel Jakub Dawidek 
7090b626a28SPawel Jakub Dawidek source_statement:	SOURCE STR
7100b626a28SPawel Jakub Dawidek 	{
711571fdd7eSPawel Jakub Dawidek 		PJDLOG_ASSERT(depth == 2);
7120b626a28SPawel Jakub Dawidek 		if (mynode) {
713571fdd7eSPawel Jakub Dawidek 			PJDLOG_ASSERT(curres != NULL);
7140b626a28SPawel Jakub Dawidek 			if (strlcpy(curres->hr_sourceaddr, $2,
7150b626a28SPawel Jakub Dawidek 			    sizeof(curres->hr_sourceaddr)) >=
7160b626a28SPawel Jakub Dawidek 			    sizeof(curres->hr_sourceaddr)) {
7170b626a28SPawel Jakub Dawidek 				pjdlog_error("source argument is too long.");
7180b626a28SPawel Jakub Dawidek 				free($2);
7190b626a28SPawel Jakub Dawidek 				return (1);
7200b626a28SPawel Jakub Dawidek 			}
7210b626a28SPawel Jakub Dawidek 		}
7220b626a28SPawel Jakub Dawidek 		free($2);
7230b626a28SPawel Jakub Dawidek 	}
7240b626a28SPawel Jakub Dawidek 	;
7255e2a209aSBaptiste Daroussin 
7265e2a209aSBaptiste Daroussin %%
7275e2a209aSBaptiste Daroussin 
7285e2a209aSBaptiste Daroussin static int
7295e2a209aSBaptiste Daroussin isitme(const char *name)
7305e2a209aSBaptiste Daroussin {
7315e2a209aSBaptiste Daroussin 	char buf[MAXHOSTNAMELEN];
732d6e636c9SPawel Jakub Dawidek 	unsigned long hostid;
7335e2a209aSBaptiste Daroussin 	char *pos;
7345e2a209aSBaptiste Daroussin 	size_t bufsize;
7355e2a209aSBaptiste Daroussin 
7365e2a209aSBaptiste Daroussin 	/*
7375e2a209aSBaptiste Daroussin 	 * First check if the given name matches our full hostname.
7385e2a209aSBaptiste Daroussin 	 */
7395e2a209aSBaptiste Daroussin 	if (gethostname(buf, sizeof(buf)) < 0) {
7405e2a209aSBaptiste Daroussin 		pjdlog_errno(LOG_ERR, "gethostname() failed");
7415e2a209aSBaptiste Daroussin 		return (-1);
7425e2a209aSBaptiste Daroussin 	}
7435e2a209aSBaptiste Daroussin 	if (strcmp(buf, name) == 0)
7445e2a209aSBaptiste Daroussin 		return (1);
7455e2a209aSBaptiste Daroussin 
7465e2a209aSBaptiste Daroussin 	/*
747d6e636c9SPawel Jakub Dawidek 	 * Check if it matches first part of the host name.
7485e2a209aSBaptiste Daroussin 	 */
7495e2a209aSBaptiste Daroussin 	pos = strchr(buf, '.');
7505e2a209aSBaptiste Daroussin 	if (pos != NULL && (size_t)(pos - buf) == strlen(name) &&
7515e2a209aSBaptiste Daroussin 	    strncmp(buf, name, pos - buf) == 0) {
7525e2a209aSBaptiste Daroussin 		return (1);
7535e2a209aSBaptiste Daroussin 	}
7545e2a209aSBaptiste Daroussin 
7555e2a209aSBaptiste Daroussin 	/*
756d6e636c9SPawel Jakub Dawidek 	 * Check if it matches host UUID.
7575e2a209aSBaptiste Daroussin 	 */
7585e2a209aSBaptiste Daroussin 	bufsize = sizeof(buf);
7595e2a209aSBaptiste Daroussin 	if (sysctlbyname("kern.hostuuid", buf, &bufsize, NULL, 0) < 0) {
7605e2a209aSBaptiste Daroussin 		pjdlog_errno(LOG_ERR, "sysctlbyname(kern.hostuuid) failed");
7615e2a209aSBaptiste Daroussin 		return (-1);
7625e2a209aSBaptiste Daroussin 	}
7635e2a209aSBaptiste Daroussin 	if (strcasecmp(buf, name) == 0)
7645e2a209aSBaptiste Daroussin 		return (1);
7655e2a209aSBaptiste Daroussin 
7665e2a209aSBaptiste Daroussin 	/*
767d6e636c9SPawel Jakub Dawidek 	 * Check if it matches hostid.
768d6e636c9SPawel Jakub Dawidek 	 */
769d6e636c9SPawel Jakub Dawidek 	bufsize = sizeof(hostid);
770d6e636c9SPawel Jakub Dawidek 	if (sysctlbyname("kern.hostid", &hostid, &bufsize, NULL, 0) < 0) {
771d6e636c9SPawel Jakub Dawidek 		pjdlog_errno(LOG_ERR, "sysctlbyname(kern.hostid) failed");
772d6e636c9SPawel Jakub Dawidek 		return (-1);
773d6e636c9SPawel Jakub Dawidek 	}
774d6e636c9SPawel Jakub Dawidek 	(void)snprintf(buf, sizeof(buf), "hostid%lu", hostid);
775d6e636c9SPawel Jakub Dawidek 	if (strcmp(buf, name) == 0)
776d6e636c9SPawel Jakub Dawidek 		return (1);
777d6e636c9SPawel Jakub Dawidek 
778d6e636c9SPawel Jakub Dawidek 	/*
7795e2a209aSBaptiste Daroussin 	 * Looks like this isn't about us.
7805e2a209aSBaptiste Daroussin 	 */
7815e2a209aSBaptiste Daroussin 	return (0);
7825e2a209aSBaptiste Daroussin }
7835e2a209aSBaptiste Daroussin 
7845e2a209aSBaptiste Daroussin static bool
family_supported(int family)7855e2a209aSBaptiste Daroussin family_supported(int family)
7865e2a209aSBaptiste Daroussin {
7875e2a209aSBaptiste Daroussin 	int sock;
7885e2a209aSBaptiste Daroussin 
7895e2a209aSBaptiste Daroussin 	sock = socket(family, SOCK_STREAM, 0);
790d6e636c9SPawel Jakub Dawidek 	if (sock == -1 && errno == EPROTONOSUPPORT)
7915e2a209aSBaptiste Daroussin 		return (false);
7925e2a209aSBaptiste Daroussin 	if (sock >= 0)
7935e2a209aSBaptiste Daroussin 		(void)close(sock);
7945e2a209aSBaptiste Daroussin 	return (true);
7955e2a209aSBaptiste Daroussin }
7965e2a209aSBaptiste Daroussin 
7975e2a209aSBaptiste Daroussin static int
node_names(char ** namesp)7985e2a209aSBaptiste Daroussin node_names(char **namesp)
7995e2a209aSBaptiste Daroussin {
8005e2a209aSBaptiste Daroussin 	static char names[MAXHOSTNAMELEN * 3];
8015e2a209aSBaptiste Daroussin 	char buf[MAXHOSTNAMELEN];
802d6e636c9SPawel Jakub Dawidek 	unsigned long hostid;
8035e2a209aSBaptiste Daroussin 	char *pos;
8045e2a209aSBaptiste Daroussin 	size_t bufsize;
8055e2a209aSBaptiste Daroussin 
8065e2a209aSBaptiste Daroussin 	if (gethostname(buf, sizeof(buf)) < 0) {
8075e2a209aSBaptiste Daroussin 		pjdlog_errno(LOG_ERR, "gethostname() failed");
8085e2a209aSBaptiste Daroussin 		return (-1);
8095e2a209aSBaptiste Daroussin 	}
8105e2a209aSBaptiste Daroussin 
8115e2a209aSBaptiste Daroussin 	/* First component of the host name. */
8125e2a209aSBaptiste Daroussin 	pos = strchr(buf, '.');
8135e2a209aSBaptiste Daroussin 	if (pos != NULL && pos != buf) {
8145e2a209aSBaptiste Daroussin 		(void)strlcpy(names, buf, MIN((size_t)(pos - buf + 1),
8155e2a209aSBaptiste Daroussin 		    sizeof(names)));
8165e2a209aSBaptiste Daroussin 		(void)strlcat(names, ", ", sizeof(names));
8175e2a209aSBaptiste Daroussin 	}
8185e2a209aSBaptiste Daroussin 
8195e2a209aSBaptiste Daroussin 	/* Full host name. */
8205e2a209aSBaptiste Daroussin 	(void)strlcat(names, buf, sizeof(names));
8215e2a209aSBaptiste Daroussin 	(void)strlcat(names, ", ", sizeof(names));
8225e2a209aSBaptiste Daroussin 
8235e2a209aSBaptiste Daroussin 	/* Host UUID. */
8245e2a209aSBaptiste Daroussin 	bufsize = sizeof(buf);
8255e2a209aSBaptiste Daroussin 	if (sysctlbyname("kern.hostuuid", buf, &bufsize, NULL, 0) < 0) {
8265e2a209aSBaptiste Daroussin 		pjdlog_errno(LOG_ERR, "sysctlbyname(kern.hostuuid) failed");
8275e2a209aSBaptiste Daroussin 		return (-1);
8285e2a209aSBaptiste Daroussin 	}
8295e2a209aSBaptiste Daroussin 	(void)strlcat(names, buf, sizeof(names));
830d6e636c9SPawel Jakub Dawidek 	(void)strlcat(names, ", ", sizeof(names));
831d6e636c9SPawel Jakub Dawidek 
832d6e636c9SPawel Jakub Dawidek 	/* Host ID. */
833d6e636c9SPawel Jakub Dawidek 	bufsize = sizeof(hostid);
834d6e636c9SPawel Jakub Dawidek 	if (sysctlbyname("kern.hostid", &hostid, &bufsize, NULL, 0) < 0) {
835d6e636c9SPawel Jakub Dawidek 		pjdlog_errno(LOG_ERR, "sysctlbyname(kern.hostid) failed");
836d6e636c9SPawel Jakub Dawidek 		return (-1);
837d6e636c9SPawel Jakub Dawidek 	}
838d6e636c9SPawel Jakub Dawidek 	(void)snprintf(buf, sizeof(buf), "hostid%lu", hostid);
839d6e636c9SPawel Jakub Dawidek 	(void)strlcat(names, buf, sizeof(names));
8405e2a209aSBaptiste Daroussin 
8415e2a209aSBaptiste Daroussin 	*namesp = names;
8425e2a209aSBaptiste Daroussin 
8435e2a209aSBaptiste Daroussin 	return (0);
8445e2a209aSBaptiste Daroussin }
8455e2a209aSBaptiste Daroussin 
8465e2a209aSBaptiste Daroussin void
yyerror(const char * str)8475e2a209aSBaptiste Daroussin yyerror(const char *str)
8485e2a209aSBaptiste Daroussin {
8495e2a209aSBaptiste Daroussin 
8505e2a209aSBaptiste Daroussin 	pjdlog_error("Unable to parse configuration file at line %d near '%s': %s",
8515e2a209aSBaptiste Daroussin 	    lineno, yytext, str);
8525e2a209aSBaptiste Daroussin }
8535e2a209aSBaptiste Daroussin 
8545e2a209aSBaptiste Daroussin struct hastd_config *
yy_config_parse(const char * config,bool exitonerror)8555e2a209aSBaptiste Daroussin yy_config_parse(const char *config, bool exitonerror)
8565e2a209aSBaptiste Daroussin {
8575e2a209aSBaptiste Daroussin 	int ret;
8585e2a209aSBaptiste Daroussin 
8595e2a209aSBaptiste Daroussin 	curres = NULL;
8605e2a209aSBaptiste Daroussin 	mynode = false;
8615e2a209aSBaptiste Daroussin 	depth = 0;
8625e2a209aSBaptiste Daroussin 	lineno = 0;
8635e2a209aSBaptiste Daroussin 
8645e2a209aSBaptiste Daroussin 	depth0_timeout = HAST_TIMEOUT;
865d6e636c9SPawel Jakub Dawidek 	depth0_replication = HAST_REPLICATION_MEMSYNC;
8665e2a209aSBaptiste Daroussin 	depth0_checksum = HAST_CHECKSUM_NONE;
8675e2a209aSBaptiste Daroussin 	depth0_compression = HAST_COMPRESSION_HOLE;
8685e2a209aSBaptiste Daroussin 	strlcpy(depth0_control, HAST_CONTROL, sizeof(depth0_control));
8695e2a209aSBaptiste Daroussin 	strlcpy(depth0_pidfile, HASTD_PIDFILE, sizeof(depth0_pidfile));
8705e2a209aSBaptiste Daroussin 	TAILQ_INIT(&depth0_listen);
8715e2a209aSBaptiste Daroussin 	strlcpy(depth0_listen_tcp4, HASTD_LISTEN_TCP4,
8725e2a209aSBaptiste Daroussin 	    sizeof(depth0_listen_tcp4));
8735e2a209aSBaptiste Daroussin 	strlcpy(depth0_listen_tcp6, HASTD_LISTEN_TCP6,
8745e2a209aSBaptiste Daroussin 	    sizeof(depth0_listen_tcp6));
8755e2a209aSBaptiste Daroussin 	depth0_exec[0] = '\0';
8765e2a209aSBaptiste Daroussin 	depth0_metaflush = 1;
8775e2a209aSBaptiste Daroussin 
8785e2a209aSBaptiste Daroussin 	lconfig = calloc(1, sizeof(*lconfig));
8795e2a209aSBaptiste Daroussin 	if (lconfig == NULL) {
8805e2a209aSBaptiste Daroussin 		pjdlog_error("Unable to allocate memory for configuration.");
8815e2a209aSBaptiste Daroussin 		if (exitonerror)
8825e2a209aSBaptiste Daroussin 			exit(EX_TEMPFAIL);
8835e2a209aSBaptiste Daroussin 		return (NULL);
8845e2a209aSBaptiste Daroussin 	}
8855e2a209aSBaptiste Daroussin 
8865e2a209aSBaptiste Daroussin 	TAILQ_INIT(&lconfig->hc_listen);
8875e2a209aSBaptiste Daroussin 	TAILQ_INIT(&lconfig->hc_resources);
8885e2a209aSBaptiste Daroussin 
8895e2a209aSBaptiste Daroussin 	yyin = fopen(config, "r");
8905e2a209aSBaptiste Daroussin 	if (yyin == NULL) {
8915e2a209aSBaptiste Daroussin 		pjdlog_errno(LOG_ERR, "Unable to open configuration file %s",
8925e2a209aSBaptiste Daroussin 		    config);
8935e2a209aSBaptiste Daroussin 		yy_config_free(lconfig);
8945e2a209aSBaptiste Daroussin 		if (exitonerror)
8955e2a209aSBaptiste Daroussin 			exit(EX_OSFILE);
8965e2a209aSBaptiste Daroussin 		return (NULL);
8975e2a209aSBaptiste Daroussin 	}
8985e2a209aSBaptiste Daroussin 	yyrestart(yyin);
8995e2a209aSBaptiste Daroussin 	ret = yyparse();
9005e2a209aSBaptiste Daroussin 	fclose(yyin);
9015e2a209aSBaptiste Daroussin 	if (ret != 0) {
9025e2a209aSBaptiste Daroussin 		yy_config_free(lconfig);
9035e2a209aSBaptiste Daroussin 		if (exitonerror)
9045e2a209aSBaptiste Daroussin 			exit(EX_CONFIG);
9055e2a209aSBaptiste Daroussin 		return (NULL);
9065e2a209aSBaptiste Daroussin 	}
9075e2a209aSBaptiste Daroussin 
9085e2a209aSBaptiste Daroussin 	/*
9095e2a209aSBaptiste Daroussin 	 * Let's see if everything is set up.
9105e2a209aSBaptiste Daroussin 	 */
9115e2a209aSBaptiste Daroussin 	if (lconfig->hc_controladdr[0] == '\0') {
9125e2a209aSBaptiste Daroussin 		strlcpy(lconfig->hc_controladdr, depth0_control,
9135e2a209aSBaptiste Daroussin 		    sizeof(lconfig->hc_controladdr));
9145e2a209aSBaptiste Daroussin 	}
9155e2a209aSBaptiste Daroussin 	if (lconfig->hc_pidfile[0] == '\0') {
9165e2a209aSBaptiste Daroussin 		strlcpy(lconfig->hc_pidfile, depth0_pidfile,
9175e2a209aSBaptiste Daroussin 		    sizeof(lconfig->hc_pidfile));
9185e2a209aSBaptiste Daroussin 	}
9195e2a209aSBaptiste Daroussin 	if (!TAILQ_EMPTY(&depth0_listen))
9205e2a209aSBaptiste Daroussin 		TAILQ_CONCAT(&lconfig->hc_listen, &depth0_listen, hl_next);
9215e2a209aSBaptiste Daroussin 	if (TAILQ_EMPTY(&lconfig->hc_listen)) {
9225e2a209aSBaptiste Daroussin 		struct hastd_listen *lst;
9235e2a209aSBaptiste Daroussin 
9245e2a209aSBaptiste Daroussin 		if (family_supported(AF_INET)) {
9255e2a209aSBaptiste Daroussin 			lst = calloc(1, sizeof(*lst));
9265e2a209aSBaptiste Daroussin 			if (lst == NULL) {
9275e2a209aSBaptiste Daroussin 				pjdlog_error("Unable to allocate memory for listen address.");
9285e2a209aSBaptiste Daroussin 				yy_config_free(lconfig);
9295e2a209aSBaptiste Daroussin 				if (exitonerror)
9305e2a209aSBaptiste Daroussin 					exit(EX_TEMPFAIL);
9315e2a209aSBaptiste Daroussin 				return (NULL);
9325e2a209aSBaptiste Daroussin 			}
9335e2a209aSBaptiste Daroussin 			(void)strlcpy(lst->hl_addr, depth0_listen_tcp4,
9345e2a209aSBaptiste Daroussin 			    sizeof(lst->hl_addr));
9355e2a209aSBaptiste Daroussin 			TAILQ_INSERT_TAIL(&lconfig->hc_listen, lst, hl_next);
9365e2a209aSBaptiste Daroussin 		} else {
9375e2a209aSBaptiste Daroussin 			pjdlog_debug(1,
9385e2a209aSBaptiste Daroussin 			    "No IPv4 support in the kernel, not listening on IPv4 address.");
9395e2a209aSBaptiste Daroussin 		}
9405e2a209aSBaptiste Daroussin 		if (family_supported(AF_INET6)) {
9415e2a209aSBaptiste Daroussin 			lst = calloc(1, sizeof(*lst));
9425e2a209aSBaptiste Daroussin 			if (lst == NULL) {
9435e2a209aSBaptiste Daroussin 				pjdlog_error("Unable to allocate memory for listen address.");
9445e2a209aSBaptiste Daroussin 				yy_config_free(lconfig);
9455e2a209aSBaptiste Daroussin 				if (exitonerror)
9465e2a209aSBaptiste Daroussin 					exit(EX_TEMPFAIL);
9475e2a209aSBaptiste Daroussin 				return (NULL);
9485e2a209aSBaptiste Daroussin 			}
9495e2a209aSBaptiste Daroussin 			(void)strlcpy(lst->hl_addr, depth0_listen_tcp6,
9505e2a209aSBaptiste Daroussin 			    sizeof(lst->hl_addr));
9515e2a209aSBaptiste Daroussin 			TAILQ_INSERT_TAIL(&lconfig->hc_listen, lst, hl_next);
9525e2a209aSBaptiste Daroussin 		} else {
9535e2a209aSBaptiste Daroussin 			pjdlog_debug(1,
9545e2a209aSBaptiste Daroussin 			    "No IPv6 support in the kernel, not listening on IPv6 address.");
9555e2a209aSBaptiste Daroussin 		}
9565e2a209aSBaptiste Daroussin 		if (TAILQ_EMPTY(&lconfig->hc_listen)) {
9575e2a209aSBaptiste Daroussin 			pjdlog_error("No address to listen on.");
9585e2a209aSBaptiste Daroussin 			yy_config_free(lconfig);
9595e2a209aSBaptiste Daroussin 			if (exitonerror)
9605e2a209aSBaptiste Daroussin 				exit(EX_TEMPFAIL);
9615e2a209aSBaptiste Daroussin 			return (NULL);
9625e2a209aSBaptiste Daroussin 		}
9635e2a209aSBaptiste Daroussin 	}
9645e2a209aSBaptiste Daroussin 	TAILQ_FOREACH(curres, &lconfig->hc_resources, hr_next) {
9655e2a209aSBaptiste Daroussin 		PJDLOG_ASSERT(curres->hr_provname[0] != '\0');
9665e2a209aSBaptiste Daroussin 		PJDLOG_ASSERT(curres->hr_localpath[0] != '\0');
9675e2a209aSBaptiste Daroussin 		PJDLOG_ASSERT(curres->hr_remoteaddr[0] != '\0');
9685e2a209aSBaptiste Daroussin 
9695e2a209aSBaptiste Daroussin 		if (curres->hr_replication == -1) {
9705e2a209aSBaptiste Daroussin 			/*
9715e2a209aSBaptiste Daroussin 			 * Replication is not set at resource-level.
9725e2a209aSBaptiste Daroussin 			 * Use global or default setting.
9735e2a209aSBaptiste Daroussin 			 */
9745e2a209aSBaptiste Daroussin 			curres->hr_replication = depth0_replication;
975d6e636c9SPawel Jakub Dawidek 			curres->hr_original_replication = depth0_replication;
9765e2a209aSBaptiste Daroussin 		}
9775e2a209aSBaptiste Daroussin 		if (curres->hr_checksum == -1) {
9785e2a209aSBaptiste Daroussin 			/*
9795e2a209aSBaptiste Daroussin 			 * Checksum is not set at resource-level.
9805e2a209aSBaptiste Daroussin 			 * Use global or default setting.
9815e2a209aSBaptiste Daroussin 			 */
9825e2a209aSBaptiste Daroussin 			curres->hr_checksum = depth0_checksum;
9835e2a209aSBaptiste Daroussin 		}
9845e2a209aSBaptiste Daroussin 		if (curres->hr_compression == -1) {
9855e2a209aSBaptiste Daroussin 			/*
9865e2a209aSBaptiste Daroussin 			 * Compression is not set at resource-level.
9875e2a209aSBaptiste Daroussin 			 * Use global or default setting.
9885e2a209aSBaptiste Daroussin 			 */
9895e2a209aSBaptiste Daroussin 			curres->hr_compression = depth0_compression;
9905e2a209aSBaptiste Daroussin 		}
9915e2a209aSBaptiste Daroussin 		if (curres->hr_timeout == -1) {
9925e2a209aSBaptiste Daroussin 			/*
9935e2a209aSBaptiste Daroussin 			 * Timeout is not set at resource-level.
9945e2a209aSBaptiste Daroussin 			 * Use global or default setting.
9955e2a209aSBaptiste Daroussin 			 */
9965e2a209aSBaptiste Daroussin 			curres->hr_timeout = depth0_timeout;
9975e2a209aSBaptiste Daroussin 		}
9985e2a209aSBaptiste Daroussin 		if (curres->hr_exec[0] == '\0') {
9995e2a209aSBaptiste Daroussin 			/*
10005e2a209aSBaptiste Daroussin 			 * Exec is not set at resource-level.
10015e2a209aSBaptiste Daroussin 			 * Use global or default setting.
10025e2a209aSBaptiste Daroussin 			 */
10035e2a209aSBaptiste Daroussin 			strlcpy(curres->hr_exec, depth0_exec,
10045e2a209aSBaptiste Daroussin 			    sizeof(curres->hr_exec));
10055e2a209aSBaptiste Daroussin 		}
10065e2a209aSBaptiste Daroussin 		if (curres->hr_metaflush == -1) {
10075e2a209aSBaptiste Daroussin 			/*
10085e2a209aSBaptiste Daroussin 			 * Metaflush is not set at resource-level.
10095e2a209aSBaptiste Daroussin 			 * Use global or default setting.
10105e2a209aSBaptiste Daroussin 			 */
10115e2a209aSBaptiste Daroussin 			curres->hr_metaflush = depth0_metaflush;
10125e2a209aSBaptiste Daroussin 		}
10135e2a209aSBaptiste Daroussin 	}
10145e2a209aSBaptiste Daroussin 
10155e2a209aSBaptiste Daroussin 	return (lconfig);
10165e2a209aSBaptiste Daroussin }
10175e2a209aSBaptiste Daroussin 
10185e2a209aSBaptiste Daroussin void
yy_config_free(struct hastd_config * config)10195e2a209aSBaptiste Daroussin yy_config_free(struct hastd_config *config)
10205e2a209aSBaptiste Daroussin {
10215e2a209aSBaptiste Daroussin 	struct hastd_listen *lst;
10225e2a209aSBaptiste Daroussin 	struct hast_resource *res;
10235e2a209aSBaptiste Daroussin 
10245e2a209aSBaptiste Daroussin 	while ((lst = TAILQ_FIRST(&depth0_listen)) != NULL) {
10255e2a209aSBaptiste Daroussin 		TAILQ_REMOVE(&depth0_listen, lst, hl_next);
10265e2a209aSBaptiste Daroussin 		free(lst);
10275e2a209aSBaptiste Daroussin 	}
10285e2a209aSBaptiste Daroussin 	while ((lst = TAILQ_FIRST(&config->hc_listen)) != NULL) {
10295e2a209aSBaptiste Daroussin 		TAILQ_REMOVE(&config->hc_listen, lst, hl_next);
10305e2a209aSBaptiste Daroussin 		free(lst);
10315e2a209aSBaptiste Daroussin 	}
10325e2a209aSBaptiste Daroussin 	while ((res = TAILQ_FIRST(&config->hc_resources)) != NULL) {
10335e2a209aSBaptiste Daroussin 		TAILQ_REMOVE(&config->hc_resources, res, hr_next);
10345e2a209aSBaptiste Daroussin 		free(res);
10355e2a209aSBaptiste Daroussin 	}
10365e2a209aSBaptiste Daroussin 	free(config);
10375e2a209aSBaptiste Daroussin }
1038