#include <net/socket.h>
#endif
#include <sys/types.h>
-#include <sys/time.h>
#ifdef HAVE_NET_SELECT_H /* AIX needs this */
#include <net/select.h>
#endif
+#ifdef HAVE_SYS_SELECT_H /* AIX 4.1, at least, needs this */
+#include <sys/select.h>
+#endif
#include <netdb.h>
#include <errno.h>
#include <unistd.h>
/* send ODMR and then run a reverse SMTP session */
{
int ok, opts, smtp_sock;
+ int doing_smtp_data = 0; /* Are we in SMTP DATA state? */
char buf [MSGBUFSIZE+1];
struct idlist *qnp; /* pointer to Q names */
switch(atoi(buf))
{
case 250: /* OK, turnaround is about to happe */
- if (outlevel >= O_SILENT)
+ if (outlevel > O_SILENT)
report(stdout, GT_("Turnaround now...\n"));
break;
case 450: /* ATRN request refused */
- if (outlevel >= O_SILENT)
+ if (outlevel > O_SILENT)
report(stdout, GT_("ATRN request refused.\n"));
return(PS_PROTOCOL);
return(PS_EXCLUDE);
case 453: /* You have no mail */
- report(stderr, GT_("You have no mail.\n"));
+ if (outlevel > O_SILENT)
+ report(stderr, GT_("You have no mail.\n"));
return(PS_NOMAIL);
case 502: /* Command not implemented */
break;
SockWrite(smtp_sock, buf, n);
- if (outlevel >= O_MONITOR)
+ if (outlevel >= O_MONITOR && !doing_smtp_data)
report(stdout, "ODMR< %s", buf);
}
if (FD_ISSET(smtp_sock, &readfds))
SockWrite(sock, buf, n);
if (outlevel >= O_MONITOR)
report(stdout, "ODMR> %s", buf);
+
+ /* We are about to receive message data if the local MTA
+ * sends 354 (after receiving DATA) */
+ if (!doing_smtp_data && !strncmp(buf, "354", 3))
+ {
+ doing_smtp_data = 1;
+ if (outlevel > O_SILENT)
+ report(stdout, GT_("receiving message data\n"));
+ }
+ else if (doing_smtp_data)
+ doing_smtp_data = 0;
}
}
SockClose(smtp_sock);
return(PS_SUCCESS);
}
-const static struct method odmr =
+static const struct method odmr =
{
"ODMR", /* ODMR protocol */
-#if INET6_ENABLE
+#ifdef INET6_ENABLE
"odmr", /* standard SMTP port */
"odmrs", /* ssl SMTP port */
#else /* INET6_ENABLE */
NULL, /* no need to get authentication */
odmr_getrange, /* initialize message sending */
NULL, /* we cannot get a list of sizes */
+ NULL, /* we cannot get a list of sizes of subsets */
NULL, /* how do we tell a message is old? */
NULL, /* no way to fetch headers */
NULL, /* no way to fetch body */
NULL, /* no message trailer */
NULL, /* how to delete a message */
+ NULL, /* how to mark a message as seen */
odmr_logout, /* log out, we're done */
FALSE, /* no, we can't re-poll */
};