Commit | Line | Data |
---|---|---|
059ec3d9 PH |
1 | /************************************************* |
2 | * Exim - an Internet mail transport agent * | |
3 | *************************************************/ | |
4 | ||
0a49a7a4 | 5 | /* Copyright (c) University of Cambridge 1995 - 2009 */ |
059ec3d9 PH |
6 | /* See the file NOTICE for conditions of use and distribution. */ |
7 | ||
8 | /* This file is not part of the main Exim code. There are little bits of test | |
9 | code for some of Exim's modules, and when they are used, the module they are | |
10 | testing may call other main Exim functions that are not available and/or | |
11 | should not be used in a test. The classic case is log_write(). This module | |
12 | contains dummy versions of such functions - well not really dummies, more like | |
13 | alternates. */ | |
14 | ||
15 | #include <stdarg.h> | |
16 | #include <stdio.h> | |
17 | #include <errno.h> | |
18 | #include <string.h> | |
19 | ||
20 | /* We don't have the full Exim headers dragged in, but this function | |
21 | is used for debugging output. */ | |
22 | ||
f3ebb786 | 23 | extern gstring * string_vformat(gstring *, unsigned, const char *, va_list); |
059ec3d9 PH |
24 | |
25 | ||
26 | /************************************************* | |
27 | * Handle calls to write the log * | |
28 | *************************************************/ | |
29 | ||
30 | /* The message gets written to stderr when log_write() is called from a | |
31 | utility. The message always gets '\n' added on the end of it. | |
32 | ||
33 | Arguments: | |
34 | selector not relevant when running a utility | |
35 | flags not relevant when running a utility | |
36 | format a printf() format | |
37 | ... arguments for format | |
38 | ||
39 | Returns: nothing | |
40 | */ | |
41 | ||
42 | void | |
43 | log_write(unsigned int selector, int flags, char *format, ...) | |
44 | { | |
45 | va_list ap; | |
46 | va_start(ap, format); | |
47 | vfprintf(stderr, format, ap); | |
48 | fprintf(stderr, "\n"); | |
49 | va_end(ap); | |
50 | selector = selector; /* Keep picky compilers happy */ | |
51 | flags = flags; | |
52 | } | |
53 | ||
54 | ||
55 | /************************************************* | |
56 | * Handle calls to print debug output * | |
57 | *************************************************/ | |
58 | ||
f3ebb786 JH |
59 | /* The message just gets written to stderr. |
60 | We use tainted memory to format into just so that we can handle | |
61 | tainted arguments. | |
059ec3d9 PH |
62 | |
63 | Arguments: | |
64 | format a printf() format | |
65 | ... arguments for format | |
66 | ||
67 | Returns: nothing | |
68 | */ | |
69 | ||
70 | void | |
71 | debug_printf(char *format, ...) | |
72 | { | |
73 | va_list ap; | |
f3ebb786 JH |
74 | rmark reset_point = store_mark(); |
75 | gstring * g = string_get_tainted(1024, TRUE); | |
059ec3d9 PH |
76 | |
77 | va_start(ap, format); | |
78 | ||
f3ebb786 | 79 | if (!string_vformat(g, 0, format, ap)) |
059ec3d9 | 80 | { |
d12746bc JH |
81 | char * s = "**** debug string overflowed buffer ****\n"; |
82 | char * p = CS g->s + g->ptr; | |
83 | int maxlen = g->size - (int)strlen(s) - 3; | |
84 | if (p > g->s + maxlen) p = g->s + maxlen; | |
85 | if (p > g->s && p[-1] != '\n') *p++ = '\n'; | |
059ec3d9 PH |
86 | strcpy(p, s); |
87 | } | |
88 | ||
d12746bc | 89 | fprintf(stderr, "%s", string_from_gstring(g)); |
059ec3d9 | 90 | fflush(stderr); |
d12746bc | 91 | store_reset(reset_point); |
059ec3d9 PH |
92 | va_end(ap); |
93 | } | |
94 | ||
95 | ||
96 | ||
97 | /************************************************* | |
98 | * SIGALRM handler * | |
99 | *************************************************/ | |
100 | ||
101 | extern int sigalrm_seen; | |
102 | ||
103 | void | |
104 | sigalrm_handler(int sig) | |
105 | { | |
106 | sig = sig; /* Keep picky compilers happy */ | |
c2a1bba0 | 107 | sigalrm_seen = TRUE; |
059ec3d9 PH |
108 | } |
109 | ||
110 | ||
111 | ||
112 | /************************************************* | |
113 | * Complete Dummies * | |
114 | *************************************************/ | |
115 | ||
116 | int | |
117 | header_checkname(void *h, char *name, int len) | |
118 | { | |
119 | h = h; /* Keep picky compilers happy */ | |
120 | name = name; | |
121 | len = len; | |
122 | return 0; | |
123 | } | |
124 | ||
125 | void | |
126 | directory_make(char *parent, char *name, int mode, int panic) | |
127 | { | |
128 | parent = parent; /* Keep picky compilers happy */ | |
129 | name = name; | |
130 | mode = mode; | |
131 | panic = panic; | |
132 | } | |
133 | ||
134 | void | |
135 | host_build_sender_fullhost(void) { } | |
136 | ||
137 | /* This one isn't needed for test_host */ | |
138 | ||
139 | #ifndef TEST_HOST | |
140 | char * | |
141 | host_ntoa(int type, const void *arg, char *buffer, int *portptr) | |
142 | { | |
143 | type = type; /* Keep picky compilers happy */ | |
144 | arg = arg; | |
145 | buffer = buffer; | |
146 | portptr = portptr; | |
147 | return NULL; | |
148 | } | |
149 | #endif | |
150 | ||
151 | ||
152 | /* End of dummies.c */ |