git://git.exim.org
/
exim.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Build: avoid compiling code for unused transports, routers, authenticators
[exim.git]
/
src
/
src
/
transports
/
lmtp.c
diff --git
a/src/src/transports/lmtp.c
b/src/src/transports/lmtp.c
index b2bf5f0dae0801e7b989b5ef147765d841cae262..eff0dc79d905a177844f21e7e8e8d4242f8ff029 100644
(file)
--- a/
src/src/transports/lmtp.c
+++ b/
src/src/transports/lmtp.c
@@
-2,11
+2,15
@@
* Exim - an Internet mail transport agent *
*************************************************/
* Exim - an Internet mail transport agent *
*************************************************/
+/* Copyright (c) The Exim Maintainers 2020 - 2023 */
/* 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 */
#include "../exim.h"
#include "../exim.h"
+#ifdef TRANSPORT_LMTP /* Remainder of file */
+
#include "lmtp.h"
#define PENDING_OK 256
#include "lmtp.h"
#define PENDING_OK 256
@@
-21,17
+25,17
@@
instance block so as to be publicly visible; these are flagged with opt_public.
optionlist lmtp_transport_options[] = {
{ "batch_id", opt_stringptr | opt_public,
optionlist lmtp_transport_options[] = {
{ "batch_id", opt_stringptr | opt_public,
-
(void *)offsetof
(transport_instance, batch_id) },
+
OPT_OFF
(transport_instance, batch_id) },
{ "batch_max", opt_int | opt_public,
{ "batch_max", opt_int | opt_public,
-
(void *)offsetof
(transport_instance, batch_max) },
+
OPT_OFF
(transport_instance, batch_max) },
{ "command", opt_stringptr,
{ "command", opt_stringptr,
-
(void *)offsetof
(lmtp_transport_options_block, cmd) },
+
OPT_OFF
(lmtp_transport_options_block, cmd) },
{ "ignore_quota", opt_bool,
{ "ignore_quota", opt_bool,
-
(void *)offsetof
(lmtp_transport_options_block, ignore_quota) },
+
OPT_OFF
(lmtp_transport_options_block, ignore_quota) },
{ "socket", opt_stringptr,
{ "socket", opt_stringptr,
-
(void *)offsetof
(lmtp_transport_options_block, skt) },
+
OPT_OFF
(lmtp_transport_options_block, skt) },
{ "timeout", opt_time,
{ "timeout", opt_time,
-
(void *)offsetof
(lmtp_transport_options_block, timeout) }
+
OPT_OFF
(lmtp_transport_options_block, timeout) }
};
/* Size of the options list. An extern variable has to be used so that its
};
/* Size of the options list. An extern variable has to be used so that its
@@
-175,7
+179,7
@@
if (*errno_value == ERRNO_CHHEADER_FAIL)
if (*errno_value == ERRNO_WRITEINCOMPLETE)
{
if (*errno_value == ERRNO_WRITEINCOMPLETE)
{
- *message =
string_sprintf("failed to write a data block")
;
+ *message =
US"failed to write a data block"
;
return FALSE;
}
return FALSE;
}
@@
-228,15
+232,18
@@
gstring gs = { .size = big_buffer_size, .ptr = 0, .s = big_buffer };
int rc;
va_list ap;
int rc;
va_list ap;
+/*XXX see comment in smtp_write_command() regarding leaving stuff in
+big_buffer */
+
va_start(ap, format);
va_start(ap, format);
-if (!string_vformat(&gs,
FALSE
, CS format, ap))
+if (!string_vformat(&gs,
SVFMT_TAINT_NOCHK
, CS format, ap))
{
va_end(ap);
errno = ERRNO_SMTPFORMAT;
return FALSE;
}
va_end(ap);
{
va_end(ap);
errno = ERRNO_SMTPFORMAT;
return FALSE;
}
va_end(ap);
-DEBUG(D_transport|D_v) debug_printf(" LMTP>> %
s", string_from_gstring(&gs)
);
+DEBUG(D_transport|D_v) debug_printf(" LMTP>> %
Y", &gs
);
rc = write(fd, gs.s, gs.ptr);
gs.ptr -= 2; string_from_gstring(&gs); /* remove \r\n for debug and error message */
if (rc > 0) return TRUE;
rc = write(fd, gs.s, gs.ptr);
gs.ptr -= 2; string_from_gstring(&gs); /* remove \r\n for debug and error message */
if (rc > 0) return TRUE;
@@
-485,8
+492,8
@@
if (ob->cmd)
{
DEBUG(D_transport) debug_printf("using command %s\n", ob->cmd);
sprintf(CS buffer, "%.50s transport", tblock->name);
{
DEBUG(D_transport) debug_printf("using command %s\n", ob->cmd);
sprintf(CS buffer, "%.50s transport", tblock->name);
- if (!transport_set_up_command(&argv, ob->cmd, T
RUE, PANIC, addrlist, buffer
,
- NULL))
+ if (!transport_set_up_command(&argv, ob->cmd, T
SUC_EXPAND_ARGS, PANIC
,
+
addrlist, buffer,
NULL))
return FALSE;
/* If the -N option is set, can't do any more. Presume all has gone well. */
return FALSE;
/* If the -N option is set, can't do any more. Presume all has gone well. */
@@
-497,7
+504,8
@@
if (ob->cmd)
uid/gid and current directory. Request that the new process be a process group
leader, so we can kill it and all its children on an error. */
uid/gid and current directory. Request that the new process be a process group
leader, so we can kill it and all its children on an error. */
- if ((pid = child_open(USS argv, NULL, 0, &fd_in, &fd_out, TRUE)) < 0)
+ if ((pid = child_open(USS argv, NULL, 0, &fd_in, &fd_out, TRUE,
+ US"lmtp-tpt-cmd")) < 0)
{
addrlist->message = string_sprintf(
"Failed to create child process for %s transport: %s", tblock->name,
{
addrlist->message = string_sprintf(
"Failed to create child process for %s transport: %s", tblock->name,
@@
-511,8
+519,7
@@
leader, so we can kill it and all its children on an error. */
else
{
DEBUG(D_transport) debug_printf("using socket %s\n", ob->skt);
else
{
DEBUG(D_transport) debug_printf("using socket %s\n", ob->skt);
- sockname = expand_string(ob->skt);
- if (sockname == NULL)
+ if (!(sockname = expand_string(ob->skt)))
{
addrlist->message = string_sprintf("Expansion of \"%s\" (socket setting "
"for %s transport) failed: %s", ob->skt, tblock->name,
{
addrlist->message = string_sprintf("Expansion of \"%s\" (socket setting "
"for %s transport) failed: %s", ob->skt, tblock->name,
@@
-553,24
+560,24
@@
allows for message+recipient checks after the message has been received. */
/* First thing is to wait for an initial greeting. */
/* First thing is to wait for an initial greeting. */
-Ustrcpy(big_buffer, "initial connection");
-if (!lmtp_read_response(out, buffer, sizeof(buffer), '2',
-
timeout))
goto RESPONSE_FAILED;
+Ustrcpy(big_buffer,
US
"initial connection");
+if (!lmtp_read_response(out, buffer, sizeof(buffer), '2',
timeout))
+ goto RESPONSE_FAILED;
/* Next, we send a LHLO command, and expect a positive response */
/* Next, we send a LHLO command, and expect a positive response */
-if (!lmtp_write_command(fd_in, "%s %s\r\n", "LHLO",
-
primary_hostname))
goto WRITE_FAILED;
+if (!lmtp_write_command(fd_in, "%s %s\r\n", "LHLO",
primary_hostname))
+ goto WRITE_FAILED;
-if (!lmtp_read_response(out, buffer, sizeof(buffer), '2',
-
timeout))
goto RESPONSE_FAILED;
+if (!lmtp_read_response(out, buffer, sizeof(buffer), '2',
timeout))
+ goto RESPONSE_FAILED;
/* If the ignore_quota option is set, note whether the server supports the
IGNOREQUOTA option, and if so, set an appropriate addition for RCPT. */
if (ob->ignore_quota)
/* If the ignore_quota option is set, note whether the server supports the
IGNOREQUOTA option, and if so, set an appropriate addition for RCPT. */
if (ob->ignore_quota)
- igquotstr =
(pcre_exec(regex_IGNOREQUOTA, NULL, CS buffer,
-
Ustrlen(CS buffer), 0, PCRE_EOPT, NULL, 0) >= 0)
? US" IGNOREQUOTA" : US"";
+ igquotstr =
regex_match(regex_IGNOREQUOTA, buffer, -1, NULL)
+ ? US" IGNOREQUOTA" : US"";
/* Now the envelope sender */
/* Now the envelope sender */
@@
-641,7
+648,7
@@
if (send_data)
sigalrm_seen = FALSE;
transport_write_timeout = timeout;
sigalrm_seen = FALSE;
transport_write_timeout = timeout;
- Ustrcpy(big_buffer, "sending data block"); /* For error messages */
+ Ustrcpy(big_buffer,
US
"sending data block"); /* For error messages */
DEBUG(D_transport|D_v)
debug_printf(" LMTP>> writing message and terminating \".\"\n");
DEBUG(D_transport|D_v)
debug_printf(" LMTP>> writing message and terminating \".\"\n");
@@
-657,7
+664,7
@@
if (send_data)
goto RESPONSE_FAILED;
}
goto RESPONSE_FAILED;
}
- Ustrcpy(big_buffer, "end of data"); /* For error messages */
+ Ustrcpy(big_buffer,
US
"end of data"); /* For error messages */
/* We now expect a response for every address that was accepted above,
in the same order. For those that get a response, their status is fixed;
/* We now expect a response for every address that was accepted above,
in the same order. For those that get a response, their status is fixed;
@@
-763,9
+770,9
@@
if (errno == ERRNO_CHHEADER_FAIL)
string_sprintf("Failed to expand headers_add or headers_remove: %s",
expand_string_message);
else if (errno == ERRNO_FILTER_FAIL)
string_sprintf("Failed to expand headers_add or headers_remove: %s",
expand_string_message);
else if (errno == ERRNO_FILTER_FAIL)
- addrlist->message =
string_sprintf("Filter process failure")
;
+ addrlist->message =
US"Filter process failure"
;
else if (errno == ERRNO_WRITEINCOMPLETE)
else if (errno == ERRNO_WRITEINCOMPLETE)
- addrlist->message =
string_sprintf("Failed repeatedly to write data")
;
+ addrlist->message =
US"Failed repeatedly to write data"
;
else if (errno == ERRNO_SMTPFORMAT)
addrlist->message = US"overlong LMTP command generated";
else
else if (errno == ERRNO_SMTPFORMAT)
addrlist->message = US"overlong LMTP command generated";
else
@@
-802,4
+809,5
@@
MINUS_N:
}
#endif /*!MACRO_PREDEF*/
}
#endif /*!MACRO_PREDEF*/
+#endif /*TRANSPORT_LMTP*/
/* End of transport/lmtp.c */
/* End of transport/lmtp.c */