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 ***
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to