2 * Amanda, The Advanced Maryland Automatic Network Disk Archiver
3 * Copyright (c) 1991-1999 University of Maryland at College Park
6 * Permission to use, copy, modify, distribute, and sell this software and its
7 * documentation for any purpose is hereby granted without fee, provided that
8 * the above copyright notice appear in all copies and that both that
9 * copyright notice and this permission notice appear in supporting
10 * documentation, and that the name of U.M. not be used in advertising or
11 * publicity pertaining to distribution of the software without specific,
12 * written prior permission. U.M. makes no representations about the
13 * suitability of this software for any purpose. It is provided "as is"
14 * without express or implied warranty.
16 * U.M. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL U.M.
18 * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
19 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
20 * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
21 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
23 * Authors: the Amanda Development Team. Its members are listed in a
24 * file named AUTHORS, in the root directory of this distribution.
27 * $Id: amanda.h,v 1.131 2006/07/25 18:27:56 martinea Exp $
29 * the central header file included by all amanda sources
35 #include <glib/gprintf.h>
40 /* use a relative path here to avoid conflicting with Perl's config.h. */
41 #include "../config/config.h"
45 * Force large file source even if configure guesses wrong.
47 #ifndef _LARGE_FILE_SOURCE
48 #define _LARGE_FILES 1
51 #ifndef _LARGEFILE64_SOURCE
52 #define _LARGEFILE64_SOURCE 1
55 #ifndef _FILE_OFFSET_BITS
56 #define _FILE_OFFSET_BITS 64
59 #ifdef HAVE_SYS_TYPES_H
60 # include <sys/types.h>
63 /* gnulib creates this header locally if the system doesn't provide it */
67 * I would prefer that each Amanda module include only those system headers
68 * that are locally needed, but on most Unixes the system header files are not
69 * protected against multiple inclusion, so this can lead to problems.
71 * Also, some systems put key files in different places, so by including
72 * everything here the rest of the system is isolated from such things.
78 /* from the autoconf documentation */
81 # define NAMLEN(dirent) strlen((dirent)->d_name)
83 # define dirent direct
84 # define NAMLEN(dirent) (dirent)->d_namlen
86 # include <sys/ndir.h>
99 # define plural(String1, String2, Count) \
100 (((Count) == 1) ? (String1) : (String2))
102 # define plural(String1, String2, Count) \
103 (((Count) == 1) ? (String1) : (String2))
104 # define setlocale(Which, Locale)
105 # define textdomain(Domain)
106 # define bindtextdomain(Package, Directory)
107 # define gettext(String) String
108 # define dgettext(Domain, String) String
109 # define dcgettext(Domain, String, Catagory) String
110 # define ngettext(String1, String2, Count) \
111 plural((String1), (String2), (Count))
112 # define dngettext(Domain, String1, String2, Count) \
113 plural((String1), (String2), (Count))
114 # define dcngettext(Domain, String1, String2, Count, Catagory) \
115 plural((String1), (String2), (Count))
117 #define T_(String) String
118 #ifndef SWIG /* TODO: make this go away */
119 #define _(String) dgettext("amanda", (String))
130 #if defined(USE_DB_H)
133 #if defined(USE_DBM_H)
136 #if defined(USE_GDBM_H)
139 #if defined(USE_NDBM_H)
150 #ifdef TIME_WITH_SYS_TIME
151 # include <sys/time.h>
154 # ifdef HAVE_SYS_TIME_H
155 # include <sys/time.h>
177 #ifdef HAVE_STRINGS_H
178 # include <strings.h>
189 #ifdef HAVE_SYS_FILE_H
190 # include <sys/file.h>
193 #ifdef HAVE_SYS_IOCTL_H
194 # include <sys/ioctl.h>
201 #ifdef HAVE_SYS_PARAM_H
202 # include <sys/param.h>
205 #if defined(HAVE_SYS_IPC_H) && defined(HAVE_SYS_SHM_H)
206 # include <sys/ipc.h>
207 # include <sys/shm.h>
209 # ifdef HAVE_SYS_MMAN_H
210 # include <sys/mman.h>
214 #ifdef HAVE_SYS_SELECT_H
215 # include <sys/select.h>
218 #ifdef HAVE_SYS_STAT_H
219 # include <sys/stat.h>
222 #ifdef HAVE_SYS_UIO_H
223 # include <sys/uio.h>
235 #ifdef HAVE_SYS_WAIT_H
236 # include <sys/wait.h>
244 typedef int amwait_t;
246 # define WEXITSTATUS(stat_val) (*(unsigned*)&(stat_val) >> 8)
249 # define WTERMSIG(stat_val) (*(unsigned*)&(stat_val) & 0x7F)
252 # define WIFEXITED(stat_val) ((*(unsigned*)&(stat_val) & 255) == 0)
255 # ifdef WAIT_USES_UNION
256 typedef union wait amwait_t;
258 # define WEXITSTATUS(stat_val) (((amwait_t*)&(stat_val))->w_retcode)
261 # define WTERMSIG(stat_val) (((amwait_t*)&(stat_val))->w_termsig)
264 # define WIFEXITED(stat_val) (WTERMSIG(stat_val) == 0)
267 typedef int amwait_t;
269 # define WEXITSTATUS(stat_val) (*(unsigned*)&(stat_val) >> 8)
272 # define WTERMSIG(stat_val) (*(unsigned*)&(stat_val) & 0x7F)
275 # define WIFEXITED(stat_val) ((*(unsigned*)&(stat_val) & 255) == 0)
281 # define WIFSIGNALED(stat_val) (WTERMSIG(stat_val) != 0)
288 #ifdef HAVE_NETINET_IN_H
289 # include <netinet/in.h>
298 #include <sys/resource.h>
299 #include <sys/socket.h>
301 #if !defined(CONFIGURE_TEST)
302 # include "amanda-int.h"
305 #ifdef HAVE_ARPA_INET_H
306 #include <arpa/inet.h>
313 #ifndef INET_ADDRSTRLEN
314 #define INET_ADDRSTRLEN 16
317 /* Calculate the length of the data in a struct sockaddr_storage.
320 * To be truly portable, the length of an address should be passed
321 * in a companion variable. When such lengths are available
322 * everywhere they are needed, this macro should be removed.
325 # define SS_LEN(ss) (((struct sockaddr *)(ss))->sa_family==AF_INET6?sizeof(struct sockaddr_in6):sizeof(struct sockaddr_in))
327 # define SS_LEN(ss) (sizeof(struct sockaddr_in))
331 /* AF_NATIVE is the "best" address family we support, backward compatible
332 * through to AF_INET.
335 #define AF_NATIVE AF_INET6
337 #define AF_NATIVE AF_INET
340 /* SS_INIT(ss, family) initializes ss to all zeroes (as directed by RFC),
341 * and sets its ss_family as specified
343 #define SS_INIT(ss, family) do { \
344 memset((ss), 0, sizeof(*(ss))); \
345 (ss)->ss_family = (family); \
348 /* SS_SET_INADDR_ANY(ss) sets ss to the family-appropriate equivalent of
349 * INADDR_ANY, a wildcard address and port.
352 #define SS_SET_INADDR_ANY(ss) do { \
353 switch ((ss)->ss_family) { \
355 ((struct sockaddr_in6 *)(ss))->sin6_flowinfo = 0; \
356 ((struct sockaddr_in6 *)(ss))->sin6_addr = in6addr_any; \
359 ((struct sockaddr_in *)(ss))->sin_addr.s_addr = INADDR_ANY; \
364 #define SS_SET_INADDR_ANY(ss) do { \
365 ((struct sockaddr_in *)(ss))->sin_addr.s_addr = INADDR_ANY; \
369 /* Set/get the port in a sockaddr_storage that already has an family */
371 #define SS_SET_PORT(ss, port) \
372 switch ((ss)->ss_family) { \
374 ((struct sockaddr_in *)(ss))->sin_port = (in_port_t)htons((port)); \
377 ((struct sockaddr_in6 *)(ss))->sin6_port = (in_port_t)htons((port)); \
379 default: assert(0); \
382 #define SS_SET_PORT(ss, port) \
383 ((struct sockaddr_in *)(ss))->sin_port = (in_port_t)htons((port));
387 #define SS_GET_PORT(ss) (ntohs( \
388 (ss)->ss_family == AF_INET6? \
389 ((struct sockaddr_in6 *)(ss))->sin6_port \
390 :((struct sockaddr_in *)(ss))->sin_port))
392 #define SS_GET_PORT(ss) (ntohs( \
393 ((struct sockaddr_in *)(ss))->sin_port))
397 * The dbmalloc package comes from:
399 * http://www.clark.net/pub/dickey/dbmalloc/dbmalloc.tar.gz
403 * ftp://gatekeeper.dec.com/pub/usenet/comp.sources.misc/volume32/dbmalloc/
405 * The following functions are sprinkled through the code, but are
406 * disabled unless USE_DBMALLOC is defined:
408 * malloc_enter(char *) -- stack trace for malloc reports
409 * malloc_leave(char *) -- stack trace for malloc reports
410 * malloc_mark(void *) -- mark an area as never to be free-d
411 * malloc_chain_check(void) -- check the malloc area now
412 * malloc_dump(int fd) -- report the malloc contents to a file descriptor
413 * malloc_list(int fd, ulong a, ulong b) -- report memory activated since
414 * history stamp a that is still active as of stamp b (leak check)
415 * malloc_inuse(ulong *h) -- create history stamp h and return the amount
416 * of memory currently in use.
420 #include "dbmalloc.h"
422 #define malloc_enter(func) ((void)0)
423 #define malloc_leave(func) ((void)0)
424 #define malloc_mark(ptr) ((void)0)
425 #define malloc_chain_check() ((void)0)
426 #define malloc_dump(fd) ((void)0)
427 #define malloc_list(a,b,c) ((void)0)
428 #define malloc_inuse(hist) (*(hist) = 0, 0)
429 #define dbmalloc_caller_loc(x,y) (x)
432 #if !defined(HAVE_SIGACTION) && defined(HAVE_SIGVEC)
433 /* quick'n'dirty hack for NextStep31 */
434 # define sa_flags sv_flags
435 # define sa_handler sv_handler
436 # define sa_mask sv_mask
437 # define sigaction sigvec
438 # define sigemptyset(mask) /* no way to clear pending signals */
442 * Most Unixen declare errno in <errno.h>, some don't. Some multithreaded
443 * systems have errno as a per-thread macro. So, we have to be careful.
450 * Some compilers have int for type of sizeof() some use size_t.
451 * size_t is the one we want...
453 #define SIZEOF(x) (size_t)sizeof(x)
457 * Some older BSD systems don't have these FD_ macros, so if not, provide them.
459 #if !defined(FD_SET) || defined(LINT) || defined(__lint)
461 # define FD_SETSIZE (int)(SIZEOF(fd_set) * CHAR_BIT)
464 # define FD_SET(n, p) (((fd_set *)(p))->fds_bits[(n)/WORD_BIT] |= (int)((1 << ((n) % WORD_BIT))))
467 # define FD_CLR(n, p) (((fd_set *)(p))->fds_bits[(n)/WORD_BIT] &= (int)(~(1 << ((n) % WORD_BIT))))
470 # define FD_ISSET(n, p) (((fd_set *)(p))->fds_bits[(n)/WORD_BIT] & (1 << ((n) % WORD_BIT)))
473 # define FD_ZERO(p) memset((p), 0, SIZEOF(*(p)))
477 # define FD_COPY(p, q) memcpy((q), (p), SIZEOF(*(p)))
482 * Define MAX_HOSTNAME_LENGTH as the size of arrays to hold hostname's.
484 #undef MAX_HOSTNAME_LENGTH
485 #define MAX_HOSTNAME_LENGTH 1025
488 * If void is broken, substitute char.
494 #define stringize(x) #x
495 #define stringconcat(x, y) x ## y
498 * So that we can use GNUC attributes (such as to get -Wall warnings
499 * for printf-like functions). Only do this in gcc 2.7 or later ...
500 * it may work on earlier stuff, but why chance it.
502 #if !defined(__GNUC__) || __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7) || defined(S_SPLINT_S) || defined(LINT) || defined(__lint)
504 #define __attribute__(__x)
508 * assertions, but call error() instead of abort
512 #define assert(exp) ((void)0)
514 #else /* ASSERTIONS */
516 #define assert(exp) do { \
519 error("assert: %s false, file %s, line %d", \
520 stringize(exp), __FILE__, __LINE__); \
525 #endif /* ASSERTIONS */
528 * print debug output, else compile to nothing.
531 #ifdef DEBUG_CODE /* { */
532 # define dbopen(a) debug_open(a)
533 # define dbreopen(a,b) debug_reopen(a,b)
534 # define dbrename(a,b) debug_rename(a,b)
535 # define dbclose() debug_close()
536 # define dbprintf(p) (debug_printf p)
537 # define dbfd() debug_fd()
538 # define dbfp() debug_fp()
539 # define dbfn() debug_fn()
541 extern void debug_open(char *subdir);
542 extern void debug_reopen(char *file, char *notation);
543 extern void debug_rename(char *config, char *subdir);
544 extern void debug_close(void);
545 extern void debug_printf(const char *format, ...)
546 __attribute__ ((format (printf, 1, 2)));
547 extern int debug_fd(void);
548 extern FILE * debug_fp(void);
549 extern char * debug_fn(void);
550 extern void set_debug_prefix_pid(pid_t);
551 extern char *debug_prefix(char *);
552 extern char *debug_prefix_time(char *);
555 # define dbreopen(a,b)
556 # define dbrename(a,b)
562 # define set_debug_prefix_pid(x)
563 # define debug_prefix(x) get_pname()
564 # define debug_prefix_time(x) get_pname()
567 /* amanda #days calculation, with roundoff */
569 #define SECS_PER_DAY (24*60*60)
570 #define days_diff(a, b) (int)(((b) - (a) + SECS_PER_DAY/2) / SECS_PER_DAY)
572 /* Global constants. */
573 #ifndef AMANDA_SERVICE_NAME
574 #define AMANDA_SERVICE_NAME "amanda"
576 #ifndef KAMANDA_SERVICE_NAME
577 #define KAMANDA_SERVICE_NAME "kamanda"
579 #ifndef SERVICE_SUFFIX
580 #define SERVICE_SUFFIX ""
582 #ifndef AMANDA_SERVICE_DEFAULT
583 #define AMANDA_SERVICE_DEFAULT ((in_port_t)10080)
585 #ifndef KAMANDA_SERVICE_DEFAULT
586 #define KAMANDA_SERVICE_DEFAULT ((in_port_t)10081)
589 #define am_round(v,u) ((((v) + (u) - 1) / (u)) * (u))
590 #define am_floor(v,u) (((v) / (u)) * (u))
592 /* Holding disk block size. Do not even think about changint this! :-) */
593 #define DISK_BLOCK_KB 32
594 #define DISK_BLOCK_BYTES (DISK_BLOCK_KB * 1024)
596 /* Maximum size of a tape block */
597 /* MAX_TAPE_BLOCK_KB is defined in config.h */
598 /* by configure --with-maxtapeblocksize */
599 #define MAX_TAPE_BLOCK_BYTES (MAX_TAPE_BLOCK_KB*1024)
601 /* Maximum length of tape label, plus one for null-terminator. */
602 #define MAX_TAPE_LABEL_LEN (10240)
603 #define MAX_TAPE_LABEL_BUF (MAX_TAPE_LABEL_LEN+1)
604 #define MAX_TAPE_LABEL_FMT "%10240s"
606 /* Unfortunately, the system-level sockaddr_storage definition can lead to
607 * C aliasing errors (where the optimizer doesn't notice that two operations
608 * affect the same datum). We define our own similar type as a union.
610 typedef union sockaddr_union {
612 struct sockaddr_in sin;
614 struct sockaddr_in6 sin6;
616 #ifdef HAVE_SOCKADDR_STORAGE
617 struct sockaddr_storage ss; /* not used; just here to make the union full-size */
624 void *debug_alloc(const char *file, int line, size_t size);
625 void *debug_newalloc(const char *file, int line, void *old, size_t size);
626 char *debug_stralloc(const char *file, int line, const char *str);
627 char *debug_newstralloc(const char *file, int line,
628 char *oldstr, const char *newstr);
629 char *debug_vstralloc(const char *file, int line, const char *str, ...);
630 char *debug_newvstralloc(const char *file, int line,
631 char *oldstr, const char *str, ...);
632 char *debug_vstrallocf(const char *file, int line, const char *fmt,
633 ...) G_GNUC_PRINTF(3, 4);
634 char *debug_newvstrallocf(const char *file, int line, char *oldstr,
635 const char *fmt, ...) G_GNUC_PRINTF(4, 5);
637 /* Usage: vstrextend(foo, "bar, "baz", NULL). Extends the existing
638 * string, or allocates a brand new one. */
639 char *debug_vstrextend(const char *file, int line, char **oldstr, ...);
641 #define alloc(s) debug_alloc(__FILE__, __LINE__, (s))
642 #define newalloc(p,s) debug_newalloc(__FILE__, __LINE__, (p), (s))
643 #define stralloc(s) debug_stralloc(__FILE__, __LINE__, (s))
644 #define newstralloc(p,s) debug_newstralloc(__FILE__, __LINE__, (p), (s))
645 #define vstralloc(...) debug_vstralloc(__FILE__,__LINE__,__VA_ARGS__)
646 #define newvstralloc(...) debug_newvstralloc(__FILE__,__LINE__,__VA_ARGS__)
647 #define vstrallocf(...) debug_vstrallocf(__FILE__,__LINE__,__VA_ARGS__)
648 #define newvstrallocf(...) debug_newvstrallocf(__FILE__,__LINE__,__VA_ARGS__)
649 #define vstrextend(...) debug_vstrextend(__FILE__,__LINE__,__VA_ARGS__)
651 #define stralloc2(s1,s2) vstralloc((s1),(s2),NULL)
652 #define newstralloc2(p,s1,s2) newvstralloc((p),(s1),(s2),NULL)
654 #define vstrallocf(...) debug_vstrallocf(__FILE__,__LINE__,__VA_ARGS__)
656 /*@only@*/ /*@null@*/ char *debug_agets(const char *file, int line, FILE *f);
657 /*@only@*/ /*@null@*/ char *debug_areads(const char *file, int line, int fd);
658 #define agets(f) debug_agets(__FILE__,__LINE__,(f))
659 #define areads(f) debug_areads(__FILE__,__LINE__,(f))
661 extern int debug_amtable_alloc(const char *file,
668 void (*init_func)(void *));
670 #define amtable_alloc(t,c,s,n,b,f) debug_amtable_alloc(__FILE__, \
679 extern void amtable_free(void **, size_t *);
681 char ** safe_env(void);
682 char * validate_regexp(const char *regex);
683 char * validate_glob(const char *glob);
684 char * clean_regex(const char *regex);
685 int match(const char *regex, const char *str);
686 int match_glob(const char *glob, const char *str);
687 char * glob_to_regex(const char *glob);
688 int match_tar(const char *glob, const char *str);
689 char * tar_to_regex(const char *glob);
690 int match_host(const char *glob, const char *host);
691 int match_disk(const char *glob, const char *disk);
692 int match_datestamp(const char *dateexp, const char *datestamp);
693 int match_level(const char *levelexp, const char *level);
694 time_t unctime(char *timestr);
697 * amfree(ptr) -- if allocated, release space and set ptr to NULL.
699 * In general, this should be called instead of just free(), unless
700 * the very next source line sets the pointer to a new value.
703 #define amfree(ptr) do { \
704 if((ptr) != NULL) { \
705 int e__errno = errno; \
709 (void)(ptr); /* Fix value never used warning at end of routines */ \
713 #define strappend(s1,s2) do { \
714 char *t_t_t = (s1) ? stralloc2((s1),(s2)) : stralloc((s2)); \
720 * Return the number of elements in an array.
722 #define am_countof(a) (int)(SIZEOF(a) / SIZEOF((a)[0]))
725 * min/max. Don't do something like
729 * because the increment will be duplicated.
733 #define min(a, b) ((a) < (b) ? (a) : (b))
734 #define max(a, b) ((a) > (b) ? (a) : (b))
737 * Utility bitmask manipulation macros.
739 #define SET(t, f) ((t) |= (f))
740 #define CLR(t, f) ((t) &= ~((unsigned)(f)))
741 #define ISSET(t, f) ((t) & (f))
744 * Utility string macros. All assume a variable holds the current
745 * character and the string pointer points to the next character to
746 * be processed. Typical setup is:
750 * skip_whitespace(s, ch);
753 * If you advance the pointer "by hand" to skip over something, do
759 * Note that ch has the character at the end of the just skipped field.
760 * It is often useful to terminate a string, make a copy, then restore
761 * the input like this:
763 * skip_whitespace(s, ch);
764 * fp = s-1; ## save the start
765 * skip_nonwhitespace(s, ch); ## find the end
766 * p[-1] = '\0'; ## temporary terminate
767 * field = stralloc(fp); ## make a copy
768 * p[-1] = ch; ## restore the input
770 * The scanning macros are:
772 * skip_whitespace (ptr, var)
773 * -- skip whitespace, but stops at a newline
774 * skip_non_whitespace (ptr, var)
775 * -- skip non whitespace
776 * skip_non_whitespace_cs (ptr, var)
777 * -- skip non whitespace, stop at comment
778 * skip_integer (ptr, var)
779 * -- skip an integer field
780 * skip_line (ptr, var)
781 * -- skip just past the next newline
782 * strncmp_const (str, const_str)
783 * -- compare str to const_str, a string constant
784 * strncmp_const_skip (str, const_var, ptr, var)
785 * -- like strncmp_const, but skip the string if a match is
786 * found; this macro only tests for equality, discarding
787 * ordering information.
791 * ptr -- string pointer
792 * var -- current character
794 * These macros copy a non-whitespace field to a new buffer, and should
795 * only be used if dynamic allocation is impossible (fixed size buffers
796 * are asking for trouble):
798 * copy_string (ptr, var, field, len, fldptr)
799 * -- copy a non-whitespace field
800 * copy_string_cs (ptr, var, field, len, fldptr)
801 * -- copy a non-whitespace field, stop at comment
805 * ptr -- string pointer
806 * var -- current character
807 * field -- area to copy to
808 * len -- length of area (needs room for null byte)
809 * fldptr -- work pointer used in move
810 * if NULL on exit, the field was too small for the input
813 #define STR_SIZE 4096 /* a generic string buffer size */
814 #define NUM_STR_SIZE 128 /* a generic number buffer size */
816 #define skip_whitespace(ptr,c) do { \
817 while((c) != '\n' && isspace((int)c)) (c) = *(ptr)++; \
820 #define skip_non_whitespace(ptr,c) do { \
821 while((c) != '\0' && !isspace((int)c)) (c) = *(ptr)++; \
824 #define skip_non_whitespace_cs(ptr,c) do { \
825 while((c) != '\0' && (c) != '#' && !isspace((int)c)) (c) = *(ptr)++;\
828 #define skip_non_integer(ptr,c) do { \
829 while((c) != '\0' && !isdigit(c)) (c) = *(ptr)++; \
832 #define skip_integer(ptr,c) do { \
833 if((c) == '+' || (c) == '-') (c) = *(ptr)++; \
834 while(isdigit(c)) (c) = *(ptr)++; \
837 #define skip_quoted_string(ptr, c) do { \
839 while (((c) != '\0') && !((iq == 0) && isspace((int)c))) { \
842 } else if (((c) == '\\') && (*(ptr) == '"')) { \
849 #define skip_quoted_line(ptr, c) do { \
851 while((c) && !((iq == 0) && ((c) == '\n'))) { \
860 #define skip_line(ptr,c) do { \
861 while((c) && (c) != '\n') \
867 #define copy_string(ptr,c,f,l,fp) do { \
869 while((c) != '\0' && !isspace((int)c)) { \
870 if((fp) >= (f) + (l) - 1) { \
873 (void)(fp); /* Fix value never used warning at end of routines */ \
883 #define copy_string_cs(ptr,c,f,l,fp) do { \
885 while((c) != '\0' && (c) != '#' && !isspace((int)c)) { \
886 if((fp) >= (f) + (l) - 1) { \
897 #define is_dot_or_dotdot(s) \
900 || ((s)[1] == '.' && (s)[2] == '\0')))
902 #define strncmp_const(str, cnst) \
903 strncmp((str), (cnst), sizeof((cnst))-1)
905 /* (have to roll this up in an expression, so it can be used in if()) */
906 #define strncmp_const_skip(str, cnst, ptr, var) \
907 ((strncmp((str), (cnst), sizeof((cnst))-1) == 0)? \
908 ((ptr)+=sizeof((cnst))-1, (var)=(ptr)[-1], 0) \
911 /* from old bsd-security.c */
913 extern int check_security(sockaddr_union *, char *, unsigned long, char **);
916 * Handle functions which are not always declared on all systems. This
917 * stops gcc -Wall and lint from complaining.
920 /* AIX #defines accept, and provides a prototype for the alternate name */
921 #if !defined(HAVE_ACCEPT_DECL) && !defined(accept)
922 extern int accept(int s, struct sockaddr *addr, socklen_t_equiv *addrlen);
925 #ifndef HAVE_ATOF_DECL
926 extern double atof(const char *ptr);
930 # define bcopy(from,to,n) ((void)memmove((to), (from), (n)))
932 # ifndef HAVE_BCOPY_DECL
933 extern void bcopy(const void *s1, void *s2, size_t n);
937 #ifndef HAVE_BIND_DECL
938 extern int bind(int s, const struct sockaddr *name, socklen_t_equiv namelen);
942 #define bzero(s,n) ((void)memset((s),0,(n)))
944 # ifndef HAVE_BZERO_DECL
945 extern void bzero(void *s, size_t n);
949 #ifndef HAVE_CLOSELOG_DECL
950 extern void closelog(void);
953 #ifndef HAVE_CONNECT_DECL
954 extern int connect(int s, struct sockaddr *name, socklen_t_equiv namelen);
957 #ifndef HAVE_FCLOSE_DECL
958 extern int fclose(FILE *stream);
961 #ifndef HAVE_FFLUSH_DECL
962 extern int fflush(FILE *stream);
965 #ifndef HAVE_FPRINTF_DECL
966 extern int fprintf(FILE *stream, const char *format, ...);
969 #ifndef HAVE_FPUTC_DECL
970 extern int fputc(int c, FILE *stream);
973 #ifndef HAVE_FPUTS_DECL
974 extern int fputs(const char *s, FILE *stream);
977 #ifndef HAVE_FREAD_DECL
978 extern size_t fread(void *ptr, size_t size, size_t nitems, FILE *stream);
981 #ifndef HAVE_FSEEK_DECL
982 extern int fseek(FILE *stream, long offset, int ptrname);
985 #ifndef HAVE_FWRITE_DECL
986 extern size_t fwrite(const void *ptr, size_t size, size_t nitems,
990 #ifndef HAVE_GETHOSTNAME_DECL
991 extern int gethostname(char *name, int namelen);
994 #ifndef HAVE_GETOPT_DECL
996 extern int getopt(int argc, char * const *argv, const char *optstring);
999 /* AIX #defines getpeername, and provides a prototype for the alternate name */
1000 #if !defined(HAVE_GETPEERNAME_DECL) && !defined(getpeername)
1001 extern int getpeername(int s, struct sockaddr *name, socklen_t_equiv *namelen);
1004 /* AIX #defines getsockname, and provides a prototype for the alternate name */
1005 #if !defined(HAVE_GETSOCKNAME_DECL) && !defined(getsockname)
1006 extern int getsockname(int s, struct sockaddr *name, socklen_t_equiv *namelen);
1009 #ifndef HAVE_GETSOCKOPT_DECL
1010 extern int getsockopt(int s, int level, int optname, char *optval,
1011 socklen_t_equiv *optlen);
1014 #ifndef HAVE_INITGROUPS
1015 # define initgroups(name,basegid) 0
1017 # ifndef HAVE_INITGROUPS_DECL
1018 extern int initgroups(const char *name, gid_t basegid);
1022 #ifndef HAVE_IOCTL_DECL
1023 extern int ioctl(int fildes, int request, ...);
1027 #ifndef HAVE_ISNORMAL
1028 #define isnormal(f) (((f) < 0.0) || ((f) > 0.0))
1032 #ifndef HAVE_LISTEN_DECL
1033 extern int listen(int s, int backlog);
1036 #ifndef HAVE_LSTAT_DECL
1037 extern int lstat(const char *path, struct stat *buf);
1040 #ifndef HAVE_MALLOC_DECL
1041 extern void *malloc (size_t size);
1044 #ifndef HAVE_MEMMOVE_DECL
1046 extern void *memmove(void *to, const void *from, size_t n);
1048 extern char *memmove(char *to, /*const*/ char *from, size_t n);
1052 #ifndef HAVE_MEMSET_DECL
1053 extern void *memset(void *s, int c, size_t n);
1056 #ifndef HAVE_MKTEMP_DECL
1057 extern char *mktemp(char *template);
1060 #ifndef HAVE_MKSTEMP_DECL
1061 extern int mkstemp(char *template);
1064 #ifndef HAVE_MKTIME_DECL
1065 extern time_t mktime(struct tm *timeptr);
1068 #ifndef HAVE_OPENLOG_DECL
1070 extern void openlog(const char *ident, int logopt, int facility);
1072 extern void openlog(const char *ident, int logopt);
1076 #ifndef HAVE_PCLOSE_DECL
1077 extern int pclose(FILE *stream);
1080 #ifndef HAVE_PERROR_DECL
1081 extern void perror(const char *s);
1084 #ifndef HAVE_PRINTF_DECL
1085 extern int printf(const char *format, ...);
1088 #ifndef HAVE_PUTS_DECL
1089 extern int puts(const char *s);
1092 #ifndef HAVE_REALLOC_DECL
1093 extern void *realloc(void *ptr, size_t size);
1096 /* AIX #defines recvfrom, and provides a prototype for the alternate name */
1097 #if !defined(HAVE_RECVFROM_DECL) && !defined(recvfrom)
1098 extern int recvfrom(int s, char *buf, int len, int flags,
1099 struct sockaddr *from, socklen_t_equiv *fromlen);
1102 #ifndef HAVE_REMOVE_DECL
1103 extern int remove(const char *path);
1106 #ifndef HAVE_RENAME_DECL
1107 extern int rename(const char *old, const char *new);
1110 #ifndef HAVE_REWIND_DECL
1111 extern void rewind(FILE *stream);
1114 #ifndef HAVE_RUSEROK_DECL
1115 extern int ruserok(const char *rhost, int suser,
1116 const char *ruser, const char *luser);
1119 #ifndef HAVE_SELECT_DECL
1120 extern int select(int nfds,
1121 SELECT_ARG_TYPE *readfds,
1122 SELECT_ARG_TYPE *writefds,
1123 SELECT_ARG_TYPE *exceptfds,
1124 struct timeval *timeout);
1127 #ifndef HAVE_SENDTO_DECL
1128 extern int sendto(int s, const char *msg, int len, int flags,
1129 const struct sockaddr *to, int tolen);
1132 #ifdef HAVE_SETRESGID
1133 #define setegid(x) setresgid((gid_t)-1,(x),(gid_t)-1)
1134 #ifndef HAVE_SETRESGID_DECL
1135 extern int setresgid(gid_t rgid, gid_t egid, gid_t sgid);
1138 #ifndef HAVE_SETEGID_DECL
1139 extern int setegid(gid_t egid);
1143 #ifdef HAVE_SETRESUID
1144 #define seteuid(x) setresuid((uid_t)-1,(x),(uid_t)-1)
1145 #ifndef HAVE_SETRESUID_DECL
1146 extern int setresuid(uid_t ruid, uid_t euid, uid_t suid);
1149 #ifndef HAVE_SETEUID_DECL
1150 extern int seteuid(uid_t euid);
1154 #ifndef HAVE_SETPGID_DECL
1156 extern int setpgid(pid_t pid, pid_t pgid);
1160 #ifndef HAVE_SETPGRP_DECL
1162 extern pid_t setpgrp(void);
1164 extern pid_t setpgrp(pid_t pgrp, pid_t pid);
1168 #ifndef HAVE_SETSOCKOPT_DECL
1169 extern int setsockopt(int s, int level, int optname,
1170 const char *optval, int optlen);
1174 #ifndef HAVE_SHMAT_DECL
1175 extern void *shmat(int shmid, const SHM_ARG_TYPE *shmaddr, int shmflg);
1178 #ifndef HAVE_SHMCTL_DECL
1179 extern int shmctl(int shmid, int cmd, struct shmid_ds *buf);
1182 #ifndef HAVE_SHMDT_DECL
1183 extern int shmdt(SHM_ARG_TYPE *shaddr);
1186 #ifndef HAVE_SHMGET_DECL
1187 extern int shmget(key_t key, size_t size, int shmflg);
1191 #ifndef HAVE_SNPRINTF_DECL
1192 #include "arglist.h"
1193 int snprintf(char *buf, size_t len, const char *format,...)
1196 #ifndef HAVE_VSNPRINTF_DECL
1197 #include "arglist.h"
1198 int vsnprintf(char *buf, size_t len, const char *format, va_list ap);
1201 #ifndef HAVE_SOCKET_DECL
1202 extern int socket(int domain, int type, int protocol);
1205 #ifndef HAVE_SOCKETPAIR_DECL
1206 extern int socketpair(int domain, int type, int protocol, int sv[2]);
1209 #ifndef HAVE_SSCANF_DECL
1210 extern int sscanf(const char *s, const char *format, ...);
1213 #ifndef HAVE_STRCASECMP_DECL
1214 extern int strcasecmp(const char *s1, const char *s2);
1217 #ifndef HAVE_STRERROR_DECL
1218 extern char *strerror(int errnum);
1221 #ifndef HAVE_STRFTIME_DECL
1222 extern size_t strftime(char *s, size_t maxsize, const char *format,
1223 const struct tm *timeptr);
1226 #ifndef HAVE_STRNCASECMP_DECL
1227 extern int strncasecmp(const char *s1, const char *s2, int n);
1230 #ifndef HAVE_SYSLOG_DECL
1231 extern void syslog(int priority, const char *logstring, ...)
1235 #ifndef HAVE_SYSTEM_DECL
1236 extern int system(const char *string);
1239 #ifndef HAVE_TIME_DECL
1240 extern time_t time(time_t *tloc);
1243 #ifndef HAVE_TOLOWER_DECL
1244 extern int tolower(int c);
1247 #ifndef HAVE_TOUPPER_DECL
1248 extern int toupper(int c);
1251 #ifndef HAVE_UNGETC_DECL
1252 extern int ungetc(int c, FILE *stream);
1255 #ifndef HAVE_VFPRINTF_DECL
1256 #include "arglist.h"
1257 extern int vfprintf(FILE *stream, const char *format, va_list ap);
1260 #ifndef HAVE_VPRINTF_DECL
1261 #include "arglist.h"
1262 extern int vprintf(const char *format, va_list ap);
1265 /* gnulib-only includes (hence "" instead of <>) */
1266 #include "getaddrinfo.h"
1267 #include "inet_ntop.h"
1269 #if !defined(S_ISCHR) && defined(_S_IFCHR) && defined(_S_IFMT)
1270 #define S_ISCHR(mode) (((mode) & _S_IFMT) == _S_IFCHR)
1273 #if !defined(S_ISREG) && defined(_S_IFREG) && defined(_S_IFMT)
1274 #define S_ISREG(mode) (((mode) & _S_IFMT) == _S_IFREG)
1277 #ifndef HAVE_WAITPID
1279 #define waitpid(pid,status,options) wait4(pid,status,options,0)
1281 extern pid_t waitpid(pid_t pid, amwait_t *stat_loc, int options);
1285 #ifndef HAVE_WRITEV_DECL
1286 extern ssize_t writev(int fd, const struct iovec *iov, int iovcnt);
1289 #ifndef STDIN_FILENO
1290 #define STDIN_FILENO 0
1293 #ifndef STDOUT_FILENO
1294 #define STDOUT_FILENO 1
1297 #ifndef STDERR_FILENO
1298 #define STDERR_FILENO 2
1301 /* S_ISDIR is not defined on Nextstep */
1303 #if defined(_S_IFMT) && defined(_S_IFDIR)
1304 #define S_ISDIR(mode) (((mode) & (_S_IFMT)) == (_S_IFDIR))
1306 #error Don t know how to define S_ISDIR
1310 #if SIZEOF_SIZE_T == SIZEOF_INT
1311 # define SIZE_T_ATOI (size_t)atoi
1313 # define SIZE_MAX G_MAXUINT
1316 # define SIZE_T_ATOI (size_t)atol
1318 # define SIZE_MAX ULONG_MAX
1322 #if SIZEOF_SSIZE_T == SIZEOF_INT
1323 # define SSIZE_T_ATOI (ssize_t)atoi
1325 # define SSIZE_MAX INT_MAX
1328 # define SSIZE_MIN INT_MIN
1331 # define SSIZE_T_ATOI (ssize_t)atol
1333 # define SSIZE_MAX LONG_MAX
1336 # define SSIZE_MIN LONG_MIN
1340 #if SIZEOF_TIME_T == SIZEOF_INT
1341 # define TIME_T_ATOI (time_t)atoi
1343 # define TIME_MAX G_MAXUINT
1346 # define TIME_T_ATOI (time_t)atol
1348 # define TIME_MAX ULONG_MAX
1352 #if SIZEOF_OFF_T > SIZEOF_LONG
1354 # define OFF_T_ATOI (off_t)atoll
1356 # define OFF_T_ATOI (off_t)atol
1358 # ifdef HAVE_STRTOLL
1359 # define OFF_T_STRTOL (off_t)strtoll
1361 # define OFF_T_STRTOL (off_t)strtol
1364 # if SIZEOF_OFF_T == SIZEOF_LONG
1365 # define OFF_T_ATOI (off_t)atol
1366 # define OFF_T_STRTOL (off_t)strtol
1368 # define OFF_T_ATOI (off_t)atoi
1369 # define OFF_T_STRTOL (off_t)strtol
1373 #if SIZEOF_OFF_T == 8
1375 # define AM64_MAX (off_t)(OFF_MAX)
1377 # define AM64_MAX (off_t)(9223372036854775807LL)
1380 # define AM64_MIN (off_t)(OFF_MIN)
1382 # define AM64_MIN (off_t)(-9223372036854775807LL -1LL)
1385 #if SIZEOF_LONG == 8
1387 # define AM64_MAX (off_t)(LONG_MAX)
1389 # define AM64_MAX (off_t)9223372036854775807L
1392 # define AM64_MIN (off_t)(LONG_MIN)
1394 # define AM64_MIN (off_t)(-9223372036854775807L -1L)
1397 #if SIZEOF_LONG_LONG == 8
1398 # ifdef LONG_LONG_MAX
1399 # define AM64_MAX (off_t)(LONG_LONG_MAX)
1401 # define AM64_MAX (off_t)9223372036854775807LL
1403 # ifdef LONG_LONG_MIN
1404 # define AM64_MIN (off_t)(LONG_LONG_MIN)
1406 # define AM64_MIN (off_t)(-9223372036854775807LL -1LL)
1409 #if SIZEOF_INTMAX_T == 8
1411 # define AM64_MAX (off_t)(INTMAX_MAX)
1413 # define AM64_MAX (off_t)9223372036854775807LL
1416 # define AM64_MIN (off_t)(INTMAX_MIN)
1418 # define AM64_MIN (off_t)(-9223372036854775807LL -1LL)
1420 #else /* no 64 bits type found, use long. */
1422 # define AM64_MAX (off_t)(LONG_MAX)
1424 # define AM64_MAX (off_t)2147483647
1427 # define AM64_MIN (off_t)(LONG_MIN)
1429 # define AM64_MIN (off_t)(-2147483647 -1)
1436 #define BIND_CYCLE_RETRIES 120 /* Total of 30 minutes */
1438 #define MAX_DUMPERS 63
1441 #define NI_MAXHOST 1025
1445 KENCRYPT_NONE, /* krb5 encryption not enabled */
1446 KENCRYPT_WILL_DO, /* krb5 encryption will be enabled once amanda
1447 protocol stream is closed */
1448 KENCRYPT_YES /* krb5 encryption enabled on all stream */
1451 #endif /* !AMANDA_H */