]> Pileus Git - ~andy/fetchmail/blobdiff - driver.c
Remove invalid header issue from TODO.
[~andy/fetchmail] / driver.c
index 335da6acdfdd3599c91c56266f6bdd27896c1bf2..8a43399a67c6c127a7a42b7c080d31f13c5f7b05 100644 (file)
--- a/driver.c
+++ b/driver.c
@@ -246,12 +246,12 @@ const char *canonical;  /* server name */
     if (retval) {
 #ifdef HEIMDAL
       if (err_ret && err_ret->e_text) {
-          report(stderr, GT_("krb5_sendauth: %s [server says '%*s'] \n"),
+          report(stderr, GT_("krb5_sendauth: %s [server says '%s']\n"),
                  error_message(retval),
                  err_ret->e_text);
 #else
       if (err_ret && err_ret->text.length) {
-          report(stderr, GT_("krb5_sendauth: %s [server says '%*s'] \n"),
+          report(stderr, GT_("krb5_sendauth: %s [server says '%*s']\n"),
                 error_message(retval),
                 err_ret->text.length,
                 err_ret->text.data);
@@ -418,6 +418,14 @@ static void mark_oversized(struct query *ctl, int size)
     }
 }
 
+static int eat_trailer(int sock, struct query *ctl)
+{
+    /* we only need this LF if we're printing ticker dots
+     * AND we are dumping protocol traces. */
+    if (outlevel >= O_VERBOSE && want_progress()) fputc('\n', stdout);
+    return (ctl->server.base_protocol->trail)(sock, ctl, tag);
+}
+
 static int fetch_messages(int mailserver_socket, struct query *ctl, 
                          int count, int **msgsizes, int maxfetch,
                          int *fetches, int *dispatches, int *deletions)
@@ -615,8 +623,11 @@ static int fetch_messages(int mailserver_socket, struct query *ctl,
                if (len > 0)
                    report_build(stdout, wholesize ? GT_(" (%d octets)")
                                 : GT_(" (%d header octets)"), len);
-               if (outlevel >= O_VERBOSE)
-                   report_complete(stdout, "\n");
+               if (want_progress()) {
+                   /* flush and add a blank to append ticker dots */
+                   report_flush(stdout);
+                   putchar(' ');
+               }
            }
 
            /* 
@@ -628,6 +639,7 @@ static int fetch_messages(int mailserver_socket, struct query *ctl,
                             /* pass the suppress_readbody flag only if the underlying
                              * protocol does not fetch the body separately */
                             separatefetchbody ? 0 : &suppress_readbody);
+
            if (err == PS_RETAINED)
                suppress_forward = suppress_delete = retained = TRUE;
            else if (err == PS_TRANSIENT)
@@ -640,14 +652,8 @@ static int fetch_messages(int mailserver_socket, struct query *ctl,
            /* tell server we got it OK and resynchronize */
            if (separatefetchbody && ctl->server.base_protocol->trail)
            {
-               if (outlevel >= O_VERBOSE && !is_a_file(1) && !run.use_syslog)
-               {
-                   fputc('\n', stdout);
-                   fflush(stdout);
-               }
-
-               if ((err = (ctl->server.base_protocol->trail)(mailserver_socket, ctl, tag)))
-                   return(err);
+               err = eat_trailer(mailserver_socket, ctl);
+               if (err) return(err);
            }
 
            /* do not read the body which is not being forwarded only if
@@ -680,9 +686,15 @@ static int fetch_messages(int mailserver_socket, struct query *ctl,
                     */
                    if (len == -1)
                        len = msgsize - msgblk.msglen;
-                   if (outlevel > O_SILENT && !wholesize)
-                       report_build(stdout,
-                                       GT_(" (%d body octets)"), len);
+                   if (!wholesize) {
+                       if (outlevel > O_SILENT)
+                           report_build(stdout,
+                                   GT_(" (%d body octets)"), len);
+                       if (want_progress()) {
+                           report_flush(stdout);
+                           putchar(' ');
+                       }
+                   }
                }
 
                /* process the body now */
@@ -690,23 +702,16 @@ static int fetch_messages(int mailserver_socket, struct query *ctl,
                              ctl,
                              !suppress_forward,
                              len);
+
                if (err == PS_TRANSIENT)
                    suppress_delete = suppress_forward = TRUE;
                else if (err)
                    return(err);
 
                /* tell server we got it OK and resynchronize */
-               if (ctl->server.base_protocol->trail)
-               {
-                   if (outlevel >= O_VERBOSE && !is_a_file(1) && !run.use_syslog)
-                   {
-                       fputc('\n', stdout);
-                       fflush(stdout);
-                   }
-
-                   err = (ctl->server.base_protocol->trail)(mailserver_socket, ctl, tag);
-                   if (err != 0)
-                       return(err);
+               if (ctl->server.base_protocol->trail) {
+                   err = eat_trailer(mailserver_socket, ctl);
+                   if (err) return(err);
                }
            }
 
@@ -760,16 +765,17 @@ static int fetch_messages(int mailserver_socket, struct query *ctl,
 
 flagthemail:
        /*
-        * At this point in flow of control, either
-        * we've bombed on a protocol error or had
-        * delivery refused by the SMTP server
-        * (unlikely -- I've never seen it) or we've
-        * seen `accepted for delivery' and the
-        * message is shipped.  It's safe to mark the
-        * message seen and delete it on the server
-        * now.
+        * At this point in flow of control,
+        * either we've bombed on a protocol error
+        * or had delivery refused by the SMTP server
+        * or we've seen `accepted for delivery' and the message is shipped.
+        * It's safe to mark the message seen and delete it on the server now.
         */
 
+       /* in softbounce mode, suppress deletion and marking as seen */
+       if (suppress_forward)
+           suppress_delete = suppress_delete || run.softbounce;
+
        /* maybe we delete this message now? */
        if (retained)
        {
@@ -941,7 +947,7 @@ static int do_session(
            else
                report(stderr,
                        GT_("pre-connection command failed with status %d\n"), WEXITSTATUS(err));
-           err = PS_PROTOCOL;
+           err = PS_SYNTAX;
            goto closeUp;
        }
 
@@ -1004,6 +1010,9 @@ static int do_session(
                hints.ai_socktype = SOCK_STREAM;
                hints.ai_family = AF_UNSPEC;
                hints.ai_flags = AI_CANONNAME;
+#ifdef AI_ADDRCONFIG
+               hints.ai_flags |= AI_ADDRCONFIG;
+#endif
 
                error = fm_getaddrinfo(ctl->server.queryname, NULL, &hints, &res);
                if (error)
@@ -1575,7 +1584,7 @@ closeUp:
        else
            report(stderr, GT_("post-connection command failed with status %d\n"), WEXITSTATUS(tmperr));
        if (err == PS_SUCCESS)
-           err = PS_PROTOCOL;
+           err = PS_SYNTAX;
     }
 
     set_timeout(0); /* cancel any pending alarm */