From e90fcc54809db2591dc083f43ef54c6ec8c60847 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sun, 7 Apr 2024 18:16:13 +0200 Subject: Adding upstream version 4.96. Signed-off-by: Daniel Baumann --- exim_monitor/em_init.c | 238 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 238 insertions(+) create mode 100644 exim_monitor/em_init.c (limited to 'exim_monitor/em_init.c') diff --git a/exim_monitor/em_init.c b/exim_monitor/em_init.c new file mode 100644 index 0000000..e0bc3b0 --- /dev/null +++ b/exim_monitor/em_init.c @@ -0,0 +1,238 @@ +/************************************************* +* Exim monitor * +*************************************************/ + +/* Copyright (c) University of Cambridge 1995 - 2009 */ +/* Copyright (c) The Exim Maintainers 2020 - 2021 */ +/* See the file NOTICE for conditions of use and distribution. */ + +/* This module contains code to initialize things from the +environment and the arguments. */ + + +#include "em_hdr.h" + + + +/************************************************* +* Decode stripchart config * +*************************************************/ + +/* First determine how many are requested, then compile the +regular expressions and save the title strings. Note that +stripchart_number is initialized to 1 or 2 to count the always- +present queue stripchart, and the optional size-monitoring +stripchart. */ + +static void decode_stripchart_config(uschar *s) +{ +int i; + +/* Loop: first time just counts, second time does the +work. */ + +for (i = 0; i <= 1; i++) + { + int first = 1; + int count = 0; + uschar *p = s; + + if (*p == '/') p++; /* allow optional / at start */ + + /* This loops for all the substrings, using the first flag + to determine whether each is the first or second of the pairs. */ + + while (*p) + { + uschar *pp; + /* Handle continuations */ + if (*p == '\n') + { + while (*(++p) == ' ' || *p == '\t'); + if (*p == '/') p++; + } + + /* Find the end of the string and count if first string */ + + pp = p; + while (*p && *p != '/') p++; + if (first) count++; + + /* Take action on the second time round. */ + + if (i != 0) + { + uschar buffer[256]; + int indx = count + stripchart_varstart - 1; + Ustrncpy(buffer, pp, p-pp); + buffer[p-pp] = 0; + if (first) + { + size_t offset; + int err; + + if (!(stripchart_regex[indx] = + pcre2_compile((PCRE2_SPTR)buffer, + PCRE2_ZERO_TERMINATED, PCRE_COPT, + &err, &offset, NULL))) + { + uschar errbuf[128]; + pcre2_get_error_message(err, errbuf, sizeof(errbuf)); + printf("regular expression error: %s at offset %ld " + "while compiling %s\n", errbuf, (long)offset, buffer); + exit(99); + } + } + else stripchart_title[indx] = string_copy(buffer); + } + + /* Advance past the delimiter and flip the first/second flag */ + + p++; + first = !first; + } + + /* On the first pass, we now know the number of stripcharts. Get + store for holding the pointers to the regular expressions and + title strings. */ + + if (i == 0) + { + stripchart_number += count; + stripchart_regex = (pcre2_code **)store_malloc(stripchart_number * sizeof(pcre2_code *)); + stripchart_title = (uschar **)store_malloc(stripchart_number * sizeof(uschar *)); + } + } +} + + +/************************************************* +* Initialize * +*************************************************/ + +void init(int argc, uschar **argv) +{ +int x; +size_t erroroffset; +uschar *s; + +argc = argc; /* These are currently unused. */ +argv = argv; + +/* Deal with simple values in the environment. */ + +if ((s = US getenv("ACTION_OUTPUT"))) + { + if (Ustrcmp(s, "no") == 0) action_output = FALSE; + if (Ustrcmp(s, "yes") == 0) action_output = TRUE; + } + +if ((s = US getenv("ACTION_QUEUE_UPDATE"))) + { + if (Ustrcmp(s, "no") == 0) action_queue_update = FALSE; + if (Ustrcmp(s, "yes") == 0) action_queue_update = TRUE; + } + +s = US getenv("BODY_MAX"); +if (s && (x = Uatoi(s)) != 0) body_max = x; + +if ((s = US getenv("EXIM_PATH"))) + exim_path = string_copy(s); + +if ((s = US getenv("EXIMON_EXIM_CONFIG"))) + alternate_config = string_copy(s); + +if ((s = US getenv("LOG_BUFFER"))) + { + uschar c[1]; + if (sscanf(CS s, "%d%c", &x, c) > 0) + { + if (c[0] == 'K' || c[0] == 'k') x *= 1024; + if (x < 1024) x = 1024; + log_buffer_size = x; + } + } + +s = US getenv("LOG_DEPTH"); +if (s && (x = Uatoi(s)) != 0) log_depth = x; + +if ((s = US getenv("LOG_FILE_NAME"))) + log_file = string_copy(s); + +if ((s = US getenv("LOG_FONT"))) + log_font = string_copy(s); + +s = US getenv("LOG_WIDTH"); +if (s && (x = Uatoi(s)) != 0) log_width = x; + +if ((s = US getenv("MENU_EVENT"))) + menu_event = string_copy(s); + +s = US getenv("MIN_HEIGHT"); +if (s && (x = Uatoi(s)) > 0) min_height = x; + +s = US getenv("MIN_WIDTH"); +if (s && (x = Uatoi(s)) > 0) min_width = x; + +if ((s = US getenv("QUALIFY_DOMAIN"))) + qualify_domain = string_copy(s); +else + qualify_domain = US""; /* Don't want NULL */ + +s = US getenv("QUEUE_DEPTH"); +if (s && (x = Uatoi(s)) != 0) queue_depth = x; + +if ((s = US getenv("QUEUE_FONT"))) + queue_font = string_copy(s); + +s = US getenv("QUEUE_INTERVAL"); +if (s && (x = Uatoi(s)) != 0) queue_update = x; + +s = US getenv("QUEUE_MAX_ADDRESSES"); +if (s && (x = Uatoi(s)) != 0) queue_max_addresses = x; + +s = US getenv("QUEUE_WIDTH"); +if (s && (x = Uatoi(s)) != 0) queue_width = x; + +if ((s = US getenv("SPOOL_DIRECTORY"))) + spool_directory = string_copy(s); + +s = US getenv("START_SMALL"); +if (s && Ustrcmp(s, "yes") == 0) start_small = 1; + +s = US getenv("TEXT_DEPTH"); +if (s && (x = Uatoi(s)) != 0) text_depth = x; + +if ((s = US getenv("WINDOW_TITLE"))) + window_title = string_copy(s); + +/* Deal with stripchart configuration. First see if we are monitoring +the size of a partition, then deal with log stripcharts in a separate +function */ + +s = US getenv("SIZE_STRIPCHART"); +if (s && *s) + { + stripchart_number++; + stripchart_varstart++; + size_stripchart = string_copy(s); + s = US getenv("SIZE_STRIPCHART_NAME"); + if (s != NULL && *s != 0) size_stripchart_name = string_copy(s); + } + +if ((s = US getenv("LOG_STRIPCHARTS"))) + decode_stripchart_config(s); + +s = US getenv("STRIPCHART_INTERVAL"); +if (s && (x = Uatoi(s)) != 0) stripchart_update = x; + +s = US getenv("QUEUE_STRIPCHART_NAME"); +queue_stripchart_name = s ? string_copy(s) : US"queue"; + +/* Compile the regex for matching yyyy-mm-dd at the start of a string. */ + +yyyymmdd_regex = pcre2_compile((PCRE2_SPTR)"^\\d{4}-\\d\\d-\\d\\d\\s", + PCRE2_ZERO_TERMINATED, PCRE_COPT, &x, &erroroffset, NULL); +} + +/* End of em_init.c */ -- cgit v1.2.3