]> git.ipfire.org Git - thirdparty/bacula.git/commitdiff
Extend 'berrno' class with Bacula-specific error handling
authorMichal Rakowski <michal.rakowski@baculasystems.com>
Fri, 15 Oct 2021 15:52:52 +0000 (17:52 +0200)
committerEric Bollengier <eric@baculasystems.com>
Thu, 14 Sep 2023 11:56:56 +0000 (13:56 +0200)
bacula/src/lib/berrno.c
bacula/src/lib/berrno.h

index 746a134fc5028a9d116c4928196c1706d53340f7..7ddf4d88a047429ee31d53335c8c45eb08acdbba 100644 (file)
@@ -37,10 +37,22 @@ extern int num_execvp_errors;
 extern int execvp_errors[];
 #endif
 
+const char *berrno::get_berr_msg()
+{
+   for (uint32_t i=0; i<berror_msgs_map_size; i++) {
+      if (m_berrno == berror_msgs_map[i].berrno){
+          return berror_msgs_map[i].msg;
+      }
+   }
+
+   return "Unknown Error";
+}
+
 const char *berrno::bstrerror()
 {
    *m_buf = 0;
 #ifdef HAVE_WIN32
+   /* Handle Windows error */
    if (m_berrno & (b_errno_win32 | b_errno_WSA)) {
       format_win32_message();
       return (const char *)m_buf;
@@ -48,6 +60,13 @@ const char *berrno::bstrerror()
 #else
    int stat = 0;
 
+   /* Handle Bacula-specific error */
+   if (m_berrno & b_bacula_errno) {
+      pm_strcpy(m_buf, get_berr_msg());
+      return m_buf;
+   }
+
+   /* Handle 'exit' error */
    if (m_berrno & b_errno_exit) {
       stat = (m_berrno & ~b_errno_exit);       /* remove bit */
       if (stat == 0) {
@@ -67,13 +86,15 @@ const char *berrno::bstrerror()
          /* If we drop out here, m_berrno is set to an execvp errno */
       }
    }
+
+   /* Handle 'signal' error */
    if (m_berrno & b_errno_signal) {
       stat = (m_berrno & ~b_errno_signal);        /* remove bit */
       Mmsg(m_buf, _("Child died from signal %d: %s"), stat, get_signal_name(stat));
       return m_buf;
    }
 #endif
-   /* Normal errno */
+   /* Handle normal errno */
    if (b_strerror(m_berrno, m_buf, sizeof_pool_memory(m_buf)) < 0) {
       return _("Invalid errno. No error message possible.");
    }
index 5d0fda288287de80ad02b144cc7d35b4e285d465..3cc6c984a1a309c2947c87c0ad69e2cc67a9b2a1 100644 (file)
@@ -22,6 +22,9 @@
  *
  */
 
+#ifndef BERRNO_H
+#define BERRNO_H
+
 /*
  * Extra bits set to interpret errno value differently from errno
  */
 #endif
 #define b_errno_exit   (1<<28)        /* child exited, exit code returned */
 #define b_errno_signal (1<<27)        /* child died, signal code returned */
+#define b_bacula_errno (1<<26)        /* internal Bacula error
+                                         (e.g. script to be run is out of allowed paths) */
+
+
+/* Set 'bacula error' bit flag for each Bacula-specific error */
+static const int berr_not_allowed_path = 1 | b_bacula_errno;
+static const int berr_not_allowed_char = 2 | b_bacula_errno;
+
+/* Helper struct to map error code to message */
+struct berror_msg {
+   const int berrno;
+   const char *msg;
+};
+
+static struct berror_msg berror_msgs_map[] = {
+   { berr_not_allowed_path,       "Not in allowed paths" },
+   { berr_not_allowed_char,       "Contains not allowed character" },
+};
+
+const int berror_msgs_map_size = sizeof(berror_msgs_map) / sizeof(berror_msg);
 
 /*
  * A more generalized way of handling errno that works with Unix, Windows,
@@ -59,6 +82,7 @@ public:
    void set_errno(int errnum);
    int code() { return m_berrno & ~(b_errno_exit|b_errno_signal); }
    int code(int stat) { return stat & ~(b_errno_exit|b_errno_signal); }
+   const char *get_berr_msg();
 };
 
 /* Constructor */
@@ -86,3 +110,5 @@ inline void berrno::set_errno(int errnum)
 {
    m_berrno = errnum;
 }
+
+#endif /* BERRNO_H */