X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=bacula%2Fsrc%2Fbaconfig.h;h=ba5db72ba0aa8cec7f5f0d7eb3ddd160ce188b51;hb=10cfd798ced2d27f61ead2de6fe9b1bcc8e3468d;hp=cae074f1f150cd54153ca5fbf7b2dfc57cafcebd;hpb=244a121b831a75480db24b0e08c747ea5516c9ae;p=bacula%2Fbacula diff --git a/bacula/src/baconfig.h b/bacula/src/baconfig.h index cae074f1f1..ba5db72ba0 100644 --- a/bacula/src/baconfig.h +++ b/bacula/src/baconfig.h @@ -1,35 +1,24 @@ /* - Bacula® - The Network Backup Solution - - Copyright (C) 2000-2009 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 two of the GNU 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 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. - * - * Version $Id$ */ @@ -53,8 +42,14 @@ #define ETIME ETIMEDOUT #endif -#define ioctl_req_t long unsigned int +#ifdef HAVE_IOCTL_ULINT_REQUEST +#define ioctl_req_t unsigned long int +#else +#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 @@ -63,11 +58,31 @@ #ifdef DEBUG #define ASSERT(x) if (!(x)) { \ - char *jcr = NULL; \ + char *tjcr = NULL; \ Emsg1(M_ERROR, 0, _("Failed ASSERT: %s\n"), #x); \ - jcr[0] = 0; } + Pmsg1(000, _("Failed ASSERT: %s\n"), #x); \ + 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 */ @@ -76,8 +91,12 @@ #if defined(HAVE_WIN32) -#define WIN32_REPARSE_POINT 1 -#define WIN32_MOUNT_POINT 2 +#define WIN32_REPARSE_POINT 1 /* Can be any number of "funny" directories except the next two */ +#define WIN32_MOUNT_POINT 2 /* Directory link to Volume */ +#define WIN32_JUNCTION_POINT 3 /* Directory link to a directory */ + +/* Reduce compiler warnings from Windows vss code */ +#define uuid(x) void InitWinAPIWrapper(); @@ -159,6 +178,9 @@ void InitWinAPIWrapper(); /* Maximum Name length including EOS */ #define MAX_NAME_LENGTH 128 +/* Maximum escaped Name lenght including EOS 2*MAX_NAME_LENGTH+1 */ +#define MAX_ESCAPE_NAME_LENGTH 257 + /* Maximume number of user entered command args */ #define MAX_CMD_ARGS 30 @@ -177,7 +199,7 @@ void InitWinAPIWrapper(); #define B_DEV_BSIZE 512 #endif -/* +/** * Set to time limit for other end to respond to * authentication. Normally 10 minutes is *way* * more than enough. The idea is to keep the Director @@ -191,168 +213,51 @@ void InitWinAPIWrapper(); */ #define DEFAULT_NETWORK_BUFFER_SIZE (64 * 1024) -/* - * Stream definitions. Once defined these must NEVER - * change as they go on the storage media. - * Note, the following streams are passed from the SD to the DIR - * so that they may be put into the catalog (actually only the - * stat packet part of the attr record is put in the catalog. - * - * STREAM_UNIX_ATTRIBUTES - * STREAM_UNIX_ATTRIBUTES_EX - * STREAM_MD5_DIGEST - * STREAM_SHA1_DIGEST - * STREAM_SHA256_DIGEST - * STREAM_SHA512_DIGEST - */ -#define STREAM_NONE 0 /* Reserved Non-Stream */ -#define STREAM_UNIX_ATTRIBUTES 1 /* Generic Unix attributes */ -#define STREAM_FILE_DATA 2 /* Standard uncompressed data */ -#define STREAM_MD5_SIGNATURE 3 /* deprecated */ -#define STREAM_MD5_DIGEST 3 /* MD5 digest for the file */ -#define STREAM_GZIP_DATA 4 /* GZip compressed file data */ -#define STREAM_UNIX_ATTRIBUTES_EX 5 /* Extended Unix attr for Win32 EX - Deprecated */ -#define STREAM_SPARSE_DATA 6 /* Sparse data stream */ -#define STREAM_SPARSE_GZIP_DATA 7 /* Sparse gzipped data stream */ -#define STREAM_PROGRAM_NAMES 8 /* program names for program data */ -#define STREAM_PROGRAM_DATA 9 /* Data needing program */ -#define STREAM_SHA1_SIGNATURE 10 /* deprecated */ -#define STREAM_SHA1_DIGEST 10 /* SHA1 digest for the file */ -#define STREAM_WIN32_DATA 11 /* Win32 BackupRead data */ -#define STREAM_WIN32_GZIP_DATA 12 /* Gzipped Win32 BackupRead data */ -#define STREAM_MACOS_FORK_DATA 13 /* Mac resource fork */ -#define STREAM_HFSPLUS_ATTRIBUTES 14 /* Mac OS extra attributes */ -#define STREAM_UNIX_ACCESS_ACL 15 /* Standard ACL attributes on UNIX - Deprecated */ -#define STREAM_UNIX_DEFAULT_ACL 16 /* Default ACL attributes on UNIX - Deprecated */ -#define STREAM_SHA256_DIGEST 17 /* SHA-256 digest for the file */ -#define STREAM_SHA512_DIGEST 18 /* SHA-512 digest for the file */ -#define STREAM_SIGNED_DIGEST 19 /* Signed File Digest, ASN.1, DER Encoded */ -#define STREAM_ENCRYPTED_FILE_DATA 20 /* Encrypted, uncompressed data */ -#define STREAM_ENCRYPTED_WIN32_DATA 21 /* Encrypted, uncompressed Win32 BackupRead data */ -#define STREAM_ENCRYPTED_SESSION_DATA 22 /* Encrypted Session Data, ASN.1, DER Encoded */ -#define STREAM_ENCRYPTED_FILE_GZIP_DATA 23 /* Encrypted, compressed data */ -#define STREAM_ENCRYPTED_WIN32_GZIP_DATA 24 /* Encrypted, compressed Win32 BackupRead data */ -#define STREAM_ENCRYPTED_MACOS_FORK_DATA 25 /* Encrypted, uncompressed Mac resource fork */ -#define STREAM_PLUGIN_NAME 26 /* Plugin "file" string */ -#define STREAM_PLUGIN_DATA 27 /* Plugin specific data */ - -/* - * Additional Stream definitions. Once defined these must NEVER - * change as they go on the storage media. - * - * The Stream numbers from 1000-1999 are reserved for ACL and extended attribute streams. - * Each different platform has its own stream id(s), if a platform supports multiple stream types - * it should supply different handlers for each type it supports and this should be called - * from the stream dispatch function. Currently in this reserved space we allocate the - * different acl streams from 1000 on and the different extended attributes streams from - * 1999 down. So the two naming spaces grows towards each other. - */ -#define STREAM_ACL_AIX_TEXT 1000 /* AIX specific string representation from acl_get */ -#define STREAM_ACL_DARWIN_ACCESS_ACL 1001 /* Darwin (OSX) specific acl_t string representation - * from acl_to_text (POSIX acl) - */ -#define STREAM_ACL_FREEBSD_DEFAULT_ACL 1002 /* FreeBSD specific acl_t string representation - * from acl_to_text (POSIX acl) for default acls. - */ -#define STREAM_ACL_FREEBSD_ACCESS_ACL 1003 /* FreeBSD specific acl_t string representation - * from acl_to_text (POSIX acl) for access acls. - */ -#define STREAM_ACL_HPUX_ACL_ENTRY 1004 /* HPUX specific acl_entry string representation - * from acltostr (POSIX acl) - */ -#define STREAM_ACL_IRIX_DEFAULT_ACL 1005 /* IRIX specific acl_t string representation - * from acl_to_text (POSIX acl) for default acls. - */ -#define STREAM_ACL_IRIX_ACCESS_ACL 1006 /* IRIX specific acl_t string representation - * from acl_to_text (POSIX acl) for access acls. - */ -#define STREAM_ACL_LINUX_DEFAULT_ACL 1007 /* Linux specific acl_t string representation - * from acl_to_text (POSIX acl) for default acls. - */ -#define STREAM_ACL_LINUX_ACCESS_ACL 1008 /* Linux specific acl_t string representation - * from acl_to_text (POSIX acl) for access acls. - */ -#define STREAM_ACL_TRU64_DEFAULT_ACL 1009 /* Tru64 specific acl_t string representation - * from acl_to_text (POSIX acl) for default acls. - */ -#define STREAM_ACL_TRU64_DEFAULT_DIR_ACL 1010 /* Tru64 specific acl_t string representation - * from acl_to_text (POSIX acl) for default acls. - */ -#define STREAM_ACL_TRU64_ACCESS_ACL 1011 /* Tru64 specific acl_t string representation - * from acl_to_text (POSIX acl) for access acls. - */ -#define STREAM_ACL_SOLARIS_ACLENT 1012 /* Solaris specific aclent_t string representation - * from acltotext or acl_totext (POSIX acl) - */ -#define STREAM_ACL_SOLARIS_ACE 1013 /* Solaris specific ace_t string representation from - * from acl_totext (NFSv4 or ZFS acl) - */ -#define STREAM_XATTR_OPENBSD 1993 /* OpenBSD specific extended attributes */ -#define STREAM_XATTR_SOLARIS_SYS 1994 /* Solaris specific extensible attributes or - * otherwise named extended system attributes. - */ -#define STREAM_XATTR_SOLARIS 1995 /* Solaris specific extented attributes */ -#define STREAM_XATTR_DARWIN 1996 /* Darwin (OSX) specific extended attributes */ -#define STREAM_XATTR_FREEBSD 1997 /* FreeBSD specific extended attributes */ -#define STREAM_XATTR_LINUX 1998 /* Linux specific extended attributes */ -#define STREAM_XATTR_NETBSD 1999 /* NetBSD specific extended attributes */ - -/* - * File type (Bacula defined). - * NOTE!!! These are saved in the Attributes record on the tape, so - * do not change them. If need be, add to them. - * - * This is stored as 32 bits on the Volume, but only FT_MASK (16) bits are - * used for the file type. The upper bits are used to indicate - * additional optional fields in the attribute record. - */ -#define FT_MASK 0xFFFF /* Bits used by FT (type) */ -#define FT_LNKSAVED 1 /* hard link to file already saved */ -#define FT_REGE 2 /* Regular file but empty */ -#define FT_REG 3 /* Regular file */ -#define FT_LNK 4 /* Soft Link */ -#define FT_DIREND 5 /* Directory at end (saved) */ -#define FT_SPEC 6 /* Special file -- chr, blk, fifo, sock */ -#define FT_NOACCESS 7 /* Not able to access */ -#define FT_NOFOLLOW 8 /* Could not follow link */ -#define FT_NOSTAT 9 /* Could not stat file */ -#define FT_NOCHG 10 /* Incremental option, file not changed */ -#define FT_DIRNOCHG 11 /* Incremental option, directory not changed */ -#define FT_ISARCH 12 /* Trying to save archive file */ -#define FT_NORECURSE 13 /* No recursion into directory */ -#define FT_NOFSCHG 14 /* Different file system, prohibited */ -#define FT_NOOPEN 15 /* Could not open directory */ -#define FT_RAW 16 /* Raw block device */ -#define FT_FIFO 17 /* Raw fifo device */ -/* The DIRBEGIN packet is sent to the FD file processing routine so - * that it can filter packets, but otherwise, it is not used - * or saved */ -#define FT_DIRBEGIN 18 /* Directory at beginning (not saved) */ -#define FT_INVALIDFS 19 /* File system not allowed for */ -#define FT_INVALIDDT 20 /* Drive type not allowed for */ -#define FT_REPARSE 21 /* Win NTFS reparse point */ -#define FT_PLUGIN 22 /* Plugin generated filename */ -#define FT_DELETED 23 /* Deleted file entry */ -#define FT_BASE 24 /* Duplicate base file entry */ - -/* Definitions for upper part of type word (see above). */ -#define AR_DATA_STREAM (1<<16) /* Data stream id present */ - -/* +/** * Tape label types -- stored in catalog */ #define B_BACULA_LABEL 0 #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) + */ +#define ON_PURGE_TRUNCATE 1 + /* Size of File Address stored in STREAM_SPARSE_DATA. Do NOT change! */ -#define SPARSE_FADDR_SIZE (sizeof(uint64_t)) +#define OFFSET_FADDR_SIZE (sizeof(uint64_t)) /* 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 +/** + * This is for dumb compilers/libraries like Solaris. Linux GCC * does it correctly, so it might be worthwhile * to remove the isascii(c) with ifdefs on such * "smart" systems. @@ -361,8 +266,9 @@ 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 */ +/** For multiplying by 10 with shift and addition */ #define B_TIMES10(d) ((d<<3)+(d<<1)) @@ -379,7 +285,7 @@ typedef int (INTHANDLER)(); #define S_ISLNK(m) (((m) & S_IFM) == S_IFLNK) #endif -/* Added by KES to deal with Win32 systems */ +/** Added by KES to deal with Win32 systems */ #ifndef S_ISWIN32 #define S_ISWIN32 020000 #endif @@ -439,28 +345,52 @@ 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 * do not handle varargs #defines. */ -/* Debug Messages that are printed */ +/** 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) @@ -508,7 +438,7 @@ void b_memset(const char *file, int line, void *mem, int val, size_t num); -/* Messages that are printed (uses d_msg) */ +/** Messages that are printed (uses d_msg) */ #define Pmsg0(lvl, msg) p_msg(__FILE__, __LINE__, lvl, msg) #define Pmsg1(lvl, msg, a1) p_msg(__FILE__, __LINE__, lvl, msg, a1) #define Pmsg2(lvl, msg, a1, a2) p_msg(__FILE__, __LINE__, lvl, msg, a1, a2) @@ -526,7 +456,7 @@ void b_memset(const char *file, int line, void *mem, int val, size_t num); #define Pmsg14(lvl,msg,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14) p_msg(__FILE__,__LINE__,lvl,msg,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14) -/* Daemon Error Messages that are delivered according to the message resource */ +/** Daemon Error Messages that are delivered according to the message resource */ #define Emsg0(typ, lvl, msg) e_msg(__FILE__, __LINE__, typ, lvl, msg) #define Emsg1(typ, lvl, msg, a1) e_msg(__FILE__, __LINE__, typ, lvl, msg, a1) #define Emsg2(typ, lvl, msg, a1, a2) e_msg(__FILE__, __LINE__, typ, lvl, msg, a1, a2) @@ -535,7 +465,7 @@ void b_memset(const char *file, int line, void *mem, int val, size_t num); #define Emsg5(typ, lvl, msg, a1, a2, a3, a4, a5) e_msg(__FILE__, __LINE__, typ, lvl, msg, a1, a2, a3, a4, a5) #define Emsg6(typ, lvl, msg, a1, a2, a3, a4, a5, a6) e_msg(__FILE__, __LINE__, typ, lvl, msg, a1, a2, a3, a4, a5, a6) -/* Job Error Messages that are delivered according to the message resource */ +/** Job Error Messages that are delivered according to the message resource */ #define Jmsg0(jcr, typ, lvl, msg) j_msg(__FILE__, __LINE__, jcr, typ, lvl, msg) #define Jmsg1(jcr, typ, lvl, msg, a1) j_msg(__FILE__, __LINE__, jcr, typ, lvl, msg, a1) #define Jmsg2(jcr, typ, lvl, msg, a1, a2) j_msg(__FILE__, __LINE__, jcr, typ, lvl, msg, a1, a2) @@ -543,18 +473,20 @@ 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) +/** Queued Job Error Messages that are delivered according to the message resource */ +#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 */ +/** Memory Messages that are edited into a Pool Memory buffer */ #define Mmsg0(buf, msg) m_msg(__FILE__, __LINE__, buf, msg) #define Mmsg1(buf, msg, a1) m_msg(__FILE__, __LINE__, buf, msg, a1) #define Mmsg2(buf, msg, a1, a2) m_msg(__FILE__, __LINE__, buf, msg, a1, a2) @@ -573,18 +505,48 @@ 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 */ +/** Use our strdup with smartalloc */ #ifndef HAVE_WXCONSOLE #undef strdup #define strdup(buf) bad_call_on_strdup_use_bstrdup(buf) @@ -598,11 +560,11 @@ int m_msg(const char *file, int line, POOLMEM *&pool_buf, const char *fmt, ...) #endif #endif -/* Use our fgets which handles interrupts */ +/** Use our fgets which handles interrupts */ #undef fgets #define fgets(x,y,z) bfgets((x), (y), (z)) -/* Use our sscanf, which is safer and works with known sizes */ +/** Use our sscanf, which is safer and works with known sizes */ #define sscanf bsscanf #ifdef DEBUG @@ -615,10 +577,13 @@ int m_msg(const char *file, int line, POOLMEM *&pool_buf, const char *fmt, ...) #define bmalloc(size) b_malloc(__FILE__, __LINE__, (size)) #endif -/* Macro to simplify free/reset pointers */ +/** 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" */ @@ -627,8 +592,8 @@ int m_msg(const char *file, int line, POOLMEM *&pool_buf, const char *fmt, ...) #define REPLACE_NEVER 'n' #define REPLACE_IFOLDER 'o' -/* This probably should be done on a machine by machine basis, but it works */ -/* This is critical for the smartalloc routines to properly align memory */ +/** This probably should be done on a machine by machine basis, but it works */ +/** This is critical for the smartalloc routines to properly align memory */ #define ALIGN_SIZE (sizeof(double)) #define BALIGN(x) (((x) + ALIGN_SIZE - 1) & ~(ALIGN_SIZE -1)) @@ -637,58 +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 -#undef ioctl_req_t -#define ioctl_req_t int -#endif - - -#ifdef HAVE_OSF1_OS -#undef ioctl_req_t -#define ioctl_req_t int -#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 -#define set_thread_concurrency(x) thr_setconcurrency(x) -extern int thr_setconcurrency(int); -#define SunOS 1 -#undef ioctl_req_t -#define ioctl_req_t int - -#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 */ -#endif - -#if defined(HAVE_DARWIN_OS) || defined(HAVE_OSF1_OS) -/* Apparently someone forgot to wrap getdomainname as a C function */ -extern "C" int getdomainname(char *name, int len); +#ifndef HAVE_FSEEKO +/* This OS does not handle 64 bit fseeks and ftells */ +#define fseeko fseek +#define ftello ftell #endif - -#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, "/\\"); } @@ -697,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 */ @@ -708,36 +641,74 @@ 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 +#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 extern int h_errno; -/* the {get,set}domainname() functions exist in HPUX's libc. +/** the {get,set}domainname() functions exist in HPUX's libc. * the configure script detects that correctly. * the problem is no system headers declares the prototypes for these functions * this is done below */ -extern "C" int getdomainname(char *name, int namelen); -extern "C" int setdomainname(char *name, int namelen); -#undef ioctl_req_t -#define ioctl_req_t int -#endif /* HAVE_HPUX_OS */ - - -#ifdef HAVE_OSF1_OS -extern "C" int fchdir(int filedes); -extern "C" long gethostid(void); -extern "C" int mknod ( const char *path, int mode, dev_t device ); -#undef ioctl_req_t -#define ioctl_req_t int +#ifdef __cplusplus +extern "C" { +#endif +int getdomainname(char *name, int namlen); +int setdomainname(char *name, int namlen); +#ifdef __cplusplus +} #endif +#endif /* HAVE_HPUX_OS */ -/* Disabled because it breaks internationalisation... +/** Disabled because it breaks internationalisation... #undef HAVE_SETLOCALE #ifdef HAVE_SETLOCALE #include @@ -751,7 +722,27 @@ extern "C" int mknod ( const char *path, int mode, dev_t device ); #endif */ -/* Determine endiannes */ +/** 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 */