#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
#include <unistd.h>
#include "i18n.h"
#include "fetchmail.h"
+#include "sdump.h"
#include "smtp.h"
#include "socket.h"
{
int ok;
- ok = SMTP_ok(sock);
+ (void)argbuf;
+ ok = SMTP_ok(sock, SMTP_MODE, TIMEOUT_DEFAULT);
if (ok == SM_UNRECOVERABLE)
return(PS_PROTOCOL);
else
/* 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 */
- if ((ok = SMTP_ehlo(sock, fetchmailhost,
+ (void)id;
+ if ((ok = SMTP_ehlo(sock, SMTP_MODE, fetchmailhost,
ctl->server.esmtp_name, ctl->server.esmtp_password,
&opts)))
{
report(stderr, GT_("Authentication required.\n"));
return(PS_AUTHFAIL);
- default:
- report(stderr, GT_("Unknown ODMR error %d\n"), atoi(buf));
- return(PS_PROTOCOL);
+ default: {
+ char *t = sdump(buf, strlen(buf));
+ report(stderr, GT_("Unknown ODMR error \"%s\"\n"), t);
+ xfree(t);
+ return(PS_PROTOCOL);
+ }
}
/*
* instead, we'll use select(2) to watch the read sides of both
* sockets and just throw their data at each other.
*/
- if ((smtp_sock = smtp_open(ctl)) == -1)
+ if ((smtp_sock = smtp_setup(ctl)) == -1)
return(PS_SOCKET);
else
{
{
fd_set readfds;
struct timeval timeout;
- char buf[MSGBUFSIZE];
FD_ZERO(&readfds);
FD_SET(sock, &readfds);
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
- "odmr", /* standard SMTP port */
- "odmrs", /* ssl SMTP port */
-#else /* INET6_ENABLE */
- 366, /* standard SMTP port */
- 2366, /* ssl SMTP port (BOGUS! RANDOM VALUE) */
-#endif /* INET6_ENABLE */
+ "odmr", /* standard ODMR port */
+ "odmrs", /* ssl ODMR port */
FALSE, /* this is not a tagged protocol */
FALSE, /* this does not use a message delimiter */
odmr_ok, /* parse command response */
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 */
+ NULL, /* no mailbox support */
odmr_logout, /* log out, we're done */
FALSE, /* no, we can't re-poll */
};
return(PS_SYNTAX);
}
if (ctl->mailboxes->id) {
- fprintf(stderr, GT_("Option --remote is not supported with ODMR\n"));
+ fprintf(stderr, GT_("Option --folder is not supported with ODMR\n"));
return(PS_SYNTAX);
}
if (check_only) {