svn commit: r235789 - in head: sbin/devd sbin/hastd usr.bin/ar
usr.bin/bc usr.bin/find usr.bin/m4 usr.bin/mkcsmapper
usr.bin/mklocale usr.sbin/bluetooth/bthidd
usr.sbin/bluetooth/hcsecd usr.sbin/co...
Baptiste Daroussin
bapt at FreeBSD.org
Tue May 22 16:33:11 UTC 2012
Author: bapt
Date: Tue May 22 16:33:10 2012
New Revision: 235789
URL: http://svn.freebsd.org/changeset/base/235789
Log:
Fix world after byacc import:
- old yacc(1) use to magicially append stdlib.h, while new one don't
- new yacc(1) do declare yyparse by itself, fix redundant declaration of
'yyparse'
Approved by: des (mentor)
Modified:
head/sbin/devd/parse.y
head/sbin/hastd/hast.h
head/sbin/hastd/parse.y
head/usr.bin/ar/acpyacc.y
head/usr.bin/bc/bc.y
head/usr.bin/find/getdate.y
head/usr.bin/m4/parser.y
head/usr.bin/mkcsmapper/ldef.h
head/usr.bin/mklocale/extern.h
head/usr.sbin/bluetooth/bthidd/parser.y
head/usr.sbin/bluetooth/hcsecd/parser.y
head/usr.sbin/config/config.h
head/usr.sbin/config/main.c
head/usr.sbin/fifolog/lib/getdate.y
head/usr.sbin/jail/config.c
head/usr.sbin/jail/jailp.h
Modified: head/sbin/devd/parse.y
==============================================================================
--- head/sbin/devd/parse.y Tue May 22 15:59:07 2012 (r235788)
+++ head/sbin/devd/parse.y Tue May 22 16:33:10 2012 (r235789)
@@ -29,6 +29,7 @@
* $FreeBSD$
*/
+#include <sys/cdefs.h>
#include "devd.h"
#include <stdio.h>
#include <string.h>
Modified: head/sbin/hastd/hast.h
==============================================================================
--- head/sbin/hastd/hast.h Tue May 22 15:59:07 2012 (r235788)
+++ head/sbin/hastd/hast.h Tue May 22 16:33:10 2012 (r235789)
@@ -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: head/sbin/hastd/parse.y
==============================================================================
--- head/sbin/hastd/parse.y Tue May 22 15:59:07 2012 (r235788)
+++ head/sbin/hastd/parse.y Tue May 22 16:33:10 2012 (r235789)
@@ -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; }
+resource_node_entry:
+ name_statement
|
- CRC32 { $$ = HAST_CHECKSUM_CRC32; }
+ local_statement
|
- SHA256 { $$ = HAST_CHECKSUM_SHA256; }
+ remote_statement
+ |
+ source_statement
+ |
+ metaflush_statement
;
-compression_statement: COMPRESSION compression_type
+remote_statement: REMOTE remote_str
{
- switch (depth) {
- case 0:
- depth0_compression = $2;
*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***
More information about the svn-src-head
mailing list