1. Update version.
[exim.git] / src / src / exim.h
1 /* $Cambridge: exim/src/src/exim.h,v 1.12 2005/05/10 10:19:11 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 define a few private types for special DNS lookups:
284
285  . T_ZNS gets the nameservers of the enclosing zone of a domain
286
287  . T_MXH gets the MX hostnames only (without their priorities)
288
289  . T_CSA gets the domain's Client SMTP Authorization SRV record
290
291 */
292
293 #define T_ZNS (-1)
294 #define T_MXH (-2)
295 #define T_CSA (-3)
296
297 /* The resolv.h header defines __P(x) on some Solaris 2.5.1 systems (without
298 checking that it is already defined, in fact). This conflicts with other
299 headers that behave likewise (see below), leading to compiler warnings. Arrange
300 to undefine it if resolv.h defines it. */
301
302 #if defined(__P)
303 #define __P_WAS_DEFINED_BEFORE_RESOLV
304 #endif
305
306 #include <resolv.h>
307
308 #if defined(__P) && ! defined (__P_WAS_DEFINED_BEFORE_RESOLV)
309 #undef __P
310 #endif
311
312 /* These three are to support the IP option logging code. Linux is
313 different to everyone else and there are also other systems which don't
314 have netinet/ip_var.h, so there's a general macro to control its inclusion. */
315
316 #include <netinet/in_systm.h>
317 #include <netinet/ip.h>
318
319 #ifndef NO_IP_VAR_H
320 #include <netinet/ip_var.h>
321 #endif
322
323 /* Linux (and some others) uses a different type for the 2nd argument of
324 iconv(). It's os.h file defines ICONV_ARG2_TYPE. For the rest, define a default
325 here. */
326
327 #ifndef ICONV_ARG2_TYPE
328 #define ICONV_ARG2_TYPE const char **
329 #endif
330
331 /* One OS uses a different type for the 5th argument of getsockopt */
332
333 #ifndef GETSOCKOPT_ARG5_TYPE
334 #define GETSOCKOPT_ARG5_TYPE socklen_t *
335 #endif
336
337 /* One operating system uses a different type for the 2nd argument of select().
338 Its os.h file defines SELECT_ARG2_TYPE. For the rest, define a default here. */
339
340 #ifndef SELECT_ARG2_TYPE
341 #define SELECT_ARG2_TYPE fd_set
342 #endif
343
344 /* One operating system uses a different type for the 4th argument of
345 dn_expand(). Its os.h file defines DN_EXPAND_ARG4_TYPE. For the rest, define a
346 default here. */
347
348 #ifndef DN_EXPAND_ARG4_TYPE
349 #define DN_EXPAND_ARG4_TYPE char *
350 #endif
351
352 /* One operating system defines a different type for the yield of inet_addr().
353 In Exim code, its value is always assigned to the s_addr members of address
354 structures. Casting the yield to the type of s_addr should fix the problem,
355 since the size of the data is correct. Just in case this ever has to be
356 changed, use a macro for the type, and define it here so that it is possible to
357 use different values for specific OS if ever necessary. */
358
359 #ifndef S_ADDR_TYPE
360 #define S_ADDR_TYPE u_long
361 #endif
362
363 /* (At least) one operating system (Solaris) defines a different type for the
364 second argument of pam_converse() - the difference is the absence of "const".
365 Its os.h file defines PAM_CONVERSE_ARG2_TYPE. For the rest, define a default
366 here. */
367
368 #ifndef PAM_CONVERSE_ARG2_TYPE
369 #define PAM_CONVERSE_ARG2_TYPE const struct pam_message
370 #endif
371
372 /* One operating system (SunOS4) defines getc, ungetc, feof, and ferror as
373 macros and not as functions. Exim needs them to be assignable functions. This
374 flag gets set to cause this to be sorted out here. */
375
376 #ifdef FUDGE_GETC_AND_FRIENDS
377 #undef getc
378 extern int getc(FILE *);
379 #undef ungetc
380 extern int ungetc(int, FILE *);
381 #undef feof
382 extern int feof(FILE *);
383 #undef ferror
384 extern int ferror(FILE *);
385 #endif
386
387 /* The header from the PCRE regex package */
388
389 #include "pcre/pcre.h"
390
391 /* Exim includes are in several files. Note that local_scan.h #includes
392 mytypes.h and store.h, so we don't need to mention them explicitly. */
393
394 #include "config.h"
395
396 #include "local_scan.h"
397 #include "macros.h"
398 #include "dbstuff.h"
399 #include "structs.h"
400 #include "globals.h"
401 #include "functions.h"
402 #include "dbfunctions.h"
403 #include "osfunctions.h"
404
405 #ifdef EXPERIMENTAL_BRIGHTMAIL
406 #include "bmi_spam.h"
407 #endif
408 #ifdef EXPERIMENTAL_SPF
409 #include "spf.h"
410 #endif
411 #ifdef EXPERIMENTAL_SRS
412 #include "srs.h"
413 #endif
414 #ifdef EXPERIMENTAL_DOMAINKEYS
415 #include "dk.h"
416 #endif
417
418 /* The following stuff must follow the inclusion of config.h because it
419 requires various things that are set therein. */
420
421 #if HAVE_ICONV             /* Not all OS have this */
422 #include <iconv.h>
423 #endif
424
425 #if defined(USE_READLINE) || defined(EXPAND_DLFUNC)
426 #include <dlfcn.h>
427 #endif
428
429 /* Backward compatibility; LOOKUP_LSEARCH now includes all three */
430
431 #if (!defined LOOKUP_LSEARCH) && (defined LOOKUP_WILDLSEARCH || defined LOOKUP_NWILDLSEARCH)
432 #define LOOKUP_LSEARCH yes
433 #endif
434
435 /* Define a union to hold either an IPv4 or an IPv6 sockaddr structure; this
436 simplifies some of the coding. */
437
438 union sockaddr_46 {
439   struct sockaddr_in v4;
440   #if HAVE_IPV6
441   struct sockaddr_in6 v6;
442   #endif
443 };
444
445 /* If SUPPORT_TLS is not defined, ensure that USE_GNUTLS is also not defined
446 so that if USE_GNUTLS *is* set, we can assume SUPPORT_TLS is also set. */
447
448 #ifndef SUPPORT_TLS
449 #undef USE_GNUTLS
450 #endif
451
452 /* If SPOOL_DIRECTORY, LOG_FILE_PATH or PID_FILE_PATH have not been defined,
453 set them to the null string. */
454
455 #ifndef SPOOL_DIRECTORY
456   #define SPOOL_DIRECTORY ""
457 #endif
458 #ifndef LOG_FILE_PATH
459   #define LOG_FILE_PATH ""
460 #endif
461 #ifndef PID_FILE_PATH
462   #define PID_FILE_PATH ""
463 #endif
464
465 /* The EDQUOT error code isn't universally available, though it is widespread.
466 There is a particular shambles in SunOS5, where it did not exist originally,
467 but got installed with a particular patch for Solaris 2.4. There is a
468 configuration variable for specifying what the system's "over quota" error is,
469 which will end up in config.h if supplied in OS/Makefile-xxx. If it is not set,
470 default to EDQUOT if it exists, otherwise ENOSPC. */
471
472 #ifndef ERRNO_QUOTA
473 #ifdef  EDQUOT
474 #define ERRNO_QUOTA EDQUOT
475 #else
476 #define ERRNO_QUOTA ENOSPC
477 #endif
478 #endif
479
480 /* Ensure PATH_MAX is defined */
481
482 #ifndef PATH_MAX
483   #ifdef MAXPATHLEN
484   #define PATH_MAX MAXPATHLEN
485   #else
486   #define PATH_MAX 1024
487   #endif
488 #endif
489
490
491 /* End of exim.h */