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