* Exim Monitor *
*************************************************/
-/* Copyright (c) University of Cambridge 1995 - 2014 */
+/* Copyright (c) University of Cambridge 1995 - 2018 */
+/* Copyright (c) The Exim Maintainers 2021 - 2022 */
/* See the file NOTICE for conditions of use and distribution. */
vfprintf(stderr, format, ap);
fprintf(stderr, "\n");
va_end(ap);
-selector = selector; /* Keep picky compilers happy */
-flags = flags;
}
*/
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 == '[')
{
- int ch = *address;
- if (ch == ':') skip = 0; /* Skip 0 dots in IPv6 addresses */
- else if (ch == '.' && skip++ >= 0) break;
+ 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;
}
-if (*address == 0) return 0;
-*address++ = 0;
-return Uatoi(address);
+
+/* Handle the "dot on the end" format */
+
+else
+ {
+ 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;
+ }
+
+return port;
}
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;
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;
{
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);
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);
}
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);
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
* Initialize *
*************************************************/
-int main(int argc, char **argv)
+int
+main(int argc, char **argv)
{
int i;
struct stat statdata;
constructing file names and things. This call will initialize
the store_get() function. */
-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 */
/* 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 */
{
/* 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);
+ (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");
{
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