#include <h/netsec.h>
#include <sys/socket.h>
+#include "sbr/base64.h"
/*
* This module implements an interface to SendMail very similar
* RP_-style codes.
*/
-/*
- * On older 4.2BSD machines without the POSIX function `sigaction',
- * the alarm handing stuff for time-outs will NOT work due to the way
- * syscalls get restarted. This is not really crucial, since SendMail
- * is generally well-behaved in this area.
- */
-
-#ifdef SENDMAILBUG
-/*
- * It appears that some versions of Sendmail will return Code 451
- * when they don't really want to indicate a failure.
- * "Code 451 almost always means sendmail has deferred; we don't
- * really want bomb out at this point since sendmail will rectify
- * things later." So, if you define SENDMAILBUG, Code 451 is
- * considered the same as Code 250. Yuck!
- */
-#endif
-
#define NBITS ((sizeof (int)) * 8)
/* Timeout in seconds for SMTP commands.
static int sm_addrs = 0;
static int sm_child = NOTOK;
static int sm_debug = 0;
-static int sm_nl = TRUE;
+static bool sm_nl = true;
static int sm_verbose = 0;
static netsec_context *nsc = NULL;
const char *);
static int rclient (char *, char *, char **);
-static int sm_ierror (const char *fmt, ...);
+static int sm_ierror (const char *fmt, ...) CHECK_PRINTF(1, 2);
static int sm_nerror (char *);
-static int smtalk (int time, char *fmt, ...);
+static int smtalk (int time, char *fmt, ...) CHECK_PRINTF(2, 3);
static int sm_wstream (char *, int);
static int smhear (void);
-static char *EHLOset (char *);
+static char *EHLOset (char *) PURE;
static int sm_sasl_callback(enum sasl_message_type, unsigned const char *,
unsigned int, unsigned char **, unsigned int *,
char **);
char *errstr, *chosen_server;
if (watch)
- verbose = TRUE;
+ verbose = true;
sm_verbose = verbose;
sm_debug = debug;
char *vec[15], *errstr;
if (watch)
- verbose = TRUE;
+ verbose = true;
sm_verbose = verbose;
sm_debug = debug;
return sm_ierror ("no pipes");
}
- for (i = 0; (sm_child = fork ()) == NOTOK && i < 5; i++)
- sleep (5);
-
+ sm_child = fork();
switch (sm_child) {
case NOTOK:
close (pdo[0]);
close (pdi[1]);
close (pdo[0]);
- netsec_set_fd(nsc, pdi[i], pdo[1]);
+ netsec_set_fd(nsc, pdi[0], pdo[1]);
netsec_set_timeout(nsc, SM_OPEN);
result = smhear ();
switch (result) {
return RP_OK;
case 451:
-#ifdef SENDMAILBUG
- sm_addrs++;
- return RP_OK;
-#endif /* SENDMAILBUG */
case 421:
case 450:
case 452:
{
switch (smtalk (SM_DATA, "DATA")) {
case 354:
- sm_nl = TRUE;
+ sm_nl = true;
return RP_OK;
case 451:
-#ifdef SENDMAILBUG
- sm_nl = TRUE;
- return RP_OK;
-#endif /* SENDMAILBUG */
case 421:
return RP_NO;
return RP_OK;
case 451:
-#ifdef SENDMAILBUG
- return RP_OK;
-#endif /* SENDMAILBUG */
case 452:
default:
return RP_NO;
}
if (nsc != NULL) {
- netsec_shutdown(nsc, 1);
+ netsec_shutdown(nsc);
nsc = NULL;
}
for (bp = buffer; bp && len > 0; bp++, len--) {
switch (*bp) {
case '\n':
- sm_nl = TRUE;
+ sm_nl = true;
if (netsec_write(nsc, "\r", 1, &errstr) != OK) {
sm_nerror(errstr);
return NOTOK;
/* FALLTHRU */
default:
- sm_nl = FALSE;
+ sm_nl = false;
}
if (netsec_write(nsc, bp, 1, &errstr) != OK) {
sm_nerror(errstr);
static int
smhear (void)
{
- int i, code, cont, more;
+ int i, code;
+ bool cont, more;
size_t buflen, rc;
unsigned char *bp;
char *rp;
rp = sm_reply.text;
rc = sizeof(sm_reply.text) - 1;
- for (more = FALSE; (buffer = netsec_readline(nsc, &buflen,
+ for (more = false; (buffer = netsec_readline(nsc, &buflen,
&errstr)) != NULL ; ) {
if (doingEHLO
for (; buflen > 0 && (!isascii (*bp) || !isdigit (*bp)); bp++, buflen--)
continue;
- cont = FALSE;
+ cont = false;
code = atoi ((char *) bp);
bp += 3, buflen -= 3;
for (; buflen > 0 && isspace (*bp); bp++, buflen--)
continue;
if (buflen > 0 && *bp == '-') {
- cont = TRUE;
+ cont = true;
bp++, buflen--;
for (; buflen > 0 && isspace (*bp); bp++, buflen--)
continue;
if (more) {
if (code != sm_reply.code || cont)
continue;
- more = FALSE;
+ more = false;
} else {
sm_reply.code = code;
more = cont;
rp_string (int code)
{
char *text;
- static char buffer[BUFSIZ];
+ /* The additional space is to avoid warning from gcc -Wformat-truncation. */
+ static char buffer[BUFSIZ + 19];
switch (sm_reply.code != NOTOK ? code : NOTOK) {
case RP_AOK: