]> Pileus Git - ~andy/fetchmail/blobdiff - imap.c
Minor bug fixes for socket.c
[~andy/fetchmail] / imap.c
diff --git a/imap.c b/imap.c
index 6145564baa1cefff872790aff95888351e94df44..cb87eda5378f258f20955c3524f2f84c6d29cd0e 100644 (file)
--- a/imap.c
+++ b/imap.c
@@ -324,7 +324,7 @@ static void imap_canonicalize(char *result, char *raw, size_t maxlen)
     result[j] = '\0';
 }
 
-static void capa_probe(int sock, struct query *ctl)
+static int capa_probe(int sock, struct query *ctl)
 /* set capability variables from a CAPA probe */
 {
     int        ok;
@@ -360,6 +360,8 @@ static void capa_probe(int sock, struct query *ctl)
        if (outlevel >= O_DEBUG)
            report(stdout, GT_("Protocol identified as IMAP2 or IMAP2BIS\n"));
     }
+    else
+       return ok;
 
     /* 
      * Handle idling.  We depend on coming through here on startup
@@ -377,6 +379,8 @@ static void capa_probe(int sock, struct query *ctl)
     }
 
     peek_capable = (imap_version >= IMAP4);
+
+    return PS_SUCCESS;
 }
 
 static int do_authcert (int sock, const char *command, const char *name)
@@ -412,7 +416,8 @@ static int imap_getauth(int sock, struct query *ctl, char *greeting)
     else
        expunge_period = 1;
 
-    capa_probe(sock, ctl);
+    if ((ok = capa_probe(sock, ctl)))
+       return ok;
 
     /* 
      * If either (a) we saw a PREAUTH token in the greeting, or
@@ -442,9 +447,9 @@ static int imap_getauth(int sock, struct query *ctl, char *greeting)
             * whether TLS is mandatory or opportunistic unless SSLOpen() fails
             * (see below). */
            if (gen_transact(sock, "STARTTLS") == PS_SUCCESS
-                   && SSLOpen(sock, ctl->sslcert, ctl->sslkey, "tls1", ctl->sslcertck,
+                   && (set_timeout(mytimeout), SSLOpen(sock, ctl->sslcert, ctl->sslkey, "tls1", ctl->sslcertck,
                        ctl->sslcertfile, ctl->sslcertpath, ctl->sslfingerprint, commonname,
-                       ctl->server.pollname, &ctl->remotename) != -1)
+                       ctl->server.pollname, &ctl->remotename)) != -1)
            {
                /*
                 * RFC 2595 says this:
@@ -459,7 +464,8 @@ static int imap_getauth(int sock, struct query *ctl, char *greeting)
                 * Now that we're confident in our TLS connection we can
                 * guarantee a secure capability re-probe.
                 */
-               capa_probe(sock, ctl);
+               if ((ok = capa_probe(sock, ctl)))
+                   return ok;
                if (outlevel >= O_VERBOSE)
                {
                    report(stdout, GT_("%s: upgrade to TLS succeeded.\n"), commonname);
@@ -467,9 +473,11 @@ static int imap_getauth(int sock, struct query *ctl, char *greeting)
            } else if (must_tls(ctl)) {
                /* Config required TLS but we couldn't guarantee it, so we must
                 * stop. */
+               set_timeout(0);
                report(stderr, GT_("%s: upgrade to TLS failed.\n"), commonname);
                return PS_SOCKET;
            } else {
+               set_timeout(0);
                if (outlevel >= O_VERBOSE) {
                    report(stdout, GT_("%s: opportunistic upgrade to TLS failed, trying to continue\n"), commonname);
                }
@@ -761,7 +769,7 @@ static int imap_idle(int sock)
 static int imap_search(int sock, struct query *ctl, int count)
 /* search for unseen messages */
 {
-    int ok, first, last;
+    int ok;
     char buf[MSGBUFSIZE+1], *cp;
 
     /* Don't count deleted messages. Enabled only for IMAP4 servers or
@@ -1158,7 +1166,8 @@ static int imap_fetch_headers(int sock, struct query *ctl,int number,int *lenp)
 
        /* try to recover for some responses */
        if (!strncmp(buf, "* NO", 4) ||
-               !strncmp(buf, "* BAD", 5))
+               !strncmp(buf, "* BAD", 5) ||
+               strstr(buf, "FETCH ()"))
        {
            return(PS_TRANSIENT);
        }
@@ -1173,7 +1182,7 @@ static int imap_fetch_headers(int sock, struct query *ctl,int number,int *lenp)
        /* an unexpected tagged response */
        if (outlevel > O_SILENT)
            report(stderr, GT_("Incorrect FETCH response: %s.\n"), buf);
-       return(PS_ERROR);
+       return(PS_TRANSIENT);
     }
     return(ok);
 }
@@ -1291,20 +1300,11 @@ static int imap_delete(int sock, struct query *ctl, int number)
     int        ok;
     /* Select which flags to set on message deletion: */
     const char delflags_seen[] = "\\Seen \\Deleted";
-    const char delflags_unseen[] = "\\Deleted";
     static const char *delflags;
     /* Which environment variable to look for: */
-    const char dis_env[] = "FETCHMAIL_IMAP_DELETED_REMAINS_UNSEEN";
 
-    if (!delflags) {
-       char *tmp;
-       if ((tmp = getenv(dis_env)) != NULL && *tmp) {
-           delflags = delflags_unseen;
-       } else {
-           /* DEFAULT since many fetchmail versions <= 6.3.X */
-           delflags = delflags_seen;
-       }
-    }
+    /* DEFAULT since many fetchmail versions <= 6.3.X */
+    delflags = delflags_seen;
 
     (void)ctl;
     /* expunges change the fetch numbers */