]> Pileus Git - ~andy/fetchmail/blobdiff - odmr.c
Move servport.c into convenience library instead.
[~andy/fetchmail] / odmr.c
diff --git a/odmr.c b/odmr.c
index 0c4db03367083305ffc607b2ffc42967d6cea87e..ea12c7c6b8ab4923a267ffd878cb863857316db8 100644 (file)
--- a/odmr.c
+++ b/odmr.c
 #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>
@@ -45,6 +47,7 @@ static int odmr_getrange(int sock, struct query *ctl, const char *id,
 /* 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 */
 
@@ -95,12 +98,12 @@ static int odmr_getrange(int sock, struct query *ctl, const char *id,
     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);
 
@@ -109,7 +112,8 @@ static int odmr_getrange(int sock, struct query *ctl, const char *id,
        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 */
@@ -161,7 +165,7 @@ static int odmr_getrange(int sock, struct query *ctl, const char *id,
                    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))
@@ -173,6 +177,17 @@ static int odmr_getrange(int sock, struct query *ctl, const char *id,
                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);
@@ -193,10 +208,10 @@ static int odmr_logout(int sock, struct query *ctl)
        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 */
@@ -209,11 +224,13 @@ const static struct method odmr =
     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 */
 };