]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/dird/inc_conf.c
- Move test for MaxStartDelay as suggested by Peter.
[bacula/bacula] / bacula / src / dird / inc_conf.c
index e723ce4c7e709a85bb4dfbba568db593ccbd35ca..9fa242891717e70959a7d2f7ab54d70e317192af 100644 (file)
@@ -7,7 +7,7 @@
  *     Version $Id$
  */
 /*
-   Copyright (C) 2003-2004 Kern Sibbald
+   Copyright (C) 2003-2005 Kern Sibbald
 
    This program is free software; you can redistribute it and/or
    modify it under the terms of the GNU General Public License as
@@ -87,8 +87,12 @@ static RES_ITEM options_items[] = {
    {"mtimeonly",       store_opts,    NULL,     0, 0, 0},
    {"keepatime",       store_opts,    NULL,     0, 0, 0},
    {"regex",           store_regex,   NULL,     0, 0, 0},
+   {"regexdir",        store_regex,   NULL,     1, 0, 0},
+   {"regexfile",       store_regex,   NULL,     2, 0, 0},
    {"base",            store_base,    NULL,     0, 0, 0},
    {"wild",            store_wild,    NULL,     0, 0, 0},
+   {"wilddir",         store_wild,    NULL,     1, 0, 0},
+   {"wildfile",        store_wild,    NULL,     2, 0, 0},
    {"exclude",         store_opts,    NULL,     0, 0, 0},
    {"aclsupport",      store_opts,    NULL,     0, 0, 0},
    {"reader",          store_reader,  NULL,     0, 0, 0},
@@ -124,8 +128,10 @@ enum {
 };
 
 /*
- * Include keywords -- these are keywords that can appear
- *    in the options lists of an old include ( Include = compression= ...)
+ * This is the list of options that can be stored by store_opts
+ *   Note, now that the old style Include/Exclude code is gone,
+ *   the INC_KW code could be put into the "code" field of the
+ *   options given above.
  */
 static struct s_kw FS_option_kw[] = {
    {"compression", INC_KW_COMPRESSION},
@@ -267,11 +273,7 @@ static void scan_include_options(LEX *lc, int keyword, char *opts, int optlen)
  */
 void store_inc(LEX *lc, RES_ITEM *item, int index, int pass)
 {
-   int token, i;
-   int options = lc->options;
-   int keyword;
-   char inc_opts[100];
-   int inc_opts_len;
+   int token;
 
    /*
     * Decide if we are doing a new Include or an old include. The
@@ -283,113 +285,7 @@ void store_inc(LEX *lc, RES_ITEM *item, int index, int pass)
       store_newinc(lc, item, index, pass);
       return;
    }
-
-   /* What follows is scanning for the OLD style Include/Exclude */
-
-   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_SKIP_EOL)) != 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) {
-           keyword = FS_option_kw[i].token;
-           break;
-        }
-      }
-      if (keyword == INC_KW_NONE) {
-         scan_err1(lc, _("Expected a FileSet keyword, got: %s"), lc->str);
-      }
-      /* Option keyword should be following by = <option> */
-      if ((token=lex_get_token(lc, T_SKIP_EOL)) != 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 */
-   }
-   inc_opts_len = strlen(inc_opts);
-
-   if (pass == 1) {
-      INCEXE *incexe;
-      if (!res_all.res_fs.have_MD5) {
-        MD5Init(&res_all.res_fs.md5c);
-        res_all.res_fs.have_MD5 = TRUE;
-      }
-      setup_current_opts();
-      bstrncpy(res_incexe.current_opts->opts, inc_opts, MAX_FOPTS);
-      Dmsg2(900, "old pass=%d incexe opts=%s\n", pass, res_incexe.current_opts->opts);
-
-      /* Create incexe structure */
-      Dmsg0(900, "Create INCEXE structure\n");
-      incexe = (INCEXE *)malloc(sizeof(INCEXE));
-      memcpy(incexe, &res_incexe, sizeof(INCEXE));
-      memset(&res_incexe, 0, sizeof(INCEXE));
-      if (item->code == 0) { /* include */
-        if (res_all.res_fs.num_includes == 0) {
-           res_all.res_fs.include_items = (INCEXE **)malloc(sizeof(INCEXE *));
-         } else {
-           res_all.res_fs.include_items = (INCEXE **)realloc(res_all.res_fs.include_items,
-                          sizeof(INCEXE *) * (res_all.res_fs.num_includes + 1));
-         }
-         res_all.res_fs.include_items[res_all.res_fs.num_includes++] = incexe;
-          Dmsg1(900, "num_includes=%d\n", res_all.res_fs.num_includes);
-      } else {   /* exclude */
-        if (res_all.res_fs.num_excludes == 0) {
-           res_all.res_fs.exclude_items = (INCEXE **)malloc(sizeof(INCEXE *));
-         } else {
-           res_all.res_fs.exclude_items = (INCEXE **)realloc(res_all.res_fs.exclude_items,
-                          sizeof(INCEXE *) * (res_all.res_fs.num_excludes + 1));
-         }
-         res_all.res_fs.exclude_items[res_all.res_fs.num_excludes++] = incexe;
-          Dmsg1(900, "num_excludes=%d\n", res_all.res_fs.num_excludes);
-      }
-
-      /* Pickup include/exclude names. They are stored in INCEXE
-       *  structures which contains the options and the name.
-       */
-      while ((token = lex_get_token(lc, T_SKIP_EOL)) != T_EOB) {
-        switch (token) {
-        case T_COMMA:
-           continue;
-
-        case T_IDENTIFIER:
-        case T_UNQUOTED_STRING:
-        case T_QUOTED_STRING:
-           if (res_all.res_fs.have_MD5) {
-              MD5Update(&res_all.res_fs.md5c, (unsigned char *)lc->str, lc->str_len);
-           }
-           if (incexe->name_list.size() == 0) {
-              incexe->name_list.init(10, true);
-           }
-           incexe->name_list.append(bstrdup(lc->str));
-            Dmsg1(900, "Add to name_list %s\n", lc->str);
-           break;
-        default:
-            scan_err1(lc, "Expected a filename, got: %s", lc->str);
-        }
-      }
-      /* Note, MD5Final is done in backup.c */
-   } else { /* pass 2 */
-      while (lex_get_token(lc, T_ALL) != T_EOB)
-        {}
-   }
-   scan_to_eol(lc);
-   lc->options = options;
-   set_bit(index, res_all.hdr.item_present);
+   scan_err0(lc, _("Old style Include/Exclude not supported\n"));
 }
 
 
@@ -473,6 +369,8 @@ static void store_regex(LEX *lc, RES_ITEM *item, int index, int pass)
    int token, rc;
    regex_t preg;
    char prbuf[500];
+   const char *type;
+   int newsize;
 
    token = lex_get_token(lc, T_SKIP_EOL);
    if (pass == 1) {
@@ -490,9 +388,21 @@ static void store_regex(LEX *lc, RES_ITEM *item, int index, int pass)
            break;
         }
         regfree(&preg);
-        res_incexe.current_opts->regex.append(bstrdup(lc->str));
-         Dmsg3(900, "set regex %p size=%d %s\n",
-           res_incexe.current_opts, res_incexe.current_opts->regex.size(),lc->str);
+        if (item->code == 1) {
+            type = "regexdir";
+           res_incexe.current_opts->regexdir.append(bstrdup(lc->str));
+           newsize = res_incexe.current_opts->regexdir.size();
+        } else if (item->code == 2) {
+            type = "regexfile";
+           res_incexe.current_opts->regexfile.append(bstrdup(lc->str));
+           newsize = res_incexe.current_opts->regexfile.size();
+        } else {
+            type = "regex";
+           res_incexe.current_opts->regex.append(bstrdup(lc->str));
+           newsize = res_incexe.current_opts->regex.size();
+        }
+         Dmsg4(900, "set %s %p size=%d %s\n",
+           type, res_incexe.current_opts, newsize, lc->str);
         break;
       default:
          scan_err1(lc, _("Expected a regex string, got: %s\n"), lc->str);
@@ -552,6 +462,8 @@ static void store_writer(LEX *lc, RES_ITEM *item, int index, int pass)
 static void store_wild(LEX *lc, RES_ITEM *item, int index, int pass)
 {
    int token;
+   const char *type;
+   int newsize;
 
    token = lex_get_token(lc, T_SKIP_EOL);
    if (pass == 1) {
@@ -562,9 +474,21 @@ static void store_wild(LEX *lc, RES_ITEM *item, int index, int pass)
       case T_IDENTIFIER:
       case T_UNQUOTED_STRING:
       case T_QUOTED_STRING:
-        res_incexe.current_opts->wild.append(bstrdup(lc->str));
-         Dmsg3(900, "set wild %p size=%d %s\n",
-           res_incexe.current_opts, res_incexe.current_opts->wild.size(),lc->str);
+        if (item->code == 1) {
+            type = "wilddir";
+           res_incexe.current_opts->wilddir.append(bstrdup(lc->str));
+           newsize = res_incexe.current_opts->wilddir.size();
+        } else if (item->code == 2) {
+            type = "wildfile";
+           res_incexe.current_opts->wildfile.append(bstrdup(lc->str));
+           newsize = res_incexe.current_opts->wildfile.size();
+        } else {
+            type = "wild";
+           res_incexe.current_opts->wild.append(bstrdup(lc->str));
+           newsize = res_incexe.current_opts->wild.size();
+        }
+         Dmsg4(9, "set %s %p size=%d %s\n",
+           type, res_incexe.current_opts, newsize, lc->str);
         break;
       default:
          scan_err1(lc, _("Expected a wild-card string, got: %s\n"), lc->str);
@@ -715,7 +639,11 @@ static void setup_current_opts(void)
    FOPTS *fo = (FOPTS *)malloc(sizeof(FOPTS));
    memset(fo, 0, sizeof(FOPTS));
    fo->regex.init(1, true);
+   fo->regexdir.init(1, true);
+   fo->regexfile.init(1, true);
    fo->wild.init(1, true);
+   fo->wilddir.init(1, true);
+   fo->wildfile.init(1, true);
    fo->base.init(1, true);
    fo->fstype.init(1, true);
    res_incexe.current_opts = fo;