X-Git-Url: https://git.exim.org/exim.git/blobdiff_plain/f1e5fef536bdc2c5d84c4bc7852d6e948253ccaf..2b68e140a846db4f24f4e29dfa16db73dc35c37f:/src/exim_monitor/em_main.c diff --git a/src/exim_monitor/em_main.c b/src/exim_monitor/em_main.c index 187dba3b0..5714b999c 100644 --- a/src/exim_monitor/em_main.c +++ b/src/exim_monitor/em_main.c @@ -1,10 +1,9 @@ -/* $Cambridge: exim/src/exim_monitor/em_main.c,v 1.6 2009/11/16 19:50:36 nm4 Exp $ */ - /************************************************* * Exim Monitor * *************************************************/ -/* Copyright (c) University of Cambridge 1995 - 2009 */ +/* Copyright (c) University of Cambridge 1995 - 2018 */ +/* Copyright (c) The Exim Maintainers 2021 - 2022 */ /* See the file NOTICE for conditions of use and distribution. */ @@ -168,15 +167,13 @@ Returns: nothing */ void -log_write(unsigned int selector, int flags, char *format, ...) +log_write(unsigned int selector, int flags, const char *format, ...) { va_list ap; va_start(ap, format); vfprintf(stderr, format, ap); fprintf(stderr, "\n"); va_end(ap); -selector = selector; /* Keep picky compilers happy */ -flags = flags; } @@ -200,19 +197,47 @@ Returns: 0 if there is no port, else the port number. */ int -host_address_extract_port(uschar *address) +host_address_extract_port(uschar * address) { -int skip = -3; /* Skip 3 dots in IPv4 addresses */ -address--; -while (*(++address) != 0) +int port = 0; +uschar *endptr; + +/* Handle the "bracketed with colon on the end" format */ + +if (*address == '[') + { + uschar *rb = address + 1; + while (*rb != 0 && *rb != ']') rb++; + if (*rb++ == 0) return 0; /* Missing ]; leave invalid address */ + if (*rb == ':') + { + port = Ustrtol(rb + 1, &endptr, 10); + if (*endptr != 0) return 0; /* Invalid port; leave invalid address */ + } + else if (*rb != 0) return 0; /* Bad syntax; leave invalid address */ + memmove(address, address + 1, rb - address - 2); + rb[-2] = 0; + } + +/* Handle the "dot on the end" format */ + +else { - int ch = *address; - if (ch == ':') skip = 0; /* Skip 0 dots in IPv6 addresses */ - else if (ch == '.' && skip++ >= 0) break; + int skip = -3; /* Skip 3 dots in IPv4 addresses */ + address--; + while (*(++address) != 0) + { + int ch = *address; + if (ch == ':') skip = 0; /* Skip 0 dots in IPv6 addresses */ + else if (ch == '.' && skip++ >= 0) break; + } + if (*address == 0) return 0; + port = Ustrtol(address + 1, &endptr, 10); + if (*endptr != 0) return 0; /* Invalid port; leave invalid address */ + *address = 0; } -if (*address == 0) return 0; -*address++ = 0; -return Uatoi(address); + +return port; } @@ -242,9 +267,6 @@ if (action_queue_update) tick_queue_accumulator = 999999; void updateAction(Widget w, XtPointer client_data, XtPointer call_data) { -w = w; /* Keep picky compilers happy */ -client_data = client_data; -call_data = call_data; scan_spool_input(TRUE); queue_display(); tick_queue_accumulator = 0; @@ -252,9 +274,6 @@ tick_queue_accumulator = 0; void hideAction(Widget w, XtPointer client_data, XtPointer call_data) { -w = w; /* Keep picky compilers happy */ -client_data = client_data; -call_data = call_data; actioned_message[0] = 0; dialog_ref_widget = w; dialog_action = da_hide; @@ -265,11 +284,7 @@ void unhideAction(Widget w, XtPointer client_data, XtPointer call_data) { skip_item *sk = queue_skip; -w = w; /* Keep picky compilers happy */ -client_data = client_data; -call_data = call_data; - -while (sk != NULL) +while (sk) { skip_item *next = sk->next; store_free(sk); @@ -287,9 +302,6 @@ tick_queue_accumulator = 0; void quitAction(Widget w, XtPointer client_data, XtPointer call_data) { -w = w; /* Keep picky compilers happy */ -client_data = client_data; -call_data = call_data; exit(0); } @@ -320,10 +332,6 @@ Dimension width, height; XWindowAttributes a; Window w = XtWindow(toplevel_widget); -button = button; /* Keep picky compilers happy */ -client_data = client_data; -call_data = call_data; - /* Get the position and size of the top level widget. */ sizepos_args[0].value = (XtArgVal)(&width); @@ -475,9 +483,6 @@ tick_queue_accumulator += tick_interval; tick_stripchart_accumulator += tick_interval; read_log(); -pt = pt; /* Keep picky compilers happy */ -i = i; - /* If we have passed the queue update time, we must do a full scan of the queue, checking for new arrivals, etc. This will as a by-product set the count of items for use by the stripchart @@ -594,7 +599,8 @@ return ret; * Initialize * *************************************************/ -int main(int argc, char **argv) +int +main(int argc, char **argv) { int i; struct stat statdata; @@ -615,8 +621,8 @@ message_subdir[1] = 0; constructing file names and things. This call will initialize the store_get() function. */ -big_buffer_size = 1024; -big_buffer = store_get(big_buffer_size); +store_init(); +big_buffer = store_get(big_buffer_size, GET_UNTAINTED); /* Set up the version string and date and output them */ @@ -634,7 +640,7 @@ signal(SIGCHLD, sigchld_handler); /* Get the buffer for storing the string for the log display. */ -log_display_buffer = (uschar *)store_malloc(log_buffer_size); +log_display_buffer = US store_malloc(log_buffer_size); log_display_buffer[0] = 0; /* Initialize the data structures for the stripcharts */ @@ -656,7 +662,9 @@ today.) */ if (log_file[0] != 0) { - (void)string_format(log_file_open, sizeof(log_file_open), CS log_file); + /* Do *not* use "%s" here, we need the %D datestamp in the log_file to + be expanded! */ + (void)string_format(log_file_open, sizeof(log_file_open), CS log_file, NULL); log_datestamping = string_datestamp_offset >= 0; LOG = fopen(CS log_file_open, "r"); @@ -670,8 +678,14 @@ if (log_file[0] != 0) { fseek(LOG, 0, SEEK_END); log_position = ftell(LOG); - fstat(fileno(LOG), &statdata); - log_inode = statdata.st_ino; + if (fstat(fileno(LOG), &statdata)) + { + perror("log file fstat"); + fclose(LOG); + LOG=NULL; + } + else + log_inode = statdata.st_ino; } } else