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