2 * fetchmail.c -- main driver module for fetchmail
4 * For license terms, see the file COPYING in this directory.
9 #if defined(STDC_HEADERS)
12 #if defined(HAVE_UNISTD_H)
18 #if defined(HAVE_SYSLOG)
26 #include <sys/types.h>
29 #include <sys/resource.h>
30 #endif /* HAVE_SETRLIMIT */
33 #include <socks.h> /* SOCKSinit() */
34 #endif /* HAVE_SOCKS */
36 #ifdef HAVE_LANGINFO_H
40 #include "fetchmail.h"
48 /* need these (and sys/types.h) for res_init() */
49 #include <netinet/in.h>
50 #include <arpa/nameser.h>
54 #define ENETUNREACH 128 /* Interactive doesn't know this */
55 #endif /* ENETUNREACH */
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 *);
62 /* controls the detail level of status/progress messages written to stderr */
63 int outlevel; /* see the O_.* constants above */
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 */
79 static int quitonly; /* if we should quit after killing the running daemon */
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 */
87 static RETSIGTYPE terminate_run(int);
88 static RETSIGTYPE terminate_poll(int);
90 #if defined(__FreeBSD__) && defined(__FreeBSD_USE_KVM)
91 /* drop SGID kmem privileage until we need it */
92 static void dropprivs(void)
102 if (gr && !strcmp(gr->gr_name, "kmem"))
104 extern void interface_set_gids(gid_t egid, gid_t rgid);
105 interface_set_gids(egid, rgid);
111 #if defined(HAVE_SETLOCALE) && defined(ENABLE_NLS) && defined(HAVE_STRFTIME)
113 /** returns timestamp in current locale,
114 * and resets LC_TIME locale to POSIX. */
115 static char *timestamp (void)
118 static char buf[60]; /* RATS: ignore */
121 setlocale (LC_TIME, "");
122 strftime (buf, sizeof (buf), "%c", localtime(&now));
123 setlocale (LC_TIME, "C");
127 #define timestamp rfc822timestamp
130 static RETSIGTYPE donothing(int sig)
132 set_signal_handler(sig, donothing);
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, Rob F. Funk, Graham Wilson\n"
139 "Copyright (C) 2005-2006 Matthias Andree, Sunil Shetye\n"
141 fprintf(fp, GT_("Fetchmail comes with ABSOLUTELY NO WARRANTY. This is free software, and you\n"
142 "are welcome to redistribute it under certain conditions. For details,\n"
143 "please see the file COPYING in the source or documentation directory.\n"));
146 const char *iana_charset;
148 int main(int argc, char **argv)
151 int implicitmode = FALSE;
153 netrc_entry *netrc_list;
154 char *netrc_file, *tmpbuf;
158 #if defined(__FreeBSD__) && defined(__FreeBSD_USE_KVM)
162 envquery(argc, argv);
164 setlocale (LC_ALL, "");
165 bindtextdomain(PACKAGE, LOCALEDIR);
167 iana_charset = norm_charmap(nl_langinfo(CODESET)); /* normalize local
171 iana_charset = "US-ASCII";
175 report(stderr, GT_("WARNING: Running as root is discouraged.\n"));
179 * Note: because we can't initialize reporting before we know whether
180 * syslog is supposed to be on, this message will go to stdout and
181 * be lost when running in background.
183 if (outlevel >= O_VERBOSE)
187 report(stdout, GT_("fetchmail: invoked with"));
188 for (i = 0; i < argc; i++)
189 report(stdout, " %s", argv[i]);
190 report(stdout, "\n");
193 #define IDFILE_NAME ".fetchids"
194 run.idfile = prependdir (IDFILE_NAME, fmhome);
199 * We used to arrange for the lock to be removed on exit close
200 * to where the lock was asserted. Now we need to do it here, because
201 * we might have re-executed in background with an existing lock
202 * as the result of a changed rcfile (see the code near the execvp(3)
203 * call near the beginning of the polling loop for details). We want
204 * to be sure the lock gets nuked on any error exit, basically.
209 /* save the current directory */
210 if (getcwd (currentwd, sizeof (currentwd)) == NULL) {
211 report(stderr, GT_("could not get current working directory\n"));
219 i = parsecmdline(argc, argv, &cmd_run, &cmd_opts);
223 if (quitmode && quitind == argc)
229 const char *features =
232 #endif /* POP2_ENABLE */
235 #endif /* POP3_ENABLE */
238 #endif /* IMAP_ENABLE */
244 #endif /* RPA_ENABLE */
247 #endif /* NTLM_ENABLE */
250 #endif /* SDPS_ENABLE */
253 #endif /* ETRN_ENABLE */
256 #endif /* ODMR_ENABLE */
262 #endif /* OPIE_ENABLE */
263 #ifdef HAVE_PKG_hesiod
268 #endif /* HAVE_SOCKS */
271 #endif /* ENABLE_NLS */
273 printf(GT_("This is fetchmail release %s"), VERSION);
274 fputs(features, stdout);
276 printcopyright(stdout);
278 fputs("Fallback MDA: ", stdout);
280 fputs(FALLBACK_MDA, stdout);
282 fputs("(none)", stdout);
287 /* this is an attempt to help remote debugging */
291 /* avoid parsing the config file if all we're doing is killing a daemon */
293 implicitmode = load_params(argc, argv, optind);
295 #if defined(HAVE_SYSLOG)
296 /* logging should be set up early in case we were restarted from exec */
299 #if defined(LOG_MAIL)
300 openlog(program_name, LOG_PID, LOG_MAIL);
302 /* Assume BSD4.2 openlog with two arguments */
303 openlog(program_name, LOG_PID);
309 report_init((run.poll_interval == 0 || nodetach) && !run.logfile);
312 /* initialize UID handling */
316 if (!versioninfo && (st = prc_filecheck(run.idfile, !versioninfo)) != 0)
319 initialize_saved_lists(querylist, run.idfile);
321 #endif /* POP3_ENABLE */
323 /* construct the lockfile */
326 #ifdef HAVE_SETRLIMIT
328 * Before getting passwords, disable core dumps unless -v -d0 mode is on.
329 * Core dumps could otherwise contain passwords to be scavenged by a
332 if (outlevel < O_VERBOSE || run.poll_interval > 0)
334 struct rlimit corelimit;
335 corelimit.rlim_cur = 0;
336 corelimit.rlim_max = 0;
337 setrlimit(RLIMIT_CORE, &corelimit);
339 #endif /* HAVE_SETRLIMIT */
341 #define NETRC_FILE ".netrc"
342 /* parse the ~/.netrc file (if present) for future password lookups. */
343 netrc_file = prependdir (NETRC_FILE, home);
344 netrc_list = parse_netrc(netrc_file);
348 /* pick up passwords where we can */
349 for (ctl = querylist; ctl; ctl = ctl->next)
351 if (ctl->active && !(implicitmode && ctl->server.skip)&&!ctl->password)
353 if (NO_PASSWORD(ctl))
354 /* Server won't care what the password is, but there
355 must be some non-null string here. */
356 ctl->password = ctl->remotename;
361 /* look up the pollname and account in the .netrc file. */
362 p = search_netrc(netrc_list,
363 ctl->server.pollname, ctl->remotename);
364 /* if we find a matching entry with a password, use it */
365 if (p && p->password)
366 ctl->password = xstrdup(p->password);
368 /* otherwise try with "via" name if there is one */
369 else if (ctl->server.via)
371 p = search_netrc(netrc_list,
372 ctl->server.via, ctl->remotename);
373 if (p && p->password)
374 ctl->password = xstrdup(p->password);
380 free_netrc(netrc_list);
383 /* perhaps we just want to check options? */
386 int havercfile = access(rcfile, 0);
388 printf(GT_("Taking options from command line%s%s\n"),
389 havercfile ? "" : GT_(" and "),
390 havercfile ? "" : rcfile);
392 if (querylist == NULL)
394 GT_("No mailservers set up -- perhaps %s is missing?\n"),
397 dump_params(&run, querylist, implicitmode);
401 /* dump options as a Python dictionary, for configurator use */
404 dump_config(&run, querylist);
408 /* check for another fetchmail running concurrently */
409 pid = fm_lock_state();
411 pid = bkgd ? -pid : pid;
413 /* if no mail servers listed and nothing in background, we're done */
414 if (!quitonly && pid == 0 && querylist == NULL) {
415 (void)fputs(GT_("fetchmail: no mailservers have been specified.\n"),stderr);
419 /* perhaps user asked us to kill the other fetchmail */
422 if (pid == 0 || pid == getpid())
423 /* this test enables re-execing on a changed rcfile
424 * for pid == getpid() */
427 fprintf(stderr,GT_("fetchmail: no other fetchmail is running\n"));
431 else if (kill(pid, SIGTERM) < 0)
433 fprintf(stderr,GT_("fetchmail: error killing %s fetchmail at %d; bailing out.\n"),
434 bkgd ? GT_("background") : GT_("foreground"), pid);
441 if (outlevel > O_SILENT)
442 fprintf(stderr,GT_("fetchmail: %s fetchmail at %d killed.\n"),
443 bkgd ? GT_("background") : GT_("foreground"), pid);
444 /* We used to nuke the other process's lock here, with
445 * fm_lock_release(), which is broken. The other process
446 * needs to clear its lock by itself. */
450 /* wait for other process to exit */
451 maxwait = 10; /* seconds */
452 while (kill(pid, 0) == 0 && --maxwait >= 0) {
459 /* another fetchmail is running -- wake it up or die */
465 GT_("fetchmail: can't check mail while another fetchmail to same host is running.\n"));
468 else if (!implicitmode)
471 GT_("fetchmail: can't poll specified hosts with another fetchmail running at %d.\n"),
478 GT_("fetchmail: another foreground fetchmail is running at %d.\n"),
482 else if (getpid() == pid)
483 /* this test enables re-execing on a changed rcfile */
488 GT_("fetchmail: can't accept options while a background fetchmail is running.\n"));
491 else if (kill(pid, SIGUSR1) == 0)
494 GT_("fetchmail: background fetchmail at %d awakened.\n"),
501 * Should never happen -- possible only if a background fetchmail
502 * croaks after the first kill probe above but before the
503 * SIGUSR1/SIGHUP transmission.
506 GT_("fetchmail: elder sibling at %d died mysteriously.\n"),
508 return(PS_UNDEFINED);
512 /* pick up interactively any passwords we need but don't have */
513 for (ctl = querylist; ctl; ctl = ctl->next)
515 if (ctl->active && !(implicitmode && ctl->server.skip)
516 && !NO_PASSWORD(ctl) && !ctl->password)
521 GT_("fetchmail: can't find a password for %s@%s.\n"),
522 ctl->remotename, ctl->server.pollname);
525 const char* password_prompt = GT_("Enter password for %s@%s: ");
526 size_t pplen = strlen(password_prompt) + strlen(ctl->remotename) + strlen(ctl->server.pollname) + 1;
528 tmpbuf = xmalloc(pplen);
529 snprintf(tmpbuf, pplen, password_prompt,
530 ctl->remotename, ctl->server.pollname);
531 ctl->password = xstrdup((char *)fm_getpassword(tmpbuf));
538 * Time to initiate the SOCKS library (this is not mandatory: it just
539 * registers the correct application name for logging purpose. If you
540 * have some problem, comment out these lines).
543 SOCKSinit("fetchmail");
544 #endif /* HAVE_SOCKS */
546 /* avoid zombies from plugins */
549 if (run.logfile && run.use_syslog)
550 fprintf(stderr, GT_("fetchmail: Warning: syslog and logfile are set. Check both for logs!\n"));
553 * Maybe time to go to demon mode...
555 if (run.poll_interval)
560 rc = daemonize(run.logfile);
562 report(stderr, GT_("fetchmail: Cannot detach into background. Aborting.\n"));
566 report(stdout, GT_("starting fetchmail %s daemon \n"), VERSION);
569 * We'll set up a handler for these when we're sleeping,
570 * but ignore them otherwise so as not to interrupt a poll.
572 set_signal_handler(SIGUSR1, SIG_IGN);
573 if (run.poll_interval && getuid() == ROOT_UID)
574 set_signal_handler(SIGHUP, SIG_IGN);
578 /* not in daemon mode */
579 if (run.logfile && !nodetach && access(run.logfile, F_OK) == 0)
581 if (!freopen(run.logfile, "a", stdout))
582 report(stderr, GT_("could not open %s to append logs to \n"), run.logfile);
583 if (!freopen(run.logfile, "a", stderr))
584 report(stdout, GT_("could not open %s to append logs to \n"), run.logfile);
586 report(stdout, GT_("fetchmail: Warning: syslog and logfile are set. Check both for logs!\n"));
592 /* beyond here we don't want more than one fetchmail running per user */
594 set_signal_handler(SIGABRT, terminate_run);
595 set_signal_handler(SIGINT, terminate_run);
596 set_signal_handler(SIGTERM, terminate_run);
597 set_signal_handler(SIGALRM, terminate_run);
598 set_signal_handler(SIGPIPE, SIG_IGN);
599 set_signal_handler(SIGQUIT, terminate_run);
601 /* here's the exclusion lock */
605 * Query all hosts. If there's only one, the error return will
606 * reflect the status of that transaction.
610 * Check to see if the rcfile has been touched. If so,
611 * re-exec so the file will be reread. Doing it this way
612 * avoids all the complications of trying to deallocate the
613 * in-core control structures -- and the potential memory
618 if (strcmp(rcfile, "-") == 0) {
620 } else if (stat(rcfile, &rcstat) == -1) {
623 GT_("couldn't time-check %s (error %d)\n"),
626 else if (rcstat.st_mtime > parsetime)
628 report(stdout, GT_("restarting fetchmail (%s changed)\n"), rcfile);
631 /* restore the startup directory */
632 if (!currentwd[0] || chdir (currentwd) == -1)
633 report(stderr, GT_("attempt to re-exec may fail as directory has not been restored\n"));
637 * Matthias Andree: Isn't this prone to introduction of
638 * "false" programs by interfering with PATH? Those
639 * path-searching execs might not be the best ideas for
642 * Rob Funk: But is there any way for someone to modify
643 * the PATH variable of a running fetchmail? I don't know
646 * Dave's change makes fetchmail restart itself in exactly
647 * the way it was started from the shell (or shell script)
648 * in the first place. If you're concerned about PATH
649 * contamination, call fetchmail initially with a full
650 * path, and use Dave's patch.
652 * Not using a -p variant of exec means that the restart
653 * will break if both (a) the user depended on PATH to
654 * call fetchmail in the first place, and (b) the system
655 * doesn't save the whole path in argv[0] if the whole
656 * path wasn't used in the initial call. (If I recall
657 * correctly, Linux saves it but many other Unices don't.)
659 execvp(argv[0], argv);
660 report(stderr, GT_("attempt to re-exec fetchmail failed\n"));
663 #if defined(HAVE_RES_SEARCH) && defined(USE_TCPIP_FOR_DNS)
665 * This was an efficiency hack that backfired. The theory
666 * was that using TCP/IP for DNS queries would get us better
667 * reliability and shave off some per-UDP-packet costs.
668 * Unfortunately it interacted badly with diald, which effectively
669 * filters out DNS queries over TCP/IP for reasons having to do
670 * with some obscure Linux kernel problem involving bootstrapping of
671 * dynamically-addressed links. I don't understand this mess
672 * and don't want to, so it's "See ya!" to this hack.
674 sethostent(TRUE); /* use TCP/IP for mailserver queries */
675 #endif /* HAVE_RES_SEARCH */
677 #ifdef HAVE_RES_SEARCH
678 /* Boldly assume that we also have res_init() if we have
679 * res_search(), and call res_init() to re-read the resolv.conf
680 * file, so that we can pick up changes to that file that are
681 * written by dhpccd, dhclient, pppd, openvpn and similar. */
683 /* NOTE: This assumes that /etc/resolv.conf is written
684 * atomically (i. e. a temporary file is written, flushed and
685 * then renamed into place). To fix Debian Bug#389270. */
687 /* NOTE: If this leaks memory or doesn't re-read
688 * /etc/resolv.conf, we're in trouble. The res_init() interface
689 * is only lightly documented :-( */
695 for (ctl = querylist; ctl; ctl = ctl->next)
699 if (!(implicitmode && ctl->server.skip))
704 GT_("poll of %s skipped (failed authentication or too many timeouts)\n"),
705 ctl->server.pollname);
709 /* check skip interval first so that it counts all polls */
710 if (run.poll_interval && ctl->server.interval)
712 if (ctl->server.poll_count++ % ctl->server.interval)
714 if (outlevel >= O_VERBOSE)
716 GT_("interval not reached, not querying %s\n"),
717 ctl->server.pollname);
724 * Don't do monitoring if we were woken by a signal.
725 * Note that interface_approve() does its own error logging.
727 if (!interface_approve(&ctl->server, !lastsig))
729 #endif /* CAN_MONITOR */
731 dofastuidl = 0; /* this is reset in the driver if required */
733 querystatus = query_host(ctl);
735 if (NUM_NONZERO(ctl->fastuidl))
736 ctl->fastuidlcount = (ctl->fastuidlcount + 1) % ctl->fastuidl;
738 /* leave the UIDL state alone if there have been any errors */
740 ((querystatus==PS_SUCCESS) || (querystatus==PS_NOMAIL) || (querystatus==PS_MAXFETCH)))
743 uid_discard_new_list(ctl);
745 #endif /* POP3_ENABLE */
747 if (querystatus == PS_SUCCESS)
749 else if (!check_only &&
750 ((querystatus!=PS_NOMAIL) || (outlevel==O_DEBUG)))
754 report(stdout,GT_("Query status=0 (SUCCESS)\n"));break;
756 report(stdout,GT_("Query status=1 (NOMAIL)\n")); break;
758 report(stdout,GT_("Query status=2 (SOCKET)\n")); break;
760 report(stdout,GT_("Query status=3 (AUTHFAIL)\n"));break;
762 report(stdout,GT_("Query status=4 (PROTOCOL)\n"));break;
764 report(stdout,GT_("Query status=5 (SYNTAX)\n")); break;
766 report(stdout,GT_("Query status=6 (IOERR)\n")); break;
768 report(stdout,GT_("Query status=7 (ERROR)\n")); break;
770 report(stdout,GT_("Query status=8 (EXCLUDE)\n")); break;
772 report(stdout,GT_("Query status=9 (LOCKBUSY)\n"));break;
774 report(stdout,GT_("Query status=10 (SMTP)\n")); break;
776 report(stdout,GT_("Query status=11 (DNS)\n")); break;
778 report(stdout,GT_("Query status=12 (BSMTP)\n")); break;
780 report(stdout,GT_("Query status=13 (MAXFETCH)\n"));break;
782 report(stdout,GT_("Query status=%d\n"),querystatus);
787 if (ctl->server.monitor)
790 * Allow some time for the link to quiesce. One
791 * second is usually sufficient, three is safe.
792 * Note: this delay is important - don't remove!
795 interface_note_activity(&ctl->server);
797 #endif /* CAN_MONITOR */
801 #if defined(HAVE_RES_SEARCH) && defined(USE_TCPIP_FOR_DNS)
802 endhostent(); /* release TCP/IP connection to nameserver */
803 #endif /* HAVE_RES_SEARCH */
805 /* close connections cleanly */
809 * OK, we've polled. Now sleep.
811 if (run.poll_interval)
814 * Because passwords can expire, it may happen that *all*
815 * hosts are now out of the loop due to authfail
816 * conditions. If this happens daemon-mode fetchmail
817 * should softly and silently vanish away, rather than
818 * spinning uselessly.
822 for (ctl = querylist; ctl; ctl = ctl->next)
823 if (ctl->active && !(implicitmode && ctl->server.skip))
828 report(stderr, GT_("All connections are wedged. Exiting.\n"));
829 /* FIXME: someday, send notification mail */
833 if (outlevel > O_SILENT)
835 GT_("sleeping at %s for %d seconds\n"), timestamp(), run.poll_interval);
838 * With this simple hack, we make it possible for a foreground
839 * fetchmail to wake up one in daemon mode. What we want is the
840 * side effect of interrupting any sleep that may be going on,
841 * forcing fetchmail to re-poll its hosts. The second line is
842 * for people who think all system daemons wake up on SIGHUP.
844 set_signal_handler(SIGUSR1, donothing);
845 if (getuid() == ROOT_UID)
846 set_signal_handler(SIGHUP, donothing);
849 * OK, now pause until it's time for the next poll cycle.
850 * A nonzero return indicates we received a wakeup signal;
851 * unwedge all servers in case the problem has been
854 if ((lastsig = interruptible_idle(run.poll_interval)))
856 if (outlevel > O_SILENT)
857 #ifdef SYS_SIGLIST_DECLARED
859 GT_("awakened by %s\n"), sys_siglist[lastsig]);
862 GT_("awakened by signal %d\n"), lastsig);
864 for (ctl = querylist; ctl; ctl = ctl->next)
868 if (outlevel > O_SILENT)
869 report(stdout, GT_("awakened at %s\n"), timestamp());
874 if (outlevel >= O_VERBOSE)
875 report(stdout, GT_("normal termination, status %d\n"),
876 successes ? PS_SUCCESS : querystatus);
882 else if (querystatus)
885 /* in case we interrupted before a successful fetch */
889 static void list_merge(struct idlist **dstl, struct idlist **srcl, int force)
892 * If force is off, modify dstl fields only when they're empty (treat srcl
893 * as defaults). If force is on, modify each dstl field whenever scrcl
894 * is nonempty (treat srcl as an override).
896 if (force ? !!*srcl : !*dstl)
898 struct idlist *cpl = copy_str_list(*srcl);
900 append_str_list(dstl, &cpl);
904 static void optmerge(struct query *h2, struct query *h1, int force)
905 /* merge two options records */
907 list_merge(&h2->server.localdomains, &h1->server.localdomains, force);
908 list_merge(&h2->localnames, &h1->localnames, force);
909 list_merge(&h2->mailboxes, &h1->mailboxes, force);
910 list_merge(&h2->smtphunt, &h1->smtphunt, force);
911 list_merge(&h2->domainlist, &h1->domainlist, force);
912 list_merge(&h2->antispam, &h1->antispam, force);
914 #define FLAG_MERGE(fld) if (force ? !!h1->fld : !h2->fld) h2->fld = h1->fld
915 FLAG_MERGE(server.via);
916 FLAG_MERGE(server.protocol);
917 FLAG_MERGE(server.service);
918 FLAG_MERGE(server.interval);
919 FLAG_MERGE(server.authenticate);
920 FLAG_MERGE(server.timeout);
921 FLAG_MERGE(server.envelope);
922 FLAG_MERGE(server.envskip);
923 FLAG_MERGE(server.qvirtual);
924 FLAG_MERGE(server.skip);
925 FLAG_MERGE(server.dns);
926 FLAG_MERGE(server.checkalias);
927 FLAG_MERGE(server.uidl);
928 FLAG_MERGE(server.principal);
931 FLAG_MERGE(server.interface);
932 FLAG_MERGE(server.interface_pair);
933 FLAG_MERGE(server.monitor);
936 FLAG_MERGE(server.plugin);
937 FLAG_MERGE(server.plugout);
938 FLAG_MERGE(server.tracepolls);
940 FLAG_MERGE(wildcard);
941 FLAG_MERGE(remotename);
942 FLAG_MERGE(password);
945 FLAG_MERGE(listener);
946 FLAG_MERGE(smtpaddress);
947 FLAG_MERGE(smtpname);
948 FLAG_MERGE(preconnect);
949 FLAG_MERGE(postconnect);
953 FLAG_MERGE(limitflush);
954 FLAG_MERGE(fetchall);
958 FLAG_MERGE(pass8bits);
959 FLAG_MERGE(dropstatus);
960 FLAG_MERGE(dropdelivered);
961 FLAG_MERGE(mimedecode);
964 FLAG_MERGE(warnings);
965 FLAG_MERGE(fetchlimit);
966 FLAG_MERGE(fetchsizelimit);
967 FLAG_MERGE(fastuidl);
968 FLAG_MERGE(batchlimit);
973 FLAG_MERGE(sslproto);
974 FLAG_MERGE(sslcertck);
975 FLAG_MERGE(sslcertpath);
976 FLAG_MERGE(sslfingerprint);
980 FLAG_MERGE(properties);
984 /** Load configuration files.
985 * \return - true if no servers found on the command line
986 * - false if servers found on the command line */
987 static int load_params(int argc, char **argv, int optind)
989 int implicitmode, st;
991 struct query def_opts, *ctl;
995 run.bouncemail = TRUE;
996 run.spambounce = FALSE; /* don't bounce back to innocent bystanders */
998 memset(&def_opts, '\0', sizeof(struct query));
999 def_opts.smtp_socket = -1;
1000 def_opts.smtpaddress = (char *)0;
1001 def_opts.smtpname = (char *)0;
1002 def_opts.server.protocol = P_AUTO;
1003 def_opts.server.timeout = CLIENT_TIMEOUT;
1004 def_opts.server.esmtp_name = user;
1005 def_opts.warnings = WARNING_INTERVAL;
1006 def_opts.remotename = user;
1007 def_opts.listener = SMTP_MODE;
1008 def_opts.fetchsizelimit = 100;
1009 def_opts.fastuidl = 4;
1011 /* get the location of rcfile */
1013 p = strrchr (rcfile, '/');
1014 if (p && (size_t)(p - rcfile) < sizeof (rcfiledir)) {
1015 *p = 0; /* replace '/' by '0' */
1016 strlcpy (rcfiledir, rcfile, sizeof(rcfiledir));
1017 *p = '/'; /* restore '/' */
1018 if (!rcfiledir[0]) /* "/.fetchmailrc" case */
1019 strcpy (rcfiledir, "/");
1022 /* note the parse time, so we can pick up on modifications */
1023 parsetime = 0; /* foil compiler warnings */
1024 if (strcmp(rcfile, "-") == 0 || stat(rcfile, &rcstat) != -1)
1025 parsetime = rcstat.st_mtime;
1026 else if (errno != ENOENT)
1027 report(stderr, GT_("couldn't time-check the run-control file\n"));
1029 /* this builds the host list */
1030 if ((st = prc_parse_file(rcfile, !versioninfo)) != 0)
1032 * FIXME: someday, send notification mail here if backgrounded.
1033 * Right now, that can happen if the user changes the rcfile
1034 * while the fetchmail is running in background. Do similarly
1035 * for the other exit() calls in this function.
1039 if ((implicitmode = (optind >= argc)))
1041 for (ctl = querylist; ctl; ctl = ctl->next)
1042 ctl->active = !ctl->server.skip;
1045 for (; optind < argc; optind++)
1047 flag predeclared = FALSE;
1050 * If hostname corresponds to a host known from the rc file,
1051 * simply declare it active. Otherwise synthesize a host
1052 * record from command line and defaults
1054 for (ctl = querylist; ctl; ctl = ctl->next)
1055 if (!strcmp(ctl->server.pollname, argv[optind])
1056 || str_in_list(&ctl->server.akalist, argv[optind], TRUE))
1058 /* Is this correct? */
1059 if (predeclared && outlevel >= O_VERBOSE)
1060 fprintf(stderr,GT_("Warning: multiple mentions of host %s in config file\n"),argv[optind]);
1068 * Allocate and link record without copying in
1069 * command-line args; we'll do that with the optmerge
1072 ctl = hostalloc((struct query *)NULL);
1074 ctl->server.pollname = xstrdup(argv[optind]);
1076 ctl->server.lead_server = (struct hostdata *)NULL;
1081 * If there's a defaults record, merge it and lose it.
1083 if (querylist && strcmp(querylist->server.pollname, "defaults") == 0)
1085 for (ctl = querylist->next; ctl; ctl = ctl->next)
1086 optmerge(ctl, querylist, FALSE);
1087 querylist = querylist->next;
1090 /* don't allow a defaults record after the first */
1091 for (ctl = querylist; ctl; ctl = ctl->next) {
1092 if (ctl != querylist && strcmp(ctl->server.pollname, "defaults") == 0) {
1093 fprintf(stderr, GT_("fetchmail: Error: multiple \"defaults\" records in config file.\n"));
1098 /* use localhost if we never fetch the FQDN of this host */
1099 fetchmailhost = "localhost";
1101 /* here's where we override globals */
1102 if (cmd_run.logfile)
1103 run.logfile = cmd_run.logfile;
1105 run.idfile = cmd_run.idfile;
1106 if (cmd_run.pidfile)
1107 run.pidfile = cmd_run.pidfile;
1108 /* do this before the keep/fetchall test below, otherwise -d0 may fail */
1109 if (cmd_run.poll_interval >= 0)
1110 run.poll_interval = cmd_run.poll_interval;
1111 if (cmd_run.invisible)
1112 run.invisible = cmd_run.invisible;
1113 if (cmd_run.showdots)
1114 run.showdots = cmd_run.showdots;
1115 if (cmd_run.use_syslog)
1116 run.use_syslog = (cmd_run.use_syslog == FLAG_TRUE);
1117 if (cmd_run.postmaster)
1118 run.postmaster = cmd_run.postmaster;
1119 if (cmd_run.bouncemail)
1120 run.bouncemail = cmd_run.bouncemail;
1122 /* check and daemon options are not compatible */
1123 if (check_only && run.poll_interval)
1124 run.poll_interval = 0;
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.
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.
1136 * If we're using Kerberos for authentication, we need
1137 * the FQDN in order to generate capability keys.
1139 for (ctl = querylist; ctl; ctl = ctl->next)
1141 (ctl->server.protocol==P_ETRN || ctl->server.protocol==P_ODMR
1142 || ctl->server.authenticate == A_KERBEROS_V4
1143 || ctl->server.authenticate == A_KERBEROS_V5))
1145 fetchmailhost = host_fqdn(1);
1149 if (!ctl) /* list exhausted */
1150 fetchmailhost = host_fqdn(0);
1152 /* this code enables flags to be turned off */
1153 #define DEFAULT(flag, dflt) if (flag == FLAG_TRUE)\
1155 else if (flag == FLAG_FALSE)\
1159 /* one global gets treated specially */
1160 DEFAULT(run.showdots, run.poll_interval==0 || nodetach);
1162 /* merge in wired defaults, do sanity checks and prepare internal fields */
1163 for (ctl = querylist; ctl; ctl = ctl->next)
1165 ctl->wedged = FALSE;
1167 /* merge in defaults */
1168 optmerge(ctl, &def_opts, FALSE);
1170 /* force command-line options */
1171 optmerge(ctl, &cmd_opts, TRUE);
1174 * queryname has to be set up for inactive servers too.
1175 * Otherwise the UIDL code core-dumps on startup.
1177 if (ctl->server.via)
1178 ctl->server.queryname = xstrdup(ctl->server.via);
1180 ctl->server.queryname = xstrdup(ctl->server.pollname);
1183 * We no longer do DNS lookups at startup.
1184 * This is a kluge. It enables users to edit their
1185 * configurations when DNS isn't available.
1187 ctl->server.truename = xstrdup(ctl->server.queryname);
1189 if (configdump || ctl->active )
1191 DEFAULT(ctl->keep, FALSE);
1192 DEFAULT(ctl->fetchall, FALSE);
1193 DEFAULT(ctl->flush, FALSE);
1194 DEFAULT(ctl->limitflush, FALSE);
1195 DEFAULT(ctl->rewrite, TRUE);
1196 DEFAULT(ctl->stripcr, (ctl->mda != (char *)NULL));
1197 DEFAULT(ctl->forcecr, FALSE);
1198 DEFAULT(ctl->pass8bits, FALSE);
1199 DEFAULT(ctl->dropstatus, FALSE);
1200 DEFAULT(ctl->dropdelivered, FALSE);
1201 DEFAULT(ctl->mimedecode, FALSE);
1202 DEFAULT(ctl->idle, FALSE);
1203 DEFAULT(ctl->server.dns, TRUE);
1204 DEFAULT(ctl->server.uidl, FALSE);
1205 DEFAULT(ctl->use_ssl, FALSE);
1206 DEFAULT(ctl->sslcertck, FALSE);
1207 DEFAULT(ctl->server.checkalias, FALSE);
1210 * XXX FIXME: do we need this check or can we rely on the .y
1211 * parser handling this?
1215 report(stderr, GT_("SSL support is not compiled in.\n"));
1218 #endif /* SSL_ENABLE */
1222 * Make sure we have a nonempty host list to forward to.
1225 save_str(&ctl->smtphunt, "localhost", FALSE);
1228 * Make sure we have a nonempty list of domains to fetch from.
1230 if ((ctl->server.protocol==P_ETRN || ctl->server.protocol==P_ODMR) && !ctl->domainlist)
1231 save_str(&ctl->domainlist, fetchmailhost, FALSE);
1233 /* if `user' doesn't name a real local user, try to run as root */
1234 if ((pw = getpwnam(user)) == (struct passwd *)NULL)
1237 ctl->uid = pw->pw_uid; /* for local delivery via MDA */
1238 if (!ctl->localnames) /* for local delivery via SMTP */
1239 save_str_pair(&ctl->localnames, user, NULL);
1241 #ifndef HAVE_RES_SEARCH
1242 /* can't handle multidrop mailboxes unless we can do DNS lookups */
1243 if (MULTIDROP(ctl) && ctl->server.dns)
1245 ctl->server.dns = FALSE;
1246 report(stderr, GT_("fetchmail: warning: no DNS available to check multidrop fetches from %s\n"), ctl->server.pollname);
1248 #endif /* !HAVE_RES_SEARCH */
1251 * can't handle multidrop mailboxes without "envelope"
1252 * option, this causes truckloads full of support complaints
1253 * "all mail forwarded to postmaster"
1255 if (MULTIDROP(ctl) && !ctl->server.envelope)
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"));
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);
1265 /* maybe user overrode timeout on command line? */
1266 if (ctl->server.timeout == -1)
1267 ctl->server.timeout = CLIENT_TIMEOUT;
1270 if (ctl->server.service) {
1271 int port = servport(ctl->server.service);
1274 (void) fprintf(stderr,
1275 GT_("fetchmail: %s configuration invalid, specify positive port number for service or port\n"),
1276 ctl->server.pollname);
1279 if (ctl->server.protocol == P_RPOP && port >= 1024)
1281 (void) fprintf(stderr,
1282 GT_("fetchmail: %s configuration invalid, RPOP requires a privileged port\n"),
1283 ctl->server.pollname);
1287 if (ctl->listener == LMTP_MODE)
1291 for (idp = ctl->smtphunt; idp; idp = idp->next)
1295 if (!(cp = strrchr(idp->id, '/'))
1296 || (0 == strcmp(cp + 1, SMTP_PORT))
1297 || servport(cp + 1) == SMTP_PORT_NUM)
1299 (void) fprintf(stderr,
1300 GT_("%s configuration invalid, LMTP can't use default SMTP port\n"),
1301 ctl->server.pollname);
1308 * "I beg to you, have mercy on the we[a]k minds like myself."
1309 * wrote Pehr Anderson. Your petition is granted.
1311 if (ctl->fetchall && ctl->keep && (run.poll_interval || ctl->idle) && !nodetach && !configdump)
1313 (void) fprintf(stderr,
1314 GT_("Both fetchall and keep on in daemon or idle mode is a mistake!\n"));
1320 * If the user didn't set a last-resort user to get misaddressed
1321 * multidrop mail, set an appropriate default here.
1323 if (!run.postmaster)
1325 if (getuid() != ROOT_UID) /* ordinary user */
1326 run.postmaster = user;
1328 run.postmaster = "postmaster";
1331 return(implicitmode);
1334 static RETSIGTYPE terminate_poll(int sig)
1335 /* to be executed at the end of a poll cycle */
1339 report(stdout, GT_("terminated with signal %d\n"), sig);
1343 * Update UID information at end of each poll, rather than at end
1344 * of run, because that way we don't lose all UIDL information since
1345 * the beginning of time if fetchmail crashes.
1348 write_saved_lists(querylist, run.idfile);
1349 #endif /* POP3_ENABLE */
1352 static RETSIGTYPE terminate_run(int sig)
1353 /* to be executed on normal or signal-induced termination */
1357 terminate_poll(sig);
1360 * Craig Metz, the RFC1938 one-time-password guy, points out:
1361 * "Remember that most kernels don't zero pages before handing them to the
1362 * next process and many kernels share pages between user and kernel space.
1363 * You'd be very surprised what you can find from a short program to do a
1364 * malloc() and then dump the contents of the pages you got. By zeroing
1365 * the secrets at end of run (earlier if you can), you make sure the next
1366 * guy can't get the password/pass phrase."
1368 * Right you are, Craig!
1370 for (ctl = querylist; ctl; ctl = ctl->next)
1372 memset(ctl->password, '\0', strlen(ctl->password));
1374 #if !defined(HAVE_ATEXIT)
1378 if (activecount == 0)
1381 exit(successes ? PS_SUCCESS : querystatus);
1385 * Sequence of protocols to try when autoprobing, most capable to least.
1387 static const int autoprobe[] =
1391 #endif /* IMAP_ENABLE */
1394 #endif /* POP3_ENABLE */
1397 #endif /* POP2_ENABLE */
1400 static int query_host(struct query *ctl)
1401 /* perform fetch transaction with single host */
1407 * If we're syslogging the progress messages are automatically timestamped.
1408 * Force timestamping if we're going to a logfile.
1410 if (outlevel >= O_VERBOSE)
1412 report(stdout, GT_("%s querying %s (protocol %s) at %s: poll started\n"),
1414 ctl->server.pollname,
1415 showproto(ctl->server.protocol),
1419 switch (ctl->server.protocol) {
1421 for (i = 0; i < sizeof(autoprobe)/sizeof(autoprobe[0]); i++)
1423 ctl->server.protocol = autoprobe[i];
1425 st = query_host(ctl);
1428 if (st == PS_SUCCESS || st == PS_NOMAIL || st == PS_AUTHFAIL || st == PS_LOCKBUSY || st == PS_SMTP || st == PS_MAXFETCH || st == PS_DNS)
1431 ctl->server.protocol = P_AUTO;
1437 report(stderr, GT_("POP2 support is not configured.\n"));
1439 #endif /* POP2_ENABLE */
1447 } while (st == PS_REPOLL);
1449 report(stderr, GT_("POP3 support is not configured.\n"));
1451 #endif /* POP3_ENABLE */
1457 } while (st == PS_REPOLL);
1459 report(stderr, GT_("IMAP support is not configured.\n"));
1461 #endif /* IMAP_ENABLE */
1465 report(stderr, GT_("ETRN support is not configured.\n"));
1470 #endif /* ETRN_ENABLE */
1473 report(stderr, GT_("ODMR support is not configured.\n"));
1477 #endif /* ODMR_ENABLE */
1480 report(stderr, GT_("unsupported protocol selected.\n"));
1485 * If we're syslogging the progress messages are automatically timestamped.
1486 * Force timestamping if we're going to a logfile.
1488 if (outlevel >= O_VERBOSE)
1490 report(stdout, GT_("%s querying %s (protocol %s) at %s: poll completed\n"),
1492 ctl->server.pollname,
1493 showproto(ctl->server.protocol),
1500 static void dump_params (struct runctl *runp,
1501 struct query *querylist, flag implicit)
1502 /* display query parameters in English */
1506 if (runp->poll_interval)
1507 printf(GT_("Poll interval is %d seconds\n"), runp->poll_interval);
1509 printf(GT_("Logfile is %s\n"), runp->logfile);
1510 if (strcmp(runp->idfile, IDFILE_NAME))
1511 printf(GT_("Idfile is %s\n"), runp->idfile);
1512 #if defined(HAVE_SYSLOG)
1513 if (runp->use_syslog)
1514 printf(GT_("Progress messages will be logged via syslog\n"));
1516 if (runp->invisible)
1517 printf(GT_("Fetchmail will masquerade and will not generate Received\n"));
1519 printf(GT_("Fetchmail will show progress dots even in logfiles.\n"));
1520 if (runp->postmaster)
1521 printf(GT_("Fetchmail will forward misaddressed multidrop messages to %s.\n"),
1524 if (!runp->bouncemail)
1525 printf(GT_("Fetchmail will direct error mail to the postmaster.\n"));
1526 else if (outlevel >= O_VERBOSE)
1527 printf(GT_("Fetchmail will direct error mail to the sender.\n"));
1529 for (ctl = querylist; ctl; ctl = ctl->next)
1531 if (!ctl->active || (implicit && ctl->server.skip))
1534 printf(GT_("Options for retrieving from %s@%s:\n"),
1535 ctl->remotename, visbuf(ctl->server.pollname));
1537 if (ctl->server.via && MAILBOX_PROTOCOL(ctl))
1538 printf(GT_(" Mail will be retrieved via %s\n"), ctl->server.via);
1540 if (ctl->server.interval)
1541 printf(ngettext(" Poll of this server will occur every %d interval.\n",
1542 " Poll of this server will occur every %d intervals.\n",
1543 ctl->server.interval), ctl->server.interval);
1544 if (ctl->server.truename)
1545 printf(GT_(" True name of server is %s.\n"), ctl->server.truename);
1546 if (ctl->server.skip || outlevel >= O_VERBOSE)
1547 printf(ctl->server.skip
1548 ? GT_(" This host will not be queried when no host is specified.\n")
1549 : GT_(" This host will be queried when no host is specified.\n"));
1550 if (!NO_PASSWORD(ctl))
1553 printf(GT_(" Password will be prompted for.\n"));
1554 else if (outlevel >= O_VERBOSE)
1556 if (ctl->server.protocol == P_APOP)
1557 printf(GT_(" APOP secret = \"%s\".\n"),
1558 visbuf(ctl->password));
1559 else if (ctl->server.protocol == P_RPOP)
1560 printf(GT_(" RPOP id = \"%s\".\n"),
1561 visbuf(ctl->password));
1563 printf(GT_(" Password = \"%s\".\n"),
1564 visbuf(ctl->password));
1568 if (ctl->server.protocol == P_POP3
1569 && ctl->server.service && !strcmp(ctl->server.service, KPOP_PORT)
1570 && (ctl->server.authenticate == A_KERBEROS_V4 ||
1571 ctl->server.authenticate == A_KERBEROS_V5))
1572 printf(GT_(" Protocol is KPOP with Kerberos %s authentication"),
1573 ctl->server.authenticate == A_KERBEROS_V5 ? "V" : "IV");
1575 printf(GT_(" Protocol is %s"), showproto(ctl->server.protocol));
1576 if (ctl->server.service)
1577 printf(GT_(" (using service %s)"), ctl->server.service);
1578 else if (outlevel >= O_VERBOSE)
1579 printf(GT_(" (using default port)"));
1580 if (ctl->server.uidl && MAILBOX_PROTOCOL(ctl))
1581 printf(GT_(" (forcing UIDL use)"));
1584 switch (ctl->server.authenticate)
1587 printf(GT_(" All available authentication methods will be tried.\n"));
1590 printf(GT_(" Password authentication will be forced.\n"));
1593 printf(GT_(" MSN authentication will be forced.\n"));
1596 printf(GT_(" NTLM authentication will be forced.\n"));
1599 printf(GT_(" OTP authentication will be forced.\n"));
1602 printf(GT_(" CRAM-Md5 authentication will be forced.\n"));
1605 printf(GT_(" GSSAPI authentication will be forced.\n"));
1608 printf(GT_(" Kerberos V4 authentication will be forced.\n"));
1611 printf(GT_(" Kerberos V5 authentication will be forced.\n"));
1614 printf(GT_(" End-to-end encryption assumed.\n"));
1617 if (ctl->server.principal != (char *) NULL)
1618 printf(GT_(" Mail service principal is: %s\n"), ctl->server.principal);
1621 printf(GT_(" SSL encrypted sessions enabled.\n"));
1623 printf(GT_(" SSL protocol: %s.\n"), ctl->sslproto);
1624 if (ctl->sslcertck) {
1625 printf(GT_(" SSL server certificate checking enabled.\n"));
1626 if (ctl->sslcertpath != NULL)
1627 printf(GT_(" SSL trusted certificate directory: %s\n"), ctl->sslcertpath);
1629 if (ctl->sslfingerprint != NULL)
1630 printf(GT_(" SSL key fingerprint (checked against the server key): %s\n"), ctl->sslfingerprint);
1632 if (ctl->server.timeout > 0)
1633 printf(GT_(" Server nonresponse timeout is %d seconds"), ctl->server.timeout);
1634 if (ctl->server.timeout == CLIENT_TIMEOUT)
1635 printf(GT_(" (default).\n"));
1639 if (MAILBOX_PROTOCOL(ctl))
1641 if (!ctl->mailboxes->id)
1642 printf(GT_(" Default mailbox selected.\n"));
1647 printf(GT_(" Selected mailboxes are:"));
1648 for (idp = ctl->mailboxes; idp; idp = idp->next)
1649 printf(" %s", idp->id);
1652 printf(ctl->fetchall
1653 ? GT_(" All messages will be retrieved (--all on).\n")
1654 : GT_(" Only new messages will be retrieved (--all off).\n"));
1656 ? GT_(" Fetched messages will be kept on the server (--keep on).\n")
1657 : GT_(" Fetched messages will not be kept on the server (--keep off).\n"));
1659 ? GT_(" Old messages will be flushed before message retrieval (--flush on).\n")
1660 : GT_(" Old messages will not be flushed before message retrieval (--flush off).\n"));
1661 printf(ctl->limitflush
1662 ? GT_(" Oversized messages will be flushed before message retrieval (--limitflush on).\n")
1663 : GT_(" Oversized messages will not be flushed before message retrieval (--limitflush off).\n"));
1665 ? GT_(" Rewrite of server-local addresses is enabled (--norewrite off).\n")
1666 : GT_(" Rewrite of server-local addresses is disabled (--norewrite on).\n"));
1668 ? GT_(" Carriage-return stripping is enabled (stripcr on).\n")
1669 : GT_(" Carriage-return stripping is disabled (stripcr off).\n"));
1671 ? GT_(" Carriage-return forcing is enabled (forcecr on).\n")
1672 : GT_(" Carriage-return forcing is disabled (forcecr off).\n"));
1673 printf(ctl->pass8bits
1674 ? GT_(" Interpretation of Content-Transfer-Encoding is disabled (pass8bits on).\n")
1675 : GT_(" Interpretation of Content-Transfer-Encoding is enabled (pass8bits off).\n"));
1676 printf(ctl->mimedecode
1677 ? GT_(" MIME decoding is enabled (mimedecode on).\n")
1678 : GT_(" MIME decoding is disabled (mimedecode off).\n"));
1680 ? GT_(" Idle after poll is enabled (idle on).\n")
1681 : GT_(" Idle after poll is disabled (idle off).\n"));
1682 printf(ctl->dropstatus
1683 ? GT_(" Nonempty Status lines will be discarded (dropstatus on)\n")
1684 : GT_(" Nonempty Status lines will be kept (dropstatus off)\n"));
1685 printf(ctl->dropdelivered
1686 ? GT_(" Delivered-To lines will be discarded (dropdelivered on)\n")
1687 : GT_(" Delivered-To lines will be kept (dropdelivered off)\n"));
1688 if (NUM_NONZERO(ctl->limit))
1690 if (NUM_NONZERO(ctl->limit))
1691 printf(GT_(" Message size limit is %d octets (--limit %d).\n"),
1692 ctl->limit, ctl->limit);
1693 else if (outlevel >= O_VERBOSE)
1694 printf(GT_(" No message size limit (--limit 0).\n"));
1695 if (run.poll_interval > 0)
1696 printf(GT_(" Message size warning interval is %d seconds (--warnings %d).\n"),
1697 ctl->warnings, ctl->warnings);
1698 else if (outlevel >= O_VERBOSE)
1699 printf(GT_(" Size warnings on every poll (--warnings 0).\n"));
1701 if (NUM_NONZERO(ctl->fetchlimit))
1702 printf(GT_(" Received-message limit is %d (--fetchlimit %d).\n"),
1703 ctl->fetchlimit, ctl->fetchlimit);
1704 else if (outlevel >= O_VERBOSE)
1705 printf(GT_(" No received-message limit (--fetchlimit 0).\n"));
1706 if (NUM_NONZERO(ctl->fetchsizelimit))
1707 printf(GT_(" Fetch message size limit is %d (--fetchsizelimit %d).\n"),
1708 ctl->fetchsizelimit, ctl->fetchsizelimit);
1709 else if (outlevel >= O_VERBOSE)
1710 printf(GT_(" No fetch message size limit (--fetchsizelimit 0).\n"));
1711 if (NUM_NONZERO(ctl->fastuidl) && MAILBOX_PROTOCOL(ctl))
1713 if (ctl->fastuidl == 1)
1714 printf(GT_(" Do binary search of UIDs during each poll (--fastuidl 1).\n"));
1716 printf(GT_(" Do binary search of UIDs during %d out of %d polls (--fastuidl %d).\n"), ctl->fastuidl - 1, ctl->fastuidl, ctl->fastuidl);
1718 else if (outlevel >= O_VERBOSE)
1719 printf(GT_(" Do linear search of UIDs during each poll (--fastuidl 0).\n"));
1720 if (NUM_NONZERO(ctl->batchlimit))
1721 printf(GT_(" SMTP message batch limit is %d.\n"), ctl->batchlimit);
1722 else if (outlevel >= O_VERBOSE)
1723 printf(GT_(" No SMTP message batch limit (--batchlimit 0).\n"));
1724 if (MAILBOX_PROTOCOL(ctl))
1726 if (NUM_NONZERO(ctl->expunge))
1727 printf(GT_(" Deletion interval between expunges forced to %d (--expunge %d).\n"), ctl->expunge, ctl->expunge);
1728 else if (outlevel >= O_VERBOSE)
1729 printf(GT_(" No forced expunges (--expunge 0).\n"));
1732 else /* ODMR or ETRN */
1736 printf(GT_(" Domains for which mail will be fetched are:"));
1737 for (idp = ctl->domainlist; idp; idp = idp->next)
1739 printf(" %s", idp->id);
1740 if (!idp->val.status.mark)
1741 printf(GT_(" (default)"));
1746 printf(GT_(" Messages will be appended to %s as BSMTP\n"), visbuf(ctl->bsmtp));
1747 else if (ctl->mda && MAILBOX_PROTOCOL(ctl))
1748 printf(GT_(" Messages will be delivered with \"%s\".\n"), visbuf(ctl->mda));
1755 printf(GT_(" Messages will be %cMTP-forwarded to:"),
1757 for (idp = ctl->smtphunt; idp; idp = idp->next)
1759 printf(" %s", idp->id);
1760 if (!idp->val.status.mark)
1761 printf(GT_(" (default)"));
1765 if (ctl->smtpaddress)
1766 printf(GT_(" Host part of MAIL FROM line will be %s\n"),
1769 printf(GT_(" Address to be put in RCPT TO lines shipped to SMTP will be %s\n"),
1772 if (MAILBOX_PROTOCOL(ctl))
1774 if (ctl->antispam != (struct idlist *)NULL)
1778 printf(GT_(" Recognized listener spam block responses are:"));
1779 for (idp = ctl->antispam; idp; idp = idp->next)
1780 printf(" %d", idp->val.status.num);
1783 else if (outlevel >= O_VERBOSE)
1784 printf(GT_(" Spam-blocking disabled\n"));
1786 if (ctl->preconnect)
1787 printf(GT_(" Server connection will be brought up with \"%s\".\n"),
1788 visbuf(ctl->preconnect));
1789 else if (outlevel >= O_VERBOSE)
1790 printf(GT_(" No pre-connection command.\n"));
1791 if (ctl->postconnect)
1792 printf(GT_(" Server connection will be taken down with \"%s\".\n"),
1793 visbuf(ctl->postconnect));
1794 else if (outlevel >= O_VERBOSE)
1795 printf(GT_(" No post-connection command.\n"));
1796 if (MAILBOX_PROTOCOL(ctl)) {
1797 if (!ctl->localnames)
1798 printf(GT_(" No localnames declared for this host.\n"));
1804 for (idp = ctl->localnames; idp; idp = idp->next)
1807 if (count > 1 || ctl->wildcard)
1808 printf(GT_(" Multi-drop mode: "));
1810 printf(GT_(" Single-drop mode: "));
1812 printf(ngettext("%d local name recognized.\n", "%d local names recognized.\n", count), count);
1813 if (outlevel >= O_VERBOSE)
1815 for (idp = ctl->localnames; idp; idp = idp->next)
1817 printf("\t%s -> %s\n", idp->id, idp->val.id2);
1819 printf("\t%s\n", idp->id);
1821 fputs("\t*\n", stdout);
1824 if (count > 1 || ctl->wildcard)
1826 printf(ctl->server.dns
1827 ? GT_(" DNS lookup for multidrop addresses is enabled.\n")
1828 : GT_(" DNS lookup for multidrop addresses is disabled.\n"));
1829 if (ctl->server.dns)
1831 if (ctl->server.checkalias)
1832 printf(GT_(" Server aliases will be compared with multidrop addresses by IP address.\n"));
1834 printf(GT_(" Server aliases will be compared with multidrop addresses by name.\n"));
1836 if (ctl->server.envelope == STRING_DISABLED)
1837 printf(GT_(" Envelope-address routing is disabled\n"));
1840 printf(GT_(" Envelope header is assumed to be: %s\n"),
1841 ctl->server.envelope ? ctl->server.envelope : "Received");
1842 if (ctl->server.envskip || outlevel >= O_VERBOSE)
1843 printf(GT_(" Number of envelope headers to be skipped over: %d\n"),
1844 ctl->server.envskip);
1845 if (ctl->server.qvirtual)
1846 printf(GT_(" Prefix %s will be removed from user id\n"),
1847 ctl->server.qvirtual);
1848 else if (outlevel >= O_VERBOSE)
1849 printf(GT_(" No prefix stripping\n"));
1852 if (ctl->server.akalist)
1856 printf(GT_(" Predeclared mailserver aliases:"));
1857 for (idp = ctl->server.akalist; idp; idp = idp->next)
1858 printf(" %s", idp->id);
1861 if (ctl->server.localdomains)
1865 printf(GT_(" Local domains:"));
1866 for (idp = ctl->server.localdomains; idp; idp = idp->next)
1867 printf(" %s", idp->id);
1874 if (ctl->server.interface)
1875 printf(GT_(" Connection must be through interface %s.\n"), ctl->server.interface);
1876 else if (outlevel >= O_VERBOSE)
1877 printf(GT_(" No interface requirement specified.\n"));
1878 if (ctl->server.monitor)
1879 printf(GT_(" Polling loop will monitor %s.\n"), ctl->server.monitor);
1880 else if (outlevel >= O_VERBOSE)
1881 printf(GT_(" No monitor interface specified.\n"));
1884 if (ctl->server.plugin)
1885 printf(GT_(" Server connections will be made via plugin %s (--plugin %s).\n"), ctl->server.plugin, ctl->server.plugin);
1886 else if (outlevel >= O_VERBOSE)
1887 printf(GT_(" No plugin command specified.\n"));
1888 if (ctl->server.plugout)
1889 printf(GT_(" Listener connections will be made via plugout %s (--plugout %s).\n"), ctl->server.plugout, ctl->server.plugout);
1890 else if (outlevel >= O_VERBOSE)
1891 printf(GT_(" No plugout command specified.\n"));
1893 if (ctl->server.protocol > P_POP2 && MAILBOX_PROTOCOL(ctl))
1896 printf(GT_(" No UIDs saved from this host.\n"));
1902 for (idp = ctl->oldsaved; idp; idp = idp->next)
1905 printf(GT_(" %d UIDs saved.\n"), count);
1906 if (outlevel >= O_VERBOSE)
1907 for (idp = ctl->oldsaved; idp; idp = idp->next)
1908 printf("\t%s\n", idp->id);
1912 if (ctl->server.tracepolls)
1913 printf(GT_(" Poll trace information will be added to the Received header.\n"));
1914 else if (outlevel >= O_VERBOSE)
1915 printf(GT_(" No poll trace information will be added to the Received header.\n.\n"));
1917 if (ctl->properties)
1918 printf(GT_(" Pass-through properties \"%s\".\n"),
1919 visbuf(ctl->properties));
1923 /* fetchmail.c ends here */