Taint: check on supplied buffer vs. list when extracting elements
[exim.git] / src / exim_monitor / em_init.c
CommitLineData
059ec3d9
PH
1/*************************************************
2* Exim monitor *
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 module contains code to initialize things from the
9environment and the arguments. */
10
11
12#include "em_hdr.h"
13
14
15
16/*************************************************
17* Decode stripchart config *
18*************************************************/
19
20/* First determine how many are requested, then compile the
21regular expressions and save the title strings. Note that
22stripchart_number is initialized to 1 or 2 to count the always-
23present queue stripchart, and the optional size-monitoring
24stripchart. */
25
26static void decode_stripchart_config(uschar *s)
27{
28int i;
29
30/* Loop: first time just counts, second time does the
31work. */
32
33for (i = 0; i <= 1; i++)
34
35 {
36 int first = 1;
37 int count = 0;
38 uschar *p = s;
39
40 if (*p == '/') p++; /* allow optional / at start */
41
42 /* This loops for all the substrings, using the first flag
43 to determine whether each is the first or second of the pairs. */
44
45 while (*p)
46 {
47 uschar *pp;
48 /* Handle continuations */
49 if (*p == '\n')
50 {
51 while (*(++p) == ' ' || *p == '\t');
52 if (*p == '/') p++;
53 }
54
55 /* Find the end of the string and count if first string */
56
57 pp = p;
58 while (*p && *p != '/') p++;
59 if (first) count++;
60
61 /* Take action on the second time round. */
62
63 if (i != 0)
64 {
65 uschar buffer[256];
66 int indx = count + stripchart_varstart - 1;
67 Ustrncpy(buffer, pp, p-pp);
68 buffer[p-pp] = 0;
69 if (first)
70 {
71 int offset;
72 const uschar *error;
3d2e82c5
JH
73 if (!(stripchart_regex[indx] = pcre_compile(CS buffer, PCRE_COPT,
74 CCSS &error, &offset, NULL)))
059ec3d9
PH
75 {
76 printf("regular expression error: %s at offset %d "
77 "while compiling %s\n", error, offset, buffer);
78 exit(99);
79 }
80 }
81 else stripchart_title[indx] = string_copy(buffer);
82 }
83
84 /* Advance past the delimiter and flip the first/second flag */
85
86 p++;
87 first = !first;
88 }
89
90 /* On the first pass, we now know the number of stripcharts. Get
91 store for holding the pointers to the regular expressions and
92 title strings. */
93
94 if (i == 0)
95 {
96 stripchart_number += count;
97 stripchart_regex = (pcre **)store_malloc(stripchart_number * sizeof(pcre *));
98 stripchart_title = (uschar **)store_malloc(stripchart_number * sizeof(uschar *));
99 }
100 }
101}
102
103
104/*************************************************
105* Initialize *
106*************************************************/
107
108void init(int argc, uschar **argv)
109{
110int x;
111int erroroffset;
112uschar *s;
113const uschar *error;
114
115argc = argc; /* These are currently unused. */
116argv = argv;
117
118/* Deal with simple values in the environment. */
119
120s = US getenv("ACTION_OUTPUT");
121if (s != NULL)
122 {
123 if (Ustrcmp(s, "no") == 0) action_output = FALSE;
124 if (Ustrcmp(s, "yes") == 0) action_output = TRUE;
125 }
126
127s = US getenv("ACTION_QUEUE_UPDATE");
128if (s != NULL)
129 {
130 if (Ustrcmp(s, "no") == 0) action_queue_update = FALSE;
131 if (Ustrcmp(s, "yes") == 0) action_queue_update = TRUE;
132 }
133
134s = US getenv("BODY_MAX");
135if (s != NULL && (x = Uatoi(s)) != 0) body_max = x;
136
137s = US getenv("EXIM_PATH");
138if (s != NULL) exim_path = string_copy(s);
139
140s = US getenv("EXIMON_EXIM_CONFIG");
141if (s != NULL) alternate_config = string_copy(s);
142
143s = US getenv("LOG_BUFFER");
144if (s != NULL)
145 {
146 uschar c[1];
147 if (sscanf(CS s, "%d%c", &x, c) > 0)
148 {
149 if (c[0] == 'K' || c[0] == 'k') x *= 1024;
150 if (x < 1024) x = 1024;
151 log_buffer_size = x;
152 }
153 }
154
155s = US getenv("LOG_DEPTH");
156if (s != NULL && (x = Uatoi(s)) != 0) log_depth = x;
157
158s = US getenv("LOG_FILE_NAME");
159if (s != NULL) log_file = string_copy(s);
160
161s = US getenv("LOG_FONT");
162if (s != NULL) log_font = string_copy(s);
163
164s = US getenv("LOG_WIDTH");
165if (s != NULL && (x = Uatoi(s)) != 0) log_width = x;
166
167s = US getenv("MENU_EVENT");
168if (s != NULL) menu_event = string_copy(s);
169
170s = US getenv("MIN_HEIGHT");
171if (s != NULL && (x = Uatoi(s)) > 0) min_height = x;
172
173s = US getenv("MIN_WIDTH");
174if (s != NULL && (x = Uatoi(s)) > 0) min_width = x;
175
176s = US getenv("QUALIFY_DOMAIN");
177if (s != NULL) qualify_domain = string_copy(s);
178 else qualify_domain = US""; /* Don't want NULL */
179
180s = US getenv("QUEUE_DEPTH");
181if (s != NULL && (x = Uatoi(s)) != 0) queue_depth = x;
182
183s = US getenv("QUEUE_FONT");
184if (s != NULL) queue_font = string_copy(s);
185
186s = US getenv("QUEUE_INTERVAL");
187if (s != NULL && (x = Uatoi(s)) != 0) queue_update = x;
188
189s = US getenv("QUEUE_MAX_ADDRESSES");
190if (s != NULL && (x = Uatoi(s)) != 0) queue_max_addresses = x;
191
192s = US getenv("QUEUE_WIDTH");
193if (s != NULL && (x = Uatoi(s)) != 0) queue_width = x;
194
195s = US getenv("SPOOL_DIRECTORY");
196if (s != NULL) spool_directory = string_copy(s);
197
198s = US getenv("START_SMALL");
199if (s != NULL && Ustrcmp(s, "yes") == 0) start_small = 1;
200
201s = US getenv("TEXT_DEPTH");
202if (s != NULL && (x = Uatoi(s)) != 0) text_depth = x;
203
204s = US getenv("WINDOW_TITLE");
205if (s != NULL) window_title = string_copy(s);
206
207/* Deal with stripchart configuration. First see if we are monitoring
208the size of a partition, then deal with log stripcharts in a separate
209function */
210
211s = US getenv("SIZE_STRIPCHART");
212if (s != NULL && *s != 0)
213 {
214 stripchart_number++;
215 stripchart_varstart++;
216 size_stripchart = string_copy(s);
217 s = US getenv("SIZE_STRIPCHART_NAME");
218 if (s != NULL && *s != 0) size_stripchart_name = string_copy(s);
219 }
220
221s = US getenv("LOG_STRIPCHARTS");
222if (s != NULL) decode_stripchart_config(s);
223
224s = US getenv("STRIPCHART_INTERVAL");
225if (s != NULL && (x = Uatoi(s)) != 0) stripchart_update = x;
226
227s = US getenv("QUEUE_STRIPCHART_NAME");
228queue_stripchart_name = (s != NULL)? string_copy(s) : US"queue";
229
230/* Compile the regex for matching yyyy-mm-dd at the start of a string. */
231
232yyyymmdd_regex = pcre_compile("^\\d{4}-\\d\\d-\\d\\d\\s", PCRE_COPT,
3d2e82c5 233 CCSS &error, &erroroffset, NULL);
059ec3d9
PH
234}
235
236/* End of em_init.c */