#ifndef AMANDA_H
#define AMANDA_H
-#include <glib.h>
-#include <glib/gprintf.h>
-
-#include "amflock.h"
-
#ifdef HAVE_CONFIG_H
/* use a relative path here to avoid conflicting with Perl's config.h. */
#include "../config/config.h"
#endif
+#include <glib.h>
+#include <glib/gprintf.h>
+
+#include "amflock.h"
+
/*
* Force large file source even if configure guesses wrong.
*/
-#ifndef _LARGE_FILE_SOURCE
-#define _LARGE_FILES 1
-#endif
-
#ifndef _LARGEFILE64_SOURCE
#define _LARGEFILE64_SOURCE 1
#endif
# include <sys/types.h>
#endif
-/* gnulib creates this header locally if the system doesn't provide it */
-#include <stdint.h>
+/* gnulib creates this header locally if the system doesn't provide it,
+ * so it uses a local ("") include */
+#include "stdint.h"
/*
* I would prefer that each Amanda module include only those system headers
* Also, some systems put key files in different places, so by including
* everything here the rest of the system is isolated from such things.
*/
-#ifdef HAVE_ALLOCA_H
-# include <alloca.h>
-#endif
/* from the autoconf documentation */
#ifdef HAVE_DIRENT_H
#endif
#endif
-#ifdef HAVE_NETDB_H
-# include <netdb.h>
-#endif
-
#ifdef TIME_WITH_SYS_TIME
# include <sys/time.h>
# include <time.h>
#include <sys/resource.h>
#include <sys/socket.h>
-#ifdef HAVE_ARPA_INET_H
-#include <arpa/inet.h>
-#endif
-
-/* Support for missing IPv6 components */
-#ifndef HAVE_SOCKADDR_STORAGE
-# define sockaddr_storage sockaddr_in
-# define ss_family sin_family
-#endif
-
#ifdef WORKING_IPV6
#define INET6
#endif
#define DISK_BLOCK_KB 32
#define DISK_BLOCK_BYTES (DISK_BLOCK_KB * 1024)
-/* Maximum size of a tape block */
-/* MAX_TAPE_BLOCK_KB is defined in config.h */
-/* by configure --with-maxtapeblocksize */
-#define MAX_TAPE_BLOCK_BYTES (MAX_TAPE_BLOCK_KB*1024)
-
/* Maximum length of tape label, plus one for null-terminator. */
#define MAX_TAPE_LABEL_LEN (10240)
#define MAX_TAPE_LABEL_BUF (MAX_TAPE_LABEL_LEN+1)
#define MAX_TAPE_LABEL_FMT "%10240s"
+/* Unfortunately, the system-level sockaddr_storage definition can lead to
+ * C aliasing errors (where the optimizer doesn't notice that two operations
+ * affect the same datum). We define our own similar type as a union.
+ */
+typedef union sockaddr_union {
+ struct sockaddr sa;
+ struct sockaddr_in sin;
+#ifdef WORKING_IPV6
+ struct sockaddr_in6 sin6;
+#endif
+#ifdef HAVE_SOCKADDR_STORAGE
+ struct sockaddr_storage ss; /* not used; just here to make the union full-size */
+#endif
+} sockaddr_union;
+
#include "debug.h"
#include "file.h"
#define agets(f) debug_agets(__FILE__,__LINE__,(f))
#define areads(f) debug_areads(__FILE__,__LINE__,(f))
-extern int debug_amtable_alloc(const char *file,
- int line,
- void **table,
- size_t *current,
- size_t elsize,
- size_t count,
- int bump,
- void (*init_func)(void *));
-
-#define amtable_alloc(t,c,s,n,b,f) debug_amtable_alloc(__FILE__, \
- __LINE__, \
- (t), \
- (c), \
- (s), \
- (n), \
- (b), \
- (f))
-
-extern void amtable_free(void **, size_t *);
-
-char ** safe_env(void);
-char * validate_regexp(const char *regex);
-char * validate_glob(const char *glob);
-char * clean_regex(const char *regex);
-int match(const char *regex, const char *str);
-int match_glob(const char *glob, const char *str);
-char * glob_to_regex(const char *glob);
-int match_tar(const char *glob, const char *str);
-char * tar_to_regex(const char *glob);
-int match_host(const char *glob, const char *host);
-int match_disk(const char *glob, const char *disk);
-int match_datestamp(const char *dateexp, const char *datestamp);
-int match_level(const char *levelexp, const char *level);
+/* return a "safe" version of the current environment; pass this to execle */
+#define safe_env() safe_env_full(NULL)
+
+/* like safe_env, but optionally add additional environment variables */
+char ** safe_env_full(char **add);
+
time_t unctime(char *timestr);
/*
#define NUM_STR_SIZE 128 /* a generic number buffer size */
#define skip_whitespace(ptr,c) do { \
- while((c) != '\n' && isspace((int)c)) (c) = *(ptr)++; \
+ while((c) != '\n' && g_ascii_isspace((int)c)) (c) = *(ptr)++; \
} while(0)
#define skip_non_whitespace(ptr,c) do { \
- while((c) != '\0' && !isspace((int)c)) (c) = *(ptr)++; \
+ while((c) != '\0' && !g_ascii_isspace((int)c)) (c) = *(ptr)++; \
} while(0)
#define skip_non_whitespace_cs(ptr,c) do { \
- while((c) != '\0' && (c) != '#' && !isspace((int)c)) (c) = *(ptr)++;\
+ while((c) != '\0' && (c) != '#' && !g_ascii_isspace((int)c)) (c) = *(ptr)++;\
} while(0)
#define skip_non_integer(ptr,c) do { \
#define skip_quoted_string(ptr, c) do { \
int iq = 0; \
- while (((c) != '\0') && !((iq == 0) && isspace((int)c))) { \
+ while (((c) != '\0') && !((iq == 0) && g_ascii_isspace((int)c))) { \
if ((c) == '"') { \
iq = !iq; \
- } else if (((c) == '\\') && (*(ptr) == '"')) { \
- (ptr)++; \
+ } else if ((c) == '\\') { \
+ if (*ptr) /* not last character */ \
+ (ptr)++; \
} \
(c) = *(ptr)++; \
} \
#define copy_string(ptr,c,f,l,fp) do { \
(fp) = (f); \
- while((c) != '\0' && !isspace((int)c)) { \
+ while((c) != '\0' && !g_ascii_isspace((int)c)) { \
if((fp) >= (f) + (l) - 1) { \
*(fp) = '\0'; \
(fp) = NULL; \
#define copy_string_cs(ptr,c,f,l,fp) do { \
(fp) = (f); \
- while((c) != '\0' && (c) != '#' && !isspace((int)c)) { \
+ while((c) != '\0' && (c) != '#' && !g_ascii_isspace((int)c)) { \
if((fp) >= (f) + (l) - 1) { \
*(fp) = '\0'; \
(fp) = NULL; \
/* from old bsd-security.c */
extern int debug;
-extern int check_security(struct sockaddr_storage *, char *, unsigned long, char **);
+extern int check_security(sockaddr_union *, char *, unsigned long, char **);
/*
* Handle functions which are not always declared on all systems. This
/* AIX #defines accept, and provides a prototype for the alternate name */
#if !defined(HAVE_ACCEPT_DECL) && !defined(accept)
-extern int accept(int s, struct sockaddr *addr, socklen_t *addrlen);
+extern int accept(int s, struct sockaddr *addr, socklen_t_equiv *addrlen);
#endif
#ifndef HAVE_ATOF_DECL
#endif
#ifndef HAVE_BIND_DECL
-extern int bind(int s, const struct sockaddr *name, socklen_t namelen);
+extern int bind(int s, const struct sockaddr *name, socklen_t_equiv namelen);
#endif
#ifndef HAVE_BZERO
#endif
#ifndef HAVE_CONNECT_DECL
-extern int connect(int s, struct sockaddr *name, socklen_t namelen);
+extern int connect(int s, struct sockaddr *name, socklen_t_equiv namelen);
#endif
#ifndef HAVE_FCLOSE_DECL
/* AIX #defines getpeername, and provides a prototype for the alternate name */
#if !defined(HAVE_GETPEERNAME_DECL) && !defined(getpeername)
-extern int getpeername(int s, struct sockaddr *name, socklen_t *namelen);
+extern int getpeername(int s, struct sockaddr *name, socklen_t_equiv *namelen);
#endif
/* AIX #defines getsockname, and provides a prototype for the alternate name */
#if !defined(HAVE_GETSOCKNAME_DECL) && !defined(getsockname)
-extern int getsockname(int s, struct sockaddr *name, socklen_t *namelen);
+extern int getsockname(int s, struct sockaddr *name, socklen_t_equiv *namelen);
#endif
#ifndef HAVE_GETSOCKOPT_DECL
extern int getsockopt(int s, int level, int optname, char *optval,
- socklen_t *optlen);
+ socklen_t_equiv *optlen);
#endif
#ifndef HAVE_INITGROUPS
/* AIX #defines recvfrom, and provides a prototype for the alternate name */
#if !defined(HAVE_RECVFROM_DECL) && !defined(recvfrom)
extern int recvfrom(int s, char *buf, int len, int flags,
- struct sockaddr *from, socklen_t *fromlen);
+ struct sockaddr *from, socklen_t_equiv *fromlen);
#endif
#ifndef HAVE_REMOVE_DECL
extern int vprintf(const char *format, va_list ap);
#endif
-/* gnulib-only includes (hence "" instead of <>) */
-#include "getaddrinfo.h"
-#include "inet_ntop.h"
+/* these system headers are added by gnulib if they
+ * do not exist */
+#include "netdb.h"
+#include "arpa/inet.h"
+
+/* gnulib-only includes */
+#include "safe-read.h"
+#include "full-read.h"
+#include "full-write.h"
#if !defined(S_ISCHR) && defined(_S_IFCHR) && defined(_S_IFMT)
#define S_ISCHR(mode) (((mode) & _S_IFMT) == _S_IFCHR)
# endif
#endif
-#if SIZEOF_OFF_T == 8
-# ifdef OFF_MAX
-# define AM64_MAX (off_t)(OFF_MAX)
-# else
-# define AM64_MAX (off_t)(9223372036854775807LL)
-# endif
-# ifdef OFF_MIN
-# define AM64_MIN (off_t)(OFF_MIN)
-# else
-# define AM64_MIN (off_t)(-9223372036854775807LL -1LL)
-# endif
-#else
-#if SIZEOF_LONG == 8
-# ifdef LONG_MAX
-# define AM64_MAX (off_t)(LONG_MAX)
-# else
-# define AM64_MAX (off_t)9223372036854775807L
-# endif
-# ifdef LONG_MIN
-# define AM64_MIN (off_t)(LONG_MIN)
-# else
-# define AM64_MIN (off_t)(-9223372036854775807L -1L)
-# endif
-#else
-#if SIZEOF_LONG_LONG == 8
-# ifdef LONG_LONG_MAX
-# define AM64_MAX (off_t)(LONG_LONG_MAX)
-# else
-# define AM64_MAX (off_t)9223372036854775807LL
-# endif
-# ifdef LONG_LONG_MIN
-# define AM64_MIN (off_t)(LONG_LONG_MIN)
-# else
-# define AM64_MIN (off_t)(-9223372036854775807LL -1LL)
-# endif
-#else
-#if SIZEOF_INTMAX_T == 8
-# ifdef INTMAX_MAX
-# define AM64_MAX (off_t)(INTMAX_MAX)
-# else
-# define AM64_MAX (off_t)9223372036854775807LL
-# endif
-# ifdef INTMAX_MIN
-# define AM64_MIN (off_t)(INTMAX_MIN)
-# else
-# define AM64_MIN (off_t)(-9223372036854775807LL -1LL)
-# endif
-#else /* no 64 bits type found, use long. */
-# ifdef LONG_MAX
-# define AM64_MAX (off_t)(LONG_MAX)
-# else
-# define AM64_MAX (off_t)2147483647
-# endif
-# ifdef LONG_MIN
-# define AM64_MIN (off_t)(LONG_MIN)
-# else
-# define AM64_MIN (off_t)(-2147483647 -1)
-# endif
-#endif
-#endif
-#endif
-#endif
#define BIND_CYCLE_RETRIES 120 /* Total of 30 minutes */
KENCRYPT_YES /* krb5 encryption enabled on all stream */
} kencrypt_type;
+#define DUMP_LEVELS 400
+
+/* Constants to define the number of pre-opened pipes between amandad and
+ * its services */
+
+/* If you change these (don't!), change them in perl/Amanda/Constants.pm, too */
+#define DATA_FD_COUNT 3 /* number of general-use pipes */
+#define DATA_FD_OFFSET 50
+
#endif /* !AMANDA_H */