]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/baconfig.h
Restore win32 dir from Branch-5.2 and update it
[bacula/bacula] / bacula / src / baconfig.h
index cc258f4404fc21d6acd997df625ff9da62c2932e..ba5db72ba0aa8cec7f5f0d7eb3ddd160ce188b51 100644 (file)
@@ -1,34 +1,24 @@
 /*
-   Bacula® - The Network Backup Solution
-
-   Copyright (C) 2000-2010 Free Software Foundation Europe e.V.
-
-   The main author of Bacula is Kern Sibbald, with contributions from
-   many others, a complete list can be found in the file AUTHORS.
-   This program is Free Software; you can redistribute it and/or
-   modify it under the terms of version three of the GNU Affero General Public
-   License as published by the Free Software Foundation and included
-   in the file LICENSE.
-
-   This program is distributed in the hope that it will be useful, but
-   WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-   General Public License for more details.
-
-   You should have received a copy of the GNU Affero General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-   02110-1301, USA.
-
-   Bacula® is a registered trademark of Kern Sibbald.
-   The licensor of Bacula is the Free Software Foundation Europe
-   (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich,
-   Switzerland, email:ftf@fsfeurope.org.
+   Bacula(R) - The Network Backup Solution
+
+   Copyright (C) 2000-2017 Kern Sibbald
+
+   The original author of Bacula is Kern Sibbald, with contributions
+   from many others, a complete list can be found in the file AUTHORS.
+
+   You may use this file and others of this release according to the
+   license defined in the LICENSE file, which includes the Affero General
+   Public License, v3.0 ("AGPLv3") and some additional permissions and
+   terms pursuant to its AGPLv3 Section 7.
+
+   This notice must be preserved when any source code is
+   conveyed and/or propagated.
+
+   Bacula(R) is a registered trademark of Kern Sibbald.
 */
-/**
+/*
  * General header file configurations that apply to
  * all daemons.  System dependent stuff goes here.
- *
  */
 
 
@@ -58,6 +48,8 @@
 #define ioctl_req_t int
 #endif
 
+#define MANUAL_AUTH_URL "http://www.bacula.org/rel-manual/en/problems/Bacula_Frequently_Asked_Que.html"
 #ifdef PROTOTYPES
 # define __PROTO(p)     p
 #else
 
 #ifdef DEBUG
 #define ASSERT(x) if (!(x)) { \
-   char *jcr = NULL; \
+   char *tjcr = NULL; \
    Emsg1(M_ERROR, 0, _("Failed ASSERT: %s\n"), #x); \
    Pmsg1(000, _("Failed ASSERT: %s\n"), #x); \
-   jcr[0] = 0; }
+   tjcr[0] = 0; }
+
+#define ASSERT2(x,y) if (!(x)) { \
+   set_assert_msg(__FILE__, __LINE__, y); \
+   Emsg1(M_ERROR, 0, _("Failed ASSERT: %s\n"), #x); \
+   Pmsg1(000, _("Failed ASSERT: %s\n"), #x); \
+   char *tjcr = NULL; \
+   tjcr[0] = 0; }
 #else
 #define ASSERT(x)
+#define ASSERT2(x, y)
+#endif
+
+#ifdef DEVELOPER
+#define ASSERTD(x, y) if (!(x)) { \
+   set_assert_msg(__FILE__, __LINE__, y); \
+   Emsg1(M_ERROR, 0, _("Failed ASSERT: %s\n"), #x); \
+   Pmsg1(000, _("Failed ASSERT: %s\n"), #x); \
+   char *jcr = NULL; \
+   jcr[0] = 0; }
+#else
+#define ASSERTD(x, y)
 #endif
 
 /* Allow printing of NULL pointers */
@@ -209,6 +220,28 @@ void InitWinAPIWrapper();
 #define B_ANSI_LABEL   1
 #define B_IBM_LABEL    2
 
+/*
+ * Device types
+ * If you update this table, be sure to add an
+ *  entry in prt_dev_types[] in stored/dev.c
+ *  This number is stored in the Catalog as VolType or VolParts, do not change.
+ */
+enum {
+   B_FILE_DEV = 1,
+   B_TAPE_DEV = 2,
+   B_DVD_DEV  = 3,
+   B_FIFO_DEV = 4,
+   B_VTAPE_DEV= 5,                    /* change to B_TAPE_DEV after init */
+   B_FTP_DEV =  6,
+   B_VTL_DEV =  7,                    /* Virtual tape library device */
+   B_ADATA_DEV = 8,                   /* Aligned data Data file */
+   B_ALIGNED_DEV = 9,                 /* Aligned data Meta file */
+   B_NULL_DEV  = 11,                  /* /dev/null for testing */
+   B_VALIGNED_DEV = 12,               /* Virtual for Aligned device (not stored) */
+   B_VDEDUP_DEV = 13,                 /* Virtual for Dedup device (not stored) */
+   B_CLOUD_DEV  = 14                  /* New Cloud device type (available in 8.8) */
+};
+
 /**
  * Actions on purge (bit mask)
  */
@@ -220,6 +253,8 @@ void InitWinAPIWrapper();
 /* Size of crypto length stored at head of crypto buffer. Do NOT change! */
 #define CRYPTO_LEN_SIZE ((int)sizeof(uint32_t))
 
+/* Plugin Features */
+#define PLUGIN_FEATURE_RESTORELISTFILES "RestoreListFiles"
 
 /**
  * This is for dumb compilers/libraries like Solaris. Linux GCC
@@ -231,6 +266,7 @@ void InitWinAPIWrapper();
 #define B_ISALPHA(c) (isascii((int)(c)) && isalpha((int)(c)))
 #define B_ISUPPER(c) (isascii((int)(c)) && isupper((int)(c)))
 #define B_ISDIGIT(c) (isascii((int)(c)) && isdigit((int)(c)))
+#define B_ISXDIGIT(c) (isascii((int)(c)) && isxdigit((int)(c)))
 
 /** For multiplying by 10 with shift and addition */
 #define B_TIMES10(d) ((d<<3)+(d<<1))
@@ -309,7 +345,31 @@ typedef off_t     boffset_t;
 void b_memset(const char *file, int line, void *mem, int val, size_t num);
 #endif
 
+/* we look for simple debug level 
+ * then finally we check if tags are set on debug_level and lvl
+ */
+
+/*
+  lvl   |   debug_level  | tags  | result
+ -------+----------------+-------+-------
+  0     |   0            |       |  OK
+  T1|0  |   0            |       |  NOK
+  T1|0  |   0            |  T1   |  OK
+  10    |   0            |       |  NOK
+  10    |   10           |       |  OK
+  T1|10 |   10           |       |  NOK
+  T1|10 |   10           |  T1   |  OK
+  T1|10 |   10           |  T2   |  NOK
+ */
 
+/* The basic test is working because tags are on high bits */
+#if 1
+#define chk_dbglvl(lvl) ((lvl) <= debug_level ||                     \
+    (((lvl) & debug_level_tags) && (((lvl) & ~DT_ALL) <= debug_level)))
+#else
+/* Alain's macro for debug */
+#define chk_dbglvl(lvl) (((lvl) & debug_level_tags) || (((lvl) & ~DT_ALL) <= debug_level))
+#endif
 /**
  * The digit following Dmsg and Emsg indicates the number of substitutions in
  * the message string. We need to do this kludge because non-GNU compilers
@@ -317,20 +377,20 @@ void b_memset(const char *file, int line, void *mem, int val, size_t num);
  */
 /** Debug Messages that are printed */
 #ifdef DEBUG
-#define Dmsg0(lvl, msg)             if ((lvl)<=debug_level) d_msg(__FILE__, __LINE__, lvl, msg)
-#define Dmsg1(lvl, msg, a1)         if ((lvl)<=debug_level) d_msg(__FILE__, __LINE__, lvl, msg, a1)
-#define Dmsg2(lvl, msg, a1, a2)     if ((lvl)<=debug_level) d_msg(__FILE__, __LINE__, lvl, msg, a1, a2)
-#define Dmsg3(lvl, msg, a1, a2, a3) if ((lvl)<=debug_level) d_msg(__FILE__, __LINE__, lvl, msg, a1, a2, a3)
-#define Dmsg4(lvl, msg, arg1, arg2, arg3, arg4) if ((lvl)<=debug_level) d_msg(__FILE__, __LINE__, lvl, msg, arg1, arg2, arg3, arg4)
-#define Dmsg5(lvl, msg, a1, a2, a3, a4, a5) if ((lvl)<=debug_level) d_msg(__FILE__, __LINE__, lvl, msg, a1, a2, a3, a4, a5)
-#define Dmsg6(lvl, msg, a1, a2, a3, a4, a5, a6) if ((lvl)<=debug_level) d_msg(__FILE__, __LINE__, lvl, msg, a1, a2, a3, a4, a5, a6)
-#define Dmsg7(lvl, msg, a1, a2, a3, a4, a5, a6, a7) if ((lvl)<=debug_level) d_msg(__FILE__, __LINE__, lvl, msg, a1, a2, a3, a4, a5, a6, a7)
-#define Dmsg8(lvl, msg, a1, a2, a3, a4, a5, a6, a7, a8) if ((lvl)<=debug_level) d_msg(__FILE__, __LINE__, lvl, msg, a1, a2, a3, a4, a5, a6, a7, a8)
-#define Dmsg9(lvl,msg,a1,a2,a3,a4,a5,a6,a7,a8,a9) if ((lvl)<=debug_level) d_msg(__FILE__,__LINE__,lvl,msg,a1,a2,a3,a4,a5,a6,a7,a8,a9)
-#define Dmsg10(lvl,msg,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10) if ((lvl)<=debug_level) d_msg(__FILE__,__LINE__,lvl,msg,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10)
-#define Dmsg11(lvl,msg,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11) if ((lvl)<=debug_level) d_msg(__FILE__,__LINE__,lvl,msg,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11)
-#define Dmsg12(lvl,msg,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12) if ((lvl)<=debug_level) d_msg(__FILE__,__LINE__,lvl,msg,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12)
-#define Dmsg13(lvl,msg,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13) if ((lvl)<=debug_level) d_msg(__FILE__,__LINE__,lvl,msg,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13)
+#define Dmsg0(lvl, msg)             if (chk_dbglvl(lvl)) d_msg(__FILE__, __LINE__, lvl, msg)
+#define Dmsg1(lvl, msg, a1)         if (chk_dbglvl(lvl)) d_msg(__FILE__, __LINE__, lvl, msg, a1)
+#define Dmsg2(lvl, msg, a1, a2)     if (chk_dbglvl(lvl)) d_msg(__FILE__, __LINE__, lvl, msg, a1, a2)
+#define Dmsg3(lvl, msg, a1, a2, a3) if (chk_dbglvl(lvl)) d_msg(__FILE__, __LINE__, lvl, msg, a1, a2, a3)
+#define Dmsg4(lvl, msg, arg1, arg2, arg3, arg4) if (chk_dbglvl(lvl)) d_msg(__FILE__, __LINE__, lvl, msg, arg1, arg2, arg3, arg4)
+#define Dmsg5(lvl, msg, a1, a2, a3, a4, a5) if (chk_dbglvl(lvl)) d_msg(__FILE__, __LINE__, lvl, msg, a1, a2, a3, a4, a5)
+#define Dmsg6(lvl, msg, a1, a2, a3, a4, a5, a6) if (chk_dbglvl(lvl)) d_msg(__FILE__, __LINE__, lvl, msg, a1, a2, a3, a4, a5, a6)
+#define Dmsg7(lvl, msg, a1, a2, a3, a4, a5, a6, a7) if (chk_dbglvl(lvl)) d_msg(__FILE__, __LINE__, lvl, msg, a1, a2, a3, a4, a5, a6, a7)
+#define Dmsg8(lvl, msg, a1, a2, a3, a4, a5, a6, a7, a8) if (chk_dbglvl(lvl)) d_msg(__FILE__, __LINE__, lvl, msg, a1, a2, a3, a4, a5, a6, a7, a8)
+#define Dmsg9(lvl,msg,a1,a2,a3,a4,a5,a6,a7,a8,a9) if (chk_dbglvl(lvl)) d_msg(__FILE__,__LINE__,lvl,msg,a1,a2,a3,a4,a5,a6,a7,a8,a9)
+#define Dmsg10(lvl,msg,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10) if (chk_dbglvl(lvl)) d_msg(__FILE__,__LINE__,lvl,msg,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10)
+#define Dmsg11(lvl,msg,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11) if (chk_dbglvl(lvl)) d_msg(__FILE__,__LINE__,lvl,msg,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11)
+#define Dmsg12(lvl,msg,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12) if (chk_dbglvl(lvl)) d_msg(__FILE__,__LINE__,lvl,msg,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12)
+#define Dmsg13(lvl,msg,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13) if (chk_dbglvl(lvl)) d_msg(__FILE__,__LINE__,lvl,msg,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13)
 #else
 #define Dmsg0(lvl, msg)
 #define Dmsg1(lvl, msg, a1)
@@ -413,15 +473,17 @@ void b_memset(const char *file, int line, void *mem, int val, size_t num);
 #define Jmsg4(jcr, typ, lvl, msg, a1, a2, a3, a4) j_msg(__FILE__, __LINE__, jcr, typ, lvl, msg, a1, a2, a3, a4)
 #define Jmsg5(jcr, typ, lvl, msg, a1, a2, a3, a4, a5) j_msg(__FILE__, __LINE__, jcr, typ, lvl, msg, a1, a2, a3, a4, a5)
 #define Jmsg6(jcr, typ, lvl, msg, a1, a2, a3, a4, a5, a6) j_msg(__FILE__, __LINE__, jcr, typ, lvl, msg, a1, a2, a3, a4, a5, a6)
+#define Jmsg7(jcr, typ, lvl, msg, a1, a2, a3, a4, a5, a6, a7) j_msg(__FILE__, __LINE__, jcr, typ, lvl, msg, a1, a2, a3, a4, a5, a6, a7)
+#define Jmsg8(jcr, typ, lvl, msg, a1, a2, a3, a4, a5, a6, a7, a8) j_msg(__FILE__, __LINE__, jcr, typ, lvl, msg, a1, a2, a3, a4, a5, a6, a7, a8)
 
 /** Queued Job Error Messages that are delivered according to the message resource */
-#define Qmsg0(jcr, typ, lvl, msg)             q_msg(__FILE__, __LINE__, jcr, typ, lvl, msg)
-#define Qmsg1(jcr, typ, lvl, msg, a1)         q_msg(__FILE__, __LINE__, jcr, typ, lvl, msg, a1)
-#define Qmsg2(jcr, typ, lvl, msg, a1, a2)     q_msg(__FILE__, __LINE__, jcr, typ, lvl, msg, a1, a2)
-#define Qmsg3(jcr, typ, lvl, msg, a1, a2, a3) q_msg(__FILE__, __LINE__, jcr, typ, lvl, msg, a1, a2, a3)
-#define Qmsg4(jcr, typ, lvl, msg, a1, a2, a3, a4) q_msg(__FILE__, __LINE__, jcr, typ, lvl, msg, a1, a2, a3, a4)
-#define Qmsg5(jcr, typ, lvl, msg, a1, a2, a3, a4, a5) q_msg(__FILE__, __LINE__, jcr, typ, lvl, msg, a1, a2, a3, a4, a5)
-#define Qmsg6(jcr, typ, lvl, msg, a1, a2, a3, a4, a5, a6) q_msg(__FILE__, __LINE__, jcr, typ, lvl, msg, a1, a2, a3, a4, a5, a6)
+#define Qmsg0(jcr, typ, mtime, msg)             q_msg(__FILE__, __LINE__, jcr, typ, mtime, msg)
+#define Qmsg1(jcr, typ, mtime, msg, a1)         q_msg(__FILE__, __LINE__, jcr, typ, mtime, msg, a1)
+#define Qmsg2(jcr, typ, mtime, msg, a1, a2)     q_msg(__FILE__, __LINE__, jcr, typ, mtime, msg, a1, a2)
+#define Qmsg3(jcr, typ, mtime, msg, a1, a2, a3) q_msg(__FILE__, __LINE__, jcr, typ, mtime, msg, a1, a2, a3)
+#define Qmsg4(jcr, typ, mtime, msg, a1, a2, a3, a4) q_msg(__FILE__, __LINE__, jcr, typ, mtime, msg, a1, a2, a3, a4)
+#define Qmsg5(jcr, typ, mtime, msg, a1, a2, a3, a4, a5) q_msg(__FILE__, __LINE__, jcr, typ, mtime, msg, a1, a2, a3, a4, a5)
+#define Qmsg6(jcr, typ, mtime, msg, a1, a2, a3, a4, a5, a6) q_msg(__FILE__, __LINE__, jcr, typ, mtime, msg, a1, a2, a3, a4, a5, a6)
 
 
 /** Memory Messages that are edited into a Pool Memory buffer */
@@ -443,15 +505,45 @@ int  Mmsg(POOLMEM **msgbuf, const char *fmt,...);
 int  Mmsg(POOLMEM *&msgbuf, const char *fmt,...);
 int  Mmsg(POOL_MEM &msgbuf, const char *fmt,...);
 
+#define MmsgD0(level, msgbuf, fmt) \
+   { Mmsg(msgbuf, fmt); Dmsg1(level, "%s", msgbuf); }
+#define MmsgD1(level, msgbuf, fmt, a1) \
+   { Mmsg(msgbuf, fmt, a1); Dmsg1(level, "%s", msgbuf); }
+#define MmsgD2(level, msgbuf, fmt, a1, a2) \
+   { Mmsg(msgbuf, fmt, a1, a2); Dmsg1(level, "%s", msgbuf); }
+#define MmsgD3(level, msgbuf, fmt, a1, a2, a3) \
+   { Mmsg(msgbuf, fmt, a1, a2, a3); Dmsg1(level, "%s", msgbuf); }
+#define MmsgD4(level, msgbuf, fmt, a1, a2, a3, a4) \
+   { Mmsg(msgbuf, fmt, a1, a2, a3, a4); Dmsg1(level, "%s", msgbuf); }
+#define MmsgD5(level, msgbuf, fmt, a1, a2, a3, a4, a5) \
+   { Mmsg(msgbuf, fmt, a1, a2, a3, a4, a5); Dmsg1(level, "%s", msgbuf); }
+#define MmsgD6(level, msgbuf, fmt, a1, a2, a3, a4, a5, a6) \
+   { Mmsg(msgbuf, fmt, a1, a2, a3, a4, a5, a6); Dmsg1(level, "%s", msgbuf); }
+
+#define MmsgT0(level, msgbuf, fmt) \
+   { Mmsg(msgbuf, fmt); Tmsg1(level, "%s", msgbuf); }
+#define MmsgT1(level, msgbuf, fmt, a1) \
+   { Mmsg(msgbuf, fmt, a1); Tmsg1(level, "%s", msgbuf); }
+#define MmsgT2(level, msgbuf, fmt, a1, a2) \
+   { Mmsg(msgbuf, fmt, a1, a2); Tmsg1(level, "%s", msgbuf); }
+#define MmsgT3(level, msgbuf, fmt, a1, a2, a3) \
+   { Mmsg(msgbuf, fmt, a1, a2, a3); Tmsg1(level, "%s", msgbuf); }
+#define MmsgT4(level, msgbuf, fmt, a1, a2, a3, a4) \
+   { Mmsg(msgbuf, fmt, a1, a2, a3, a4); Tmsg1(level, "%s", msgbuf); }
+#define MmsgT5(level, msgbuf, fmt, a1, a2, a3, a4, a5) \
+   { Mmsg(msgbuf, fmt, a1, a2, a3, a4, a5); Tmsg1(level, "%s", msgbuf); }
+#define MmsgT6(level, msgbuf, fmt, a1, a2, a3, a4, a5, a6) \
+   { Mmsg(msgbuf, fmt, a1, a2, a3, a4, a5, a6); Tmsg1(level, "%s", msgbuf); }
 
 class JCR;
-void d_msg(const char *file, int line, int level, const char *fmt,...);
+void d_msg(const char *file, int line, int64_t level, const char *fmt,...);
 void p_msg(const char *file, int line, int level, const char *fmt,...);
 void e_msg(const char *file, int line, int type, int level, const char *fmt,...);
 void j_msg(const char *file, int line, JCR *jcr, int type, utime_t mtime, const char *fmt,...);
 void q_msg(const char *file, int line, JCR *jcr, int type, utime_t mtime, const char *fmt,...);
 int  m_msg(const char *file, int line, POOLMEM **msgbuf, const char *fmt,...);
 int  m_msg(const char *file, int line, POOLMEM *&pool_buf, const char *fmt, ...);
+void t_msg(const char *file, int line, int64_t level, const char *fmt,...);
 
 
 /** Use our strdup with smartalloc */
@@ -488,6 +580,9 @@ int  m_msg(const char *file, int line, POOLMEM *&pool_buf, const char *fmt, ...)
 /** Macro to simplify free/reset pointers */
 #define bfree_and_null(a) do{if(a){free(a); (a)=NULL;}} while(0)
 
+/* Use bfopen instead of fopen */
+#define fopen(path, mode) bfopen(path, mode)
+
 /**
  * Replace codes needed in both file routines and non-file routines
  * Job replace codes -- in "replace"
@@ -507,55 +602,26 @@ int  m_msg(const char *file, int line, POOLMEM *&pool_buf, const char *fmt, ...)
  *               OS Dependent defines
  * ============================================================= 
  */
-
-#ifndef HAVE_FSEEKO
-/* Bad news. This OS cannot handle 64 bit fseeks and ftells */
-#define fseeko fseek
-#define ftello ftell
-#endif
-
 #if defined (__digital__) && defined (__unix__)
-/* Tru64 - it does have fseeko and ftello , but since ftell/fseek are also 64 bit */
-/* take this 'shortcut' */
-#define fseeko fseek
-#define ftello ftell
-#endif
-
-
-#ifdef HAVE_SUN_OS
-   /**
-    * On Solaris 2.5, threads are not timesliced by default, so we need to
-    * explictly increase the conncurrency level.
-    */
-#include <thread.h>
-#define set_thread_concurrency(x)  thr_setconcurrency(x)
-extern int thr_setconcurrency(int);
-#define SunOS 1
-
-#else
-
-
-/** Not needed on most systems */
-#define set_thread_concurrency(x)
+/* Tru64 - has 64 bit fseeko and ftello */
+#define  fseeko fseek
+#define  ftello ftell
+#endif /* digital stuff */
 
+#ifndef HAVE_FSEEKO
+/* This OS does not handle 64 bit fseeks and ftells */
+#define  fseeko fseek
+#define  ftello ftell
 #endif
 
-#ifdef HAVE_DARWIN_OS
-/* Apparently someone forgot to wrap getdomainname as a C function */
-#ifdef  __cplusplus
-extern "C" {
-#endif /* __cplusplus */
-int getdomainname(char *name, int len);
-#ifdef  __cplusplus
-}
-#endif /* __cplusplus */
-#endif /* HAVE_DARWIN_OS */
-
-
 
-#if defined(HAVE_WIN32)
-#define DEFAULT_CONFIGDIR "C:\\Documents and Settings\\All Users\\Application Data\\Bacula"
+#ifdef HAVE_WIN32
+/*
+ *   Windows
+ */
 #define PathSeparator '\\'
+#define PathSeparatorUp "..\\"
+#define PathSeparatorCur ".\\"
 
 inline bool IsPathSeparator(int ch) { return ch == '/' || ch == '\\'; }
 inline char *first_path_separator(char *path) { return strpbrk(path, "/\\"); }
@@ -564,7 +630,7 @@ inline const char *first_path_separator(const char *path) { return strpbrk(path,
 extern void pause_msg(const char *file, const char *func, int line, const char *msg);
 #define pause(msg) if (debug_level) pause_msg(__FILE__, __func__, __LINE__, (msg))
 
-#else
+#else /* Unix/Linux */
 #define PathSeparator '/'
 /* Define Winsock functions if we aren't on Windows */
 
@@ -575,10 +641,53 @@ inline bool IsPathSeparator(int ch) { return ch == '/'; }
 inline char *first_path_separator(char *path) { return strchr(path, '/'); }
 inline const char *first_path_separator(const char *path) { return strchr(path, '/'); }
 #define pause(msg)
+#endif /* HAVE_WIN32 */
+
+#ifdef HAVE_DARWIN_OS
+/* Apparently someone forgot to wrap getdomainname as a C function */
+#ifdef __cplusplus
+extern "C" {
 #endif
+int getdomainname(char *name, int namelen);
+#ifdef __cplusplus
+}
+#endif
+#endif /* HAVE_DARWIN_OS */
 
 
-/** HP-UX 11 specific workarounds */
+/* **** Unix Systems **** */
+#ifdef HAVE_SUN_OS
+/*
+ * On Solaris 2.5/2.6/7 and 8, threads are not timesliced by default,
+ * so we need to explictly increase the conncurrency level.
+ */
+#ifdef USE_THR_SETCONCURRENCY
+#include <thread.h>
+#define set_thread_concurrency(x)  thr_setconcurrency(x)
+extern int thr_setconcurrency(int);
+#define SunOS 1
+#else
+#define set_thread_concurrency(x)
+#define thr_setconcurrency(x)
+#endif
+
+#else
+#define set_thread_concurrency(x)
+#endif /* HAVE_SUN_OS */
+
+
+#ifdef HAVE_OSF1_OS
+#ifdef __cplusplus
+extern "C" {
+#endif
+int fchdir(int filedes);
+long gethostid(void);
+int getdomainname(char *name, int namelen);
+#ifdef __cplusplus
+}
+#endif
+#endif /* HAVE_OSF1_OS */
+
 
 #ifdef HAVE_HPUX_OS
 # undef h_errno
@@ -588,30 +697,17 @@ extern int h_errno;
  * the problem is no system headers declares the prototypes for these functions
  * this is done below
  */
-#ifdef  __cplusplus
-extern "C" {
-#endif /* __cplusplus */
-int getdomainname(char *name, int namelen);
-int setdomainname(char *name, int namelen);
-#ifdef  __cplusplus
-}
-#endif /* __cplusplus */
+#ifdef __cplusplus
+extern  "C" {
+#endif
+int getdomainname(char *name, int namlen);
+int setdomainname(char *name, int namlen);
+#ifdef __cplusplus
+} 
+#endif
 #endif /* HAVE_HPUX_OS */
 
 
-#ifdef HAVE_OSF1_OS
-#ifdef  __cplusplus
-extern "C" {
-#endif /* __cplusplus */
-int fchdir(int filedes);
-long gethostid(void);
-int getdomainname(char *name, int len);
-#ifdef  __cplusplus
-}
-#endif /* __cplusplus */
-#endif /* HAVE_OSF1_OS */
-
-
 /** Disabled because it breaks internationalisation...
 #undef HAVE_SETLOCALE
 #ifdef HAVE_SETLOCALE
@@ -629,4 +725,24 @@ int getdomainname(char *name, int len);
 /** Determine endianes */
 static inline bool bigendian() { return htonl(1) == 1L; }
 
+#ifndef __GNUC__
+#define __PRETTY_FUNCTION__ __func__
+#endif
+#ifdef HAVE_SUN_OS
+#undef ENTER_LEAVE
+#endif
+#ifdef ENTER_LEAVE
+#define Enter(lvl) Dmsg1(lvl, "Enter: %s\n", __PRETTY_FUNCTION__)
+#define Leave(lvl) Dmsg1(lvl, "Leave: %s\n", __PRETTY_FUNCTION__)
+#else
+#define Enter(lvl)
+#define Leave(lvl)
+#endif
+
+#ifdef __GNUC__x
+# define CHECK_FORMAT(fun, f, a) __attribute__ ((format (fun, f, a)))
+#else
+# define CHECK_FORMAT(fun, f, a)
+#endif
+
 #endif /* _BACONFIG_H */