1 /*
2  * Copyright (c) 2005, Petr Rehor <rx@rx.cz>. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  * 3. Neither the name of the copyright holders nor the names of its
13  *    contributors may be used to endorse or promote products derived from
14  *    this software without specific prior written permission.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20  * OWNERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
22  * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
23  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
24  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
25  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
26  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  */
28 
29 #ifndef _AMAVISD_COMPAT_H
30 #define _AMAVISD_COMPAT_H
31 
32 #ifdef HAVE_CONFIG_H
33 # include <config.h>
34 #endif
35 
36 #if HAVE_STDBOOL_H
37 # include <stdbool.h>
38 #else
39 # if ! HAVE__BOOL
40 #  ifdef __cplusplus
41 typedef bool _Bool;
42 #  else
43 typedef unsigned char _Bool;
44 #  endif
45 # endif
46 # define bool _Bool
47 # define false 0
48 # define true 1
49 # define __bool_true_false_are_defined 1
50 #endif
51 
52 #include <errno.h>
53 #include <fcntl.h>
54 #include <libmilter/mfapi.h>
55 #include <libmilter/mfdef.h>
56 #include <limits.h>
57 #include <semaphore.h>
58 #include <stdio.h>
59 #include <stdlib.h>
60 #include <string.h>
61 #include <sys/param.h>
62 #include <sys/stat.h>
63 #include <sys/types.h>
64 #include <sys/un.h>
65 #include <syslog.h>
66 #include <unistd.h>
67 
68 #if HAVE_DIRENT_H
69 # include <dirent.h>
70 #else
71 # define dirent direct
72 # if HAVE_SYS_NDIR_H
73 #  include <sys/ndir.h>
74 # endif
75 # if HAVE_SYS_DIR_H
76 #  include <sys/dir.h>
77 # endif
78 # if HAVE_NDIR_H
79 #  include <ndir.h>
80 # endif
81 #endif
82 
83 #if !defined(HAVE_DIRFD) && !defined(HAVE_DIRFD_AS_MACRO)
84 # if defined(HAVE_DIR_D_FD)
85 #  define dirfd(_d) ((_d)->d_fd)
86 # elif defined(HAVE_DIR_DD_FD)
87 #  define dirfd(_d) ((_d)->dd_fd)
88 # elif defined(HAVE_DIR___DD_FD)
89 #  define dirfd(_d) ((_d)->__dd_fd)
90 # else
91 #  error cannot figure out how to turn a DIR * into a fd
92 # endif
93 #endif
94 
95 #if ! defined(MIN)
96 # define MIN(a, b)      ((a) < (b) ? (a) : (b))
97 #endif
98 #if ! defined(MAX)
99 # define MAX(a, b)      ((a) < (b) ? (b) : (a))
100 #endif
101 
102 #if ! HAVE_DAEMON
103 # ifndef _PATH_DEVNULL
104 #  define _PATH_DEVNULL "/dev/null"
105 # endif
106 /* Run detached from the controlling terminal */
107 extern int     daemon(int, int);
108 #endif
109 
110 #if HAVE_FTS_H
111 # include <fts.h>
112 #else
113 # include "fts_compat.h"
114 #endif
115 
116 #if TIME_WITH_SYS_TIME
117 # include <sys/time.h>
118 # include <time.h>
119 #else
120 # if HAVE_SYS_TIME_H
121 #  include <sys/time.h>
122 # else
123 #  include <time.h>
124 # endif
125 #endif
126 
127 #if ! HAVE_MKDTEMP
128 /* Make temporary directory */
129 extern char    *mkdtemp(char *);
130 #endif
131 
132 #if ! HAVE_STRLCPY
133 /* String copy */
134 extern size_t   strlcpy(char *, const char *, size_t);
135 #endif
136 
137 /* Secure socket handling */
138 extern ssize_t  read_sock(int, void *, size_t, long);
139 extern ssize_t  write_sock(int, void *, size_t, long);
140 
141 #endif /* _AMAVISD_COMPAT_H */
142