]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/wx-console/console_thread.cpp
wx-console: Improve error handling when reading configuration file.
[bacula/bacula] / bacula / src / wx-console / console_thread.cpp
index 705033f05378de41601ad8acf94ce672c25c446a..0eed96f451046da1ab2093e8775f6e94d3f91ee4 100644 (file)
@@ -51,6 +51,16 @@ int authenticate_director(JCR *jcr, DIRRES *director, CONRES *cons);
 
 bool console_thread::inited = false;
 bool console_thread::configloaded = false;
+wxString console_thread::working_dir = ".";
+
+void console_thread::SetWorkingDirectory(wxString w_dir) {
+   if ((w_dir.Last() == '/') || (w_dir.Last() == '\\')) {
+      console_thread::working_dir = w_dir.Mid(0, w_dir.Length()-1);
+   }
+   else {
+      console_thread::working_dir = w_dir;
+   }
+}
 
 void console_thread::InitLib() {
    if (WSA_Init() != 0) {
@@ -62,6 +72,7 @@ void console_thread::InitLib() {
    init_stack_dump();
    my_name_is(0, NULL, "wx-console");
    //textdomain("bacula-console");
+   working_directory = console_thread::working_dir;
    
    inited = true;
 }
@@ -74,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();
@@ -94,30 +133,17 @@ wxString console_thread::LoadConfig(wxString configfile) {
    }
    
    init_msg(NULL, msgs);
-   init_console_msg(".");
+   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("./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("./wx-console.conmsg");
-      return err;
+      return errmsg;
    }
    
    term_msg();
-   wxRemoveFile("./wx-console.conmsg");
+   wxRemoveFile(console_thread::working_dir + "/wx-console.conmsg");
    init_msg(NULL, NULL);
    
    configloaded = true;