]> Pileus Git - ~andy/fetchmail/blob - fetchmail.c
Update for gettext 0.17.
[~andy/fetchmail] / fetchmail.c
1 /*
2  * fetchmail.c -- main driver module for fetchmail
3  *
4  * For license terms, see the file COPYING in this directory.
5  */
6 #include "config.h"
7
8 #include <stdio.h>
9 #include <stdlib.h>
10 #include <unistd.h>
11 #include <fcntl.h>
12 #include <string.h>
13 #include <signal.h>
14 #include <syslog.h>
15 #include <pwd.h>
16 #ifdef __FreeBSD__
17 #include <grp.h>
18 #endif
19 #include <errno.h>
20 #include <sys/types.h>
21 #include <sys/stat.h>
22 #include <sys/resource.h>
23
24 #ifdef HAVE_SOCKS
25 #include <socks.h> /* SOCKSinit() */
26 #endif /* HAVE_SOCKS */
27
28 #include <langinfo.h>
29
30 #include "fetchmail.h"
31 #include "socket.h"
32 #include "tunable.h"
33 #include "smtp.h"
34 #include "netrc.h"
35 #include "gettext.h"
36 #include "lock.h"
37
38 /* need these (and sys/types.h) for res_init() */
39 #include <netinet/in.h>
40 #include <arpa/nameser.h>
41 #include <resolv.h>
42
43 #ifndef ENETUNREACH
44 #define ENETUNREACH   128       /* Interactive doesn't know this */
45 #endif /* ENETUNREACH */
46
47 /* prototypes for internal functions */
48 static int load_params(int, char **, int);
49 static void dump_params (struct runctl *runp, struct query *, flag implicit);
50 static int query_host(struct query *);
51
52 /* controls the detail level of status/progress messages written to stderr */
53 int outlevel;               /* see the O_.* constants above */
54
55 /* miscellaneous global controls */
56 struct runctl run;          /* global controls for this run */
57 flag nodetach;              /* if TRUE, don't detach daemon process */
58 flag quitmode;              /* if --quit was set */
59 int  quitind;               /* optind after position of last --quit option */
60 flag check_only;            /* if --probe was set */
61 flag versioninfo;           /* emit only version info */
62 char *user;                 /* the name of the invoking user */
63 char *home;                 /* invoking user's home directory */
64 char *fmhome;               /* fetchmail's home directory */
65 const char *program_name;   /* the name to prefix error messages with */
66 flag configdump;            /* dump control blocks for configurator */
67 const char *fetchmailhost;  /* either `localhost' or the host's FQDN */
68
69 static int quitonly;        /* if we should quit after killing the running daemon */
70
71 static int querystatus;         /* status of query */
72 static int successes;           /* count number of successful polls */
73 static int activecount;         /* count number of active entries */
74 static struct runctl cmd_run;   /* global options set from command line */
75 static time_t parsetime;        /* time of last parse */
76
77 static void terminate_run(int);
78 static void terminate_poll(int);
79
80 #if defined(__FreeBSD__) && defined(__FreeBSD_USE_KVM)
81 /* drop SGID kmem privileage until we need it */
82 static void dropprivs(void)
83 {
84     struct group *gr;
85     gid_t        egid;
86     gid_t        rgid;
87     
88     egid = getegid();
89     rgid = getgid();
90     gr = getgrgid(egid);
91     
92     if (gr && !strcmp(gr->gr_name, "kmem"))
93     {
94         extern void interface_set_gids(gid_t egid, gid_t rgid);
95         interface_set_gids(egid, rgid);
96         setegid(rgid);
97     }
98 }
99 #endif
100
101 #if defined(HAVE_SETLOCALE) && defined(ENABLE_NLS)
102 #include <locale.h>
103 /** returns timestamp in current locale,
104  * and resets LC_TIME locale to POSIX. */
105 static char *timestamp (void)
106 {
107     time_t      now;
108     static char buf[60]; /* RATS: ignore */
109
110     time (&now);
111     setlocale (LC_TIME, "");
112     strftime (buf, sizeof (buf), "%c", localtime(&now));
113     setlocale (LC_TIME, "C");
114     return (buf);
115 }
116 #else
117 #define timestamp rfc822timestamp
118 #endif
119
120 static void donothing(int sig) 
121 {
122     set_signal_handler(sig, donothing);
123     lastsig = sig;
124 }
125
126 static void printcopyright(FILE *fp) {
127         fprintf(fp, GT_("Copyright (C) 2002, 2003 Eric S. Raymond\n"
128                    "Copyright (C) 2004 Matthias Andree, Eric S. Raymond,\n"
129                    "                   Robert M. Funk, Graham Wilson\n"
130                    "Copyright (C) 2005 - 2006, 2010 Sunil Shetye\n"
131                    "Copyright (C) 2005 - 2010 Matthias Andree\n"
132                    ));
133         fprintf(fp, GT_("Fetchmail comes with ABSOLUTELY NO WARRANTY. This is free software, and you\n"
134                    "are welcome to redistribute it under certain conditions. For details,\n"
135                    "please see the file COPYING in the source or documentation directory.\n"));
136 #ifdef SSL_ENABLE
137         /* Do not translate this */
138         fprintf(fp, "This product includes software developed by the OpenSSL Project\nfor use in the OpenSSL Toolkit. (http://www.openssl.org/)\n");
139 #endif
140 }
141
142 const char *iana_charset;
143
144 int main(int argc, char **argv)
145 {
146     int bkgd = FALSE;
147     int implicitmode = FALSE;
148     struct query *ctl;
149     netrc_entry *netrc_list;
150     char *netrc_file, *tmpbuf;
151     pid_t pid;
152     int lastsig = 0;
153
154 #if defined(__FreeBSD__) && defined(__FreeBSD_USE_KVM)
155     dropprivs();
156 #endif
157
158     envquery(argc, argv);
159 #ifdef ENABLE_NLS
160     setlocale (LC_ALL, "");
161     bindtextdomain(PACKAGE, LOCALEDIR);
162     textdomain(PACKAGE);
163     iana_charset = norm_charmap(nl_langinfo(CODESET)); /* normalize local
164                                                           charset to
165                                                           IANA charset. */
166 #else
167     iana_charset = "US-ASCII";
168 #endif
169
170     if (getuid() == 0) {
171         report(stderr, GT_("WARNING: Running as root is discouraged.\n"));
172     }
173
174     /*
175      * Note: because we can't initialize reporting before we  know whether
176      * syslog is supposed to be on, this message will go to stdout and
177      * be lost when running in background.
178      */
179     if (outlevel >= O_VERBOSE)
180     {
181         int i;
182
183         report(stdout, GT_("fetchmail: invoked with"));
184         for (i = 0; i < argc; i++)
185             report(stdout, " %s", argv[i]);
186         report(stdout, "\n");
187     }
188
189 #define IDFILE_NAME     ".fetchids"
190     run.idfile = prependdir (IDFILE_NAME, fmhome);
191   
192     outlevel = O_NORMAL;
193
194     /*
195      * We used to arrange for the lock to be removed on exit close
196      * to where the lock was asserted.  Now we need to do it here, because
197      * we might have re-executed in background with an existing lock
198      * as the result of a changed rcfile (see the code near the execvp(3)
199      * call near the beginning of the polling loop for details).  We want
200      * to be sure the lock gets nuked on any error exit, basically.
201      */
202     fm_lock_dispose();
203
204 #ifdef HAVE_GETCWD
205     /* save the current directory */
206     if (getcwd (currentwd, sizeof (currentwd)) == NULL) {
207         report(stderr, GT_("could not get current working directory\n"));
208         currentwd[0] = 0;
209     }
210 #endif
211
212     {
213         int i;
214
215         i = parsecmdline(argc, argv, &cmd_run, &cmd_opts);
216         if (i < 0)
217             exit(PS_SYNTAX);
218
219         if (quitmode && quitind == argc)
220             quitonly = 1;
221     }
222
223     if (versioninfo)
224     {
225         const char *features = 
226 #ifndef POP3_ENABLE
227         "-POP3"
228 #endif /* POP3_ENABLE */
229 #ifndef IMAP_ENABLE
230         "-IMAP"
231 #endif /* IMAP_ENABLE */
232 #ifdef GSSAPI
233         "+GSS"
234 #endif /* GSSAPI */
235 #ifdef RPA_ENABLE
236         "+RPA"
237 #endif /* RPA_ENABLE */
238 #ifdef NTLM_ENABLE
239         "+NTLM"
240 #endif /* NTLM_ENABLE */
241 #ifdef SDPS_ENABLE
242         "+SDPS"
243 #endif /* SDPS_ENABLE */
244 #ifndef ETRN_ENABLE
245         "-ETRN"
246 #endif /* ETRN_ENABLE */
247 #ifndef ODMR_ENABLE
248         "-ODMR"
249 #endif /* ODMR_ENABLE */
250 #ifdef SSL_ENABLE
251         "+SSL"
252 #endif
253 #ifdef OPIE_ENABLE
254         "+OPIE"
255 #endif /* OPIE_ENABLE */
256 #ifdef HAVE_PKG_hesiod
257         "+HESIOD"
258 #endif
259 #ifdef HAVE_SOCKS
260         "+SOCKS"
261 #endif /* HAVE_SOCKS */
262 #ifdef ENABLE_NLS
263         "+NLS"
264 #endif /* ENABLE_NLS */
265 #ifdef KERBEROS_V5
266         "+KRB5"
267 #endif /* KERBEROS_V5 */
268         ".\n";
269         printf(GT_("This is fetchmail release %s"), VERSION);
270         fputs(features, stdout);
271         puts("");
272         printcopyright(stdout);
273         puts("");
274         fputs("Fallback MDA: ", stdout);
275 #ifdef FALLBACK_MDA
276         fputs(FALLBACK_MDA, stdout);
277 #else
278         fputs("(none)", stdout);
279 #endif
280         putchar('\n');
281         fflush(stdout);
282
283         /* this is an attempt to help remote debugging */
284         if (system("uname -a")) { /* NOOP to quench GCC complaint */ }
285     }
286
287     /* avoid parsing the config file if all we're doing is killing a daemon */
288     if (!quitonly)
289         implicitmode = load_params(argc, argv, optind);
290
291     /* precedence: logfile (if effective) overrides syslog. */
292     if (run.logfile && run.poll_interval && !nodetach) {
293         run.use_syslog = 0;
294     }
295
296     /* logging should be set up early in case we were restarted from exec */
297     if (run.use_syslog)
298     {
299         openlog(program_name, LOG_PID, LOG_MAIL);
300         report_init(-1);
301     }
302     else
303         report_init((run.poll_interval == 0 || nodetach) && !run.logfile);
304
305 #ifdef POP3_ENABLE
306     /* initialize UID handling */
307     {
308         int st;
309
310         if (!versioninfo && (st = prc_filecheck(run.idfile, !versioninfo)) != 0)
311             exit(st);
312         else
313             initialize_saved_lists(querylist, run.idfile);
314     }
315 #endif /* POP3_ENABLE */
316
317     /* construct the lockfile */
318     fm_lock_setup(&run);
319
320     /*
321      * Before getting passwords, disable core dumps unless -v -d0 mode is on.
322      * Core dumps could otherwise contain passwords to be scavenged by a
323      * cracker.
324      */
325     if (outlevel < O_VERBOSE || run.poll_interval > 0)
326     {
327         struct rlimit corelimit;
328         corelimit.rlim_cur = 0;
329         corelimit.rlim_max = 0;
330         setrlimit(RLIMIT_CORE, &corelimit);
331     }
332
333 #define NETRC_FILE      ".netrc"
334     /* parse the ~/.netrc file (if present) for future password lookups. */
335     netrc_file = prependdir (NETRC_FILE, home);
336     netrc_list = parse_netrc(netrc_file);
337     free(netrc_file);
338 #undef NETRC_FILE
339
340     /* pick up passwords where we can */ 
341     for (ctl = querylist; ctl; ctl = ctl->next)
342     {
343         if (ctl->active && !(implicitmode && ctl->server.skip)&&!ctl->password)
344         {
345             if (NO_PASSWORD(ctl))
346                 /* Server won't care what the password is, but there
347                    must be some non-null string here.  */
348                 ctl->password = ctl->remotename;
349             else
350             {
351                 netrc_entry *p;
352
353                 /* look up the pollname and account in the .netrc file. */
354                 p = search_netrc(netrc_list,
355                                  ctl->server.pollname, ctl->remotename);
356                 /* if we find a matching entry with a password, use it */
357                 if (p && p->password)
358                     ctl->password = xstrdup(p->password);
359
360                 /* otherwise try with "via" name if there is one */
361                 else if (ctl->server.via)
362                 {
363                     p = search_netrc(netrc_list, 
364                                      ctl->server.via, ctl->remotename);
365                     if (p && p->password)
366                         ctl->password = xstrdup(p->password);
367                 }
368             }
369         }
370     }
371
372     free_netrc(netrc_list);
373     netrc_list = 0;
374
375     /* perhaps we just want to check options? */
376     if (versioninfo)
377     {
378         int havercfile = access(rcfile, 0);
379
380         printf(GT_("Taking options from command line%s%s\n"),
381                                 havercfile ? "" :  GT_(" and "),
382                                 havercfile ? "" : rcfile);
383
384         if (querylist == NULL)
385             fprintf(stderr,
386                     GT_("No mailservers set up -- perhaps %s is missing?\n"),
387                     rcfile);
388         else
389             dump_params(&run, querylist, implicitmode);
390         exit(0);
391     }
392
393     /* dump options as a Python dictionary, for configurator use */
394     if (configdump)
395     {
396         dump_config(&run, querylist);
397         exit(0);
398     }
399
400     /* check for another fetchmail running concurrently */
401     pid = fm_lock_state();
402     bkgd = (pid < 0);
403     pid = bkgd ? -pid : pid;
404
405     /* if no mail servers listed and nothing in background, we're done */
406     if (!quitonly && pid == 0 && querylist == NULL) {
407         (void)fputs(GT_("fetchmail: no mailservers have been specified.\n"),stderr);
408         exit(PS_SYNTAX);
409     }
410
411     /* perhaps user asked us to kill the other fetchmail */
412     if (quitmode)
413     {
414         if (pid == 0 || pid == getpid())
415             /* this test enables re-execing on a changed rcfile
416              * for pid == getpid() */
417         {
418             if (quitonly) {
419                 fprintf(stderr,GT_("fetchmail: no other fetchmail is running\n"));
420                 exit(PS_EXCLUDE);
421             }
422         }
423         else if (kill(pid, SIGTERM) < 0)
424         {
425             fprintf(stderr,GT_("fetchmail: error killing %s fetchmail at %ld; bailing out.\n"),
426                     bkgd ? GT_("background") : GT_("foreground"), (long)pid);
427             exit(PS_EXCLUDE);
428         }
429         else
430         {
431             int maxwait;
432
433             if (outlevel > O_SILENT)
434                 fprintf(stderr,GT_("fetchmail: %s fetchmail at %ld killed.\n"),
435                         bkgd ? GT_("background") : GT_("foreground"), (long)pid);
436             /* We used to nuke the other process's lock here, with
437              * fm_lock_release(), which is broken. The other process
438              * needs to clear its lock by itself. */
439             if (quitonly)
440                 exit(0);
441
442             /* wait for other process to exit */
443             maxwait = 10; /* seconds */
444             while (kill(pid, 0) == 0 && --maxwait >= 0) {
445                 sleep(1);
446             }
447             pid = 0;
448         }
449     }
450
451     /* another fetchmail is running -- wake it up or die */
452     if (pid != 0)
453     {
454         if (check_only)
455         {
456             fprintf(stderr,
457                  GT_("fetchmail: can't check mail while another fetchmail to same host is running.\n"));
458             return(PS_EXCLUDE);
459         }
460         else if (!implicitmode)
461         {
462             fprintf(stderr,
463                  GT_("fetchmail: can't poll specified hosts with another fetchmail running at %ld.\n"),
464                  (long)pid);
465                 return(PS_EXCLUDE);
466         }
467         else if (!bkgd)
468         {
469             fprintf(stderr,
470                  GT_("fetchmail: another foreground fetchmail is running at %ld.\n"),
471                  (long)pid);
472                 return(PS_EXCLUDE);
473         }
474         else if (getpid() == pid)
475             /* this test enables re-execing on a changed rcfile */
476             fm_lock_assert();
477         else if (argc > 1)
478         {
479             fprintf(stderr,
480                     GT_("fetchmail: can't accept options while a background fetchmail is running.\n"));
481             return(PS_EXCLUDE);
482         }
483         else if (kill(pid, SIGUSR1) == 0)
484         {
485             fprintf(stderr,
486                     GT_("fetchmail: background fetchmail at %ld awakened.\n"),
487                     (long)pid);
488             return(0);
489         }
490         else
491         {
492             /*
493              * Should never happen -- possible only if a background fetchmail
494              * croaks after the first kill probe above but before the
495              * SIGUSR1/SIGHUP transmission.
496              */
497             fprintf(stderr,
498                     GT_("fetchmail: elder sibling at %ld died mysteriously.\n"),
499                     (long)pid);
500             return(PS_UNDEFINED);
501         }
502     }
503
504     /* pick up interactively any passwords we need but don't have */ 
505     for (ctl = querylist; ctl; ctl = ctl->next)
506     {
507         if (ctl->active && !(implicitmode && ctl->server.skip)
508                 && !NO_PASSWORD(ctl) && !ctl->password)
509         {
510             if (!isatty(0))
511             {
512                 fprintf(stderr,
513                         GT_("fetchmail: can't find a password for %s@%s.\n"),
514                         ctl->remotename, ctl->server.pollname);
515                 return(PS_AUTHFAIL);
516             } else {
517                 const char* password_prompt = GT_("Enter password for %s@%s: ");
518                 size_t pplen = strlen(password_prompt) + strlen(ctl->remotename) + strlen(ctl->server.pollname) + 1;
519
520                 tmpbuf = (char *)xmalloc(pplen);
521                 snprintf(tmpbuf, pplen, password_prompt,
522                         ctl->remotename, ctl->server.pollname);
523                 ctl->password = xstrdup((char *)fm_getpassword(tmpbuf));
524                 free(tmpbuf);
525             }
526         }
527     }
528
529     /*
530      * Time to initiate the SOCKS library (this is not mandatory: it just
531      * registers the correct application name for logging purpose. If you
532      * have some problem, comment out these lines).
533      */
534 #ifdef HAVE_SOCKS
535     SOCKSinit("fetchmail");
536 #endif /* HAVE_SOCKS */
537
538     /* avoid zombies from plugins */
539     deal_with_sigchld();
540
541     /* Fix up log destination - if the if() is true, the precedence rule
542      * above hasn't killed off the syslog option, because the logfile
543      * option is ineffective (because we're not detached or not in
544      * deamon mode), so kill it for the benefit of other parts of the
545      * code. */
546     if (run.logfile && run.use_syslog)
547         run.logfile = 0;
548
549     /*
550      * Maybe time to go to demon mode...
551      */
552     if (run.poll_interval)
553     {
554         if (!nodetach) {
555             int rc;
556
557             rc = daemonize(run.logfile);
558             if (rc) {
559                 report(stderr, GT_("fetchmail: Cannot detach into background. Aborting.\n"));
560                 exit(rc);
561             }
562         }
563         report(stdout, GT_("starting fetchmail %s daemon\n"), VERSION);
564
565         /*
566          * We'll set up a handler for these when we're sleeping,
567          * but ignore them otherwise so as not to interrupt a poll.
568          */
569         set_signal_handler(SIGUSR1, SIG_IGN);
570         if (run.poll_interval && getuid() == ROOT_UID)
571             set_signal_handler(SIGHUP, SIG_IGN);
572     }
573     else
574     {
575         /* not in daemon mode */
576         if (run.logfile && !nodetach && access(run.logfile, F_OK) == 0)
577         {
578             if (!freopen(run.logfile, "a", stdout))
579                     report(stderr, GT_("could not open %s to append logs to\n"), run.logfile);
580             if (!freopen(run.logfile, "a", stderr))
581                     report(stdout, GT_("could not open %s to append logs to\n"), run.logfile);
582             if (run.use_syslog)
583                 report(stdout, GT_("fetchmail: Warning: syslog and logfile are set. Check both for logs!\n"));
584         }
585     }
586
587     interface_init();
588
589     /* beyond here we don't want more than one fetchmail running per user */
590     umask(0077);
591     set_signal_handler(SIGABRT, terminate_run);
592     set_signal_handler(SIGINT, terminate_run);
593     set_signal_handler(SIGTERM, terminate_run);
594     set_signal_handler(SIGALRM, terminate_run);
595     set_signal_handler(SIGPIPE, SIG_IGN);
596     set_signal_handler(SIGQUIT, terminate_run);
597
598     /* here's the exclusion lock */
599     fm_lock_or_die();
600
601     if (check_only && outlevel >= O_VERBOSE) {
602         report(stdout, GT_("--check mode enabled, not fetching mail\n"));
603     }
604
605     /*
606      * Query all hosts. If there's only one, the error return will
607      * reflect the status of that transaction.
608      */
609     do {
610         /* 
611          * Check to see if the rcfile has been touched.  If so,
612          * re-exec so the file will be reread.  Doing it this way
613          * avoids all the complications of trying to deallocate the
614          * in-core control structures -- and the potential memory
615          * leaks...
616          */
617         struct stat     rcstat;
618
619         if (strcmp(rcfile, "-") == 0) {
620             /* do nothing */
621         } else if (stat(rcfile, &rcstat) == -1) {
622             if (errno != ENOENT)
623                 report(stderr, 
624                        GT_("couldn't time-check %s (error %d)\n"),
625                        rcfile, errno);
626         }
627         else if (rcstat.st_mtime > parsetime)
628         {
629             report(stdout, GT_("restarting fetchmail (%s changed)\n"), rcfile);
630
631 #ifdef HAVE_GETCWD
632             /* restore the startup directory */
633             if (!currentwd[0] || chdir (currentwd) == -1)
634                 report(stderr, GT_("attempt to re-exec may fail as directory has not been restored\n"));
635 #endif
636
637             /*
638              * Matthias Andree: Isn't this prone to introduction of
639              * "false" programs by interfering with PATH? Those
640              * path-searching execs might not be the best ideas for
641              * this reason.
642              *
643              * Rob Funk: But is there any way for someone to modify
644              * the PATH variable of a running fetchmail?  I don't know
645              * of a way.
646              *
647              * Dave's change makes fetchmail restart itself in exactly
648              * the way it was started from the shell (or shell script)
649              * in the first place.  If you're concerned about PATH
650              * contamination, call fetchmail initially with a full
651              * path, and use Dave's patch.
652              *
653              * Not using a -p variant of exec means that the restart
654              * will break if both (a) the user depended on PATH to
655              * call fetchmail in the first place, and (b) the system
656              * doesn't save the whole path in argv[0] if the whole
657              * path wasn't used in the initial call.  (If I recall
658              * correctly, Linux saves it but many other Unices don't.)
659              */
660             execvp(argv[0], argv);
661             report(stderr, GT_("attempt to re-exec fetchmail failed\n"));
662         }
663
664 #ifdef HAVE_RES_SEARCH
665         /* Boldly assume that we also have res_init() if we have
666          * res_search(), and call res_init() to re-read the resolv.conf
667          * file, so that we can pick up changes to that file that are
668          * written by dhpccd, dhclient, pppd, openvpn and similar. */
669
670         /* NOTE: This assumes that /etc/resolv.conf is written
671          * atomically (i. e. a temporary file is written, flushed and
672          * then renamed into place). To fix Debian Bug#389270. */
673
674         /* NOTE: If this leaks memory or doesn't re-read
675          * /etc/resolv.conf, we're in trouble. The res_init() interface
676          * is only lightly documented :-( */
677         res_init();
678 #endif
679
680         activecount = 0;
681         batchcount = 0;
682         for (ctl = querylist; ctl; ctl = ctl->next)
683             if (ctl->active)
684             {
685                 activecount++;
686                 if (!(implicitmode && ctl->server.skip))
687                 {
688                     if (ctl->wedged)
689                     {
690                         report(stderr, 
691                                GT_("poll of %s skipped (failed authentication or too many timeouts)\n"),
692                                ctl->server.pollname);
693                         continue;
694                     }
695
696                     /* check skip interval first so that it counts all polls */
697                     if (run.poll_interval && ctl->server.interval) 
698                     {
699                         if (ctl->server.poll_count++ % ctl->server.interval) 
700                         {
701                             if (outlevel >= O_VERBOSE)
702                                 report(stdout,
703                                        GT_("interval not reached, not querying %s\n"),
704                                        ctl->server.pollname);
705                             continue;
706                         }
707                     }
708
709 #ifdef CAN_MONITOR
710                     /*
711                      * Don't do monitoring if we were woken by a signal.
712                      * Note that interface_approve() does its own error logging.
713                      */
714                     if (!interface_approve(&ctl->server, !lastsig))
715                         continue;
716 #endif /* CAN_MONITOR */
717
718                     dofastuidl = 0; /* this is reset in the driver if required */
719
720                     querystatus = query_host(ctl);
721
722                     if (NUM_NONZERO(ctl->fastuidl))
723                         ctl->fastuidlcount = (ctl->fastuidlcount + 1) % ctl->fastuidl;
724 #ifdef POP3_ENABLE
725                     /* leave the UIDL state alone if there have been any errors */
726                     if (!check_only &&
727                                 ((querystatus==PS_SUCCESS) || (querystatus==PS_NOMAIL) || (querystatus==PS_MAXFETCH)))
728                         uid_swap_lists(ctl);
729                     else
730                         uid_discard_new_list(ctl);
731                     uid_reset_num(ctl);
732 #endif  /* POP3_ENABLE */
733
734                     if (querystatus == PS_SUCCESS)
735                         successes++;
736                     else if (!check_only && 
737                              ((querystatus!=PS_NOMAIL) || (outlevel==O_DEBUG)))
738                         switch(querystatus)
739                         {
740                         case PS_SUCCESS:
741                             report(stdout,GT_("Query status=0 (SUCCESS)\n"));break;
742                         case PS_NOMAIL: 
743                             report(stdout,GT_("Query status=1 (NOMAIL)\n")); break;
744                         case PS_SOCKET:
745                             report(stdout,GT_("Query status=2 (SOCKET)\n")); break;
746                         case PS_AUTHFAIL:
747                             report(stdout,GT_("Query status=3 (AUTHFAIL)\n"));break;
748                         case PS_PROTOCOL:
749                             report(stdout,GT_("Query status=4 (PROTOCOL)\n"));break;
750                         case PS_SYNTAX:
751                             report(stdout,GT_("Query status=5 (SYNTAX)\n")); break;
752                         case PS_IOERR:
753                             report(stdout,GT_("Query status=6 (IOERR)\n"));  break;
754                         case PS_ERROR:
755                             report(stdout,GT_("Query status=7 (ERROR)\n"));  break;
756                         case PS_EXCLUDE:
757                             report(stdout,GT_("Query status=8 (EXCLUDE)\n")); break;
758                         case PS_LOCKBUSY:
759                             report(stdout,GT_("Query status=9 (LOCKBUSY)\n"));break;
760                         case PS_SMTP:
761                             report(stdout,GT_("Query status=10 (SMTP)\n")); break;
762                         case PS_DNS:
763                             report(stdout,GT_("Query status=11 (DNS)\n")); break;
764                         case PS_BSMTP:
765                             report(stdout,GT_("Query status=12 (BSMTP)\n")); break;
766                         case PS_MAXFETCH:
767                             report(stdout,GT_("Query status=13 (MAXFETCH)\n"));break;
768                         default:
769                             report(stdout,GT_("Query status=%d\n"),querystatus);
770                             break;
771                         }
772
773 #ifdef CAN_MONITOR
774                     if (ctl->server.monitor)
775                     {
776                         /*
777                          * Allow some time for the link to quiesce.  One
778                          * second is usually sufficient, three is safe.
779                          * Note:  this delay is important - don't remove!
780                          */
781                         sleep(3);
782                         interface_note_activity(&ctl->server);
783                     }
784 #endif /* CAN_MONITOR */
785                 }
786             }
787
788         /* close connections cleanly */
789         terminate_poll(0);
790
791         /*
792          * OK, we've polled.  Now sleep.
793          */
794         if (run.poll_interval)
795         {
796             /* 
797              * Because passwords can expire, it may happen that *all*
798              * hosts are now out of the loop due to authfail
799              * conditions.  If this happens daemon-mode fetchmail
800              * should softly and silently vanish away, rather than
801              * spinning uselessly.
802              */
803             int unwedged = 0;
804
805             for (ctl = querylist; ctl; ctl = ctl->next)
806                 if (ctl->active && !(implicitmode && ctl->server.skip))
807                     if (!ctl->wedged)
808                         unwedged++;
809             if (!unwedged)
810             {
811                 report(stderr, GT_("All connections are wedged.  Exiting.\n"));
812                 /* FIXME: someday, send notification mail */
813                 exit(PS_AUTHFAIL);
814             }
815
816             if ((outlevel > O_SILENT && !run.use_syslog && isatty(1))
817                     || outlevel > O_NORMAL)
818                 report(stdout,
819                        GT_("sleeping at %s for %d seconds\n"), timestamp(), run.poll_interval);
820
821             /*
822              * With this simple hack, we make it possible for a foreground 
823              * fetchmail to wake up one in daemon mode.  What we want is the
824              * side effect of interrupting any sleep that may be going on,
825              * forcing fetchmail to re-poll its hosts.  The second line is
826              * for people who think all system daemons wake up on SIGHUP.
827              */
828             set_signal_handler(SIGUSR1, donothing);
829             if (getuid() == ROOT_UID)
830                 set_signal_handler(SIGHUP, donothing);
831
832             /*
833              * OK, now pause until it's time for the next poll cycle.
834              * A nonzero return indicates we received a wakeup signal;
835              * unwedge all servers in case the problem has been
836              * manually repaired.
837              */
838             if ((lastsig = interruptible_idle(run.poll_interval)))
839             {
840                 if (outlevel > O_SILENT)
841 #ifdef SYS_SIGLIST_DECLARED
842                     report(stdout, 
843                        GT_("awakened by %s\n"), sys_siglist[lastsig]);
844 #else
845                     report(stdout, 
846                        GT_("awakened by signal %d\n"), lastsig);
847 #endif
848                 for (ctl = querylist; ctl; ctl = ctl->next)
849                     ctl->wedged = FALSE;
850             }
851
852             if ((outlevel > O_SILENT && !run.use_syslog && isatty(1))
853                     || outlevel > O_NORMAL)
854                 report(stdout, GT_("awakened at %s\n"), timestamp());
855         }
856     } while (run.poll_interval);
857
858     if (outlevel >= O_VERBOSE)
859         report(stdout, GT_("normal termination, status %d\n"),
860                 successes ? PS_SUCCESS : querystatus);
861
862     terminate_run(0);
863
864     if (successes)
865         exit(PS_SUCCESS);
866     else if (querystatus)
867         exit(querystatus);
868     else
869         /* in case we interrupted before a successful fetch */
870         exit(PS_NOMAIL);
871 }
872
873 static void list_merge(struct idlist **dstl, struct idlist **srcl, int force)
874 {
875     /*
876      * If force is off, modify dstl fields only when they're empty (treat srcl
877      * as defaults).  If force is on, modify each dstl field whenever scrcl
878      * is nonempty (treat srcl as an override).  
879      */
880     if (force ? !!*srcl : !*dstl)
881     {
882         struct idlist *cpl = copy_str_list(*srcl);
883
884         append_str_list(dstl, &cpl);
885     }
886 }
887
888 static void optmerge(struct query *h2, struct query *h1, int force)
889 /* merge two options records */
890 {
891     list_merge(&h2->server.localdomains, &h1->server.localdomains, force);
892     list_merge(&h2->localnames, &h1->localnames, force);
893     list_merge(&h2->mailboxes, &h1->mailboxes, force);
894     list_merge(&h2->smtphunt, &h1->smtphunt, force);
895     list_merge(&h2->domainlist, &h1->domainlist, force);
896     list_merge(&h2->antispam, &h1->antispam, force);
897
898 #define FLAG_MERGE(fld) if (force ? !!h1->fld : !h2->fld) h2->fld = h1->fld
899     FLAG_MERGE(server.via);
900     FLAG_MERGE(server.protocol);
901     FLAG_MERGE(server.service);
902     FLAG_MERGE(server.interval);
903     FLAG_MERGE(server.authenticate);
904     FLAG_MERGE(server.timeout);
905     FLAG_MERGE(server.envelope);
906     FLAG_MERGE(server.envskip);
907     FLAG_MERGE(server.qvirtual);
908     FLAG_MERGE(server.skip);
909     FLAG_MERGE(server.dns);
910     FLAG_MERGE(server.checkalias);
911     FLAG_MERGE(server.uidl);
912     FLAG_MERGE(server.principal);
913
914 #ifdef CAN_MONITOR
915     FLAG_MERGE(server.interface);
916     FLAG_MERGE(server.interface_pair);
917     FLAG_MERGE(server.monitor);
918 #endif
919
920     FLAG_MERGE(server.plugin);
921     FLAG_MERGE(server.plugout);
922     FLAG_MERGE(server.tracepolls);
923     FLAG_MERGE(server.badheader);
924
925     FLAG_MERGE(wildcard);
926     FLAG_MERGE(remotename);
927     FLAG_MERGE(password);
928     FLAG_MERGE(mda);
929     FLAG_MERGE(bsmtp);
930     FLAG_MERGE(listener);
931     FLAG_MERGE(smtpaddress);
932     FLAG_MERGE(smtpname);
933     FLAG_MERGE(preconnect);
934     FLAG_MERGE(postconnect);
935
936     FLAG_MERGE(keep);
937     FLAG_MERGE(flush);
938     FLAG_MERGE(limitflush);
939     FLAG_MERGE(fetchall);
940     FLAG_MERGE(rewrite);
941     FLAG_MERGE(forcecr);
942     FLAG_MERGE(stripcr);
943     FLAG_MERGE(pass8bits);
944     FLAG_MERGE(dropstatus);
945     FLAG_MERGE(dropdelivered);
946     FLAG_MERGE(mimedecode);
947     FLAG_MERGE(idle);
948     FLAG_MERGE(limit);
949     FLAG_MERGE(warnings);
950     FLAG_MERGE(fetchlimit);
951     FLAG_MERGE(fetchsizelimit);
952     FLAG_MERGE(fastuidl);
953     FLAG_MERGE(batchlimit);
954 #ifdef  SSL_ENABLE
955     FLAG_MERGE(use_ssl);
956     FLAG_MERGE(sslkey);
957     FLAG_MERGE(sslcert);
958     FLAG_MERGE(sslproto);
959     FLAG_MERGE(sslcertck);
960     FLAG_MERGE(sslcertfile);
961     FLAG_MERGE(sslcertpath);
962     FLAG_MERGE(sslcommonname);
963     FLAG_MERGE(sslfingerprint);
964 #endif
965     FLAG_MERGE(expunge);
966
967     FLAG_MERGE(properties);
968 #undef FLAG_MERGE
969 }
970
971 /** Load configuration files.
972  * \return - true if no servers found on the command line
973  *         - false if servers found on the command line */
974 static int load_params(int argc, char **argv, int optind)
975 {
976     int implicitmode, st;
977     struct passwd *pw;
978     struct query def_opts, *ctl;
979     struct stat rcstat;
980     char *p;
981
982     run.bouncemail = TRUE;
983     run.softbounce = TRUE;      /* treat permanent errors as temporary */
984     run.spambounce = FALSE;     /* don't bounce back to innocent bystanders */
985
986     memset(&def_opts, '\0', sizeof(struct query));
987     def_opts.smtp_socket = -1;
988     def_opts.smtpaddress = (char *)0;
989     def_opts.smtpname = (char *)0;
990     def_opts.server.protocol = P_AUTO;
991     def_opts.server.timeout = CLIENT_TIMEOUT;
992     def_opts.server.esmtp_name = user;
993     def_opts.server.badheader = BHREJECT;
994     def_opts.warnings = WARNING_INTERVAL;
995     def_opts.remotename = user;
996     def_opts.listener = SMTP_MODE;
997     def_opts.fetchsizelimit = 100;
998     def_opts.fastuidl = 4;
999
1000     /* get the location of rcfile */
1001     rcfiledir[0] = 0;
1002     p = strrchr (rcfile, '/');
1003     if (p && (size_t)(p - rcfile) < sizeof (rcfiledir)) {
1004         *p = 0;                 /* replace '/' by '0' */
1005         strlcpy (rcfiledir, rcfile, sizeof(rcfiledir));
1006         *p = '/';               /* restore '/' */
1007         if (!rcfiledir[0])      /* "/.fetchmailrc" case */
1008             strcpy (rcfiledir, "/");
1009     }
1010
1011     /* note the parse time, so we can pick up on modifications */
1012     if (strcmp(rcfile, "-") == 0)
1013         parsetime = time(NULL);
1014     else {
1015         if (stat(rcfile, &rcstat) != -1)
1016             parsetime = rcstat.st_mtime;
1017         else if (errno != ENOENT)
1018             report(stderr, GT_("couldn't time-check the run-control file\n"));
1019     }
1020
1021     /* this builds the host list */
1022     if ((st = prc_parse_file(rcfile, !versioninfo)) != 0)
1023         /*
1024          * FIXME: someday, send notification mail here if backgrounded.
1025          * Right now, that can happen if the user changes the rcfile
1026          * while the fetchmail is running in background.  Do similarly
1027          * for the other exit() calls in this function.
1028          */
1029         exit(st);
1030
1031     if ((implicitmode = (optind >= argc)))
1032     {
1033         for (ctl = querylist; ctl; ctl = ctl->next)
1034             ctl->active = !ctl->server.skip;
1035     }
1036     else
1037         for (; optind < argc; optind++) 
1038         {
1039             flag        predeclared =  FALSE;
1040
1041             /*
1042              * If hostname corresponds to a host known from the rc file,
1043              * simply declare it active.  Otherwise synthesize a host
1044              * record from command line and defaults
1045              */
1046             for (ctl = querylist; ctl; ctl = ctl->next)
1047                 if (!strcmp(ctl->server.pollname, argv[optind])
1048                         || str_in_list(&ctl->server.akalist, argv[optind], TRUE))
1049                 {
1050                     /* Is this correct? */
1051                     if (predeclared && outlevel >= O_VERBOSE)
1052                         fprintf(stderr,GT_("Warning: multiple mentions of host %s in config file\n"),argv[optind]);
1053                     ctl->active = TRUE;
1054                     predeclared = TRUE;
1055                 }
1056
1057             if (!predeclared)
1058             {
1059                 /*
1060                  * Allocate and link record without copying in
1061                  * command-line args; we'll do that with the optmerge
1062                  * call later on.
1063                  */
1064                 ctl = hostalloc((struct query *)NULL);
1065                 ctl->server.via =
1066                     ctl->server.pollname = xstrdup(argv[optind]);
1067                 ctl->active = TRUE;
1068                 ctl->server.lead_server = (struct hostdata *)NULL;
1069             }
1070         }
1071
1072     /*
1073      * If there's a defaults record, merge it and lose it.
1074      * FIXME: we don't currently free all entries that might be in struct query.
1075      */ 
1076     if (querylist && strcmp(querylist->server.pollname, "defaults") == 0)
1077     {
1078         struct query *tmpq;
1079
1080         for (ctl = querylist->next; ctl; ctl = ctl->next)
1081             optmerge(ctl, querylist, FALSE);
1082         tmpq = querylist;
1083         querylist = querylist->next;
1084         free(tmpq->server.pollname);
1085         free(tmpq);
1086     }
1087
1088     /* don't allow a defaults record after the first */
1089     for (ctl = querylist; ctl; ctl = ctl->next) {
1090         if (ctl != querylist && strcmp(ctl->server.pollname, "defaults") == 0) {
1091             fprintf(stderr, GT_("fetchmail: Error: multiple \"defaults\" records in config file.\n"));
1092             exit(PS_SYNTAX);
1093         }
1094     }
1095
1096     /* use localhost if we never fetch the FQDN of this host */
1097     fetchmailhost = "localhost";
1098
1099     /* here's where we override globals */
1100     if (cmd_run.logfile)
1101         run.logfile = cmd_run.logfile;
1102     if (cmd_run.idfile)
1103         run.idfile = cmd_run.idfile;
1104     if (cmd_run.pidfile)
1105         run.pidfile = cmd_run.pidfile;
1106     /* do this before the keep/fetchall test below, otherwise -d0 may fail */
1107     if (cmd_run.poll_interval >= 0)
1108         run.poll_interval = cmd_run.poll_interval;
1109     if (cmd_run.invisible)
1110         run.invisible = (cmd_run.invisible == FLAG_TRUE);
1111     if (cmd_run.showdots)
1112         run.showdots = (cmd_run.showdots == FLAG_TRUE);
1113     if (cmd_run.use_syslog)
1114         run.use_syslog = (cmd_run.use_syslog == FLAG_TRUE);
1115     if (cmd_run.postmaster)
1116         run.postmaster = cmd_run.postmaster;
1117     if (cmd_run.bouncemail)
1118         run.bouncemail = (cmd_run.bouncemail == FLAG_TRUE);
1119     if (cmd_run.softbounce)
1120         run.softbounce = (cmd_run.softbounce == FLAG_TRUE);
1121
1122     /* check and daemon options are not compatible */
1123     if (check_only && run.poll_interval)
1124         run.poll_interval = 0;
1125
1126     /*
1127      * DNS support is required for some protocols.  We used to
1128      * do this unconditionally, but it made fetchmail excessively
1129      * vulnerable to misconfigured DNS setups.
1130      *
1131      * If we're using ETRN or ODMR, the smtp hunt list is the
1132      * list of systems we're polling on behalf of; these have
1133      * to be fully-qualified domain names.  The default for
1134      * this list should be the FQDN of localhost.
1135      *
1136      * If we're using Kerberos for authentication, we need 
1137      * the FQDN in order to generate capability keys.
1138      */
1139     for (ctl = querylist; ctl; ctl = ctl->next)
1140         if (ctl->active && 
1141                 (ctl->server.protocol==P_ETRN || ctl->server.protocol==P_ODMR
1142                  || ctl->server.authenticate == A_KERBEROS_V5))
1143         {
1144             fetchmailhost = host_fqdn(1);
1145             break;
1146         }
1147
1148     if (!ctl) /* list exhausted */
1149         fetchmailhost = host_fqdn(0);
1150
1151     /* this code enables flags to be turned off */
1152 #define DEFAULT(flag, dflt)     if (flag == FLAG_TRUE)\
1153                                         flag = TRUE;\
1154                                 else if (flag == FLAG_FALSE)\
1155                                         flag = FALSE;\
1156                                 else\
1157                                         flag = (dflt)
1158
1159     /* merge in wired defaults, do sanity checks and prepare internal fields */
1160     for (ctl = querylist; ctl; ctl = ctl->next)
1161     {
1162         ctl->wedged = FALSE;
1163
1164         /* merge in defaults */
1165         optmerge(ctl, &def_opts, FALSE);
1166
1167         /* force command-line options */
1168         optmerge(ctl, &cmd_opts, TRUE);
1169
1170         /*
1171          * queryname has to be set up for inactive servers too.  
1172          * Otherwise the UIDL code core-dumps on startup.
1173          */
1174         if (ctl->server.via) 
1175             ctl->server.queryname = xstrdup(ctl->server.via);
1176         else
1177             ctl->server.queryname = xstrdup(ctl->server.pollname);
1178
1179         /*
1180          * We no longer do DNS lookups at startup.
1181          * This is a kluge.  It enables users to edit their
1182          * configurations when DNS isn't available.
1183          */
1184         ctl->server.truename = xstrdup(ctl->server.queryname);
1185
1186         if (configdump || ctl->active )
1187         {
1188             DEFAULT(ctl->keep, FALSE);
1189             DEFAULT(ctl->fetchall, FALSE);
1190             DEFAULT(ctl->flush, FALSE);
1191             DEFAULT(ctl->limitflush, FALSE);
1192             DEFAULT(ctl->rewrite, TRUE);
1193             DEFAULT(ctl->stripcr, (ctl->mda != (char *)NULL)); 
1194             DEFAULT(ctl->forcecr, FALSE);
1195             DEFAULT(ctl->pass8bits, FALSE);
1196             DEFAULT(ctl->dropstatus, FALSE);
1197             DEFAULT(ctl->dropdelivered, FALSE);
1198             DEFAULT(ctl->mimedecode, FALSE);
1199             DEFAULT(ctl->idle, FALSE);
1200             DEFAULT(ctl->server.dns, TRUE);
1201             DEFAULT(ctl->server.uidl, FALSE);
1202             DEFAULT(ctl->use_ssl, FALSE);
1203             DEFAULT(ctl->sslcertck, FALSE);
1204             DEFAULT(ctl->server.checkalias, FALSE);
1205 #ifndef SSL_ENABLE
1206             /*
1207              * XXX FIXME: do we need this check or can we rely on the .y
1208              * parser handling this?
1209              */
1210             if (ctl->use_ssl) 
1211             {
1212                 report(stderr, GT_("SSL support is not compiled in.\n"));
1213                 exit(PS_SYNTAX);
1214             }
1215 #endif /* SSL_ENABLE */
1216 #undef DEFAULT
1217 #ifndef KERBEROS_V5
1218             if (ctl->server.authenticate == A_KERBEROS_V5) {
1219                 report(stderr, GT_("KERBEROS v5 support is configured, but not compiled in.\n"));
1220                 exit(PS_SYNTAX);
1221             }
1222 #endif
1223 #ifndef GSSAPI
1224             if (ctl->server.authenticate == A_GSSAPI) {
1225                 report(stderr, GT_("GSSAPI support is configured, but not compiled in.\n"));
1226                 exit(PS_SYNTAX);
1227             }
1228 #endif
1229
1230             /*
1231              * Make sure we have a nonempty host list to forward to.
1232              */
1233             if (!ctl->smtphunt)
1234                 save_str(&ctl->smtphunt, "localhost", FALSE);
1235
1236             /*
1237              * Make sure we have a nonempty list of domains to fetch from.
1238              */
1239             if ((ctl->server.protocol==P_ETRN || ctl->server.protocol==P_ODMR) && !ctl->domainlist)
1240                 save_str(&ctl->domainlist, fetchmailhost, FALSE);
1241
1242             /* if `user' doesn't name a real local user, try to run as root */
1243             if ((pw = getpwnam(user)) == (struct passwd *)NULL)
1244                 ctl->uid = 0;
1245             else
1246                 ctl->uid = pw->pw_uid;  /* for local delivery via MDA */
1247             if (!ctl->localnames)       /* for local delivery via SMTP */
1248                 save_str_pair(&ctl->localnames, user, NULL);
1249
1250             /*
1251              * can't handle multidrop mailboxes without "envelope"
1252              * option, this causes truckloads full of support complaints
1253              * "all mail forwarded to postmaster"
1254              */
1255             if (MULTIDROP(ctl) && !ctl->server.envelope)
1256             {
1257                 report(stderr, GT_("warning: multidrop for %s requires envelope option!\n"), ctl->server.pollname);
1258                 report(stderr, GT_("warning: Do not ask for support if all mail goes to postmaster!\n"));
1259             }
1260
1261             /* if no folders were specified, set up the null one as default */
1262             if (!ctl->mailboxes)
1263                 save_str(&ctl->mailboxes, (char *)NULL, 0);
1264
1265             /* maybe user overrode timeout on command line? */
1266             if (ctl->server.timeout == -1)
1267                 ctl->server.timeout = CLIENT_TIMEOUT;
1268
1269             /* sanity checks */
1270             if (ctl->server.service) {
1271                 int port = servport(ctl->server.service);
1272                 if (port < 0)
1273                 {
1274                     (void) fprintf(stderr,
1275                                    GT_("fetchmail: %s configuration invalid, specify positive port number for service or port\n"),
1276                                    ctl->server.pollname);
1277                     exit(PS_SYNTAX);
1278                 }
1279             }
1280             if (ctl->listener == LMTP_MODE)
1281             {
1282                 struct idlist   *idp;
1283
1284                 for (idp = ctl->smtphunt; idp; idp = idp->next)
1285                 {
1286                     char        *cp;
1287
1288                     if (!(cp = strrchr(idp->id, '/'))
1289                         || (0 == strcmp(cp + 1, SMTP_PORT))
1290                         || servport(cp + 1) == SMTP_PORT_NUM)
1291                     {
1292                         (void) fprintf(stderr,
1293                                        GT_("%s configuration invalid, LMTP can't use default SMTP port\n"),
1294                                        ctl->server.pollname);
1295                         exit(PS_SYNTAX);
1296                     }
1297                 }
1298             }
1299
1300             /*
1301              * "I beg to you, have mercy on the we[a]k minds like myself."
1302              * wrote Pehr Anderson.  Your petition is granted.
1303              */
1304             if (ctl->fetchall && ctl->keep && (run.poll_interval || ctl->idle) && !nodetach && !configdump)
1305             {
1306                 (void) fprintf(stderr,
1307                                GT_("Both fetchall and keep on in daemon or idle mode is a mistake!\n"));
1308             }
1309         }
1310     }
1311
1312     /*
1313      * If the user didn't set a last-resort user to get misaddressed
1314      * multidrop mail, set an appropriate default here.
1315      */
1316     if (!run.postmaster)
1317     {
1318         if (getuid() != ROOT_UID)               /* ordinary user */
1319             run.postmaster = user;
1320         else                                    /* root */
1321             run.postmaster = "postmaster";
1322     }
1323
1324     return(implicitmode);
1325 }
1326
1327 static void terminate_poll(int sig)
1328 /* to be executed at the end of a poll cycle */
1329 {
1330
1331     if (sig != 0)
1332         report(stdout, GT_("terminated with signal %d\n"), sig);
1333
1334 #ifdef POP3_ENABLE
1335     /*
1336      * Update UID information at end of each poll, rather than at end
1337      * of run, because that way we don't lose all UIDL information since
1338      * the beginning of time if fetchmail crashes.
1339      */
1340     if (!check_only)
1341         write_saved_lists(querylist, run.idfile);
1342 #endif /* POP3_ENABLE */
1343 }
1344
1345 static void terminate_run(int sig)
1346 /* to be executed on normal or signal-induced termination */
1347 {
1348     struct query        *ctl;
1349
1350     terminate_poll(sig);
1351
1352     /* 
1353      * Craig Metz, the RFC1938 one-time-password guy, points out:
1354      * "Remember that most kernels don't zero pages before handing them to the
1355      * next process and many kernels share pages between user and kernel space.
1356      * You'd be very surprised what you can find from a short program to do a
1357      * malloc() and then dump the contents of the pages you got. By zeroing
1358      * the secrets at end of run (earlier if you can), you make sure the next
1359      * guy can't get the password/pass phrase."
1360      *
1361      * Right you are, Craig!
1362      */
1363     for (ctl = querylist; ctl; ctl = ctl->next)
1364         if (ctl->password)
1365           memset(ctl->password, '\0', strlen(ctl->password));
1366
1367     if (activecount == 0)
1368         exit(PS_NOMAIL);
1369     else
1370         exit(successes ? PS_SUCCESS : querystatus);
1371 }
1372
1373 /*
1374  * Sequence of protocols to try when autoprobing, most capable to least.
1375  */
1376 static const int autoprobe[] = 
1377 {
1378 #ifdef IMAP_ENABLE
1379     P_IMAP,
1380 #endif /* IMAP_ENABLE */
1381 #ifdef POP3_ENABLE
1382     P_POP3,
1383 #endif /* POP3_ENABLE */
1384 };
1385
1386 static int query_host(struct query *ctl)
1387 /* perform fetch transaction with single host */
1388 {
1389     size_t i;
1390     int st = 0;
1391
1392     /*
1393      * If we're syslogging the progress messages are automatically timestamped.
1394      * Force timestamping if we're going to a logfile.
1395      */
1396     if (outlevel >= O_VERBOSE)
1397     {
1398         report(stdout, GT_("%s querying %s (protocol %s) at %s: poll started\n"),
1399                VERSION,
1400                ctl->server.pollname,
1401                showproto(ctl->server.protocol),
1402                timestamp());
1403     }
1404
1405     switch (ctl->server.protocol) {
1406     case P_AUTO:
1407         for (i = 0; i < sizeof(autoprobe)/sizeof(autoprobe[0]); i++)
1408         {
1409             ctl->server.protocol = autoprobe[i];
1410             do {
1411                 st = query_host(ctl);
1412             } while 
1413                 (st == PS_REPOLL);
1414             if (st == PS_SUCCESS || st == PS_NOMAIL || st == PS_AUTHFAIL || st == PS_LOCKBUSY || st == PS_SMTP || st == PS_MAXFETCH || st == PS_DNS)
1415                 break;
1416         }
1417         ctl->server.protocol = P_AUTO;
1418         break;
1419     case P_POP3:
1420     case P_APOP:
1421 #ifdef POP3_ENABLE
1422         do {
1423             st = doPOP3(ctl);
1424         } while (st == PS_REPOLL);
1425 #else
1426         report(stderr, GT_("POP3 support is not configured.\n"));
1427         st = PS_PROTOCOL;
1428 #endif /* POP3_ENABLE */
1429         break;
1430     case P_IMAP:
1431 #ifdef IMAP_ENABLE
1432         do {
1433             st = doIMAP(ctl);
1434         } while (st == PS_REPOLL);
1435 #else
1436         report(stderr, GT_("IMAP support is not configured.\n"));
1437         st = PS_PROTOCOL;
1438 #endif /* IMAP_ENABLE */
1439         break;
1440     case P_ETRN:
1441 #ifndef ETRN_ENABLE
1442         report(stderr, GT_("ETRN support is not configured.\n"));
1443         st = PS_PROTOCOL;
1444 #else
1445         st = doETRN(ctl);
1446         break;
1447 #endif /* ETRN_ENABLE */
1448     case P_ODMR:
1449 #ifndef ODMR_ENABLE
1450         report(stderr, GT_("ODMR support is not configured.\n"));
1451         st = PS_PROTOCOL;
1452 #else
1453         st = doODMR(ctl);
1454 #endif /* ODMR_ENABLE */
1455         break;
1456     default:
1457         report(stderr, GT_("unsupported protocol selected.\n"));
1458         st = PS_PROTOCOL;
1459     }
1460
1461     /*
1462      * If we're syslogging the progress messages are automatically timestamped.
1463      * Force timestamping if we're going to a logfile.
1464      */
1465     if (outlevel >= O_VERBOSE)
1466     {
1467         report(stdout, GT_("%s querying %s (protocol %s) at %s: poll completed\n"),
1468                VERSION,
1469                ctl->server.pollname,
1470                showproto(ctl->server.protocol),
1471                timestamp());
1472     }
1473
1474     return(st);
1475 }
1476
1477 static void dump_params (struct runctl *runp,
1478                          struct query *querylist, flag implicit)
1479 /* display query parameters in English */
1480 {
1481     struct query *ctl;
1482
1483     if (runp->poll_interval)
1484         printf(GT_("Poll interval is %d seconds\n"), runp->poll_interval);
1485     if (runp->logfile)
1486         printf(GT_("Logfile is %s\n"), runp->logfile);
1487     if (strcmp(runp->idfile, IDFILE_NAME))
1488         printf(GT_("Idfile is %s\n"), runp->idfile);
1489     if (runp->use_syslog)
1490         printf(GT_("Progress messages will be logged via syslog\n"));
1491     if (runp->invisible)
1492         printf(GT_("Fetchmail will masquerade and will not generate Received\n"));
1493     if (runp->showdots)
1494         printf(GT_("Fetchmail will show progress dots even in logfiles.\n"));
1495     if (runp->postmaster)
1496         printf(GT_("Fetchmail will forward misaddressed multidrop messages to %s.\n"),
1497                runp->postmaster);
1498
1499     if (!runp->bouncemail)
1500         printf(GT_("Fetchmail will direct error mail to the postmaster.\n"));
1501     else if (outlevel >= O_VERBOSE)
1502         printf(GT_("Fetchmail will direct error mail to the sender.\n"));
1503
1504     if (!runp->softbounce)
1505         printf(GT_("Fetchmail will treat permanent errors as permanent (drop messages).\n"));
1506     else if (outlevel >= O_VERBOSE)
1507         printf(GT_("Fetchmail will treat permanent errors as temporary (keep messages).\n"));
1508
1509     for (ctl = querylist; ctl; ctl = ctl->next)
1510     {
1511         if (!ctl->active || (implicit && ctl->server.skip))
1512             continue;
1513
1514         printf(GT_("Options for retrieving from %s@%s:\n"),
1515                ctl->remotename, visbuf(ctl->server.pollname));
1516
1517         if (ctl->server.via && MAILBOX_PROTOCOL(ctl))
1518             printf(GT_("  Mail will be retrieved via %s\n"), ctl->server.via);
1519
1520         if (ctl->server.interval)
1521             printf(ngettext("  Poll of this server will occur every %d interval.\n",
1522                             "  Poll of this server will occur every %d intervals.\n",
1523                             ctl->server.interval), ctl->server.interval);
1524         if (ctl->server.truename)
1525             printf(GT_("  True name of server is %s.\n"), ctl->server.truename);
1526         if (ctl->server.skip || outlevel >= O_VERBOSE)
1527             printf(ctl->server.skip
1528                    ? GT_("  This host will not be queried when no host is specified.\n")
1529                    : GT_("  This host will be queried when no host is specified.\n"));
1530         if (!NO_PASSWORD(ctl))
1531         {
1532             if (!ctl->password)
1533                 printf(GT_("  Password will be prompted for.\n"));
1534             else if (outlevel >= O_VERBOSE)
1535             {
1536                 if (ctl->server.protocol == P_APOP)
1537                     printf(GT_("  APOP secret = \"%s\".\n"),
1538                            visbuf(ctl->password));
1539                 else
1540                     printf(GT_("  Password = \"%s\".\n"),
1541                                                         visbuf(ctl->password));
1542             }
1543         }
1544
1545         if (ctl->server.protocol == P_POP3 
1546             && ctl->server.service && !strcmp(ctl->server.service, KPOP_PORT)
1547             && (ctl->server.authenticate == A_KERBEROS_V5))
1548             printf(GT_("  Protocol is KPOP with Kerberos %s authentication"),
1549                    ctl->server.authenticate == A_KERBEROS_V5 ? "V" : "IV");
1550         else
1551             printf(GT_("  Protocol is %s"), showproto(ctl->server.protocol));
1552         if (ctl->server.service)
1553             printf(GT_(" (using service %s)"), ctl->server.service);
1554         else if (outlevel >= O_VERBOSE)
1555             printf(GT_(" (using default port)"));
1556         if (ctl->server.uidl && MAILBOX_PROTOCOL(ctl))
1557             printf(GT_(" (forcing UIDL use)"));
1558         putchar('.');
1559         putchar('\n');
1560         switch (ctl->server.authenticate)
1561         {
1562         case A_ANY:
1563             printf(GT_("  All available authentication methods will be tried.\n"));
1564             break;
1565         case A_PASSWORD:
1566             printf(GT_("  Password authentication will be forced.\n"));
1567             break;
1568         case A_MSN:
1569             printf(GT_("  MSN authentication will be forced.\n"));
1570             break;
1571         case A_NTLM:
1572             printf(GT_("  NTLM authentication will be forced.\n"));
1573             break;
1574         case A_OTP:
1575             printf(GT_("  OTP authentication will be forced.\n"));
1576             break;
1577         case A_CRAM_MD5:
1578             printf(GT_("  CRAM-MD5 authentication will be forced.\n"));
1579             break;
1580         case A_GSSAPI:
1581             printf(GT_("  GSSAPI authentication will be forced.\n"));
1582             break;
1583         case A_KERBEROS_V5:
1584             printf(GT_("  Kerberos V5 authentication will be forced.\n"));
1585             break;
1586         case A_SSH:
1587             printf(GT_("  End-to-end encryption assumed.\n"));
1588             break;
1589         }
1590         if (ctl->server.principal != (char *) NULL)
1591             printf(GT_("  Mail service principal is: %s\n"), ctl->server.principal);
1592 #ifdef  SSL_ENABLE
1593         if (ctl->use_ssl)
1594             printf(GT_("  SSL encrypted sessions enabled.\n"));
1595         if (ctl->sslproto)
1596             printf(GT_("  SSL protocol: %s.\n"), ctl->sslproto);
1597         if (ctl->sslcertck) {
1598             printf(GT_("  SSL server certificate checking enabled.\n"));
1599         }
1600         if (ctl->sslcertfile != NULL)
1601                 printf(GT_("  SSL trusted certificate file: %s\n"), ctl->sslcertfile);
1602         if (ctl->sslcertpath != NULL)
1603                 printf(GT_("  SSL trusted certificate directory: %s\n"), ctl->sslcertpath);
1604         if (ctl->sslcommonname != NULL)
1605                 printf(GT_("  SSL server CommonName: %s\n"), ctl->sslcommonname);
1606         if (ctl->sslfingerprint != NULL)
1607                 printf(GT_("  SSL key fingerprint (checked against the server key): %s\n"), ctl->sslfingerprint);
1608 #endif
1609         if (ctl->server.timeout > 0)
1610             printf(GT_("  Server nonresponse timeout is %d seconds"), ctl->server.timeout);
1611         if (ctl->server.timeout ==  CLIENT_TIMEOUT)
1612             printf(GT_(" (default).\n"));
1613         else
1614             printf(".\n");
1615
1616         if (MAILBOX_PROTOCOL(ctl)) 
1617         {
1618             if (!ctl->mailboxes->id)
1619                 printf(GT_("  Default mailbox selected.\n"));
1620             else
1621             {
1622                 struct idlist *idp;
1623
1624                 printf(GT_("  Selected mailboxes are:"));
1625                 for (idp = ctl->mailboxes; idp; idp = idp->next)
1626                     printf(" %s", idp->id);
1627                 printf("\n");
1628             }
1629             printf(ctl->fetchall
1630                    ? GT_("  All messages will be retrieved (--all on).\n")
1631                    : GT_("  Only new messages will be retrieved (--all off).\n"));
1632             printf(ctl->keep
1633                    ? GT_("  Fetched messages will be kept on the server (--keep on).\n")
1634                    : GT_("  Fetched messages will not be kept on the server (--keep off).\n"));
1635             printf(ctl->flush
1636                    ? GT_("  Old messages will be flushed before message retrieval (--flush on).\n")
1637                    : GT_("  Old messages will not be flushed before message retrieval (--flush off).\n"));
1638             printf(ctl->limitflush
1639                    ? GT_("  Oversized messages will be flushed before message retrieval (--limitflush on).\n")
1640                    : GT_("  Oversized messages will not be flushed before message retrieval (--limitflush off).\n"));
1641             printf(ctl->rewrite
1642                    ? GT_("  Rewrite of server-local addresses is enabled (--norewrite off).\n")
1643                    : GT_("  Rewrite of server-local addresses is disabled (--norewrite on).\n"));
1644             printf(ctl->stripcr
1645                    ? GT_("  Carriage-return stripping is enabled (stripcr on).\n")
1646                    : GT_("  Carriage-return stripping is disabled (stripcr off).\n"));
1647             printf(ctl->forcecr
1648                    ? GT_("  Carriage-return forcing is enabled (forcecr on).\n")
1649                    : GT_("  Carriage-return forcing is disabled (forcecr off).\n"));
1650             printf(ctl->pass8bits
1651                    ? GT_("  Interpretation of Content-Transfer-Encoding is disabled (pass8bits on).\n")
1652                    : GT_("  Interpretation of Content-Transfer-Encoding is enabled (pass8bits off).\n"));
1653             printf(ctl->mimedecode
1654                    ? GT_("  MIME decoding is enabled (mimedecode on).\n")
1655                    : GT_("  MIME decoding is disabled (mimedecode off).\n"));
1656             printf(ctl->idle
1657                    ? GT_("  Idle after poll is enabled (idle on).\n")
1658                    : GT_("  Idle after poll is disabled (idle off).\n"));
1659             printf(ctl->dropstatus
1660                    ? GT_("  Nonempty Status lines will be discarded (dropstatus on)\n")
1661                    : GT_("  Nonempty Status lines will be kept (dropstatus off)\n"));
1662             printf(ctl->dropdelivered
1663                    ? GT_("  Delivered-To lines will be discarded (dropdelivered on)\n")
1664                    : GT_("  Delivered-To lines will be kept (dropdelivered off)\n"));
1665             if (NUM_NONZERO(ctl->limit))
1666             {
1667                 if (NUM_NONZERO(ctl->limit))
1668                     printf(GT_("  Message size limit is %d octets (--limit %d).\n"), 
1669                            ctl->limit, ctl->limit);
1670                 else if (outlevel >= O_VERBOSE)
1671                     printf(GT_("  No message size limit (--limit 0).\n"));
1672                 if (run.poll_interval > 0)
1673                     printf(GT_("  Message size warning interval is %d seconds (--warnings %d).\n"), 
1674                            ctl->warnings, ctl->warnings);
1675                 else if (outlevel >= O_VERBOSE)
1676                     printf(GT_("  Size warnings on every poll (--warnings 0).\n"));
1677             }
1678             if (NUM_NONZERO(ctl->fetchlimit))
1679                 printf(GT_("  Received-message limit is %d (--fetchlimit %d).\n"),
1680                        ctl->fetchlimit, ctl->fetchlimit);
1681             else if (outlevel >= O_VERBOSE)
1682                 printf(GT_("  No received-message limit (--fetchlimit 0).\n"));
1683             if (NUM_NONZERO(ctl->fetchsizelimit))
1684                 printf(GT_("  Fetch message size limit is %d (--fetchsizelimit %d).\n"),
1685                        ctl->fetchsizelimit, ctl->fetchsizelimit);
1686             else if (outlevel >= O_VERBOSE)
1687                 printf(GT_("  No fetch message size limit (--fetchsizelimit 0).\n"));
1688             if (NUM_NONZERO(ctl->fastuidl) && MAILBOX_PROTOCOL(ctl))
1689             {
1690                 if (ctl->fastuidl == 1)
1691                     printf(GT_("  Do binary search of UIDs during each poll (--fastuidl 1).\n"));
1692                 else
1693                     printf(GT_("  Do binary search of UIDs during %d out of %d polls (--fastuidl %d).\n"), ctl->fastuidl - 1, ctl->fastuidl, ctl->fastuidl);
1694             }
1695             else if (outlevel >= O_VERBOSE)
1696                 printf(GT_("   Do linear search of UIDs during each poll (--fastuidl 0).\n"));
1697             if (NUM_NONZERO(ctl->batchlimit))
1698                 printf(GT_("  SMTP message batch limit is %d.\n"), ctl->batchlimit);
1699             else if (outlevel >= O_VERBOSE)
1700                 printf(GT_("  No SMTP message batch limit (--batchlimit 0).\n"));
1701             if (MAILBOX_PROTOCOL(ctl))
1702             {
1703                 if (NUM_NONZERO(ctl->expunge))
1704                     printf(GT_("  Deletion interval between expunges forced to %d (--expunge %d).\n"), ctl->expunge, ctl->expunge);
1705                 else if (outlevel >= O_VERBOSE)
1706                     printf(GT_("  No forced expunges (--expunge 0).\n"));
1707             }
1708         }
1709         else    /* ODMR or ETRN */
1710         {
1711             struct idlist *idp;
1712
1713             printf(GT_("  Domains for which mail will be fetched are:"));
1714             for (idp = ctl->domainlist; idp; idp = idp->next)
1715             {
1716                 printf(" %s", idp->id);
1717                 if (!idp->val.status.mark)
1718                     printf(GT_(" (default)"));
1719             }
1720             printf("\n");
1721         }
1722         if (ctl->bsmtp)
1723             printf(GT_("  Messages will be appended to %s as BSMTP\n"), visbuf(ctl->bsmtp));
1724         else if (ctl->mda && MAILBOX_PROTOCOL(ctl))
1725             printf(GT_("  Messages will be delivered with \"%s\".\n"), visbuf(ctl->mda));
1726         else
1727         {
1728             struct idlist *idp;
1729
1730             if (ctl->smtphunt)
1731             {
1732                 printf(GT_("  Messages will be %cMTP-forwarded to:"), 
1733                        ctl->listener);
1734                 for (idp = ctl->smtphunt; idp; idp = idp->next)
1735                 {
1736                     printf(" %s", idp->id);
1737                     if (!idp->val.status.mark)
1738                         printf(GT_(" (default)"));
1739                 }
1740                 printf("\n");
1741             }
1742             if (ctl->smtpaddress)
1743                 printf(GT_("  Host part of MAIL FROM line will be %s\n"),
1744                        ctl->smtpaddress);
1745             if (ctl->smtpname)
1746                 printf(GT_("  Address to be put in RCPT TO lines shipped to SMTP will be %s\n"),
1747                        ctl->smtpname);
1748         }
1749         if (MAILBOX_PROTOCOL(ctl))
1750         {
1751                 if (ctl->antispam != (struct idlist *)NULL)
1752                 {
1753                     struct idlist *idp;
1754
1755                     printf(GT_("  Recognized listener spam block responses are:"));
1756                     for (idp = ctl->antispam; idp; idp = idp->next)
1757                         printf(" %d", idp->val.status.num);
1758                     printf("\n");
1759                 }
1760                 else if (outlevel >= O_VERBOSE)
1761                     printf(GT_("  Spam-blocking disabled\n"));
1762         }
1763         if (ctl->preconnect)
1764             printf(GT_("  Server connection will be brought up with \"%s\".\n"),
1765                    visbuf(ctl->preconnect));
1766         else if (outlevel >= O_VERBOSE)
1767             printf(GT_("  No pre-connection command.\n"));
1768         if (ctl->postconnect)
1769             printf(GT_("  Server connection will be taken down with \"%s\".\n"),
1770                    visbuf(ctl->postconnect));
1771         else if (outlevel >= O_VERBOSE)
1772             printf(GT_("  No post-connection command.\n"));
1773         if (MAILBOX_PROTOCOL(ctl)) {
1774                 if (!ctl->localnames)
1775                     printf(GT_("  No localnames declared for this host.\n"));
1776                 else
1777                 {
1778                     struct idlist *idp;
1779                     int count = 0;
1780
1781                     for (idp = ctl->localnames; idp; idp = idp->next)
1782                         ++count;
1783
1784                     if (count > 1 || ctl->wildcard)
1785                         printf(GT_("  Multi-drop mode: "));
1786                     else
1787                         printf(GT_("  Single-drop mode: "));
1788
1789                     printf(ngettext("%d local name recognized.\n", "%d local names recognized.\n", count), count);
1790                     if (outlevel >= O_VERBOSE)
1791                     {
1792                         for (idp = ctl->localnames; idp; idp = idp->next)
1793                             if (idp->val.id2)
1794                                 printf("\t%s -> %s\n", idp->id, idp->val.id2);
1795                             else
1796                                 printf("\t%s\n", idp->id);
1797                         if (ctl->wildcard)
1798                             fputs("\t*\n", stdout);
1799                     }
1800
1801                     if (count > 1 || ctl->wildcard)
1802                     {
1803                         printf(ctl->server.dns
1804                                ? GT_("  DNS lookup for multidrop addresses is enabled.\n")
1805                                : GT_("  DNS lookup for multidrop addresses is disabled.\n"));
1806                         if (ctl->server.dns)
1807                         {
1808                             if (ctl->server.checkalias)
1809                                 printf(GT_("  Server aliases will be compared with multidrop addresses by IP address.\n"));
1810                             else
1811                                 printf(GT_("  Server aliases will be compared with multidrop addresses by name.\n"));
1812                         }
1813                         if (ctl->server.envelope == STRING_DISABLED)
1814                             printf(GT_("  Envelope-address routing is disabled\n"));
1815                         else
1816                         {
1817                             printf(GT_("  Envelope header is assumed to be: %s\n"),
1818                                    ctl->server.envelope ? ctl->server.envelope : "Received");
1819                             if (ctl->server.envskip || outlevel >= O_VERBOSE)
1820                                 printf(GT_("  Number of envelope headers to be skipped over: %d\n"),
1821                                        ctl->server.envskip);
1822                             if (ctl->server.qvirtual)
1823                                 printf(GT_("  Prefix %s will be removed from user id\n"),
1824                                        ctl->server.qvirtual);
1825                             else if (outlevel >= O_VERBOSE) 
1826                                 printf(GT_("  No prefix stripping\n"));
1827                         }
1828
1829                         if (ctl->server.akalist)
1830                         {
1831                             printf(GT_("  Predeclared mailserver aliases:"));
1832                             for (idp = ctl->server.akalist; idp; idp = idp->next)
1833                                 printf(" %s", idp->id);
1834                             putchar('\n');
1835                         }
1836
1837                         if (ctl->server.localdomains)
1838                         {
1839                             printf(GT_("  Local domains:"));
1840                             for (idp = ctl->server.localdomains; idp; idp = idp->next)
1841                                 printf(" %s", idp->id);
1842                             putchar('\n');
1843                         }
1844                     }
1845                 }
1846         }
1847 #ifdef CAN_MONITOR
1848         if (ctl->server.interface)
1849             printf(GT_("  Connection must be through interface %s.\n"), ctl->server.interface);
1850         else if (outlevel >= O_VERBOSE)
1851             printf(GT_("  No interface requirement specified.\n"));
1852         if (ctl->server.monitor)
1853             printf(GT_("  Polling loop will monitor %s.\n"), ctl->server.monitor);
1854         else if (outlevel >= O_VERBOSE)
1855             printf(GT_("  No monitor interface specified.\n"));
1856 #endif
1857
1858         if (ctl->server.plugin)
1859             printf(GT_("  Server connections will be made via plugin %s (--plugin %s).\n"), ctl->server.plugin, ctl->server.plugin);
1860         else if (outlevel >= O_VERBOSE)
1861             printf(GT_("  No plugin command specified.\n"));
1862         if (ctl->server.plugout)
1863             printf(GT_("  Listener connections will be made via plugout %s (--plugout %s).\n"), ctl->server.plugout, ctl->server.plugout);
1864         else if (outlevel >= O_VERBOSE)
1865             printf(GT_("  No plugout command specified.\n"));
1866
1867         if (MAILBOX_PROTOCOL(ctl))
1868         {
1869             if (!ctl->oldsaved)
1870                 printf(GT_("  No UIDs saved from this host.\n"));
1871             else
1872             {
1873                 struct idlist *idp;
1874                 int count = 0;
1875
1876                 for (idp = ctl->oldsaved; idp; idp = idp->next)
1877                     ++count;
1878
1879                 printf(GT_("  %d UIDs saved.\n"), count);
1880                 if (outlevel >= O_VERBOSE)
1881                     for (idp = ctl->oldsaved; idp; idp = idp->next)
1882                         printf("\t%s\n", idp->id);
1883             }
1884         }
1885
1886         if (ctl->server.tracepolls)
1887             printf(GT_("  Poll trace information will be added to the Received header.\n"));
1888         else if (outlevel >= O_VERBOSE)
1889             printf(GT_("  No poll trace information will be added to the Received header.\n"));
1890
1891         switch (ctl->server.badheader) {
1892             case BHREJECT:
1893                 if (outlevel >= O_VERBOSE)
1894                     printf(GT_("  Messages with bad headers will be rejected.\n"));
1895                 break;
1896             case BHACCEPT:
1897                 printf(GT_("  Messages with bad headers will be passed on.\n"));
1898                 break;
1899         }
1900
1901         if (ctl->properties)
1902             printf(GT_("  Pass-through properties \"%s\".\n"),
1903                    visbuf(ctl->properties));
1904     }
1905 }
1906
1907 /* fetchmail.c ends here */