static MSGS *daemon_msgs; /* global messages */
+/* Define if e_msg must exit when M_ERROR_TERM is received */
+static int exit_on_error = 1;
+
/*
* Set daemon name. Also, find canonical execution
* path. Note, exepath has spare room for tacking on
char *p = 0;
p[0] = 0; /* generate segmentation violation */
}
- if (type == M_ERROR_TERM) {
+ if ((type == M_ERROR_TERM) && exit_on_error) {
exit(1);
}
}
char *p = 0;
p[0] = 0; /* generate segmentation violation */
}
- if (type == M_ERROR_TERM) {
+ if ((type == M_ERROR_TERM) && exit_on_error) {
exit(1);
}
}
Qmsg(jcr, type, level, "%s", pool_buf);
free_memory(pool_buf);
}
+
+/*
+ * Define if e_msg must exit when M_ERROR_TERM is received
+ */
+void set_exit_on_error(int value) {
+ exit_on_error = value;
+}
/*********************************************************************
*
* Parse configuration file
- *
+ *
+ * Return 0 if reading failed, 1 otherwise
*/
-void
-parse_config(const char *cf)
+int
+parse_config(const char *cf, int exit_on_error)
{
+ set_exit_on_error(exit_on_error);
LEX *lc = NULL;
int token, i, pass;
int res_type = 0;
Dmsg0(300, "Enter parse_config()\n");
for (pass=1; pass <= 2; pass++) {
Dmsg1(300, "parse_config pass %d\n", pass);
- lc = lex_open_file(lc, cf, NULL);
+ if ((lc = lex_open_file(lc, cf, NULL)) == NULL) {
+ set_exit_on_error(1); /* Never reached if exit_on_error == 1 */
+ return 0;
+ }
while ((token=lex_get_token(lc, T_ALL)) != T_EOF) {
Dmsg1(300, "parse got token=%s\n", lex_tok_to_str(token));
switch (state) {
}
if (token != T_IDENTIFIER) {
scan_err1(lc, _("Expected a Resource name identifier, got: %s"), lc->str);
- /* NOT REACHED */
+ set_exit_on_error(1); /* Never reached if exit_on_error == 1 */
+ return 0;
}
for (i=0; resources[i].name; i++)
if (strcasecmp(resources[i].name, lc->str) == 0) {
}
if (state == p_none) {
scan_err1(lc, _("expected resource name, got: %s"), lc->str);
- /* NOT REACHED */
+ set_exit_on_error(1); /* Never reached if exit_on_error == 1 */
+ return 0;
}
break;
case p_resource:
case T_IDENTIFIER:
if (level != 1) {
scan_err1(lc, _("not in resource definition: %s"), lc->str);
- /* NOT REACHED */
+ set_exit_on_error(1); /* Never reached if exit_on_error == 1 */
+ return 0;
}
for (i=0; items[i].name; i++) {
if (strcasecmp(items[i].name, lc->str) == 0) {
Dmsg1 (300, "in T_IDENT got token=%s\n", lex_tok_to_str(token));
if (token != T_EQUALS) {
scan_err1(lc, _("expected an equals, got: %s"), lc->str);
- /* NOT REACHED */
+ set_exit_on_error(1); /* Never reached if exit_on_error == 1 */
+ return 0;
}
}
Dmsg1(300, "calling handler for %s\n", items[i].name);
Dmsg1(300, "Keyword = %s\n", lc->str);
scan_err1(lc, _("Keyword \"%s\" not permitted in this resource.\n"
"Perhaps you left the trailing brace off of the previous resource."), lc->str);
- /* NOT REACHED */
+ set_exit_on_error(1); /* Never reached if exit_on_error == 1 */
+ return 0;
}
break;
default:
scan_err2(lc, _("unexpected token %d %s in resource definition"),
token, lex_tok_to_str(token));
- /* NOT REACHED */
+ set_exit_on_error(1); /* Never reached if exit_on_error == 1 */
+ return 0;
}
break;
default:
scan_err1(lc, _("Unknown parser state %d\n"), state);
- /* NOT REACHED */
+ set_exit_on_error(1); /* Never reached if exit_on_error == 1 */
+ return 0;
}
}
if (state != p_none) {
scan_err0(lc, _("End of conf file reached with unclosed resource."));
+ set_exit_on_error(1); /* Never reached if exit_on_error == 1 */
+ return 0;
}
if (debug_level > 50 && pass == 2) {
int i;
lc = lex_close_file(lc);
}
Dmsg0(300, "Leave parse_config()\n");
+ set_exit_on_error(1);
+ return 1;
}
/*********************************************************************