]> Pileus Git - ~andy/fetchmail/blobdiff - fetchmail.c
Added plugin/plugout option.
[~andy/fetchmail] / fetchmail.c
index 0e0d3f460d4daec69606bf93bb52c7e88692677f..ef40f0b9db2fad63813ad56650e5f5936474ddee 100644 (file)
@@ -500,8 +500,8 @@ int main (int argc, char **argv)
                    if (ctl->server.poll_count++ % ctl->server.interval) 
                    {
                        if (outlevel >= O_VERBOSE)
-                           fprintf(stderr,
-                                   "fetchmail: interval not reached, not querying %s\n",
+                           error(0, -1,
+                                   "interval not reached, not querying %s",
                                    ctl->server.pollname);
                        continue;
                    }
@@ -532,11 +532,6 @@ int main (int argc, char **argv)
                    }
 #endif  /* POP3_ENABLE */
                }
-               else if (querystatus == PS_AUTHFAIL) {
-                   /* have it logged with priority LOG_ALERT */
-                   error(querystatus, -1, "Authentication failed for %s@%s",
-                               ctl->remotename, visbuf(ctl->server.pollname));
-               }
                else if (!check_only && 
                         ((querystatus!=PS_NOMAIL) || (outlevel==O_DEBUG)))
                    error(0, 0, "Query status=%d", querystatus);
@@ -581,14 +576,27 @@ int main (int argc, char **argv)
         */
        if (run.poll_interval)
        {
-           if (outlevel >= O_VERBOSE)
-           {
-               time_t  now;
+           /* 
+            * Because passwords can expire, it may happen that *all*
+            * hosts are now out of the loop due to authfail
+            * conditions.  If this happens daemon-mode fetchmail
+            * should softly and silently vanish away, rather than
+            * spinning uselessly.
+            */
+           int auth_ok = 0;
 
-               time(&now);
-               fprintf(stderr, "fetchmail: sleeping at %s", ctime(&now));
+           for (ctl = querylist; ctl; ctl = ctl->next)
+               if (!ctl->authfailcount)
+                   auth_ok++;
+           if (!auth_ok)
+           {
+               error(0, -1, "All authentications have failed.  Exiting.");
+               exit(PS_AUTHFAIL);
            }
 
+           if (outlevel >= O_VERBOSE)
+               error(0, -1, "fetchmail: sleeping at %s", rfc822timestamp());
+
            /*
             * With this simple hack, we make it possible for a foreground 
             * fetchmail to wake up one in daemon mode.  What we want is the
@@ -694,18 +702,13 @@ int main (int argc, char **argv)
                signal(SIGHUP, SIG_IGN);
 
            if (outlevel >= O_VERBOSE)
-           {
-               time_t  now;
-
-               time(&now);
-               fprintf(stderr, "fetchmail: awakened at %s", ctime(&now));
-           }
+               error(0, -1, "awakened at %s", rfc822timestamp());
        }
     } while
        (run.poll_interval);
 
     if (outlevel >= O_VERBOSE)
-       fprintf(stderr,"fetchmail: normal termination, status %d\n",
+       error(0, -1, "normal termination, status %d",
                successes ? PS_SUCCESS : querystatus);
 
     termhook(0);
@@ -756,6 +759,8 @@ static void optmerge(struct query *h2, struct query *h1, int force)
     FLAG_MERGE(server.interface_pair);
 #endif /* linux */
 
+    FLAG_MERGE(server.plugin);
+    FLAG_MERGE(server.plugout);
     FLAG_MERGE(wildcard);
     FLAG_MERGE(remotename);
     FLAG_MERGE(password);
@@ -1131,7 +1136,7 @@ static int query_host(struct query *ctl)
        time_t now;
 
        time(&now);
-       fprintf(stderr, "fetchmail: %s querying %s (protocol %s) at %s",
+       error(0, -1, "fetchmail: %s querying %s (protocol %s) at %s",
            RELEASE_ID,
            ctl->server.pollname, showproto(ctl->server.protocol), ctime(&now));
     }
@@ -1150,7 +1155,7 @@ static int query_host(struct query *ctl)
 #ifdef POP2_ENABLE
        return(doPOP2(ctl));
 #else
-       fprintf(stderr, "POP2 support is not configured.\n");
+       error(0, -1, "POP2 support is not configured.\n");
        return(PS_PROTOCOL);
 #endif /* POP2_ENABLE */
        break;
@@ -1160,7 +1165,7 @@ static int query_host(struct query *ctl)
 #ifdef POP3_ENABLE
        return(doPOP3(ctl));
 #else
-       fprintf(stderr, "POP3 support is not configured.\n");
+       error(0, -1, "POP3 support is not configured.\n");
        return(PS_PROTOCOL);
 #endif /* POP3_ENABLE */
        break;
@@ -1172,19 +1177,19 @@ static int query_host(struct query *ctl)
 #ifdef IMAP_ENABLE
        return(doIMAP(ctl));
 #else
-       fprintf(stderr, "IMAP support is not configured.\n");
+       error(0, -1, "IMAP support is not configured.\n");
        return(PS_PROTOCOL);
 #endif /* IMAP_ENABLE */
        break;
     case P_ETRN:
 #ifndef ETRN_ENABLE
-       fprintf(stderr, "ETRN support is not configured.\n");
+       error(0, -1, "ETRN support is not configured.\n");
        return(PS_PROTOCOL);
 #else
 #ifdef HAVE_GETHOSTBYNAME
        return(doETRN(ctl));
 #else
-       fprintf(stderr, "Cannot support ETRN without gethostbyname(2).\n");
+       error(0, -1, "Cannot support ETRN without gethostbyname(2).\n");
        return(PS_PROTOCOL);
 #endif /* HAVE_GETHOSTBYNAME */
 #endif /* ETRN_ENABLE */
@@ -1488,6 +1493,15 @@ void dump_params (struct runctl *runp, struct query *querylist, flag implicit)
            printf("  No monitor interface specified.\n");
 #endif
 
+       if (ctl->server.plugin)
+           printf("  Server connections will be mode via plugin %s (--plugin %s).\n", ctl->server.plugin, ctl->server.plugin);
+       else if (outlevel >= O_VERBOSE)
+           printf("  No plugin command specified.\n");
+       if (ctl->server.plugout)
+           printf("  Listener connections will be mode via plugout %s (--plugout %s).\n", ctl->server.plugout, ctl->server.plugout);
+       else if (outlevel >= O_VERBOSE)
+           printf("  No plugout command specified.\n");
+
        if (ctl->server.protocol > P_POP2 && (ctl->server.protocol != P_ETRN))
            if (!ctl->oldsaved)
                printf("  No UIDs saved from this host.\n");
@@ -1502,7 +1516,7 @@ void dump_params (struct runctl *runp, struct query *querylist, flag implicit)
                printf("  %d UIDs saved.\n", count);
                if (outlevel >= O_VERBOSE)
                    for (idp = ctl->oldsaved; idp; idp = idp->next)
-                       fprintf(stderr, "\t%s\n", idp->id);
+                       printf("\t%s\n", idp->id);
            }
 
        if (ctl->properties)