Fix regext substring capture variables for null matches. Bug 2933
[exim.git] / src / exim_monitor / em_main.c
index 2756ab0151cd5f02e86f266e281e4fdb8cc09aa1..86caf71eba2aebedf473e69aff11b119d07db0e0 100644 (file)
@@ -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                  *
 *************************************************/
 
 /*************************************************
 *                  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. */
 
 
 /* See the file NOTICE for conditions of use and distribution. */
 
 
@@ -168,51 +167,13 @@ Returns:    nothing
 */
 
 void
 */
 
 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);
 {
 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;
-}
-
-
-
-
-/*************************************************
-*        Extract port from address string        *
-*************************************************/
-
-/* In the spool file, a host plus port is given as an IP address followed by a
-dot and a port number. This function decodes this. It is needed by the
-spool-reading function, and copied here to avoid having to include the whole
-host.c module. One day the interaction between exim and eximon with regard to
-included code MUST be tidied up!
-
-Argument:
-  address    points to the string; if there is a port, the '.' in the string
-             is overwritten with zero to terminate the address
-
-Returns:     0 if there is no port, else the port number.
-*/
-
-int
-host_address_extract_port(uschar *address)
-{
-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;
-*address++ = 0;
-return Uatoi(address);
 }
 
 
 }
 
 
@@ -242,9 +203,6 @@ if (action_queue_update) tick_queue_accumulator = 999999;
 
 void updateAction(Widget w, XtPointer client_data, XtPointer call_data)
 {
 
 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;
 scan_spool_input(TRUE);
 queue_display();
 tick_queue_accumulator = 0;
@@ -252,9 +210,6 @@ tick_queue_accumulator = 0;
 
 void hideAction(Widget w, XtPointer client_data, XtPointer call_data)
 {
 
 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;
 actioned_message[0] = 0;
 dialog_ref_widget = w;
 dialog_action = da_hide;
@@ -265,11 +220,7 @@ void unhideAction(Widget w, XtPointer client_data, XtPointer call_data)
 {
 skip_item *sk = queue_skip;
 
 {
 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);
   {
   skip_item *next = sk->next;
   store_free(sk);
@@ -287,9 +238,6 @@ tick_queue_accumulator = 0;
 
 void quitAction(Widget w, XtPointer client_data, XtPointer call_data)
 {
 
 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);
 }
 
 exit(0);
 }
 
@@ -320,10 +268,6 @@ Dimension width, height;
 XWindowAttributes a;
 Window w = XtWindow(toplevel_widget);
 
 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);
 /* Get the position and size of the top level widget. */
 
 sizepos_args[0].value = (XtArgVal)(&width);
@@ -475,9 +419,6 @@ tick_queue_accumulator += tick_interval;
 tick_stripchart_accumulator += tick_interval;
 read_log();
 
 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
 /* 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 +535,8 @@ return ret;
 *               Initialize                       *
 *************************************************/
 
 *               Initialize                       *
 *************************************************/
 
-int main(int argc, char **argv)
+int
+main(int argc, char **argv)
 {
 int i;
 struct stat statdata;
 {
 int i;
 struct stat statdata;
@@ -615,8 +557,8 @@ message_subdir[1] = 0;
 constructing file names and things. This call will initialize
 the store_get() function. */
 
 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 */
 
 
 /* Set up the version string and date and output them */
 
@@ -634,7 +576,7 @@ signal(SIGCHLD, sigchld_handler);
 
 /* Get the buffer for storing the string for the log display. */
 
 
 /* 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 */
 log_display_buffer[0] = 0;
 
 /* Initialize the data structures for the stripcharts */
@@ -645,8 +587,8 @@ stripchart_init();
 only, and we can't tail the log. If not, open the log file and position to the
 end of it. Before doing so, we have to detect whether the log files are
 datestamped, and if so, sort out the name. The string in log_file already has
 only, and we can't tail the log. If not, open the log file and position to the
 end of it. Before doing so, we have to detect whether the log files are
 datestamped, and if so, sort out the name. The string in log_file already has
-%s replaced by "main"; if datestamping is occurring, %D will be present. In
-fact, we don't need to test explicitly - just process the string with
+%s replaced by "main"; if datestamping is occurring, %D or %M will be present.
+In fact, we don't need to test explicitly - just process the string with
 string_format.
 
 Once opened, save the file's inode so that we can detect when the file is
 string_format.
 
 Once opened, save the file's inode so that we can detect when the file is
@@ -656,7 +598,9 @@ today.) */
 
 if (log_file[0] != 0)
   {
 
 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");
   log_datestamping = string_datestamp_offset >= 0;
 
   LOG = fopen(CS log_file_open, "r");
@@ -670,8 +614,14 @@ if (log_file[0] != 0)
     {
     fseek(LOG, 0, SEEK_END);
     log_position = ftell(LOG);
     {
     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
     }
   }
 else