Apply Ian Freislich's patch to fix a spamd timeout problem.
[exim.git] / src / src / exim.h
1 /* $Cambridge: exim/src/src/exim.h,v 1.11 2005/04/27 10:00:18 ph10 Exp $ */
2
3 /*************************************************
4 * Exim - an Internet mail transport agent *
5 *************************************************/
6
7 /* Copyright (c) University of Cambridge 1995 - 2005 */
8 /* See the file NOTICE for conditions of use and distribution. */
9
10
11 /* Source files for exim all #include this header, which drags in everything
12 that is needed. They don't all need everything, of course, but it's far too
13 messy to have each one importing its own list, and anyway, most of them need
14 most of these includes. */
15
16 /* Assume most systems have statfs() unless os.h undefines this macro */
17
18 #define HAVE_STATFS
19
20 /* First of all include the os-specific header, which might set things that
21 are needed by any of the other headers, including system headers. */
22
23 #include "os.h"
24
25 /* If it didn't define os_find_running_interfaces, use the common function. */
26
27 #ifndef os_find_running_interfaces
28 #define os_find_running_interfaces os_common_find_running_interfaces
29 #endif
30
31 /* If it didn't define the base for "base 62" numbers, we really do use 62.
32 This is the case for all real Unix and Unix-like OS. It's only Cygwin and
33 Darwin, with their case-insensitive file systems, that can't use base 62 for
34 making unique names. */
35
36 #ifndef BASE_62
37 #define BASE_62 62
38 #endif
39
40 /* The maximum value of localhost_number depends on the base being used */
41
42 #if BASE_62 == 62
43 #define LOCALHOST_MAX 16
44 #else
45 #define LOCALHOST_MAX 10
46 #endif
47
48 /* ANSI C standard includes */
49
50 #include <ctype.h>
51 #include <locale.h>
52 #include <signal.h>
53 #include <stdarg.h>
54 #include <stddef.h>
55 #include <stdio.h>
56 #include <stdlib.h>
57 #include <string.h>
58 #include <time.h>
59
60 /* Unix includes */
61
62 #include <errno.h>
63 #if defined(__svr4__) && defined(__sparc) && ! defined(__EXTENSIONS__)
64 #define __EXTENSIONS__ /* so that SunOS 5 gets NGROUPS_MAX */
65 #include <limits.h>
66 #undef __EXTENSIONS__
67 #else
68 #include <limits.h>
69 #endif
70
71 /* Just in case some aged system doesn't define them... */
72
73 #ifndef INT_MAX
74 #define INT_MAX 2147483647
75 #endif
76
77 #ifndef UCHAR_MAX
78 #define UCHAR_MAX 255
79 #endif
80
81 /* Some systems have PATH_MAX and some have MAX_PATH_LEN. */
82
83 #ifndef PATH_MAX
84 #ifdef MAX_PATH_LEN
85 #define PATH_MAX MAX_PATH_LEN
86 #else
87 #define PATH_MAX 1024
88 #endif
89 #endif
90
91 #include <sys/types.h>
92 #include <sys/file.h>
93 #include <dirent.h>
94 #include <netdb.h>
95 #include <poll.h>
96 #include <pwd.h>
97 #include <grp.h>
98 #include <syslog.h>
99
100 /* Not all systems have flock() available. Those that do must define LOCK_SH
101 in sys/file.h. */
102
103 #ifndef LOCK_SH
104 #define NO_FLOCK
105 #endif
106
107 #ifndef NO_SYSEXITS /* some OS don't have this */
108 #include <sysexits.h>
109 #endif
110
111 /* A few OS don't have socklen_t; their os.h files define EXIM_SOCKLEN_T to
112 be size_t or whatever. We used to use SOCKLEN_T, but then it was discovered
113 that this is used by the AIX include files. */
114
115 #ifndef EXIM_SOCKLEN_T
116 #define EXIM_SOCKLEN_T socklen_t
117 #endif
118
119 /* Ensure that the sysexits we reference are defined */
120
121 #ifndef EX_UNAVAILABLE
122 #define EX_UNAVAILABLE 69 /* service unavailable; used for execv fail */
123 #endif
124 #ifndef EX_CANTCREAT
125 #define EX_CANTCREAT 73 /* can't create file: treat as temporary */
126 #endif
127 #ifndef EX_TEMPFAIL
128 #define EX_TEMPFAIL 75 /* temp failure; user is invited to retry */
129 #endif
130 #ifndef EX_CONFIG
131 #define EX_CONFIG 78 /* configuration error */
132 #endif
133
134 /* This one is not in any sysexits file that I've come across */
135
136 #define EX_EXECFAILED 127 /* execve() failed */
137
138
139 #include <sys/time.h>
140 #include <sys/param.h>
141
142 #ifndef NO_SYS_RESOURCE_H /* QNX doesn't have this */
143 #include <sys/resource.h>
144 #endif
145
146 #include <sys/socket.h>
147
148 /* If we are on an IPv6 system, the macro AF_INET6 will have been defined in
149 the sys/socket.h header. It is helpful to have this defined on an IPv4 system
150 so that it can appear in the code, even if it is never actually used when
151 the code is run. It saves some #ifdef occurrences. */
152
153 #ifndef AF_INET6
154 #define AF_INET6 24
155 #endif
156
157 #include <sys/ioctl.h>
158
159 /* The new standard is statvfs; some OS have statfs. For statvfs the block
160 counts must be multiplied by the "fragment size" f_frsize to get the actual
161 size. In other cases the value seems to be f_bsize (which is sometimes the only
162 block size), so we use a macro to get that instead.
163
164 Also arrange to be able to cut it out altogether for way-out OS that don't have
165 anything. I've indented a bit here to try to make the mess a bit more
166 intelligible. Note that simply defining one name to be another when
167 HAVE_SYS_STATVFS_H is not set will not work if the system has a statvfs macro
168 or a macro with entries f_frsize and f_bsize. */
169
170 #ifdef HAVE_STATFS
171 #ifdef HAVE_SYS_STATVFS_H
172 #include <sys/statvfs.h>
173 #define STATVFS statvfs
174 #define F_FRSIZE f_frsize
175 #else
176 #define STATVFS statfs
177 #define F_FRSIZE f_bsize
178 #ifdef HAVE_SYS_VFS_H
179 #include <sys/vfs.h>
180 #ifdef HAVE_SYS_STATFS_H
181 #include <sys/statfs.h>
182 #endif
183 #endif
184 #ifdef HAVE_SYS_MOUNT_H
185 #include <sys/mount.h>
186 #endif
187 #endif
188
189 /* Macros for the fields for the available space for non-superusers; define
190 these only if the OS header has not. Not all OS have f_favail; those that
191 are known to have it define F_FAVAIL as f_favail. The default is to use
192 f_free. */
193
194 #ifndef F_BAVAIL
195 #define F_BAVAIL f_bavail
196 #endif
197
198 #ifndef F_FAVAIL
199 #define F_FAVAIL f_ffree
200 #endif
201
202 /* All the systems I've been able to look at seem to have F_FILES */
203
204 #ifndef F_FILES
205 #define F_FILES f_files
206 #endif
207
208 #endif
209
210
211 #ifndef SIOCGIFCONF /* HACK for SunOS 5 */
212 #include <sys/sockio.h>
213 #endif
214
215 #include <sys/stat.h>
216 #include <sys/wait.h>
217 #include <sys/utsname.h>
218 #include <fcntl.h>
219
220 /* There's a shambles in IRIX6 - it defines EX_OK in unistd.h which conflicts
221 with the definition in sysexits.h. Arrange to preserve it, even though at
222 present Exim doesn't actually use it. */
223
224 #ifdef EX_OK
225 #define SAVE_EX_OK EX_OK
226 #undef EX_OK
227 #endif
228
229 #include <unistd.h>
230
231 #ifdef SAVE_EX_OK
232 #ifdef EX_OK
233 #undef EX_OK
234 #endif
235 #define EX_OK SAVE_EX_OK
236 #endif
237
238 #include <utime.h>
239 #ifndef NO_NET_IF_H
240 #include <net/if.h>
241 #endif
242 #include <sys/un.h>
243 #include <netinet/in.h>
244 #include <netinet/tcp.h>
245 #include <arpa/inet.h>
246 #include <arpa/nameser.h>
247
248
249 /* If arpa/nameser.h defines a maximum name server packet size, use it,
250 provided it is greater than 2048. Otherwise go for a default. PACKETSZ was used
251 for this, but it seems that NS_PACKETSZ is coming into use. */
252
253 #if defined(NS_PACKETSZ) && NS_PACKETSZ >= 2048
254 #define MAXPACKET NS_PACKETSZ
255 #elif defined(PACKETSZ) && PACKETSZ >= 2048
256 #define MAXPACKET PACKETSZ
257 #else
258 #define MAXPACKET 2048
259 #endif
260
261 /* While IPv6 is still young the definitions of T_AAAA and T_A6 may not be
262 included in arpa/nameser.h. Fudge them here. */
263
264 #ifndef T_AAAA
265 #define T_AAAA 28
266 #endif
267
268 #ifndef T_A6
269 #define T_A6 38
270 #endif
271
272 /* Ancient systems (e.g. SunOS4) don't appear to have T_TXT defined in their
273 header files. I don't suppose they have T_SRV either. */
274
275 #ifndef T_TXT
276 #define T_TXT 16
277 #endif
278
279 #ifndef T_SRV
280 #define T_SRV 33
281 #endif
282
283 /* We use the private type T_ZNS for retrieving the nameservers for the
284 enclosing zone of a domain, and the private type T_MXH for retrieving
285 the MX hostnames only (without their priorities). */
286
287 #define T_ZNS (-1)
288 #define T_MXH (-2)
289
290 /* The resolv.h header defines __P(x) on some Solaris 2.5.1 systems (without
291 checking that it is already defined, in fact). This conflicts with other
292 headers that behave likewise (see below), leading to compiler warnings. Arrange
293 to undefine it if resolv.h defines it. */
294
295 #if defined(__P)
296 #define __P_WAS_DEFINED_BEFORE_RESOLV
297 #endif
298
299 #include <resolv.h>
300
301 #if defined(__P) && ! defined (__P_WAS_DEFINED_BEFORE_RESOLV)
302 #undef __P
303 #endif
304
305 /* These three are to support the IP option logging code. Linux is
306 different to everyone else and there are also other systems which don't
307 have netinet/ip_var.h, so there's a general macro to control its inclusion. */
308
309 #include <netinet/in_systm.h>
310 #include <netinet/ip.h>
311
312 #ifndef NO_IP_VAR_H
313 #include <netinet/ip_var.h>
314 #endif
315
316 /* Linux (and some others) uses a different type for the 2nd argument of
317 iconv(). It's os.h file defines ICONV_ARG2_TYPE. For the rest, define a default
318 here. */
319
320 #ifndef ICONV_ARG2_TYPE
321 #define ICONV_ARG2_TYPE const char **
322 #endif
323
324 /* One OS uses a different type for the 5th argument of getsockopt */
325
326 #ifndef GETSOCKOPT_ARG5_TYPE
327 #define GETSOCKOPT_ARG5_TYPE socklen_t *
328 #endif
329
330 /* One operating system uses a different type for the 2nd argument of select().
331 Its os.h file defines SELECT_ARG2_TYPE. For the rest, define a default here. */
332
333 #ifndef SELECT_ARG2_TYPE
334 #define SELECT_ARG2_TYPE fd_set
335 #endif
336
337 /* One operating system uses a different type for the 4th argument of
338 dn_expand(). Its os.h file defines DN_EXPAND_ARG4_TYPE. For the rest, define a
339 default here. */
340
341 #ifndef DN_EXPAND_ARG4_TYPE
342 #define DN_EXPAND_ARG4_TYPE char *
343 #endif
344
345 /* One operating system defines a different type for the yield of inet_addr().
346 In Exim code, its value is always assigned to the s_addr members of address
347 structures. Casting the yield to the type of s_addr should fix the problem,
348 since the size of the data is correct. Just in case this ever has to be
349 changed, use a macro for the type, and define it here so that it is possible to
350 use different values for specific OS if ever necessary. */
351
352 #ifndef S_ADDR_TYPE
353 #define S_ADDR_TYPE u_long
354 #endif
355
356 /* (At least) one operating system (Solaris) defines a different type for the
357 second argument of pam_converse() - the difference is the absence of "const".
358 Its os.h file defines PAM_CONVERSE_ARG2_TYPE. For the rest, define a default
359 here. */
360
361 #ifndef PAM_CONVERSE_ARG2_TYPE
362 #define PAM_CONVERSE_ARG2_TYPE const struct pam_message
363 #endif
364
365 /* One operating system (SunOS4) defines getc, ungetc, feof, and ferror as
366 macros and not as functions. Exim needs them to be assignable functions. This
367 flag gets set to cause this to be sorted out here. */
368
369 #ifdef FUDGE_GETC_AND_FRIENDS
370 #undef getc
371 extern int getc(FILE *);
372 #undef ungetc
373 extern int ungetc(int, FILE *);
374 #undef feof
375 extern int feof(FILE *);
376 #undef ferror
377 extern int ferror(FILE *);
378 #endif
379
380 /* The header from the PCRE regex package */
381
382 #include "pcre/pcre.h"
383
384 /* Exim includes are in several files. Note that local_scan.h #includes
385 mytypes.h and store.h, so we don't need to mention them explicitly. */
386
387 #include "config.h"
388
389 #include "local_scan.h"
390 #include "macros.h"
391 #include "dbstuff.h"
392 #include "structs.h"
393 #include "globals.h"
394 #include "functions.h"
395 #include "dbfunctions.h"
396 #include "osfunctions.h"
397
398 #ifdef EXPERIMENTAL_BRIGHTMAIL
399 #include "bmi_spam.h"
400 #endif
401 #ifdef EXPERIMENTAL_SPF
402 #include "spf.h"
403 #endif
404 #ifdef EXPERIMENTAL_SRS
405 #include "srs.h"
406 #endif
407 #ifdef EXPERIMENTAL_DOMAINKEYS
408 #include "dk.h"
409 #endif
410
411 /* The following stuff must follow the inclusion of config.h because it
412 requires various things that are set therein. */
413
414 #if HAVE_ICONV /* Not all OS have this */
415 #include <iconv.h>
416 #endif
417
418 #if defined(USE_READLINE) || defined(EXPAND_DLFUNC)
419 #include <dlfcn.h>
420 #endif
421
422 /* Backward compatibility; LOOKUP_LSEARCH now includes all three */
423
424 #if (!defined LOOKUP_LSEARCH) && (defined LOOKUP_WILDLSEARCH || defined LOOKUP_NWILDLSEARCH)
425 #define LOOKUP_LSEARCH yes
426 #endif
427
428 /* Define a union to hold either an IPv4 or an IPv6 sockaddr structure; this
429 simplifies some of the coding. */
430
431 union sockaddr_46 {
432 struct sockaddr_in v4;
433 #if HAVE_IPV6
434 struct sockaddr_in6 v6;
435 #endif
436 };
437
438 /* If SUPPORT_TLS is not defined, ensure that USE_GNUTLS is also not defined
439 so that if USE_GNUTLS *is* set, we can assume SUPPORT_TLS is also set. */
440
441 #ifndef SUPPORT_TLS
442 #undef USE_GNUTLS
443 #endif
444
445 /* If SPOOL_DIRECTORY, LOG_FILE_PATH or PID_FILE_PATH have not been defined,
446 set them to the null string. */
447
448 #ifndef SPOOL_DIRECTORY
449 #define SPOOL_DIRECTORY ""
450 #endif
451 #ifndef LOG_FILE_PATH
452 #define LOG_FILE_PATH ""
453 #endif
454 #ifndef PID_FILE_PATH
455 #define PID_FILE_PATH ""
456 #endif
457
458 /* The EDQUOT error code isn't universally available, though it is widespread.
459 There is a particular shambles in SunOS5, where it did not exist originally,
460 but got installed with a particular patch for Solaris 2.4. There is a
461 configuration variable for specifying what the system's "over quota" error is,
462 which will end up in config.h if supplied in OS/Makefile-xxx. If it is not set,
463 default to EDQUOT if it exists, otherwise ENOSPC. */
464
465 #ifndef ERRNO_QUOTA
466 #ifdef EDQUOT
467 #define ERRNO_QUOTA EDQUOT
468 #else
469 #define ERRNO_QUOTA ENOSPC
470 #endif
471 #endif
472
473 /* Ensure PATH_MAX is defined */
474
475 #ifndef PATH_MAX
476 #ifdef MAXPATHLEN
477 #define PATH_MAX MAXPATHLEN
478 #else
479 #define PATH_MAX 1024
480 #endif
481 #endif
482
483
484 /* End of exim.h */