* Exim - an Internet mail transport agent *
*************************************************/
+/* Copyright (c) The Exim Maintainers 2020 - 2022 */
/* Copyright (c) University of Cambridge 1995 - 2018 */
-/* Copyright (c) The Exim Maintainers 2020 - 2021 */
/* See the file NOTICE for conditions of use and distribution. */
/* Functions for writing log files. The code for maintaining datestamped
#include "exim.h"
-#define LOG_NAME_SIZE 256
#define MAX_SYSLOG_LEN 870
#define LOG_MODE_FILE 1
static uschar mainlog_name[LOG_NAME_SIZE];
static uschar rejectlog_name[LOG_NAME_SIZE];
-static uschar debuglog_name[LOG_NAME_SIZE];
static uschar *mainlog_datestamp = NULL;
static uschar *rejectlog_datestamp = NULL;
*/
static int
-log_open_already_exim(uschar * const name)
+log_open_already_exim(const uschar * const name)
{
int fd = -1;
const int flags = O_WRONLY | O_APPEND | O_CREAT | O_NONBLOCK;
*/
int
-log_open_as_exim(uschar * const name)
+log_open_as_exim(const uschar * const name)
{
int fd = -1;
const uid_t euid = geteuid();
*/
static void
-open_log(int *fd, int type, uschar *tag)
+open_log(int * fd, int type, const uschar * tag)
{
uid_t euid;
BOOL ok, ok2;
default:
/* Remove any datestamp if this is the panic log. This is rare, so there's no
- need to optimize getting the datestamp length. We remove one non-alphanumeric
- char afterwards if at the start, otherwise one before. */
+ need to optimize getting the datestamp length. We remove one non-alphanumeric
+ char afterwards if at the start, otherwise one before. */
if (string_datestamp_offset >= 0)
{
uschar * from = buffer + string_datestamp_offset;
/* Give up if the DIE flag is set */
if ((flags & LOG_PANIC_DIE) != LOG_PANIC)
- die(NULL, US"Unexpected failure, please try later");
+ if (panic_coredump)
+ kill(getpid(), SIGSEGV); /* deliberate trap */
+ else
+ die(NULL, US"Unexpected failure, please try later");
}
}
*/
void
-decode_bits(unsigned int *selector, size_t selsize, int *notall,
- uschar *string, bit_table *options, int count, uschar *which, int flags)
+decode_bits(unsigned int * selector, size_t selsize, int * notall,
+ const uschar * string, bit_table * options, int count, uschar * which,
+ int flags)
{
uschar *errmsg;
if (!string) return;
{
char *end; /* Not uschar */
memset(selector, 0, sizeof(*selector)*selsize);
- *selector = strtoul(CS string+1, &end, 0);
+ *selector = strtoul(CCS string+1, &end, 0);
if (!*end) return;
errmsg = string_sprintf("malformed numeric %s_selector setting: %s", which,
string);
else for(;;)
{
BOOL adding;
- uschar *s;
+ const uschar * s;
int len;
- bit_table *start, *end;
+ bit_table * start, * end;
Uskip_whitespace(&string);
if (!*string) return;
to pass the name through child_exxec_exim(). */
void
-debug_logging_activate(uschar *tag_name, uschar *opts)
+debug_logging_activate(const uschar * tag_name, const uschar * opts)
{
if (debug_file)
{
}
+void
+debug_logging_from_spool(const uschar * filename)
+{
+if (debug_fd < 0)
+ {
+ Ustrncpy(debuglog_name, filename, sizeof(debuglog_name));
+ if ((debug_fd = log_open_as_exim(filename)) >= 0)
+ debug_file = fdopen(debug_fd, "w");
+ DEBUG(D_deliver) debug_printf("debug enabled by spoolfile\n");
+ }
+/*
+else DEBUG(D_deliver)
+ debug_printf("debug already active; ignoring spoolfile '%s'\n", filename);
+*/
+}
+
+
void
debug_logging_stop(BOOL kill)
{