Hintsbd: fix locking
[exim.git] / src / exim_monitor / em_log.c
index 348f0642f4854d97a25266fc02fae9af58484eba..55dad0bae24b23d8e6ca3fd4b42017f7508afa1e 100644 (file)
@@ -2,8 +2,10 @@
 *                 Exim Monitor                   *
 *************************************************/
 
 *                 Exim Monitor                   *
 *************************************************/
 
+/* Copyright (c) The Exim Maintainers 2021 - 2024 */
 /* Copyright (c) University of Cambridge 1995 - 2018 */
 /* See the file NOTICE for conditions of use and distribution. */
 /* Copyright (c) University of Cambridge 1995 - 2018 */
 /* See the file NOTICE for conditions of use and distribution. */
+/* SPDX-License-Identifier: GPL-2.0-or-later */
 
 /* This module contains code for scanning the main log,
 extracting information from it, and displaying a "tail". */
 
 /* This module contains code for scanning the main log,
 extracting information from it, and displaying a "tail". */
@@ -106,7 +108,9 @@ length = Ustrlen(buffer);
 #ifdef ANONYMIZE
   {
   uschar *p = buffer + 9;
 #ifdef ANONYMIZE
   {
   uschar *p = buffer + 9;
-  if (p[6] == '-' && p[13] == '-') p += 17;
+  if (  p[MESSAGE_ID_TIME_LEN] == '-'
+     && p[MESSAGE_ID_TIME_LEN + MESSAGE_ID_PID_LEN + 1] == '-')
+      p += MESSAGE_ID_LENGTH + 1;
 
   while (p < buffer + length)
     {
 
   while (p < buffer + length)
     {
@@ -229,7 +233,7 @@ if (LOG != NULL)
     uschar *p = buffer;
     rmark reset_point;
     int length = Ustrlen(buffer);
     uschar *p = buffer;
     rmark reset_point;
     int length = Ustrlen(buffer);
-    int i;
+    pcre2_match_data * md = pcre2_match_data_create(1, NULL);
 
     /* Skip totally blank lines (paranoia: there shouldn't be any) */
 
 
     /* Skip totally blank lines (paranoia: there shouldn't be any) */
 
@@ -246,27 +250,25 @@ if (LOG != NULL)
     stripchart is the queue length, which is handled elsewhere, and the
     1st may the a size monitor. */
 
     stripchart is the queue length, which is handled elsewhere, and the
     1st may the a size monitor. */
 
-    for (i = stripchart_varstart; i < stripchart_number; i++)
-      {
-      if (pcre_exec(stripchart_regex[i], NULL, CS buffer, length, 0, PCRE_EOPT,
-            NULL, 0) >= 0)
+    for (int i = stripchart_varstart; i < stripchart_number; i++)
+      if (pcre2_match(stripchart_regex[i], (PCRE2_SPTR)buffer, length,
+                       0, PCRE_EOPT, md, NULL) >= 0)
         stripchart_total[i]++;
         stripchart_total[i]++;
-      }
 
     /* Munge the log entry and display shortened form on one line.
     We omit the date and show only the time. Remove any time zone offset.
     Take note of the presence of [pid]. */
 
 
     /* Munge the log entry and display shortened form on one line.
     We omit the date and show only the time. Remove any time zone offset.
     Take note of the presence of [pid]. */
 
-    if (pcre_exec(yyyymmdd_regex,NULL,CS buffer,length,0,PCRE_EOPT,NULL,0) >= 0)
+    if (pcre2_match(yyyymmdd_regex, (PCRE2_SPTR) buffer, length, 0, PCRE_EOPT,
+                     md, NULL) >= 0)
       {
       int pidlength = 0;
       {
       int pidlength = 0;
-      if ((buffer[20] == '+' || buffer[20] == '-') &&
-          isdigit(buffer[21]) && buffer[25] == ' ')
+      if (  (buffer[20] == '+' || buffer[20] == '-')
+         && isdigit(buffer[21]) && buffer[25] == ' ')
         memmove(buffer + 20, buffer + 26, Ustrlen(buffer + 26) + 1);
       if (buffer[20] == '[')
         memmove(buffer + 20, buffer + 26, Ustrlen(buffer + 26) + 1);
       if (buffer[20] == '[')
-        {
-        while (Ustrchr("[]0123456789", buffer[20+pidlength++]) != NULL);
-        }
+        while (Ustrchr("[]0123456789", buffer[20+pidlength++]) != NULL)
+         ;
       id = string_copyn(buffer + 20 + pidlength, MESSAGE_ID_LENGTH);
       show_log("%s", buffer+11);
       }
       id = string_copyn(buffer + 20 + pidlength, MESSAGE_ID_LENGTH);
       show_log("%s", buffer+11);
       }
@@ -275,6 +277,7 @@ if (LOG != NULL)
       id = US"";
       show_log("%s", buffer);
       }
       id = US"";
       show_log("%s", buffer);
       }
+    pcre2_match_data_free(md);
 
     /* Deal with frozen and unfrozen messages */
 
 
     /* Deal with frozen and unfrozen messages */
 
@@ -291,22 +294,20 @@ if (LOG != NULL)
 
     if ((p = Ustrstr(buffer, "==")) != NULL)
       {
 
     if ((p = Ustrstr(buffer, "==")) != NULL)
       {
-      queue_item *qq = find_queue(id, queue_noop, 0);
-      if (qq != NULL)
+      queue_item * qq = find_queue(id, queue_noop, 0);
+      if (qq)
         {
         dest_item *d;
         uschar *q, *r;
         p += 2;
         while (isspace(*p)) p++;
         q = p;
         {
         dest_item *d;
         uschar *q, *r;
         p += 2;
         while (isspace(*p)) p++;
         q = p;
-        while (*p != 0 && !isspace(*p))
+        while (*p && !isspace(*p))
           {
           if (*p++ != '\"') continue;
           {
           if (*p++ != '\"') continue;
-          while (*p != 0)
-            {
+          while (*p)
             if (*p == '\\') p += 2;
             if (*p == '\\') p += 2;
-              else if (*p++ == '\"') break;
-            }
+            else if (*p++ == '\"') break;
           }
         *p++ = 0;
         if ((r = strstric(q, qualify_domain, FALSE)) != NULL &&
           }
         *p++ = 0;
         if ((r = strstric(q, qualify_domain, FALSE)) != NULL &&
@@ -365,8 +366,9 @@ if (log_datestamping)
   {
   uschar log_file_wanted[256];
   /* Do *not* use "%s" here, we need the %D datestamp in the log_file string to
   {
   uschar log_file_wanted[256];
   /* Do *not* use "%s" here, we need the %D datestamp in the log_file string to
-  be expanded. */
-  string_format(log_file_wanted, sizeof(log_file_wanted), CS log_file);
+  be expanded.  The trailing NULL arg is to quieten preprocessors that need at
+  least one arg for a variadic set in a macro. */
+  string_format(log_file_wanted, sizeof(log_file_wanted), CS log_file, NULL);
   if (Ustrcmp(log_file_wanted, log_file_open) != 0)
     {
     if (LOG != NULL)
   if (Ustrcmp(log_file_wanted, log_file_open) != 0)
     {
     if (LOG != NULL)