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