]> git.sur5r.net Git - bacula/bacula/commitdiff
wx-console: Improve error handling when reading configuration file.
authorNicolas Boichat <nicolas@boichat.ch>
Tue, 26 Apr 2005 21:21:35 +0000 (21:21 +0000)
committerNicolas Boichat <nicolas@boichat.ch>
Tue, 26 Apr 2005 21:21:35 +0000 (21:21 +0000)
git-svn-id: https://bacula.svn.sourceforge.net/svnroot/bacula/trunk@1963 91ce42f0-d328-0410-95d8-f526ca767f89

bacula/src/lib/lex.c
bacula/src/lib/message.c
bacula/src/lib/parse_conf.c
bacula/src/lib/parse_conf.h
bacula/src/lib/protos.h
bacula/src/stored/parse_bsr.c
bacula/src/wx-console/CHANGELOG
bacula/src/wx-console/console_thread.cpp

index c73016e138854b5052698daa83a16d9f0a84e7f3..714b0f8a42f5d310ed5441d1f7926edf51d05c7b 100644 (file)
@@ -135,10 +135,7 @@ LEX *lex_open_file(LEX *lf, const char *filename, LEX_ERROR_HANDLER *scan_error)
 
 
    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));
@@ -488,11 +485,17 @@ lex_get_token(LEX *lf, int expect)
          }
          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);
index 65079394b2f2ad0db917b7543ff2c2e01a72a27a..2e14810576a36dffb21e9d188d239444d31c0f8c 100755 (executable)
@@ -91,8 +91,6 @@ static bool trace = false;
 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
@@ -596,14 +594,6 @@ void dispatch_message(JCR *jcr, int type, time_t mtime, char *msg)
        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
     }
 
@@ -982,7 +972,7 @@ e_msg(const char *file, int line, int type, int level, const char *fmt,...)
        char *p = 0;
        p[0] = 0;                     /* generate segmentation violation */
     }
-    if ((type == M_ERROR_TERM) && exit_on_error) {
+    if (type == M_ERROR_TERM) {
        exit(1);
     }
 }
@@ -1079,7 +1069,7 @@ Jmsg(JCR *jcr, int type, time_t mtime, const char *fmt,...)
        char *p = 0;
        p[0] = 0;                     /* generate segmentation violation */
     }
-    if ((type == M_ERROR_TERM) && exit_on_error) {
+    if (type == M_ERROR_TERM) {
        exit(1);
     }
 }
@@ -1316,10 +1306,3 @@ void q_msg(const char *file, int line, JCR *jcr, int type, time_t mtime, const c
    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;
-}
index ae9fe194fafd32c83169c6585d62b72642ef9ec6..5213d73aa76a7569fd86ca85025b44fc4bc78fdc 100755 (executable)
@@ -734,14 +734,13 @@ enum parse_state {
 
 /*********************************************************************
  *
- *     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;
@@ -755,9 +754,15 @@ parse_config(const char *cf, int exit_on_error)
    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));
@@ -768,7 +773,6 @@ parse_config(const char *cf, int exit_on_error)
            }
            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++)
@@ -781,8 +785,7 @@ parse_config(const char *cf, int exit_on_error)
               }
            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:
@@ -793,7 +796,6 @@ parse_config(const char *cf, int exit_on_error)
            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++) {
@@ -805,7 +807,6 @@ parse_config(const char *cf, int exit_on_error)
                         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;
                        }
                     }
@@ -821,7 +822,6 @@ parse_config(const char *cf, int exit_on_error)
                   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;
@@ -839,19 +839,16 @@ parse_config(const char *cf, int exit_on_error)
            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) {
@@ -863,7 +860,6 @@ parse_config(const char *cf, int exit_on_error)
       lc = lex_close_file(lc);
    }
    Dmsg0(900, "Leave parse_config()\n");
-   set_exit_on_error(1);
    return 1;
 }
 
index 46f08f2eec2890ffd005fffb3e8db63e0d374400..af81738e579bc1e04a567797c07736a1c435d36f 100644 (file)
@@ -96,7 +96,7 @@ union CURES {
 
 
 /* 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();
index 1ca895a29dcb4d4614bb7407c61a27cd28a4db4a..ba13ad44bfc26ddcb65a6cda49a083559d9b4368 100644 (file)
@@ -163,7 +163,6 @@ void       init_console_msg      (const char *wd);
 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,
index 69df50cc4fd61e514ff7275be0c74097f676503d..4aa77a03f1f8bf505322733ed1ce5d678e994019 100755 (executable)
@@ -129,7 +129,11 @@ BSR *parse_bsr(JCR *jcr, char *fname)
    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));
index 408838d0842dadcc20daedeb96907e04daf09161..6816822d8e06c67b33bf83a6cce1939cc9ec8605 100644 (file)
@@ -1,4 +1,5 @@
 26-04-2005 :
+ - Improve error handling when reading configuration file.
  - Fixes compile error with unicode-enabled wxWidgets.
 
 25-04-2005 :
index ba51097f30cf45be5e930555a99f868370b2a87b..0eed96f451046da1ab2093e8775f6e94d3f91ee4 100644 (file)
@@ -85,6 +85,34 @@ void console_thread::FreeLib() {
    }
 }
 
+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();
@@ -107,24 +135,11 @@ wxString console_thread::LoadConfig(wxString configfile) {
    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();