/*
- * 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
*
/* 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);
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},
#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},
/*
- * 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)
{
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
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);
}
}
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) {
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 */
}
}
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");
*/
while ((token = lex_get_token(lc, T_ALL)) != T_EOB) {
switch (token) {
- case T_COMMA:
- case T_EOL:
- 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->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);
- }
- }
- incexe->name_list[incexe->num_names++] = bstrdup(lc->str);
- Dmsg1(200, "Add to name_list %s\n", incexe->name_list[incexe->num_names -1]);
- break;
- default:
- scan_err1(lc, "Expected a filename, got: %s", lc->str);
+ case T_COMMA:
+ case T_EOL:
+ 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(200, "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 */
* 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;
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;
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;
}
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);
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;
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;
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);
}