Fix listing a named queue by a non-admin user. Bug 2398
[exim.git] / src / exim_monitor / em_main.c
index 6de84662403609d20ee41d1bf87347090c056746..7aa760eb3e2d5e7f19b3eac7671ce01638f77c0e 100644 (file)
@@ -1,10 +1,8 @@
-/* $Cambridge: exim/src/exim_monitor/em_main.c,v 1.1 2004/10/07 10:39:01 ph10 Exp $ */
-
 /*************************************************
 *                  Exim Monitor                  *
 *************************************************/
 
-/* Copyright (c) University of Cambridge 1995 - 2004 */
+/* Copyright (c) University of Cambridge 1995 - 2018 */
 /* See the file NOTICE for conditions of use and distribution. */
 
 
@@ -168,7 +166,7 @@ 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);
@@ -200,7 +198,7 @@ Returns:     0 if there is no port, else the port number.
 */
 
 int
-host_extract_port(uschar *address)
+host_address_extract_port(uschar *address)
 {
 int skip = -3;                     /* Skip 3 dots in IPv4 addresses */
 address--;
@@ -615,7 +613,6 @@ 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);
 
 /* Set up the version string and date and output them */
@@ -634,7 +631,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 */
@@ -645,8 +642,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
-%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
@@ -656,6 +653,8 @@ today.) */
 
 if (log_file[0] != 0)
   {
+  /* 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);
   log_datestamping = string_datestamp_offset >= 0;
 
@@ -670,8 +669,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