if ((fd = fopen(fname, "r")) == NULL) {
- berrno be;
- Emsg2(M_ERROR_TERM, 0, _("Cannot open config file %s: %s\n"),
- fname, be.strerror());
- return NULL; /* Never reached if exit_on_error == 1 */
+ return NULL;
}
Dmsg1(2000, "Open config file: %s\n", fname);
nf = (LEX *)malloc(sizeof(LEX));
}
if (B_ISSPACE(ch) || ch == '\n' || ch == L_EOL || ch == '}' || ch == '{' ||
ch == ';' || ch == ',' || ch == '"' || ch == '#') {
+ /* Keep the original LEX so we can print an error if the included file can't be opened. */
+ LEX* lfori = lf;
+
lf->state = lex_none;
lf = lex_open_file(lf, lf->str, NULL);
- if (lf == NULL) {
- return T_ERROR;
- }
+ if (lf == NULL) {
+ berrno be;
+ scan_err2(lfori, _("Cannot open included config file %s: %s\n"),
+ lfori->str, be.strerror());
+ return T_ERROR;
+ }
break;
}
add_str(lf, ch);
static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
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
fputs(dt, stdout);
fputs(msg, stdout); /* print this here to INSURE that it is printed */
fflush(stdout);
-#endif
-#if !defined(HAVE_CONSOLE)
-#if defined(HAVE_CYGWIN) || defined(HAVE_WIN32)
- /* If we don't exit on error, error messages are parsed by UA */
- if (exit_on_error) {
- MessageBox(NULL, msg, "Bacula", MB_OK);
- }
-#endif
#endif
}
char *p = 0;
p[0] = 0; /* generate segmentation violation */
}
- if ((type == M_ERROR_TERM) && exit_on_error) {
+ if (type == M_ERROR_TERM) {
exit(1);
}
}
char *p = 0;
p[0] = 0; /* generate segmentation violation */
}
- if ((type == M_ERROR_TERM) && exit_on_error) {
+ if (type == M_ERROR_TERM) {
exit(1);
}
}
Qmsg(jcr, type, mtime, "%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
+ * Parse configuration file
*
* Return 0 if reading failed, 1 otherwise
*/
int
-parse_config(const char *cf, int exit_on_error)
+parse_config(const char *cf, LEX_ERROR_HANDLER *scan_error)
{
- set_exit_on_error(exit_on_error);
LEX *lc = NULL;
int token, i, pass;
int res_type = 0;
Dmsg0(900, "Enter parse_config()\n");
for (pass=1; pass <= 2; pass++) {
Dmsg1(900, "parse_config pass %d\n", pass);
- if ((lc = lex_open_file(lc, cf, NULL)) == NULL) {
- set_exit_on_error(1); /* Never reached if exit_on_error == 1 */
- return 0;
+ if ((lc = lex_open_file(lc, cf, scan_error)) == NULL) {
+ lc = (LEX *)malloc(sizeof(LEX));
+ memset(lc, 0, sizeof(LEX));
+ lc->scan_error = scan_error;
+ berrno be;
+ scan_err2(lc, _("Cannot open config file %s: %s\n"),
+ lc->str, be.strerror());
+ free(lc);
+ return 0;
}
while ((token=lex_get_token(lc, T_ALL)) != T_EOF) {
Dmsg1(900, "parse got token=%s\n", lex_tok_to_str(token));
}
if (token != T_IDENTIFIER) {
scan_err1(lc, _("Expected a Resource name identifier, got: %s"), lc->str);
- set_exit_on_error(1); /* Never reached if exit_on_error == 1 */
return 0;
}
for (i=0; resources[i].name; i++)
}
if (state == p_none) {
scan_err1(lc, _("expected resource name, got: %s"), lc->str);
- set_exit_on_error(1); /* Never reached if exit_on_error == 1 */
- return 0;
+ return 0;
}
break;
case p_resource:
case T_IDENTIFIER:
if (level != 1) {
scan_err1(lc, _("not in resource definition: %s"), lc->str);
- set_exit_on_error(1); /* Never reached if exit_on_error == 1 */
return 0;
}
for (i=0; items[i].name; i++) {
Dmsg1 (900, "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);
- set_exit_on_error(1); /* Never reached if exit_on_error == 1 */
return 0;
}
}
Dmsg1(900, "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);
- 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));
- 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);
- 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 >= 900 && pass == 2) {
lc = lex_close_file(lc);
}
Dmsg0(900, "Leave parse_config()\n");
- set_exit_on_error(1);
return 1;
}
/* Configuration routines */
-int parse_config(const char *cf, int exit_on_error = 1);
+int parse_config(const char *cf, LEX_ERROR_HANDLER *scan_error = NULL);
void free_config_resources(void);
RES **save_config_resources(void);
RES **new_res_head();
void free_msgs_res (MSGS *msgs);
void dequeue_messages (JCR *jcr);
void set_trace (int trace_flag);
-void set_exit_on_error (int value);
/* bnet_server.c */
void bnet_thread_server(dlist *addr, int max_clients, workq_t *client_wq,
BSR *bsr = root_bsr;
Dmsg1(200, "Enter parse_bsf %s\n", fname);
- lc = lex_open_file(lc, fname, s_err);
+ if ((lc = lex_open_file(lc, fname, s_err)) == NULL) {
+ berrno be;
+ Emsg2(M_ERROR_TERM, 0, _("Cannot open bootstrap file %s: %s\n"),
+ fname, be.strerror());
+ }
lc->caller_ctx = (void *)jcr;
while ((token=lex_get_token(lc, T_ALL)) != T_EOF) {
Dmsg1(200, "parse got token=%s\n", lex_tok_to_str(token));
26-04-2005 :
+ - Improve error handling when reading configuration file.
- Fixes compile error with unicode-enabled wxWidgets.
25-04-2005 :
}
}
+wxString errmsg;
+
+/*
+ * Format a scanner error message
+ */
+static void scan_err(const char *file, int line, LEX *lc, const char *msg, ...)
+{
+ va_list arg_ptr;
+ char buf[MAXSTRING];
+ char more[MAXSTRING];
+ char err[MAXSTRING];
+
+ va_start(arg_ptr, msg);
+ bvsnprintf(buf, sizeof(buf), msg, arg_ptr);
+ va_end(arg_ptr);
+
+ if (lc->line_no > lc->begin_line_no) {
+ bsnprintf(more, sizeof(more),
+ _("Problem probably begins at line %d.\n"), lc->begin_line_no);
+ } else {
+ more[0] = 0;
+ }
+ bsnprintf(err, sizeof(err), _("Config error: %s\n"
+" : line %d, col %d of file %s\n%s\n%s"),
+ buf, lc->line_no, lc->col_no, lc->fname, lc->line, more);
+ errmsg << err;
+}
+
wxString console_thread::LoadConfig(wxString configfile) {
if (!inited) {
InitLib();
init_msg(NULL, msgs);
init_console_msg(console_thread::working_dir);
- if (!parse_config(configfile.c_str(), 0)) {
+ errmsg = "";
+ if (!parse_config(configfile.c_str(), &scan_err)) {
configloaded = false;
- wxFile file(console_thread::working_dir + "/wx-console.conmsg");
- if (!file.IsOpened())
- return "Unable to retrieve error message.";
- wxString err = "";
- wxChar buffer[513];
- off_t len;
- while ((len = file.Read(buffer, 512)) > -1) {
- buffer[len] = (wxChar)0;
- err += buffer;
- if (file.Eof())
- break;
- }
- file.Close();
term_msg();
- wxRemoveFile(console_thread::working_dir + "/wx-console.conmsg");
- return err;
+ return errmsg;
}
term_msg();