* 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. */
+/* SPDX-License-Identifier: GPL-2.0-or-later */
#include "../exim.h"
+
+#ifdef TRANSPORT_AUTOREPLY /* Remainder of file */
#include "autoreply.h"
s = newlist + Ustrlen(newlist);
while (s > newlist && (isspace(s[-1]) || s[-1] == ',')) s--;
-*s = 0;
+*s = '\0';
/* Check to see if there any addresses left; if not, return NULL */
s = newlist;
-while (s && isspace(*s)) s++;
-if (*s)
+if (Uskip_whitespace(&s))
return newlist;
store_reset(reset_point);
int cache_fd = -1;
int cache_size = 0;
int add_size = 0;
-EXIM_DB *dbm_file = NULL;
+EXIM_DB * dbm_file = NULL;
BOOL file_expand, return_message;
uschar *from, *reply_to, *to, *cc, *bcc, *subject, *headers, *text, *file;
uschar *logfile, *oncelog;
}
else
{
- uschar *oncerepeat = ob->once_repeat;
+ uschar * oncerepeat;
DEBUG(D_transport) debug_printf("taking data from transport\n");
- from = ob->from;
- reply_to = ob->reply_to;
- to = ob->to;
- cc = ob->cc;
- bcc = ob->bcc;
- subject = ob->subject;
- headers = ob->headers;
- text = ob->text;
- file = ob->file;
- logfile = ob->logfile;
- oncelog = ob->oncelog;
+ GET_OPTION("once_repeat"); oncerepeat = ob->once_repeat;
+ GET_OPTION("from"); from = ob->from;
+ GET_OPTION("reply_to"); reply_to = ob->reply_to;
+ GET_OPTION("to"); to = ob->to;
+ GET_OPTION("cc"); cc = ob->cc;
+ GET_OPTION("bcc"); bcc = ob->bcc;
+ GET_OPTION("subject"); subject = ob->subject;
+ GET_OPTION("headers"); headers = ob->headers;
+ GET_OPTION("text"); text = ob->text;
+ GET_OPTION("file"); file = ob->file;
+ GET_OPTION("log"); logfile = ob->logfile;
+ GET_OPTION("once"); oncelog = ob->oncelog;
file_expand = ob->file_expand;
return_message = ob->return_message;
dirname = (s = Ustrrchr(oncelog, '/'))
? string_copyn(oncelog, s - oncelog) : NULL;
- EXIM_DBOPEN(oncelog, dirname, O_RDWR|O_CREAT, ob->mode, &dbm_file);
- if (!dbm_file)
+ if (!(dbm_file = exim_dbopen(oncelog, dirname, O_RDWR|O_CREAT, ob->mode)))
{
addr->transport_return = DEFER;
addr->basic_errno = errno;
goto END_OFF;
}
- EXIM_DATUM_INIT(key_datum); /* Some DBM libraries need datums */
- EXIM_DATUM_INIT(result_datum); /* to be cleared */
- EXIM_DATUM_DATA(key_datum) = (void *) to;
- EXIM_DATUM_SIZE(key_datum) = Ustrlen(to) + 1;
+ exim_datum_init(&key_datum); /* Some DBM libraries need datums */
+ exim_datum_init(&result_datum); /* to be cleared */
+ exim_datum_data_set(&key_datum, (void *) to);
+ exim_datum_size_set(&key_datum, Ustrlen(to) + 1);
- if (EXIM_DBGET(dbm_file, key_datum, result_datum))
- {
- /* If the datum size is that of a binary time, we are in the new world
- where messages are sent periodically. Otherwise the file is an old one,
- where the datum was filled with a tod_log time, which is assumed to be
- different in size. For that, only one message is ever sent. This change
- introduced at Exim 3.00. In a couple of years' time the test on the size
- can be abolished. */
-
- if (EXIM_DATUM_SIZE(result_datum) == sizeof(time_t))
- memcpy(&then, EXIM_DATUM_DATA(result_datum), sizeof(time_t));
- else
- then = now;
- }
+ if (exim_dbget(dbm_file, &key_datum, &result_datum))
+ memcpy(&then, exim_datum_data_get(&result_datum), sizeof(time_t));
}
/* Either "then" is set zero, if no message has yet been sent, or it
addr->message = string_sprintf("Failed to create child process to send "
"message from %s transport: %s", tblock->name, strerror(errno));
DEBUG(D_transport) debug_printf("%s\n", addr->message);
- if (dbm_file) EXIM_DBCLOSE(dbm_file);
+ if (dbm_file) exim_dbclose(dbm_file);
return FALSE;
}
if (h)
{
message_id = Ustrchr(h->text, ':') + 1;
- while (isspace(*message_id)) message_id++;
+ Uskip_whitespace(&message_id);
fprintf(fp, "In-Reply-To: %s", message_id);
}
if (ff)
{
-debug_printf("%s %d: ff\n", __FUNCTION__, __LINE__);
while (Ufgets(big_buffer, big_buffer_size, ff) != NULL)
{
if (file_expand)
if (return_message)
{
-debug_printf("%s %d: ret msg\n", __FUNCTION__, __LINE__);
uschar *rubric = tblock->headers_only
? US"------ This is a copy of the message's header lines.\n"
: tblock->body_only
else if (dbm_file)
{
EXIM_DATUM key_datum, value_datum;
- EXIM_DATUM_INIT(key_datum); /* Some DBM libraries need to have */
- EXIM_DATUM_INIT(value_datum); /* cleared datums. */
- EXIM_DATUM_DATA(key_datum) = (void *) to;
- EXIM_DATUM_SIZE(key_datum) = Ustrlen(to) + 1;
+ exim_datum_init(&key_datum); /* Some DBM libraries need to have */
+ exim_datum_init(&value_datum); /* cleared datums. */
+ exim_datum_data_set(&key_datum, to);
+ exim_datum_size_set(&key_datum, Ustrlen(to) + 1);
/* Many OS define the datum value, sensibly, as a void *. However, there
are some which still have char *. By casting this address to a char * we
can avoid warning messages from the char * systems. */
- EXIM_DATUM_DATA(value_datum) = (void *) &now;
- EXIM_DATUM_SIZE(value_datum) = (int)sizeof(time_t);
- EXIM_DBPUT(dbm_file, key_datum, value_datum);
+ exim_datum_data_set(&value_datum, &now);
+ exim_datum_size_set(&value_datum, sizeof(time_t));
+ exim_dbput(dbm_file, &key_datum, &value_datum);
}
/* If sending failed, defer to try again - but if once is set the next
}
END_OFF:
-if (dbm_file) EXIM_DBCLOSE(dbm_file);
+if (dbm_file) exim_dbclose(dbm_file);
if (cache_fd > 0) (void)close(cache_fd);
DEBUG(D_transport) debug_printf("%s transport succeeded\n", tblock->name);
}
#endif /*!MACRO_PREDEF*/
+#endif /*TRANSPORT_AUTOREPOL*/
/* End of transport/autoreply.c */