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;
#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) {
/* 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.");
}
*
*/
+#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,
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 */
{
m_berrno = errnum;
}
+
+#endif /* BERRNO_H */