Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 7 Jul 2012 18:04:09 +0000 (UTC)
From:      Tim Kientzle <kientzle@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r238208 - in projects/armv6: bin/expr lib/libc/net sbin/devd sbin/hastd usr.bin/ar usr.bin/bc usr.bin/find usr.bin/m4 usr.bin/mkcsmapper usr.bin/mkesdb usr.bin/mklocale usr.sbin/bluetoo...
Message-ID:  <201207071804.q67I49nY072267@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: kientzle
Date: Sat Jul  7 18:04:09 2012
New Revision: 238208
URL: http://svn.freebsd.org/changeset/base/238208

Log:
  Merge from -CURRENT:  Fixes for building with the
  new YACC.

Modified:
  projects/armv6/bin/expr/expr.y
  projects/armv6/lib/libc/net/nsparser.y
  projects/armv6/sbin/devd/parse.y
  projects/armv6/sbin/hastd/hast.h
  projects/armv6/sbin/hastd/parse.y
  projects/armv6/usr.bin/ar/acpyacc.y
  projects/armv6/usr.bin/bc/bc.y
  projects/armv6/usr.bin/find/getdate.y
  projects/armv6/usr.bin/m4/parser.y
  projects/armv6/usr.bin/mkcsmapper/ldef.h
  projects/armv6/usr.bin/mkesdb/ldef.h
  projects/armv6/usr.bin/mklocale/extern.h
  projects/armv6/usr.sbin/bluetooth/bthidd/parser.y
  projects/armv6/usr.sbin/bluetooth/hcsecd/parser.y
  projects/armv6/usr.sbin/config/config.h
  projects/armv6/usr.sbin/config/main.c
  projects/armv6/usr.sbin/fifolog/lib/getdate.y
  projects/armv6/usr.sbin/jail/config.c
  projects/armv6/usr.sbin/jail/jailp.h
Directory Properties:
  projects/armv6/   (props changed)
  projects/armv6/lib/libc/   (props changed)
  projects/armv6/sbin/   (props changed)
  projects/armv6/usr.sbin/jail/   (props changed)

Modified: projects/armv6/bin/expr/expr.y
==============================================================================
--- projects/armv6/bin/expr/expr.y	Sat Jul  7 17:55:27 2012	(r238207)
+++ projects/armv6/bin/expr/expr.y	Sat Jul  7 18:04:09 2012	(r238208)
@@ -74,7 +74,6 @@ int		to_integer(struct val *);
 void		to_string(struct val *);
 int		yyerror(const char *);
 int		yylex(void);
-int		yyparse(void);
 
 %}
 

Modified: projects/armv6/lib/libc/net/nsparser.y
==============================================================================
--- projects/armv6/lib/libc/net/nsparser.y	Sat Jul  7 17:55:27 2012	(r238207)
+++ projects/armv6/lib/libc/net/nsparser.y	Sat Jul  7 18:04:09 2012	(r238208)
@@ -44,6 +44,7 @@ __FBSDID("$FreeBSD$");
 #define _NS_PRIVATE
 #include <nsswitch.h>
 #include <stdio.h>
+#include <stdlib.h>
 #include <string.h>
 #include <syslog.h>
 #include "un-namespace.h"

Modified: projects/armv6/sbin/devd/parse.y
==============================================================================
--- projects/armv6/sbin/devd/parse.y	Sat Jul  7 17:55:27 2012	(r238207)
+++ projects/armv6/sbin/devd/parse.y	Sat Jul  7 18:04:09 2012	(r238208)
@@ -29,6 +29,7 @@
  * $FreeBSD$
  */
 
+#include <sys/cdefs.h>
 #include "devd.h"
 #include <stdio.h>
 #include <string.h>

Modified: projects/armv6/sbin/hastd/hast.h
==============================================================================
--- projects/armv6/sbin/hastd/hast.h	Sat Jul  7 17:55:27 2012	(r238207)
+++ projects/armv6/sbin/hastd/hast.h	Sat Jul  7 18:04:09 2012	(r238208)
@@ -244,6 +244,5 @@ void yy_config_free(struct hastd_config 
 
 void yyerror(const char *);
 int yylex(void);
-int yyparse(void);
 
 #endif	/* !_HAST_H_ */

Modified: projects/armv6/sbin/hastd/parse.y
==============================================================================
--- projects/armv6/sbin/hastd/parse.y	Sat Jul  7 17:55:27 2012	(r238207)
+++ projects/armv6/sbin/hastd/parse.y	Sat Jul  7 18:04:09 2012	(r238208)
@@ -77,332 +77,483 @@ static int depth1_metaflush;
 
 extern void yyrestart(FILE *);
 
-static int
-isitme(const char *name)
-{
-	char buf[MAXHOSTNAMELEN];
-	char *pos;
-	size_t bufsize;
-
-	/*
-	 * First check if the given name matches our full hostname.
-	 */
-	if (gethostname(buf, sizeof(buf)) < 0) {
-		pjdlog_errno(LOG_ERR, "gethostname() failed");
-		return (-1);
-	}
-	if (strcmp(buf, name) == 0)
-		return (1);
+static int isitme(const char *name);
+static bool family_supported(int family);
+static int node_names(char **namesp);
+%}
 
-	/*
-	 * Now check if it matches first part of the host name.
-	 */
-	pos = strchr(buf, '.');
-	if (pos != NULL && (size_t)(pos - buf) == strlen(name) &&
-	    strncmp(buf, name, pos - buf) == 0) {
-		return (1);
-	}
+%token CONTROL PIDFILE LISTEN REPLICATION CHECKSUM COMPRESSION METAFLUSH
+%token TIMEOUT EXEC RESOURCE NAME LOCAL REMOTE SOURCE ON OFF
+%token FULLSYNC MEMSYNC ASYNC NONE CRC32 SHA256 HOLE LZF
+%token NUM STR OB CB
 
-	/*
-	 * At the end check if name is equal to our host's UUID.
-	 */
-	bufsize = sizeof(buf);
-	if (sysctlbyname("kern.hostuuid", buf, &bufsize, NULL, 0) < 0) {
-		pjdlog_errno(LOG_ERR, "sysctlbyname(kern.hostuuid) failed");
-		return (-1);
-	}
-	if (strcasecmp(buf, name) == 0)
-		return (1);
+%type <str> remote_str
+%type <num> replication_type
+%type <num> checksum_type
+%type <num> compression_type
+%type <num> boolean
 
-	/*
-	 * Looks like this isn't about us.
-	 */
-	return (0);
+%union
+{
+	int num;
+	char *str;
 }
 
-static bool
-family_supported(int family)
-{
-	int sock;
+%token <num> NUM
+%token <str> STR
 
-	sock = socket(family, SOCK_STREAM, 0);
-	if (sock == -1 && errno == EPROTONOSUPPORT)
-		return (false);
-	if (sock >= 0)
-		(void)close(sock);
-	return (true);
-}
+%%
 
-static int
-node_names(char **namesp)
-{
-	static char names[MAXHOSTNAMELEN * 3];
-	char buf[MAXHOSTNAMELEN];
-	char *pos;
-	size_t bufsize;
+statements:
+	|
+	statements statement
+	;
 
-	if (gethostname(buf, sizeof(buf)) < 0) {
-		pjdlog_errno(LOG_ERR, "gethostname() failed");
-		return (-1);
+statement:
+	control_statement
+	|
+	pidfile_statement
+	|
+	listen_statement
+	|
+	replication_statement
+	|
+	checksum_statement
+	|
+	compression_statement
+	|
+	timeout_statement
+	|
+	exec_statement
+	|
+	metaflush_statement
+	|
+	node_statement
+	|
+	resource_statement
+	;
+
+control_statement:	CONTROL STR
+	{
+		switch (depth) {
+		case 0:
+			if (strlcpy(depth0_control, $2,
+			    sizeof(depth0_control)) >=
+			    sizeof(depth0_control)) {
+				pjdlog_error("control argument is too long.");
+				free($2);
+				return (1);
+			}
+			break;
+		case 1:
+			if (!mynode)
+				break;
+			if (strlcpy(lconfig->hc_controladdr, $2,
+			    sizeof(lconfig->hc_controladdr)) >=
+			    sizeof(lconfig->hc_controladdr)) {
+				pjdlog_error("control argument is too long.");
+				free($2);
+				return (1);
+			}
+			break;
+		default:
+			PJDLOG_ABORT("control at wrong depth level");
+		}
+		free($2);
 	}
+	;
 
-	/* First component of the host name. */
-	pos = strchr(buf, '.');
-	if (pos != NULL && pos != buf) {
-		(void)strlcpy(names, buf, MIN((size_t)(pos - buf + 1),
-		    sizeof(names)));
-		(void)strlcat(names, ", ", sizeof(names));
+pidfile_statement:	PIDFILE STR
+	{
+		switch (depth) {
+		case 0:
+			if (strlcpy(depth0_pidfile, $2,
+			    sizeof(depth0_pidfile)) >=
+			    sizeof(depth0_pidfile)) {
+				pjdlog_error("pidfile argument is too long.");
+				free($2);
+				return (1);
+			}
+			break;
+		case 1:
+			if (!mynode)
+				break;
+			if (strlcpy(lconfig->hc_pidfile, $2,
+			    sizeof(lconfig->hc_pidfile)) >=
+			    sizeof(lconfig->hc_pidfile)) {
+				pjdlog_error("pidfile argument is too long.");
+				free($2);
+				return (1);
+			}
+			break;
+		default:
+			PJDLOG_ABORT("pidfile at wrong depth level");
+		}
+		free($2);
 	}
+	;
 
-	/* Full host name. */
-	(void)strlcat(names, buf, sizeof(names));
-	(void)strlcat(names, ", ", sizeof(names));
+listen_statement:	LISTEN STR
+	{
+		struct hastd_listen *lst;
 
-	/* Host UUID. */
-	bufsize = sizeof(buf);
-	if (sysctlbyname("kern.hostuuid", buf, &bufsize, NULL, 0) < 0) {
-		pjdlog_errno(LOG_ERR, "sysctlbyname(kern.hostuuid) failed");
-		return (-1);
+		lst = calloc(1, sizeof(*lst));
+		if (lst == NULL) {
+			pjdlog_error("Unable to allocate memory for listen address.");
+			free($2);
+			return (1);
+		}
+		if (strlcpy(lst->hl_addr, $2, sizeof(lst->hl_addr)) >=
+		    sizeof(lst->hl_addr)) {
+			pjdlog_error("listen argument is too long.");
+			free($2);
+			free(lst);
+			return (1);
+		}
+		switch (depth) {
+		case 0:
+			TAILQ_INSERT_TAIL(&depth0_listen, lst, hl_next);
+			break;
+		case 1:
+			if (mynode)
+				TAILQ_INSERT_TAIL(&depth0_listen, lst, hl_next);
+			else
+				free(lst);
+			break;
+		default:
+			PJDLOG_ABORT("listen at wrong depth level");
+		}
+		free($2);
 	}
-	(void)strlcat(names, buf, sizeof(names));
-
-	*namesp = names;
+	;
 
-	return (0);
-}
+replication_statement:	REPLICATION replication_type
+	{
+		switch (depth) {
+		case 0:
+			depth0_replication = $2;
+			break;
+		case 1:
+			PJDLOG_ASSERT(curres != NULL);
+			curres->hr_replication = $2;
+			break;
+		default:
+			PJDLOG_ABORT("replication at wrong depth level");
+		}
+	}
+	;
 
-void
-yyerror(const char *str)
-{
+replication_type:
+	FULLSYNC	{ $$ = HAST_REPLICATION_FULLSYNC; }
+	|
+	MEMSYNC		{ $$ = HAST_REPLICATION_MEMSYNC; }
+	|
+	ASYNC		{ $$ = HAST_REPLICATION_ASYNC; }
+	;
 
-	pjdlog_error("Unable to parse configuration file at line %d near '%s': %s",
-	    lineno, yytext, str);
-}
+checksum_statement:	CHECKSUM checksum_type
+	{
+		switch (depth) {
+		case 0:
+			depth0_checksum = $2;
+			break;
+		case 1:
+			PJDLOG_ASSERT(curres != NULL);
+			curres->hr_checksum = $2;
+			break;
+		default:
+			PJDLOG_ABORT("checksum at wrong depth level");
+		}
+	}
+	;
 
-struct hastd_config *
-yy_config_parse(const char *config, bool exitonerror)
-{
-	int ret;
-
-	curres = NULL;
-	mynode = false;
-	depth = 0;
-	lineno = 0;
-
-	depth0_timeout = HAST_TIMEOUT;
-	depth0_replication = HAST_REPLICATION_FULLSYNC;
-	depth0_checksum = HAST_CHECKSUM_NONE;
-	depth0_compression = HAST_COMPRESSION_HOLE;
-	strlcpy(depth0_control, HAST_CONTROL, sizeof(depth0_control));
-	strlcpy(depth0_pidfile, HASTD_PIDFILE, sizeof(depth0_pidfile));
-	TAILQ_INIT(&depth0_listen);
-	strlcpy(depth0_listen_tcp4, HASTD_LISTEN_TCP4,
-	    sizeof(depth0_listen_tcp4));
-	strlcpy(depth0_listen_tcp6, HASTD_LISTEN_TCP6,
-	    sizeof(depth0_listen_tcp6));
-	depth0_exec[0] = '\0';
-	depth0_metaflush = 1;
+checksum_type:
+	NONE		{ $$ = HAST_CHECKSUM_NONE; }
+	|
+	CRC32		{ $$ = HAST_CHECKSUM_CRC32; }
+	|
+	SHA256		{ $$ = HAST_CHECKSUM_SHA256; }
+	;
 
-	lconfig = calloc(1, sizeof(*lconfig));
-	if (lconfig == NULL) {
-		pjdlog_error("Unable to allocate memory for configuration.");
-		if (exitonerror)
-			exit(EX_TEMPFAIL);
-		return (NULL);
+compression_statement:	COMPRESSION compression_type
+	{
+		switch (depth) {
+		case 0:
+			depth0_compression = $2;
+			break;
+		case 1:
+			PJDLOG_ASSERT(curres != NULL);
+			curres->hr_compression = $2;
+			break;
+		default:
+			PJDLOG_ABORT("compression at wrong depth level");
+		}
 	}
+	;
 
-	TAILQ_INIT(&lconfig->hc_listen);
-	TAILQ_INIT(&lconfig->hc_resources);
-
-	yyin = fopen(config, "r");
-	if (yyin == NULL) {
-		pjdlog_errno(LOG_ERR, "Unable to open configuration file %s",
-		    config);
-		yy_config_free(lconfig);
-		if (exitonerror)
-			exit(EX_OSFILE);
-		return (NULL);
-	}
-	yyrestart(yyin);
-	ret = yyparse();
-	fclose(yyin);
-	if (ret != 0) {
-		yy_config_free(lconfig);
-		if (exitonerror)
-			exit(EX_CONFIG);
-		return (NULL);
-	}
+compression_type:
+	NONE		{ $$ = HAST_COMPRESSION_NONE; }
+	|
+	HOLE		{ $$ = HAST_COMPRESSION_HOLE; }
+	|
+	LZF		{ $$ = HAST_COMPRESSION_LZF; }
+	;
 
-	/*
-	 * Let's see if everything is set up.
-	 */
-	if (lconfig->hc_controladdr[0] == '\0') {
-		strlcpy(lconfig->hc_controladdr, depth0_control,
-		    sizeof(lconfig->hc_controladdr));
-	}
-	if (lconfig->hc_pidfile[0] == '\0') {
-		strlcpy(lconfig->hc_pidfile, depth0_pidfile,
-		    sizeof(lconfig->hc_pidfile));
+timeout_statement:	TIMEOUT NUM
+	{
+		if ($2 <= 0) {
+			pjdlog_error("Negative or zero timeout.");
+			return (1);
+		}
+		switch (depth) {
+		case 0:
+			depth0_timeout = $2;
+			break;
+		case 1:
+			PJDLOG_ASSERT(curres != NULL);
+			curres->hr_timeout = $2;
+			break;
+		default:
+			PJDLOG_ABORT("timeout at wrong depth level");
+		}
 	}
-	if (!TAILQ_EMPTY(&depth0_listen))
-		TAILQ_CONCAT(&lconfig->hc_listen, &depth0_listen, hl_next);
-	if (TAILQ_EMPTY(&lconfig->hc_listen)) {
-		struct hastd_listen *lst;
+	;
 
-		if (family_supported(AF_INET)) {
-			lst = calloc(1, sizeof(*lst));
-			if (lst == NULL) {
-				pjdlog_error("Unable to allocate memory for listen address.");
-				yy_config_free(lconfig);
-				if (exitonerror)
-					exit(EX_TEMPFAIL);
-				return (NULL);
+exec_statement:		EXEC STR
+	{
+		switch (depth) {
+		case 0:
+			if (strlcpy(depth0_exec, $2, sizeof(depth0_exec)) >=
+			    sizeof(depth0_exec)) {
+				pjdlog_error("Exec path is too long.");
+				free($2);
+				return (1);
 			}
-			(void)strlcpy(lst->hl_addr, depth0_listen_tcp4,
-			    sizeof(lst->hl_addr));
-			TAILQ_INSERT_TAIL(&lconfig->hc_listen, lst, hl_next);
-		} else {
-			pjdlog_debug(1,
-			    "No IPv4 support in the kernel, not listening on IPv4 address.");
-		}
-		if (family_supported(AF_INET6)) {
-			lst = calloc(1, sizeof(*lst));
-			if (lst == NULL) {
-				pjdlog_error("Unable to allocate memory for listen address.");
-				yy_config_free(lconfig);
-				if (exitonerror)
-					exit(EX_TEMPFAIL);
-				return (NULL);
+			break;
+		case 1:
+			PJDLOG_ASSERT(curres != NULL);
+			if (strlcpy(curres->hr_exec, $2,
+			    sizeof(curres->hr_exec)) >=
+			    sizeof(curres->hr_exec)) {
+				pjdlog_error("Exec path is too long.");
+				free($2);
+				return (1);
 			}
-			(void)strlcpy(lst->hl_addr, depth0_listen_tcp6,
-			    sizeof(lst->hl_addr));
-			TAILQ_INSERT_TAIL(&lconfig->hc_listen, lst, hl_next);
-		} else {
-			pjdlog_debug(1,
-			    "No IPv6 support in the kernel, not listening on IPv6 address.");
-		}
-		if (TAILQ_EMPTY(&lconfig->hc_listen)) {
-			pjdlog_error("No address to listen on.");
-			yy_config_free(lconfig);
-			if (exitonerror)
-				exit(EX_TEMPFAIL);
-			return (NULL);
+			break;
+		default:
+			PJDLOG_ABORT("exec at wrong depth level");
 		}
+		free($2);
 	}
-	TAILQ_FOREACH(curres, &lconfig->hc_resources, hr_next) {
-		PJDLOG_ASSERT(curres->hr_provname[0] != '\0');
-		PJDLOG_ASSERT(curres->hr_localpath[0] != '\0');
-		PJDLOG_ASSERT(curres->hr_remoteaddr[0] != '\0');
+	;
 
-		if (curres->hr_replication == -1) {
-			/*
-			 * Replication is not set at resource-level.
-			 * Use global or default setting.
-			 */
-			curres->hr_replication = depth0_replication;
-		}
-		if (curres->hr_replication == HAST_REPLICATION_MEMSYNC) {
-			pjdlog_warning("Replication mode \"%s\" is not implemented, falling back to \"%s\".",
-			    "memsync", "fullsync");
-			curres->hr_replication = HAST_REPLICATION_FULLSYNC;
-		}
-		if (curres->hr_checksum == -1) {
-			/*
-			 * Checksum is not set at resource-level.
-			 * Use global or default setting.
-			 */
-			curres->hr_checksum = depth0_checksum;
-		}
-		if (curres->hr_compression == -1) {
-			/*
-			 * Compression is not set at resource-level.
-			 * Use global or default setting.
-			 */
-			curres->hr_compression = depth0_compression;
-		}
-		if (curres->hr_timeout == -1) {
-			/*
-			 * Timeout is not set at resource-level.
-			 * Use global or default setting.
-			 */
-			curres->hr_timeout = depth0_timeout;
-		}
-		if (curres->hr_exec[0] == '\0') {
-			/*
-			 * Exec is not set at resource-level.
-			 * Use global or default setting.
-			 */
-			strlcpy(curres->hr_exec, depth0_exec,
-			    sizeof(curres->hr_exec));
-		}
-		if (curres->hr_metaflush == -1) {
-			/*
-			 * Metaflush is not set at resource-level.
-			 * Use global or default setting.
-			 */
-			curres->hr_metaflush = depth0_metaflush;
+metaflush_statement:	METAFLUSH boolean
+	{
+		switch (depth) {
+		case 0:
+			depth0_metaflush = $2;
+			break;
+		case 1:
+			PJDLOG_ASSERT(curres != NULL);
+			depth1_metaflush = $2;
+			break;
+		case 2:
+			if (!mynode)
+				break;
+			PJDLOG_ASSERT(curres != NULL);
+			curres->hr_metaflush = $2;
+			break;
+		default:
+			PJDLOG_ABORT("metaflush at wrong depth level");
 		}
 	}
+	;
 
-	return (lconfig);
-}
-
-void
-yy_config_free(struct hastd_config *config)
-{
-	struct hastd_listen *lst;
-	struct hast_resource *res;
+boolean:
+	ON		{ $$ = 1; }
+	|
+	OFF		{ $$ = 0; }
+	;
 
-	while ((lst = TAILQ_FIRST(&depth0_listen)) != NULL) {
-		TAILQ_REMOVE(&depth0_listen, lst, hl_next);
-		free(lst);
+node_statement:		ON node_start OB node_entries CB
+	{
+		mynode = false;
 	}
-	while ((lst = TAILQ_FIRST(&config->hc_listen)) != NULL) {
-		TAILQ_REMOVE(&config->hc_listen, lst, hl_next);
-		free(lst);
-	}
-	while ((res = TAILQ_FIRST(&config->hc_resources)) != NULL) {
-		TAILQ_REMOVE(&config->hc_resources, res, hr_next);
-		free(res);
-	}
-	free(config);
-}
-%}
-
-%token CONTROL PIDFILE LISTEN REPLICATION CHECKSUM COMPRESSION METAFLUSH
-%token TIMEOUT EXEC RESOURCE NAME LOCAL REMOTE SOURCE ON OFF
-%token FULLSYNC MEMSYNC ASYNC NONE CRC32 SHA256 HOLE LZF
-%token NUM STR OB CB
-
-%type <str> remote_str
-%type <num> replication_type
-%type <num> checksum_type
-%type <num> compression_type
-%type <num> boolean
-
-%union
-{
-	int num;
-	char *str;
-}
-
-%token <num> NUM
-%token <str> STR
+	;
 
-%%
+node_start:	STR
+	{
+		switch (isitme($1)) {
+		case -1:
+			free($1);
+			return (1);
+		case 0:
+			break;
+		case 1:
+			mynode = true;
+			break;
+		default:
+			PJDLOG_ABORT("invalid isitme() return value");
+		}
+		free($1);
+	}
+	;
 
-statements:
+node_entries:
 	|
-	statements statement
+	node_entries node_entry
 	;
 
-statement:
+node_entry:
 	control_statement
 	|
 	pidfile_statement
 	|
 	listen_statement
+	;
+
+resource_statement:	RESOURCE resource_start OB resource_entries CB
+	{
+		if (curres != NULL) {
+			/*
+			 * There must be section for this node, at least with
+			 * remote address configuration.
+			 */
+			if (!hadmynode) {
+				char *names;
+
+				if (node_names(&names) != 0)
+					return (1);
+				pjdlog_error("No resource %s configuration for this node (acceptable node names: %s).",
+				    curres->hr_name, names);
+				return (1);
+			}
+
+			/*
+			 * Let's see if there are some resource-level settings
+			 * that we can use for node-level settings.
+			 */
+			if (curres->hr_provname[0] == '\0' &&
+			    depth1_provname[0] != '\0') {
+				/*
+				 * Provider name is not set at node-level,
+				 * but is set at resource-level, use it.
+				 */
+				strlcpy(curres->hr_provname, depth1_provname,
+				    sizeof(curres->hr_provname));
+			}
+			if (curres->hr_localpath[0] == '\0' &&
+			    depth1_localpath[0] != '\0') {
+				/*
+				 * Path to local provider is not set at
+				 * node-level, but is set at resource-level,
+				 * use it.
+				 */
+				strlcpy(curres->hr_localpath, depth1_localpath,
+				    sizeof(curres->hr_localpath));
+			}
+			if (curres->hr_metaflush == -1 && depth1_metaflush != -1) {
+				/*
+				 * Metaflush is not set at node-level,
+				 * but is set at resource-level, use it.
+				 */
+				curres->hr_metaflush = depth1_metaflush;
+			}
+
+			/*
+			 * If provider name is not given, use resource name
+			 * as provider name.
+			 */
+			if (curres->hr_provname[0] == '\0') {
+				strlcpy(curres->hr_provname, curres->hr_name,
+				    sizeof(curres->hr_provname));
+			}
+
+			/*
+			 * Remote address has to be configured at this point.
+			 */
+			if (curres->hr_remoteaddr[0] == '\0') {
+				pjdlog_error("Remote address not configured for resource %s.",
+				    curres->hr_name);
+				return (1);
+			}
+			/*
+			 * Path to local provider has to be configured at this
+			 * point.
+			 */
+			if (curres->hr_localpath[0] == '\0') {
+				pjdlog_error("Path to local component not configured for resource %s.",
+				    curres->hr_name);
+				return (1);
+			}
+
+			/* Put it onto resource list. */
+			TAILQ_INSERT_TAIL(&lconfig->hc_resources, curres, hr_next);
+			curres = NULL;
+		}
+	}
+	;
+
+resource_start:	STR
+	{
+		/* Check if there is no duplicate entry. */
+		TAILQ_FOREACH(curres, &lconfig->hc_resources, hr_next) {
+			if (strcmp(curres->hr_name, $1) == 0) {
+				pjdlog_error("Resource %s configured more than once.",
+				    curres->hr_name);
+				free($1);
+				return (1);
+			}
+		}
+
+		/*
+		 * Clear those, so we can tell if they were set at
+		 * resource-level or not.
+		 */
+		depth1_provname[0] = '\0';
+		depth1_localpath[0] = '\0';
+		depth1_metaflush = -1;
+		hadmynode = false;
+
+		curres = calloc(1, sizeof(*curres));
+		if (curres == NULL) {
+			pjdlog_error("Unable to allocate memory for resource.");
+			free($1);
+			return (1);
+		}
+		if (strlcpy(curres->hr_name, $1,
+		    sizeof(curres->hr_name)) >=
+		    sizeof(curres->hr_name)) {
+			pjdlog_error("Resource name is too long.");
+			free(curres);
+			free($1);
+			return (1);
+		}
+		free($1);
+		curres->hr_role = HAST_ROLE_INIT;
+		curres->hr_previous_role = HAST_ROLE_INIT;
+		curres->hr_replication = -1;
+		curres->hr_checksum = -1;
+		curres->hr_compression = -1;
+		curres->hr_timeout = -1;
+		curres->hr_exec[0] = '\0';
+		curres->hr_provname[0] = '\0';
+		curres->hr_localpath[0] = '\0';
+		curres->hr_localfd = -1;
+		curres->hr_localflush = true;
+		curres->hr_metaflush = -1;
+		curres->hr_remoteaddr[0] = '\0';
+		curres->hr_sourceaddr[0] = '\0';
+		curres->hr_ggateunit = -1;
+	}
+	;
+
+resource_entries:
 	|
+	resource_entries resource_entry
+	;
+
+resource_entry:
 	replication_statement
 	|
 	checksum_statement
@@ -415,592 +566,447 @@ statement:
 	|
 	metaflush_statement
 	|
-	node_statement
+	name_statement
 	|
-	resource_statement
+	local_statement
+	|
+	resource_node_statement
 	;
 
-control_statement:	CONTROL STR
+name_statement:		NAME STR
 	{
 		switch (depth) {
-		case 0:
-			if (strlcpy(depth0_control, $2,
-			    sizeof(depth0_control)) >=
-			    sizeof(depth0_control)) {
-				pjdlog_error("control argument is too long.");
+		case 1:
+			if (strlcpy(depth1_provname, $2,
+			    sizeof(depth1_provname)) >=
+			    sizeof(depth1_provname)) {
+				pjdlog_error("name argument is too long.");
 				free($2);
 				return (1);
 			}
 			break;
-		case 1:
+		case 2:
 			if (!mynode)
 				break;
-			if (strlcpy(lconfig->hc_controladdr, $2,
-			    sizeof(lconfig->hc_controladdr)) >=
-			    sizeof(lconfig->hc_controladdr)) {
-				pjdlog_error("control argument is too long.");
+			PJDLOG_ASSERT(curres != NULL);
+			if (strlcpy(curres->hr_provname, $2,
+			    sizeof(curres->hr_provname)) >=
+			    sizeof(curres->hr_provname)) {
+				pjdlog_error("name argument is too long.");
 				free($2);
 				return (1);
 			}
 			break;
 		default:
-			PJDLOG_ABORT("control at wrong depth level");
+			PJDLOG_ABORT("name at wrong depth level");
 		}
 		free($2);
 	}
 	;
 
-pidfile_statement:	PIDFILE STR
+local_statement:	LOCAL STR
 	{
 		switch (depth) {
-		case 0:
-			if (strlcpy(depth0_pidfile, $2,
-			    sizeof(depth0_pidfile)) >=
-			    sizeof(depth0_pidfile)) {
-				pjdlog_error("pidfile argument is too long.");
+		case 1:
+			if (strlcpy(depth1_localpath, $2,
+			    sizeof(depth1_localpath)) >=
+			    sizeof(depth1_localpath)) {
+				pjdlog_error("local argument is too long.");
 				free($2);
 				return (1);
 			}
 			break;
-		case 1:
+		case 2:
 			if (!mynode)
 				break;
-			if (strlcpy(lconfig->hc_pidfile, $2,
-			    sizeof(lconfig->hc_pidfile)) >=
-			    sizeof(lconfig->hc_pidfile)) {
-				pjdlog_error("pidfile argument is too long.");
+			PJDLOG_ASSERT(curres != NULL);
+			if (strlcpy(curres->hr_localpath, $2,
+			    sizeof(curres->hr_localpath)) >=
+			    sizeof(curres->hr_localpath)) {
+				pjdlog_error("local argument is too long.");
 				free($2);
 				return (1);
 			}
 			break;
 		default:
-			PJDLOG_ABORT("pidfile at wrong depth level");
+			PJDLOG_ABORT("local at wrong depth level");
 		}
 		free($2);
 	}
 	;
 
-listen_statement:	LISTEN STR
+resource_node_statement:ON resource_node_start OB resource_node_entries CB
 	{
-		struct hastd_listen *lst;
-
-		lst = calloc(1, sizeof(*lst));
-		if (lst == NULL) {
-			pjdlog_error("Unable to allocate memory for listen address.");
-			free($2);
-			return (1);
-		}
-		if (strlcpy(lst->hl_addr, $2, sizeof(lst->hl_addr)) >=
-		    sizeof(lst->hl_addr)) {
-			pjdlog_error("listen argument is too long.");
-			free($2);
-			free(lst);
-			return (1);
-		}
-		switch (depth) {
-		case 0:
-			TAILQ_INSERT_TAIL(&depth0_listen, lst, hl_next);
-			break;
-		case 1:
-			if (mynode)
-				TAILQ_INSERT_TAIL(&depth0_listen, lst, hl_next);
-			else
-				free(lst);
-			break;
-		default:
-			PJDLOG_ABORT("listen at wrong depth level");
-		}
-		free($2);
+		mynode = false;
 	}
 	;
 
-replication_statement:	REPLICATION replication_type
+resource_node_start:	STR
 	{
-		switch (depth) {
-		case 0:
-			depth0_replication = $2;
-			break;
-		case 1:
-			PJDLOG_ASSERT(curres != NULL);
-			curres->hr_replication = $2;
-			break;
-		default:
-			PJDLOG_ABORT("replication at wrong depth level");
+		if (curres != NULL) {
+			switch (isitme($1)) {
+			case -1:
+				free($1);
+				return (1);
+			case 0:
+				break;
+			case 1:
+				mynode = hadmynode = true;
+				break;
+			default:
+				PJDLOG_ABORT("invalid isitme() return value");
+			}
 		}
+		free($1);
 	}
 	;
 
-replication_type:
-	FULLSYNC	{ $$ = HAST_REPLICATION_FULLSYNC; }
-	|
-	MEMSYNC		{ $$ = HAST_REPLICATION_MEMSYNC; }
+resource_node_entries:
 	|
-	ASYNC		{ $$ = HAST_REPLICATION_ASYNC; }
-	;
-
-checksum_statement:	CHECKSUM checksum_type
-	{
-		switch (depth) {
-		case 0:
-			depth0_checksum = $2;
-			break;
-		case 1:
-			PJDLOG_ASSERT(curres != NULL);
-			curres->hr_checksum = $2;
-			break;
-		default:
-			PJDLOG_ABORT("checksum at wrong depth level");
-		}
-	}
+	resource_node_entries resource_node_entry
 	;
 
-checksum_type:
-	NONE		{ $$ = HAST_CHECKSUM_NONE; }

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201207071804.q67I49nY072267>