]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/dird/inc_conf.c
This commit was manufactured by cvs2svn to create tag
[bacula/bacula] / bacula / src / dird / inc_conf.c
index 2b2629090f9990054dc8309101be20e4aa2a27de..1e9c69c694451b354e64a99860d1c538b6ebc747 100644 (file)
@@ -1,6 +1,6 @@
 /*
- *   Configuration file parser for Include, Exclude, Finclude
- *    and FExclude records.
+ *   Configuration file parser for new and old Include and
+ *     Exclude records
  *
  *     Kern Sibbald, March MMIII
  *
@@ -32,8 +32,8 @@
 /* Forward referenced subroutines */
 
 void store_inc(LEX *lc, struct res_items *item, int index, int pass);
-void store_finc(LEX *lc, struct res_items *item, int index, int pass);
 
+static void store_newinc(LEX *lc, struct res_items *item, int index, int pass);
 static void store_match(LEX *lc, struct res_items *item, int index, int pass);
 static void store_opts(LEX *lc, struct res_items *item, int index, int pass);
 static void store_fname(LEX *lc, struct res_items *item, int index, int pass);
@@ -49,14 +49,14 @@ static void setup_current_opts(void);
 extern URES res_all;
 extern int  res_all_size;
 
-/* We build the current Finclude Fexclude item here */
+/* We build the current new Include and Exclude items here */
 static INCEXE res_incexe;
 
 /* 
- * FInclude/FExclude items
+ * new Include/Exclude items
  *   name            handler     value                        code flags default_value
  */
-static struct res_items finc_items[] = {
+static struct res_items newinc_items[] = {
    {"compression",     store_opts,    NULL,     0, 0, 0},
    {"signature",       store_opts,    NULL,     0, 0, 0},
    {"verify",          store_opts,    NULL,     0, 0, 0},
@@ -87,7 +87,7 @@ static struct res_items finc_items[] = {
 #define INC_KW_PORTABLE    10
 
 /* Include keywords -- these are keywords that can appear
- *    in the options lists of an include ( Include = compression= ...)
+ *    in the options lists of an old include ( Include = compression= ...)
  */
 static struct s_kw FS_option_kw[] = {
    {"compression", INC_KW_COMPRESSION},
@@ -151,8 +151,9 @@ static struct s_fs_opt FS_options[] = {
 
 
 /* 
- * Scan for Include options (keyword=option) is converted into one or
- *  two characters. Verifyopts=xxxx is Vxxxx:
+ * Scan for right hand side of Include options (keyword=option) is 
+ *    converted into one or two characters. Verifyopts=xxxx is Vxxxx:
+ *    Whatever is found is concatenated to the opts string.
  */
 static void scan_include_options(LEX *lc, int keyword, char *opts, int optlen)
 {
@@ -167,6 +168,7 @@ static void scan_include_options(LEX *lc, int keyword, char *opts, int optlen)
       bstrncat(opts, "V", optlen);         /* indicate Verify */
       bstrncat(opts, lc->str, optlen);
       bstrncat(opts, ":", optlen);         /* terminate it */
+      Dmsg3(100, "Catopts=%s option=%s optlen=%d\n", opts, option,optlen);
 
    /*
     * Standard keyword options for Include/Exclude 
@@ -185,7 +187,7 @@ static void scan_include_options(LEX *lc, int keyword, char *opts, int optlen)
          scan_err1(lc, "Expected a FileSet option keyword, got:%s:", lc->str);
       } else { /* add option */
         bstrncat(opts, option, optlen);
-         Dmsg3(200, "Catopts=%s option=%s optlen=%d\n", opts, option,optlen);
+         Dmsg3(100, "Catopts=%s option=%s optlen=%d\n", opts, option,optlen);
       }
    }
 
@@ -204,12 +206,26 @@ void store_inc(LEX *lc, struct res_items *item, int index, int pass)
    char inc_opts[100];
    int inc_opts_len;
 
+   /*
+    * Decide if we are doing a new Include or an old include. The
+    *  new Include is followed immediately by {, whereas the
+    *  old include has options following the Include.
+    */
+   token = lex_get_token(lc, T_ALL);           
+   if (token == T_BOB) {
+      store_newinc(lc, item, index, pass);
+      return;
+   }
+   if (token != T_EQUALS) {
+      scan_err1(lc, _("Expecting an equals sign, got: %s\n"), lc->str);
+   }
    lc->options |= LOPT_NO_IDENT;      /* make spaces significant */
    memset(&res_incexe, 0, sizeof(INCEXE));
 
    /* Get include options */
    inc_opts[0] = 0;
    while ((token=lex_get_token(lc, T_ALL)) != T_BOB) {
+        
       keyword = INC_KW_NONE;
       for (i=0; FS_option_kw[i].name; i++) {
         if (strcasecmp(lc->str, FS_option_kw[i].name) == 0) {
@@ -224,12 +240,14 @@ void store_inc(LEX *lc, struct res_items *item, int index, int pass)
       if ((token=lex_get_token(lc, T_ALL)) != T_EQUALS) {
          scan_err1(lc, _("expected an = following keyword, got: %s"), lc->str);
       } else {
+        /* Scan right hand side of option */
         scan_include_options(lc, keyword, inc_opts, sizeof(inc_opts));
       }
       if (token == T_BOB) {
         break;
       }
    }
+
    if (!inc_opts[0]) {
       strcat(inc_opts, "0");          /* set no options */
    }
@@ -243,7 +261,7 @@ void store_inc(LEX *lc, struct res_items *item, int index, int pass)
       }
       setup_current_opts();
       bstrncpy(res_incexe.current_opts->opts, inc_opts, MAX_FOPTS);
-      Dmsg1(200, "incexe opts=%s\n", res_incexe.current_opts->opts);
+      Dmsg2(100, "old pass=%d incexe opts=%s\n", pass, res_incexe.current_opts->opts);
 
       /* Create incexe structure */
       Dmsg0(200, "Create INCEXE structure\n");
@@ -285,17 +303,11 @@ void store_inc(LEX *lc, struct res_items *item, int index, int pass)
               if (res_all.res_fs.have_MD5) {
                  MD5Update(&res_all.res_fs.md5c, (unsigned char *)lc->str, lc->str_len);
               }
-              if (incexe->num_names == incexe->max_names) {
-                 incexe->max_names += 10;
-                 if (incexe->name_list == NULL) {
-                    incexe->name_list = (char **)malloc(sizeof(char *) * incexe->max_names);
-                 } else {
-                    incexe->name_list = (char **)realloc(incexe->name_list,
-                          sizeof(char *) * incexe->max_names);
-                 }
+              if (incexe->name_list.size() == 0) {
+                 incexe->name_list.init(10, true);
               }
-              incexe->name_list[incexe->num_names++] = bstrdup(lc->str);
-               Dmsg1(200, "Add to name_list %s\n", incexe->name_list[incexe->num_names -1]);
+              incexe->name_list.append(bstrdup(lc->str));
+               Dmsg1(200, "Add to name_list %s\n", lc->str);
               break;
            default:
                scan_err1(lc, "Expected a filename, got: %s", lc->str);
@@ -318,7 +330,7 @@ void store_inc(LEX *lc, struct res_items *item, int index, int pass)
  *  resource.  We treat the Finclude/Fexeclude like a sort of
  *  mini-resource within the FileSet resource.
  */
-void store_finc(LEX *lc, struct res_items *item, int index, int pass)
+static void store_newinc(LEX *lc, struct res_items *item, int index, int pass)
 {
    int token, i;
    INCEXE *incexe;
@@ -327,12 +339,8 @@ void store_finc(LEX *lc, struct res_items *item, int index, int pass)
       MD5Init(&res_all.res_fs.md5c);
       res_all.res_fs.have_MD5 = TRUE;
    }
-   res_all.res_fs.finclude = TRUE;
-   token = lex_get_token(lc, T_ALL);           
-   if (token != T_BOB) {
-      scan_err1(lc, _("Expecting a beginning brace, got: %s\n"), lc->str);
-   }
    memset(&res_incexe, 0, sizeof(INCEXE));
+   res_all.res_fs.new_include = TRUE;
    while ((token = lex_get_token(lc, T_ALL)) != T_EOF) {
       if (token == T_EOL) {
         continue;
@@ -343,14 +351,14 @@ void store_finc(LEX *lc, struct res_items *item, int index, int pass)
       if (token != T_IDENTIFIER) {
          scan_err1(lc, _("Expecting keyword, got: %s\n"), lc->str);
       }
-      for (i=0; finc_items[i].name; i++) {
-        if (strcasecmp(finc_items[i].name, lc->str) == 0) {
+      for (i=0; newinc_items[i].name; i++) {
+        if (strcasecmp(newinc_items[i].name, lc->str) == 0) {
            token = lex_get_token(lc, T_ALL);
            if (token != T_EQUALS) {
                scan_err1(lc, "expected an equals, got: %s", lc->str);
            }
            /* Call item handler */
-           finc_items[i].handler(lc, &finc_items[i], i, pass);
+           newinc_items[i].handler(lc, &newinc_items[i], i, pass);
            i = -1;
            break;
         }
@@ -452,17 +460,11 @@ static void store_fname(LEX *lc, struct res_items *item, int index, int pass)
               MD5Update(&res_all.res_fs.md5c, (unsigned char *)lc->str, lc->str_len);
            }
            incexe = &res_incexe;
-           if (incexe->num_names == incexe->max_names) {
-              incexe->max_names += 10;
-              if (incexe->name_list == NULL) {
-                 incexe->name_list = (char **)malloc(sizeof(char *) * incexe->max_names);
-              } else {
-                 incexe->name_list = (char **)realloc(incexe->name_list,
-                       sizeof(char *) * incexe->max_names);
-              }
+           if (incexe->name_list.size() == 0) {
+              incexe->name_list.init(10, true);
            }
-           incexe->name_list[incexe->num_names++] = bstrdup(lc->str);
-            Dmsg1(200, "Add to name_list %s\n", incexe->name_list[incexe->num_names -1]);
+           incexe->name_list.append(bstrdup(lc->str));
+            Dmsg1(200, "Add to name_list %s\n", lc->str);
            break;
         default:
             scan_err1(lc, _("Expected a filename, got: %s"), lc->str);
@@ -473,7 +475,9 @@ static void store_fname(LEX *lc, struct res_items *item, int index, int pass)
    scan_to_eol(lc);
 }
 
-
+/*
+ * New style options come here
+ */
 static void store_opts(LEX *lc, struct res_items *item, int index, int pass)
 {
    int i;
@@ -482,6 +486,7 @@ static void store_opts(LEX *lc, struct res_items *item, int index, int pass)
 
    inc_opts[0] = 0;
    keyword = INC_KW_NONE;
+   /* Look up the keyword */
    for (i=0; FS_option_kw[i].name; i++) {
       if (strcasecmp(item->name, FS_option_kw[i].name) == 0) {
         keyword = FS_option_kw[i].token;
@@ -491,14 +496,13 @@ static void store_opts(LEX *lc, struct res_items *item, int index, int pass)
    if (keyword == INC_KW_NONE) {
       scan_err1(lc, "Expected a FileSet keyword, got: %s", lc->str);
    }
-   Dmsg2(200, "keyword=%d %s\n", keyword, FS_option_kw[keyword].name);
+   /* Now scan for the value */
    scan_include_options(lc, keyword, inc_opts, sizeof(inc_opts));
-
    if (pass == 1) {
       setup_current_opts();
-      bstrncat(res_incexe.current_opts->opts, inc_opts, MAX_FOPTS);
+      bstrncpy(res_incexe.current_opts->opts, inc_opts, MAX_FOPTS);
+      Dmsg2(100, "new pass=%d incexe opts=%s\n", pass, res_incexe.current_opts->opts);
    }
-
    scan_to_eol(lc);
 }
 
@@ -510,6 +514,8 @@ static void setup_current_opts(void)
    if (res_incexe.current_opts == NULL) {
       res_incexe.current_opts = (FOPTS *)malloc(sizeof(FOPTS));
       memset(res_incexe.current_opts, 0, sizeof(FOPTS));
+      res_incexe.current_opts->match.init(1, true);
+      res_incexe.current_opts->base_list.init(1, true);
       res_incexe.num_opts = 1;
       res_incexe.opts_list = (FOPTS **)malloc(sizeof(FOPTS *));
       res_incexe.opts_list[0] = res_incexe.current_opts;