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, Robert M. Funk, Graham Wilson\n"
139 "Copyright (C) 2005-2006 Sunil Shetye\n"
140 "Copyright (C) 2005-2007 Matthias Andree\n"
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"));
147 const char *iana_charset;
149 int main(int argc, char **argv)
152 int implicitmode = FALSE;
154 netrc_entry *netrc_list;
155 char *netrc_file, *tmpbuf;
159 #if defined(__FreeBSD__) && defined(__FreeBSD_USE_KVM)
163 envquery(argc, argv);
165 setlocale (LC_ALL, "");
166 bindtextdomain(PACKAGE, LOCALEDIR);
168 iana_charset = norm_charmap(nl_langinfo(CODESET)); /* normalize local
172 iana_charset = "US-ASCII";
176 report(stderr, GT_("WARNING: Running as root is discouraged.\n"));
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.
184 if (outlevel >= O_VERBOSE)
188 report(stdout, GT_("fetchmail: invoked with"));
189 for (i = 0; i < argc; i++)
190 report(stdout, " %s", argv[i]);
191 report(stdout, "\n");
194 #define IDFILE_NAME ".fetchids"
195 run.idfile = prependdir (IDFILE_NAME, fmhome);
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.
210 /* save the current directory */
211 if (getcwd (currentwd, sizeof (currentwd)) == NULL) {
212 report(stderr, GT_("could not get current working directory\n"));
220 i = parsecmdline(argc, argv, &cmd_run, &cmd_opts);
224 if (quitmode && quitind == argc)
230 const char *features =
233 #endif /* POP2_ENABLE */
236 #endif /* POP3_ENABLE */
239 #endif /* IMAP_ENABLE */
245 #endif /* RPA_ENABLE */
248 #endif /* NTLM_ENABLE */
251 #endif /* SDPS_ENABLE */
254 #endif /* ETRN_ENABLE */
257 #endif /* ODMR_ENABLE */
263 #endif /* OPIE_ENABLE */
264 #ifdef HAVE_PKG_hesiod
269 #endif /* HAVE_SOCKS */
272 #endif /* ENABLE_NLS */
275 #endif /* KERBEROS_V4 */
278 #endif /* KERBEROS_V5 */
280 printf(GT_("This is fetchmail release %s"), VERSION);
281 fputs(features, stdout);
283 printcopyright(stdout);
285 fputs("Fallback MDA: ", stdout);
287 fputs(FALLBACK_MDA, stdout);
289 fputs("(none)", stdout);
294 /* this is an attempt to help remote debugging */
298 /* avoid parsing the config file if all we're doing is killing a daemon */
300 implicitmode = load_params(argc, argv, optind);
302 #if defined(HAVE_SYSLOG)
303 /* logging should be set up early in case we were restarted from exec */
306 #if defined(LOG_MAIL)
307 openlog(program_name, LOG_PID, LOG_MAIL);
309 /* Assume BSD4.2 openlog with two arguments */
310 openlog(program_name, LOG_PID);
316 report_init((run.poll_interval == 0 || nodetach) && !run.logfile);
319 /* initialize UID handling */
323 if (!versioninfo && (st = prc_filecheck(run.idfile, !versioninfo)) != 0)
326 initialize_saved_lists(querylist, run.idfile);
328 #endif /* POP3_ENABLE */
330 /* construct the lockfile */
333 #ifdef HAVE_SETRLIMIT
335 * Before getting passwords, disable core dumps unless -v -d0 mode is on.
336 * Core dumps could otherwise contain passwords to be scavenged by a
339 if (outlevel < O_VERBOSE || run.poll_interval > 0)
341 struct rlimit corelimit;
342 corelimit.rlim_cur = 0;
343 corelimit.rlim_max = 0;
344 setrlimit(RLIMIT_CORE, &corelimit);
346 #endif /* HAVE_SETRLIMIT */
348 #define NETRC_FILE ".netrc"
349 /* parse the ~/.netrc file (if present) for future password lookups. */
350 netrc_file = prependdir (NETRC_FILE, home);
351 netrc_list = parse_netrc(netrc_file);
355 /* pick up passwords where we can */
356 for (ctl = querylist; ctl; ctl = ctl->next)
358 if (ctl->active && !(implicitmode && ctl->server.skip)&&!ctl->password)
360 if (NO_PASSWORD(ctl))
361 /* Server won't care what the password is, but there
362 must be some non-null string here. */
363 ctl->password = ctl->remotename;
368 /* look up the pollname and account in the .netrc file. */
369 p = search_netrc(netrc_list,
370 ctl->server.pollname, ctl->remotename);
371 /* if we find a matching entry with a password, use it */
372 if (p && p->password)
373 ctl->password = xstrdup(p->password);
375 /* otherwise try with "via" name if there is one */
376 else if (ctl->server.via)
378 p = search_netrc(netrc_list,
379 ctl->server.via, ctl->remotename);
380 if (p && p->password)
381 ctl->password = xstrdup(p->password);
387 free_netrc(netrc_list);
390 /* perhaps we just want to check options? */
393 int havercfile = access(rcfile, 0);
395 printf(GT_("Taking options from command line%s%s\n"),
396 havercfile ? "" : GT_(" and "),
397 havercfile ? "" : rcfile);
399 if (querylist == NULL)
401 GT_("No mailservers set up -- perhaps %s is missing?\n"),
404 dump_params(&run, querylist, implicitmode);
408 /* dump options as a Python dictionary, for configurator use */
411 dump_config(&run, querylist);
415 /* check for another fetchmail running concurrently */
416 pid = fm_lock_state();
418 pid = bkgd ? -pid : pid;
420 /* if no mail servers listed and nothing in background, we're done */
421 if (!quitonly && pid == 0 && querylist == NULL) {
422 (void)fputs(GT_("fetchmail: no mailservers have been specified.\n"),stderr);
426 /* perhaps user asked us to kill the other fetchmail */
429 if (pid == 0 || pid == getpid())
430 /* this test enables re-execing on a changed rcfile
431 * for pid == getpid() */
434 fprintf(stderr,GT_("fetchmail: no other fetchmail is running\n"));
438 else if (kill(pid, SIGTERM) < 0)
440 fprintf(stderr,GT_("fetchmail: error killing %s fetchmail at %d; bailing out.\n"),
441 bkgd ? GT_("background") : GT_("foreground"), pid);
448 if (outlevel > O_SILENT)
449 fprintf(stderr,GT_("fetchmail: %s fetchmail at %d killed.\n"),
450 bkgd ? GT_("background") : GT_("foreground"), pid);
451 /* We used to nuke the other process's lock here, with
452 * fm_lock_release(), which is broken. The other process
453 * needs to clear its lock by itself. */
457 /* wait for other process to exit */
458 maxwait = 10; /* seconds */
459 while (kill(pid, 0) == 0 && --maxwait >= 0) {
466 /* another fetchmail is running -- wake it up or die */
472 GT_("fetchmail: can't check mail while another fetchmail to same host is running.\n"));
475 else if (!implicitmode)
478 GT_("fetchmail: can't poll specified hosts with another fetchmail running at %d.\n"),
485 GT_("fetchmail: another foreground fetchmail is running at %d.\n"),
489 else if (getpid() == pid)
490 /* this test enables re-execing on a changed rcfile */
495 GT_("fetchmail: can't accept options while a background fetchmail is running.\n"));
498 else if (kill(pid, SIGUSR1) == 0)
501 GT_("fetchmail: background fetchmail at %d awakened.\n"),
508 * Should never happen -- possible only if a background fetchmail
509 * croaks after the first kill probe above but before the
510 * SIGUSR1/SIGHUP transmission.
513 GT_("fetchmail: elder sibling at %d died mysteriously.\n"),
515 return(PS_UNDEFINED);
519 /* pick up interactively any passwords we need but don't have */
520 for (ctl = querylist; ctl; ctl = ctl->next)
522 if (ctl->active && !(implicitmode && ctl->server.skip)
523 && !NO_PASSWORD(ctl) && !ctl->password)
528 GT_("fetchmail: can't find a password for %s@%s.\n"),
529 ctl->remotename, ctl->server.pollname);
532 const char* password_prompt = GT_("Enter password for %s@%s: ");
533 size_t pplen = strlen(password_prompt) + strlen(ctl->remotename) + strlen(ctl->server.pollname) + 1;
535 tmpbuf = xmalloc(pplen);
536 snprintf(tmpbuf, pplen, password_prompt,
537 ctl->remotename, ctl->server.pollname);
538 ctl->password = xstrdup((char *)fm_getpassword(tmpbuf));
545 * Time to initiate the SOCKS library (this is not mandatory: it just
546 * registers the correct application name for logging purpose. If you
547 * have some problem, comment out these lines).
550 SOCKSinit("fetchmail");
551 #endif /* HAVE_SOCKS */
553 /* avoid zombies from plugins */
556 if (run.logfile && run.use_syslog)
557 fprintf(stderr, GT_("fetchmail: Warning: syslog and logfile are set. Check both for logs!\n"));
560 * Maybe time to go to demon mode...
562 if (run.poll_interval)
567 rc = daemonize(run.logfile);
569 report(stderr, GT_("fetchmail: Cannot detach into background. Aborting.\n"));
573 report(stdout, GT_("starting fetchmail %s daemon \n"), VERSION);
576 * We'll set up a handler for these when we're sleeping,
577 * but ignore them otherwise so as not to interrupt a poll.
579 set_signal_handler(SIGUSR1, SIG_IGN);
580 if (run.poll_interval && getuid() == ROOT_UID)
581 set_signal_handler(SIGHUP, SIG_IGN);
585 /* not in daemon mode */
586 if (run.logfile && !nodetach && access(run.logfile, F_OK) == 0)
588 if (!freopen(run.logfile, "a", stdout))
589 report(stderr, GT_("could not open %s to append logs to \n"), run.logfile);
590 if (!freopen(run.logfile, "a", stderr))
591 report(stdout, GT_("could not open %s to append logs to \n"), run.logfile);
593 report(stdout, GT_("fetchmail: Warning: syslog and logfile are set. Check both for logs!\n"));
599 /* beyond here we don't want more than one fetchmail running per user */
601 set_signal_handler(SIGABRT, terminate_run);
602 set_signal_handler(SIGINT, terminate_run);
603 set_signal_handler(SIGTERM, terminate_run);
604 set_signal_handler(SIGALRM, terminate_run);
605 set_signal_handler(SIGPIPE, SIG_IGN);
606 set_signal_handler(SIGQUIT, terminate_run);
608 /* here's the exclusion lock */
612 * Query all hosts. If there's only one, the error return will
613 * reflect the status of that transaction.
617 * Check to see if the rcfile has been touched. If so,
618 * re-exec so the file will be reread. Doing it this way
619 * avoids all the complications of trying to deallocate the
620 * in-core control structures -- and the potential memory
625 if (strcmp(rcfile, "-") == 0) {
627 } else if (stat(rcfile, &rcstat) == -1) {
630 GT_("couldn't time-check %s (error %d)\n"),
633 else if (rcstat.st_mtime > parsetime)
635 report(stdout, GT_("restarting fetchmail (%s changed)\n"), rcfile);
638 /* restore the startup directory */
639 if (!currentwd[0] || chdir (currentwd) == -1)
640 report(stderr, GT_("attempt to re-exec may fail as directory has not been restored\n"));
644 * Matthias Andree: Isn't this prone to introduction of
645 * "false" programs by interfering with PATH? Those
646 * path-searching execs might not be the best ideas for
649 * Rob Funk: But is there any way for someone to modify
650 * the PATH variable of a running fetchmail? I don't know
653 * Dave's change makes fetchmail restart itself in exactly
654 * the way it was started from the shell (or shell script)
655 * in the first place. If you're concerned about PATH
656 * contamination, call fetchmail initially with a full
657 * path, and use Dave's patch.
659 * Not using a -p variant of exec means that the restart
660 * will break if both (a) the user depended on PATH to
661 * call fetchmail in the first place, and (b) the system
662 * doesn't save the whole path in argv[0] if the whole
663 * path wasn't used in the initial call. (If I recall
664 * correctly, Linux saves it but many other Unices don't.)
666 execvp(argv[0], argv);
667 report(stderr, GT_("attempt to re-exec fetchmail failed\n"));
670 #if defined(HAVE_RES_SEARCH) && defined(USE_TCPIP_FOR_DNS)
672 * This was an efficiency hack that backfired. The theory
673 * was that using TCP/IP for DNS queries would get us better
674 * reliability and shave off some per-UDP-packet costs.
675 * Unfortunately it interacted badly with diald, which effectively
676 * filters out DNS queries over TCP/IP for reasons having to do
677 * with some obscure Linux kernel problem involving bootstrapping of
678 * dynamically-addressed links. I don't understand this mess
679 * and don't want to, so it's "See ya!" to this hack.
681 sethostent(TRUE); /* use TCP/IP for mailserver queries */
682 #endif /* HAVE_RES_SEARCH */
684 #ifdef HAVE_RES_SEARCH
685 /* Boldly assume that we also have res_init() if we have
686 * res_search(), and call res_init() to re-read the resolv.conf
687 * file, so that we can pick up changes to that file that are
688 * written by dhpccd, dhclient, pppd, openvpn and similar. */
690 /* NOTE: This assumes that /etc/resolv.conf is written
691 * atomically (i. e. a temporary file is written, flushed and
692 * then renamed into place). To fix Debian Bug#389270. */
694 /* NOTE: If this leaks memory or doesn't re-read
695 * /etc/resolv.conf, we're in trouble. The res_init() interface
696 * is only lightly documented :-( */
702 for (ctl = querylist; ctl; ctl = ctl->next)
706 if (!(implicitmode && ctl->server.skip))
711 GT_("poll of %s skipped (failed authentication or too many timeouts)\n"),
712 ctl->server.pollname);
716 /* check skip interval first so that it counts all polls */
717 if (run.poll_interval && ctl->server.interval)
719 if (ctl->server.poll_count++ % ctl->server.interval)
721 if (outlevel >= O_VERBOSE)
723 GT_("interval not reached, not querying %s\n"),
724 ctl->server.pollname);
731 * Don't do monitoring if we were woken by a signal.
732 * Note that interface_approve() does its own error logging.
734 if (!interface_approve(&ctl->server, !lastsig))
736 #endif /* CAN_MONITOR */
738 dofastuidl = 0; /* this is reset in the driver if required */
740 querystatus = query_host(ctl);
742 if (NUM_NONZERO(ctl->fastuidl))
743 ctl->fastuidlcount = (ctl->fastuidlcount + 1) % ctl->fastuidl;
745 /* leave the UIDL state alone if there have been any errors */
747 ((querystatus==PS_SUCCESS) || (querystatus==PS_NOMAIL) || (querystatus==PS_MAXFETCH)))
750 uid_discard_new_list(ctl);
752 #endif /* POP3_ENABLE */
754 if (querystatus == PS_SUCCESS)
756 else if (!check_only &&
757 ((querystatus!=PS_NOMAIL) || (outlevel==O_DEBUG)))
761 report(stdout,GT_("Query status=0 (SUCCESS)\n"));break;
763 report(stdout,GT_("Query status=1 (NOMAIL)\n")); break;
765 report(stdout,GT_("Query status=2 (SOCKET)\n")); break;
767 report(stdout,GT_("Query status=3 (AUTHFAIL)\n"));break;
769 report(stdout,GT_("Query status=4 (PROTOCOL)\n"));break;
771 report(stdout,GT_("Query status=5 (SYNTAX)\n")); break;
773 report(stdout,GT_("Query status=6 (IOERR)\n")); break;
775 report(stdout,GT_("Query status=7 (ERROR)\n")); break;
777 report(stdout,GT_("Query status=8 (EXCLUDE)\n")); break;
779 report(stdout,GT_("Query status=9 (LOCKBUSY)\n"));break;
781 report(stdout,GT_("Query status=10 (SMTP)\n")); break;
783 report(stdout,GT_("Query status=11 (DNS)\n")); break;
785 report(stdout,GT_("Query status=12 (BSMTP)\n")); break;
787 report(stdout,GT_("Query status=13 (MAXFETCH)\n"));break;
789 report(stdout,GT_("Query status=%d\n"),querystatus);
794 if (ctl->server.monitor)
797 * Allow some time for the link to quiesce. One
798 * second is usually sufficient, three is safe.
799 * Note: this delay is important - don't remove!
802 interface_note_activity(&ctl->server);
804 #endif /* CAN_MONITOR */
808 #if defined(HAVE_RES_SEARCH) && defined(USE_TCPIP_FOR_DNS)
809 endhostent(); /* release TCP/IP connection to nameserver */
810 #endif /* HAVE_RES_SEARCH */
812 /* close connections cleanly */
816 * OK, we've polled. Now sleep.
818 if (run.poll_interval)
821 * Because passwords can expire, it may happen that *all*
822 * hosts are now out of the loop due to authfail
823 * conditions. If this happens daemon-mode fetchmail
824 * should softly and silently vanish away, rather than
825 * spinning uselessly.
829 for (ctl = querylist; ctl; ctl = ctl->next)
830 if (ctl->active && !(implicitmode && ctl->server.skip))
835 report(stderr, GT_("All connections are wedged. Exiting.\n"));
836 /* FIXME: someday, send notification mail */
840 if (outlevel > O_SILENT)
842 GT_("sleeping at %s for %d seconds\n"), timestamp(), run.poll_interval);
845 * With this simple hack, we make it possible for a foreground
846 * fetchmail to wake up one in daemon mode. What we want is the
847 * side effect of interrupting any sleep that may be going on,
848 * forcing fetchmail to re-poll its hosts. The second line is
849 * for people who think all system daemons wake up on SIGHUP.
851 set_signal_handler(SIGUSR1, donothing);
852 if (getuid() == ROOT_UID)
853 set_signal_handler(SIGHUP, donothing);
856 * OK, now pause until it's time for the next poll cycle.
857 * A nonzero return indicates we received a wakeup signal;
858 * unwedge all servers in case the problem has been
861 if ((lastsig = interruptible_idle(run.poll_interval)))
863 if (outlevel > O_SILENT)
864 #ifdef SYS_SIGLIST_DECLARED
866 GT_("awakened by %s\n"), sys_siglist[lastsig]);
869 GT_("awakened by signal %d\n"), lastsig);
871 for (ctl = querylist; ctl; ctl = ctl->next)
875 if (outlevel > O_SILENT)
876 report(stdout, GT_("awakened at %s\n"), timestamp());
881 if (outlevel >= O_VERBOSE)
882 report(stdout, GT_("normal termination, status %d\n"),
883 successes ? PS_SUCCESS : querystatus);
889 else if (querystatus)
892 /* in case we interrupted before a successful fetch */
896 static void list_merge(struct idlist **dstl, struct idlist **srcl, int force)
899 * If force is off, modify dstl fields only when they're empty (treat srcl
900 * as defaults). If force is on, modify each dstl field whenever scrcl
901 * is nonempty (treat srcl as an override).
903 if (force ? !!*srcl : !*dstl)
905 struct idlist *cpl = copy_str_list(*srcl);
907 append_str_list(dstl, &cpl);
911 static void optmerge(struct query *h2, struct query *h1, int force)
912 /* merge two options records */
914 list_merge(&h2->server.localdomains, &h1->server.localdomains, force);
915 list_merge(&h2->localnames, &h1->localnames, force);
916 list_merge(&h2->mailboxes, &h1->mailboxes, force);
917 list_merge(&h2->smtphunt, &h1->smtphunt, force);
918 list_merge(&h2->domainlist, &h1->domainlist, force);
919 list_merge(&h2->antispam, &h1->antispam, force);
921 #define FLAG_MERGE(fld) if (force ? !!h1->fld : !h2->fld) h2->fld = h1->fld
922 FLAG_MERGE(server.via);
923 FLAG_MERGE(server.protocol);
924 FLAG_MERGE(server.service);
925 FLAG_MERGE(server.interval);
926 FLAG_MERGE(server.authenticate);
927 FLAG_MERGE(server.timeout);
928 FLAG_MERGE(server.envelope);
929 FLAG_MERGE(server.envskip);
930 FLAG_MERGE(server.qvirtual);
931 FLAG_MERGE(server.skip);
932 FLAG_MERGE(server.dns);
933 FLAG_MERGE(server.checkalias);
934 FLAG_MERGE(server.uidl);
935 FLAG_MERGE(server.principal);
938 FLAG_MERGE(server.interface);
939 FLAG_MERGE(server.interface_pair);
940 FLAG_MERGE(server.monitor);
943 FLAG_MERGE(server.plugin);
944 FLAG_MERGE(server.plugout);
945 FLAG_MERGE(server.tracepolls);
947 FLAG_MERGE(wildcard);
948 FLAG_MERGE(remotename);
949 FLAG_MERGE(password);
952 FLAG_MERGE(listener);
953 FLAG_MERGE(smtpaddress);
954 FLAG_MERGE(smtpname);
955 FLAG_MERGE(preconnect);
956 FLAG_MERGE(postconnect);
960 FLAG_MERGE(limitflush);
961 FLAG_MERGE(fetchall);
965 FLAG_MERGE(pass8bits);
966 FLAG_MERGE(dropstatus);
967 FLAG_MERGE(dropdelivered);
968 FLAG_MERGE(mimedecode);
971 FLAG_MERGE(warnings);
972 FLAG_MERGE(fetchlimit);
973 FLAG_MERGE(fetchsizelimit);
974 FLAG_MERGE(fastuidl);
975 FLAG_MERGE(batchlimit);
980 FLAG_MERGE(sslproto);
981 FLAG_MERGE(sslcertck);
982 FLAG_MERGE(sslcertpath);
983 FLAG_MERGE(sslfingerprint);
987 FLAG_MERGE(properties);
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)
996 int implicitmode, st;
998 struct query def_opts, *ctl;
1002 run.bouncemail = TRUE;
1003 run.spambounce = FALSE; /* don't bounce back to innocent bystanders */
1005 memset(&def_opts, '\0', sizeof(struct query));
1006 def_opts.smtp_socket = -1;
1007 def_opts.smtpaddress = (char *)0;
1008 def_opts.smtpname = (char *)0;
1009 def_opts.server.protocol = P_AUTO;
1010 def_opts.server.timeout = CLIENT_TIMEOUT;
1011 def_opts.server.esmtp_name = user;
1012 def_opts.warnings = WARNING_INTERVAL;
1013 def_opts.remotename = user;
1014 def_opts.listener = SMTP_MODE;
1015 def_opts.fetchsizelimit = 100;
1016 def_opts.fastuidl = 4;
1018 /* get the location of rcfile */
1020 p = strrchr (rcfile, '/');
1021 if (p && (size_t)(p - rcfile) < sizeof (rcfiledir)) {
1022 *p = 0; /* replace '/' by '0' */
1023 strlcpy (rcfiledir, rcfile, sizeof(rcfiledir));
1024 *p = '/'; /* restore '/' */
1025 if (!rcfiledir[0]) /* "/.fetchmailrc" case */
1026 strcpy (rcfiledir, "/");
1029 /* note the parse time, so we can pick up on modifications */
1030 parsetime = 0; /* foil compiler warnings */
1031 if (strcmp(rcfile, "-") == 0 || stat(rcfile, &rcstat) != -1)
1032 parsetime = rcstat.st_mtime;
1033 else if (errno != ENOENT)
1034 report(stderr, GT_("couldn't time-check the run-control file\n"));
1036 /* this builds the host list */
1037 if ((st = prc_parse_file(rcfile, !versioninfo)) != 0)
1039 * FIXME: someday, send notification mail here if backgrounded.
1040 * Right now, that can happen if the user changes the rcfile
1041 * while the fetchmail is running in background. Do similarly
1042 * for the other exit() calls in this function.
1046 if ((implicitmode = (optind >= argc)))
1048 for (ctl = querylist; ctl; ctl = ctl->next)
1049 ctl->active = !ctl->server.skip;
1052 for (; optind < argc; optind++)
1054 flag predeclared = FALSE;
1057 * If hostname corresponds to a host known from the rc file,
1058 * simply declare it active. Otherwise synthesize a host
1059 * record from command line and defaults
1061 for (ctl = querylist; ctl; ctl = ctl->next)
1062 if (!strcmp(ctl->server.pollname, argv[optind])
1063 || str_in_list(&ctl->server.akalist, argv[optind], TRUE))
1065 /* Is this correct? */
1066 if (predeclared && outlevel >= O_VERBOSE)
1067 fprintf(stderr,GT_("Warning: multiple mentions of host %s in config file\n"),argv[optind]);
1075 * Allocate and link record without copying in
1076 * command-line args; we'll do that with the optmerge
1079 ctl = hostalloc((struct query *)NULL);
1081 ctl->server.pollname = xstrdup(argv[optind]);
1083 ctl->server.lead_server = (struct hostdata *)NULL;
1088 * If there's a defaults record, merge it and lose it.
1090 if (querylist && strcmp(querylist->server.pollname, "defaults") == 0)
1092 for (ctl = querylist->next; ctl; ctl = ctl->next)
1093 optmerge(ctl, querylist, FALSE);
1094 querylist = querylist->next;
1097 /* don't allow a defaults record after the first */
1098 for (ctl = querylist; ctl; ctl = ctl->next) {
1099 if (ctl != querylist && strcmp(ctl->server.pollname, "defaults") == 0) {
1100 fprintf(stderr, GT_("fetchmail: Error: multiple \"defaults\" records in config file.\n"));
1105 /* use localhost if we never fetch the FQDN of this host */
1106 fetchmailhost = "localhost";
1108 /* here's where we override globals */
1109 if (cmd_run.logfile)
1110 run.logfile = cmd_run.logfile;
1112 run.idfile = cmd_run.idfile;
1113 if (cmd_run.pidfile)
1114 run.pidfile = cmd_run.pidfile;
1115 /* do this before the keep/fetchall test below, otherwise -d0 may fail */
1116 if (cmd_run.poll_interval >= 0)
1117 run.poll_interval = cmd_run.poll_interval;
1118 if (cmd_run.invisible)
1119 run.invisible = cmd_run.invisible;
1120 if (cmd_run.showdots)
1121 run.showdots = cmd_run.showdots;
1122 if (cmd_run.use_syslog)
1123 run.use_syslog = (cmd_run.use_syslog == FLAG_TRUE);
1124 if (cmd_run.postmaster)
1125 run.postmaster = cmd_run.postmaster;
1126 if (cmd_run.bouncemail)
1127 run.bouncemail = cmd_run.bouncemail;
1129 /* check and daemon options are not compatible */
1130 if (check_only && run.poll_interval)
1131 run.poll_interval = 0;
1134 * DNS support is required for some protocols. We used to
1135 * do this unconditionally, but it made fetchmail excessively
1136 * vulnerable to misconfigured DNS setups.
1138 * If we're using ETRN or ODMR, the smtp hunt list is the
1139 * list of systems we're polling on behalf of; these have
1140 * to be fully-qualified domain names. The default for
1141 * this list should be the FQDN of localhost.
1143 * If we're using Kerberos for authentication, we need
1144 * the FQDN in order to generate capability keys.
1146 for (ctl = querylist; ctl; ctl = ctl->next)
1148 (ctl->server.protocol==P_ETRN || ctl->server.protocol==P_ODMR
1149 || ctl->server.authenticate == A_KERBEROS_V4
1150 || ctl->server.authenticate == A_KERBEROS_V5))
1152 fetchmailhost = host_fqdn(1);
1156 if (!ctl) /* list exhausted */
1157 fetchmailhost = host_fqdn(0);
1159 /* this code enables flags to be turned off */
1160 #define DEFAULT(flag, dflt) if (flag == FLAG_TRUE)\
1162 else if (flag == FLAG_FALSE)\
1166 /* one global gets treated specially */
1167 DEFAULT(run.showdots, run.poll_interval==0 || nodetach);
1169 /* merge in wired defaults, do sanity checks and prepare internal fields */
1170 for (ctl = querylist; ctl; ctl = ctl->next)
1172 ctl->wedged = FALSE;
1174 /* merge in defaults */
1175 optmerge(ctl, &def_opts, FALSE);
1177 /* force command-line options */
1178 optmerge(ctl, &cmd_opts, TRUE);
1181 * queryname has to be set up for inactive servers too.
1182 * Otherwise the UIDL code core-dumps on startup.
1184 if (ctl->server.via)
1185 ctl->server.queryname = xstrdup(ctl->server.via);
1187 ctl->server.queryname = xstrdup(ctl->server.pollname);
1190 * We no longer do DNS lookups at startup.
1191 * This is a kluge. It enables users to edit their
1192 * configurations when DNS isn't available.
1194 ctl->server.truename = xstrdup(ctl->server.queryname);
1196 if (configdump || ctl->active )
1198 DEFAULT(ctl->keep, FALSE);
1199 DEFAULT(ctl->fetchall, FALSE);
1200 DEFAULT(ctl->flush, FALSE);
1201 DEFAULT(ctl->limitflush, FALSE);
1202 DEFAULT(ctl->rewrite, TRUE);
1203 DEFAULT(ctl->stripcr, (ctl->mda != (char *)NULL));
1204 DEFAULT(ctl->forcecr, FALSE);
1205 DEFAULT(ctl->pass8bits, FALSE);
1206 DEFAULT(ctl->dropstatus, FALSE);
1207 DEFAULT(ctl->dropdelivered, FALSE);
1208 DEFAULT(ctl->mimedecode, FALSE);
1209 DEFAULT(ctl->idle, FALSE);
1210 DEFAULT(ctl->server.dns, TRUE);
1211 DEFAULT(ctl->server.uidl, FALSE);
1212 DEFAULT(ctl->use_ssl, FALSE);
1213 DEFAULT(ctl->sslcertck, FALSE);
1214 DEFAULT(ctl->server.checkalias, FALSE);
1217 * XXX FIXME: do we need this check or can we rely on the .y
1218 * parser handling this?
1222 report(stderr, GT_("SSL support is not compiled in.\n"));
1225 #endif /* SSL_ENABLE */
1228 if (ctl->server.authenticate == A_KERBEROS_V4) {
1229 report(stderr, GT_("KERBEROS v4 support is configured, but not compiled in.\n"));
1234 if (ctl->server.authenticate == A_KERBEROS_V5) {
1235 report(stderr, GT_("KERBEROS v5 support is configured, but not compiled in.\n"));
1240 if (ctl->server.authenticate == A_GSSAPI) {
1241 report(stderr, GT_("GSSAPI support is configured, but not compiled in.\n"));
1247 * Make sure we have a nonempty host list to forward to.
1250 save_str(&ctl->smtphunt, "localhost", FALSE);
1253 * Make sure we have a nonempty list of domains to fetch from.
1255 if ((ctl->server.protocol==P_ETRN || ctl->server.protocol==P_ODMR) && !ctl->domainlist)
1256 save_str(&ctl->domainlist, fetchmailhost, FALSE);
1258 /* if `user' doesn't name a real local user, try to run as root */
1259 if ((pw = getpwnam(user)) == (struct passwd *)NULL)
1262 ctl->uid = pw->pw_uid; /* for local delivery via MDA */
1263 if (!ctl->localnames) /* for local delivery via SMTP */
1264 save_str_pair(&ctl->localnames, user, NULL);
1266 #ifndef HAVE_RES_SEARCH
1267 /* can't handle multidrop mailboxes unless we can do DNS lookups */
1268 if (MULTIDROP(ctl) && ctl->server.dns)
1270 ctl->server.dns = FALSE;
1271 report(stderr, GT_("fetchmail: warning: no DNS available to check multidrop fetches from %s\n"), ctl->server.pollname);
1273 #endif /* !HAVE_RES_SEARCH */
1276 * can't handle multidrop mailboxes without "envelope"
1277 * option, this causes truckloads full of support complaints
1278 * "all mail forwarded to postmaster"
1280 if (MULTIDROP(ctl) && !ctl->server.envelope)
1282 report(stderr, GT_("warning: multidrop for %s requires envelope option!\n"), ctl->server.pollname);
1283 report(stderr, GT_("warning: Do not ask for support if all mail goes to postmaster!\n"));
1286 /* if no folders were specified, set up the null one as default */
1287 if (!ctl->mailboxes)
1288 save_str(&ctl->mailboxes, (char *)NULL, 0);
1290 /* maybe user overrode timeout on command line? */
1291 if (ctl->server.timeout == -1)
1292 ctl->server.timeout = CLIENT_TIMEOUT;
1295 if (ctl->server.service) {
1296 int port = servport(ctl->server.service);
1299 (void) fprintf(stderr,
1300 GT_("fetchmail: %s configuration invalid, specify positive port number for service or port\n"),
1301 ctl->server.pollname);
1304 if (ctl->server.protocol == P_RPOP && port >= 1024)
1306 (void) fprintf(stderr,
1307 GT_("fetchmail: %s configuration invalid, RPOP requires a privileged port\n"),
1308 ctl->server.pollname);
1312 if (ctl->listener == LMTP_MODE)
1316 for (idp = ctl->smtphunt; idp; idp = idp->next)
1320 if (!(cp = strrchr(idp->id, '/'))
1321 || (0 == strcmp(cp + 1, SMTP_PORT))
1322 || servport(cp + 1) == SMTP_PORT_NUM)
1324 (void) fprintf(stderr,
1325 GT_("%s configuration invalid, LMTP can't use default SMTP port\n"),
1326 ctl->server.pollname);
1333 * "I beg to you, have mercy on the we[a]k minds like myself."
1334 * wrote Pehr Anderson. Your petition is granted.
1336 if (ctl->fetchall && ctl->keep && (run.poll_interval || ctl->idle) && !nodetach && !configdump)
1338 (void) fprintf(stderr,
1339 GT_("Both fetchall and keep on in daemon or idle mode is a mistake!\n"));
1345 * If the user didn't set a last-resort user to get misaddressed
1346 * multidrop mail, set an appropriate default here.
1348 if (!run.postmaster)
1350 if (getuid() != ROOT_UID) /* ordinary user */
1351 run.postmaster = user;
1353 run.postmaster = "postmaster";
1356 return(implicitmode);
1359 static RETSIGTYPE terminate_poll(int sig)
1360 /* to be executed at the end of a poll cycle */
1364 report(stdout, GT_("terminated with signal %d\n"), sig);
1368 * Update UID information at end of each poll, rather than at end
1369 * of run, because that way we don't lose all UIDL information since
1370 * the beginning of time if fetchmail crashes.
1373 write_saved_lists(querylist, run.idfile);
1374 #endif /* POP3_ENABLE */
1377 static RETSIGTYPE terminate_run(int sig)
1378 /* to be executed on normal or signal-induced termination */
1382 terminate_poll(sig);
1385 * Craig Metz, the RFC1938 one-time-password guy, points out:
1386 * "Remember that most kernels don't zero pages before handing them to the
1387 * next process and many kernels share pages between user and kernel space.
1388 * You'd be very surprised what you can find from a short program to do a
1389 * malloc() and then dump the contents of the pages you got. By zeroing
1390 * the secrets at end of run (earlier if you can), you make sure the next
1391 * guy can't get the password/pass phrase."
1393 * Right you are, Craig!
1395 for (ctl = querylist; ctl; ctl = ctl->next)
1397 memset(ctl->password, '\0', strlen(ctl->password));
1399 #if !defined(HAVE_ATEXIT)
1403 if (activecount == 0)
1406 exit(successes ? PS_SUCCESS : querystatus);
1410 * Sequence of protocols to try when autoprobing, most capable to least.
1412 static const int autoprobe[] =
1416 #endif /* IMAP_ENABLE */
1419 #endif /* POP3_ENABLE */
1422 #endif /* POP2_ENABLE */
1425 static int query_host(struct query *ctl)
1426 /* perform fetch transaction with single host */
1432 * If we're syslogging the progress messages are automatically timestamped.
1433 * Force timestamping if we're going to a logfile.
1435 if (outlevel >= O_VERBOSE)
1437 report(stdout, GT_("%s querying %s (protocol %s) at %s: poll started\n"),
1439 ctl->server.pollname,
1440 showproto(ctl->server.protocol),
1444 switch (ctl->server.protocol) {
1446 for (i = 0; i < sizeof(autoprobe)/sizeof(autoprobe[0]); i++)
1448 ctl->server.protocol = autoprobe[i];
1450 st = query_host(ctl);
1453 if (st == PS_SUCCESS || st == PS_NOMAIL || st == PS_AUTHFAIL || st == PS_LOCKBUSY || st == PS_SMTP || st == PS_MAXFETCH || st == PS_DNS)
1456 ctl->server.protocol = P_AUTO;
1462 report(stderr, GT_("POP2 support is not configured.\n"));
1464 #endif /* POP2_ENABLE */
1472 } while (st == PS_REPOLL);
1474 report(stderr, GT_("POP3 support is not configured.\n"));
1476 #endif /* POP3_ENABLE */
1482 } while (st == PS_REPOLL);
1484 report(stderr, GT_("IMAP support is not configured.\n"));
1486 #endif /* IMAP_ENABLE */
1490 report(stderr, GT_("ETRN support is not configured.\n"));
1495 #endif /* ETRN_ENABLE */
1498 report(stderr, GT_("ODMR support is not configured.\n"));
1502 #endif /* ODMR_ENABLE */
1505 report(stderr, GT_("unsupported protocol selected.\n"));
1510 * If we're syslogging the progress messages are automatically timestamped.
1511 * Force timestamping if we're going to a logfile.
1513 if (outlevel >= O_VERBOSE)
1515 report(stdout, GT_("%s querying %s (protocol %s) at %s: poll completed\n"),
1517 ctl->server.pollname,
1518 showproto(ctl->server.protocol),
1525 static void dump_params (struct runctl *runp,
1526 struct query *querylist, flag implicit)
1527 /* display query parameters in English */
1531 if (runp->poll_interval)
1532 printf(GT_("Poll interval is %d seconds\n"), runp->poll_interval);
1534 printf(GT_("Logfile is %s\n"), runp->logfile);
1535 if (strcmp(runp->idfile, IDFILE_NAME))
1536 printf(GT_("Idfile is %s\n"), runp->idfile);
1537 #if defined(HAVE_SYSLOG)
1538 if (runp->use_syslog)
1539 printf(GT_("Progress messages will be logged via syslog\n"));
1541 if (runp->invisible)
1542 printf(GT_("Fetchmail will masquerade and will not generate Received\n"));
1544 printf(GT_("Fetchmail will show progress dots even in logfiles.\n"));
1545 if (runp->postmaster)
1546 printf(GT_("Fetchmail will forward misaddressed multidrop messages to %s.\n"),
1549 if (!runp->bouncemail)
1550 printf(GT_("Fetchmail will direct error mail to the postmaster.\n"));
1551 else if (outlevel >= O_VERBOSE)
1552 printf(GT_("Fetchmail will direct error mail to the sender.\n"));
1554 for (ctl = querylist; ctl; ctl = ctl->next)
1556 if (!ctl->active || (implicit && ctl->server.skip))
1559 printf(GT_("Options for retrieving from %s@%s:\n"),
1560 ctl->remotename, visbuf(ctl->server.pollname));
1562 if (ctl->server.via && MAILBOX_PROTOCOL(ctl))
1563 printf(GT_(" Mail will be retrieved via %s\n"), ctl->server.via);
1565 if (ctl->server.interval)
1566 printf(ngettext(" Poll of this server will occur every %d interval.\n",
1567 " Poll of this server will occur every %d intervals.\n",
1568 ctl->server.interval), ctl->server.interval);
1569 if (ctl->server.truename)
1570 printf(GT_(" True name of server is %s.\n"), ctl->server.truename);
1571 if (ctl->server.skip || outlevel >= O_VERBOSE)
1572 printf(ctl->server.skip
1573 ? GT_(" This host will not be queried when no host is specified.\n")
1574 : GT_(" This host will be queried when no host is specified.\n"));
1575 if (!NO_PASSWORD(ctl))
1578 printf(GT_(" Password will be prompted for.\n"));
1579 else if (outlevel >= O_VERBOSE)
1581 if (ctl->server.protocol == P_APOP)
1582 printf(GT_(" APOP secret = \"%s\".\n"),
1583 visbuf(ctl->password));
1584 else if (ctl->server.protocol == P_RPOP)
1585 printf(GT_(" RPOP id = \"%s\".\n"),
1586 visbuf(ctl->password));
1588 printf(GT_(" Password = \"%s\".\n"),
1589 visbuf(ctl->password));
1593 if (ctl->server.protocol == P_POP3
1594 && ctl->server.service && !strcmp(ctl->server.service, KPOP_PORT)
1595 && (ctl->server.authenticate == A_KERBEROS_V4 ||
1596 ctl->server.authenticate == A_KERBEROS_V5))
1597 printf(GT_(" Protocol is KPOP with Kerberos %s authentication"),
1598 ctl->server.authenticate == A_KERBEROS_V5 ? "V" : "IV");
1600 printf(GT_(" Protocol is %s"), showproto(ctl->server.protocol));
1601 if (ctl->server.service)
1602 printf(GT_(" (using service %s)"), ctl->server.service);
1603 else if (outlevel >= O_VERBOSE)
1604 printf(GT_(" (using default port)"));
1605 if (ctl->server.uidl && MAILBOX_PROTOCOL(ctl))
1606 printf(GT_(" (forcing UIDL use)"));
1609 switch (ctl->server.authenticate)
1612 printf(GT_(" All available authentication methods will be tried.\n"));
1615 printf(GT_(" Password authentication will be forced.\n"));
1618 printf(GT_(" MSN authentication will be forced.\n"));
1621 printf(GT_(" NTLM authentication will be forced.\n"));
1624 printf(GT_(" OTP authentication will be forced.\n"));
1627 printf(GT_(" CRAM-Md5 authentication will be forced.\n"));
1630 printf(GT_(" GSSAPI authentication will be forced.\n"));
1633 printf(GT_(" Kerberos V4 authentication will be forced.\n"));
1636 printf(GT_(" Kerberos V5 authentication will be forced.\n"));
1639 printf(GT_(" End-to-end encryption assumed.\n"));
1642 if (ctl->server.principal != (char *) NULL)
1643 printf(GT_(" Mail service principal is: %s\n"), ctl->server.principal);
1646 printf(GT_(" SSL encrypted sessions enabled.\n"));
1648 printf(GT_(" SSL protocol: %s.\n"), ctl->sslproto);
1649 if (ctl->sslcertck) {
1650 printf(GT_(" SSL server certificate checking enabled.\n"));
1651 if (ctl->sslcertpath != NULL)
1652 printf(GT_(" SSL trusted certificate directory: %s\n"), ctl->sslcertpath);
1654 if (ctl->sslfingerprint != NULL)
1655 printf(GT_(" SSL key fingerprint (checked against the server key): %s\n"), ctl->sslfingerprint);
1657 if (ctl->server.timeout > 0)
1658 printf(GT_(" Server nonresponse timeout is %d seconds"), ctl->server.timeout);
1659 if (ctl->server.timeout == CLIENT_TIMEOUT)
1660 printf(GT_(" (default).\n"));
1664 if (MAILBOX_PROTOCOL(ctl))
1666 if (!ctl->mailboxes->id)
1667 printf(GT_(" Default mailbox selected.\n"));
1672 printf(GT_(" Selected mailboxes are:"));
1673 for (idp = ctl->mailboxes; idp; idp = idp->next)
1674 printf(" %s", idp->id);
1677 printf(ctl->fetchall
1678 ? GT_(" All messages will be retrieved (--all on).\n")
1679 : GT_(" Only new messages will be retrieved (--all off).\n"));
1681 ? GT_(" Fetched messages will be kept on the server (--keep on).\n")
1682 : GT_(" Fetched messages will not be kept on the server (--keep off).\n"));
1684 ? GT_(" Old messages will be flushed before message retrieval (--flush on).\n")
1685 : GT_(" Old messages will not be flushed before message retrieval (--flush off).\n"));
1686 printf(ctl->limitflush
1687 ? GT_(" Oversized messages will be flushed before message retrieval (--limitflush on).\n")
1688 : GT_(" Oversized messages will not be flushed before message retrieval (--limitflush off).\n"));
1690 ? GT_(" Rewrite of server-local addresses is enabled (--norewrite off).\n")
1691 : GT_(" Rewrite of server-local addresses is disabled (--norewrite on).\n"));
1693 ? GT_(" Carriage-return stripping is enabled (stripcr on).\n")
1694 : GT_(" Carriage-return stripping is disabled (stripcr off).\n"));
1696 ? GT_(" Carriage-return forcing is enabled (forcecr on).\n")
1697 : GT_(" Carriage-return forcing is disabled (forcecr off).\n"));
1698 printf(ctl->pass8bits
1699 ? GT_(" Interpretation of Content-Transfer-Encoding is disabled (pass8bits on).\n")
1700 : GT_(" Interpretation of Content-Transfer-Encoding is enabled (pass8bits off).\n"));
1701 printf(ctl->mimedecode
1702 ? GT_(" MIME decoding is enabled (mimedecode on).\n")
1703 : GT_(" MIME decoding is disabled (mimedecode off).\n"));
1705 ? GT_(" Idle after poll is enabled (idle on).\n")
1706 : GT_(" Idle after poll is disabled (idle off).\n"));
1707 printf(ctl->dropstatus
1708 ? GT_(" Nonempty Status lines will be discarded (dropstatus on)\n")
1709 : GT_(" Nonempty Status lines will be kept (dropstatus off)\n"));
1710 printf(ctl->dropdelivered
1711 ? GT_(" Delivered-To lines will be discarded (dropdelivered on)\n")
1712 : GT_(" Delivered-To lines will be kept (dropdelivered off)\n"));
1713 if (NUM_NONZERO(ctl->limit))
1715 if (NUM_NONZERO(ctl->limit))
1716 printf(GT_(" Message size limit is %d octets (--limit %d).\n"),
1717 ctl->limit, ctl->limit);
1718 else if (outlevel >= O_VERBOSE)
1719 printf(GT_(" No message size limit (--limit 0).\n"));
1720 if (run.poll_interval > 0)
1721 printf(GT_(" Message size warning interval is %d seconds (--warnings %d).\n"),
1722 ctl->warnings, ctl->warnings);
1723 else if (outlevel >= O_VERBOSE)
1724 printf(GT_(" Size warnings on every poll (--warnings 0).\n"));
1726 if (NUM_NONZERO(ctl->fetchlimit))
1727 printf(GT_(" Received-message limit is %d (--fetchlimit %d).\n"),
1728 ctl->fetchlimit, ctl->fetchlimit);
1729 else if (outlevel >= O_VERBOSE)
1730 printf(GT_(" No received-message limit (--fetchlimit 0).\n"));
1731 if (NUM_NONZERO(ctl->fetchsizelimit))
1732 printf(GT_(" Fetch message size limit is %d (--fetchsizelimit %d).\n"),
1733 ctl->fetchsizelimit, ctl->fetchsizelimit);
1734 else if (outlevel >= O_VERBOSE)
1735 printf(GT_(" No fetch message size limit (--fetchsizelimit 0).\n"));
1736 if (NUM_NONZERO(ctl->fastuidl) && MAILBOX_PROTOCOL(ctl))
1738 if (ctl->fastuidl == 1)
1739 printf(GT_(" Do binary search of UIDs during each poll (--fastuidl 1).\n"));
1741 printf(GT_(" Do binary search of UIDs during %d out of %d polls (--fastuidl %d).\n"), ctl->fastuidl - 1, ctl->fastuidl, ctl->fastuidl);
1743 else if (outlevel >= O_VERBOSE)
1744 printf(GT_(" Do linear search of UIDs during each poll (--fastuidl 0).\n"));
1745 if (NUM_NONZERO(ctl->batchlimit))
1746 printf(GT_(" SMTP message batch limit is %d.\n"), ctl->batchlimit);
1747 else if (outlevel >= O_VERBOSE)
1748 printf(GT_(" No SMTP message batch limit (--batchlimit 0).\n"));
1749 if (MAILBOX_PROTOCOL(ctl))
1751 if (NUM_NONZERO(ctl->expunge))
1752 printf(GT_(" Deletion interval between expunges forced to %d (--expunge %d).\n"), ctl->expunge, ctl->expunge);
1753 else if (outlevel >= O_VERBOSE)
1754 printf(GT_(" No forced expunges (--expunge 0).\n"));
1757 else /* ODMR or ETRN */
1761 printf(GT_(" Domains for which mail will be fetched are:"));
1762 for (idp = ctl->domainlist; idp; idp = idp->next)
1764 printf(" %s", idp->id);
1765 if (!idp->val.status.mark)
1766 printf(GT_(" (default)"));
1771 printf(GT_(" Messages will be appended to %s as BSMTP\n"), visbuf(ctl->bsmtp));
1772 else if (ctl->mda && MAILBOX_PROTOCOL(ctl))
1773 printf(GT_(" Messages will be delivered with \"%s\".\n"), visbuf(ctl->mda));
1780 printf(GT_(" Messages will be %cMTP-forwarded to:"),
1782 for (idp = ctl->smtphunt; idp; idp = idp->next)
1784 printf(" %s", idp->id);
1785 if (!idp->val.status.mark)
1786 printf(GT_(" (default)"));
1790 if (ctl->smtpaddress)
1791 printf(GT_(" Host part of MAIL FROM line will be %s\n"),
1794 printf(GT_(" Address to be put in RCPT TO lines shipped to SMTP will be %s\n"),
1797 if (MAILBOX_PROTOCOL(ctl))
1799 if (ctl->antispam != (struct idlist *)NULL)
1803 printf(GT_(" Recognized listener spam block responses are:"));
1804 for (idp = ctl->antispam; idp; idp = idp->next)
1805 printf(" %d", idp->val.status.num);
1808 else if (outlevel >= O_VERBOSE)
1809 printf(GT_(" Spam-blocking disabled\n"));
1811 if (ctl->preconnect)
1812 printf(GT_(" Server connection will be brought up with \"%s\".\n"),
1813 visbuf(ctl->preconnect));
1814 else if (outlevel >= O_VERBOSE)
1815 printf(GT_(" No pre-connection command.\n"));
1816 if (ctl->postconnect)
1817 printf(GT_(" Server connection will be taken down with \"%s\".\n"),
1818 visbuf(ctl->postconnect));
1819 else if (outlevel >= O_VERBOSE)
1820 printf(GT_(" No post-connection command.\n"));
1821 if (MAILBOX_PROTOCOL(ctl)) {
1822 if (!ctl->localnames)
1823 printf(GT_(" No localnames declared for this host.\n"));
1829 for (idp = ctl->localnames; idp; idp = idp->next)
1832 if (count > 1 || ctl->wildcard)
1833 printf(GT_(" Multi-drop mode: "));
1835 printf(GT_(" Single-drop mode: "));
1837 printf(ngettext("%d local name recognized.\n", "%d local names recognized.\n", count), count);
1838 if (outlevel >= O_VERBOSE)
1840 for (idp = ctl->localnames; idp; idp = idp->next)
1842 printf("\t%s -> %s\n", idp->id, idp->val.id2);
1844 printf("\t%s\n", idp->id);
1846 fputs("\t*\n", stdout);
1849 if (count > 1 || ctl->wildcard)
1851 printf(ctl->server.dns
1852 ? GT_(" DNS lookup for multidrop addresses is enabled.\n")
1853 : GT_(" DNS lookup for multidrop addresses is disabled.\n"));
1854 if (ctl->server.dns)
1856 if (ctl->server.checkalias)
1857 printf(GT_(" Server aliases will be compared with multidrop addresses by IP address.\n"));
1859 printf(GT_(" Server aliases will be compared with multidrop addresses by name.\n"));
1861 if (ctl->server.envelope == STRING_DISABLED)
1862 printf(GT_(" Envelope-address routing is disabled\n"));
1865 printf(GT_(" Envelope header is assumed to be: %s\n"),
1866 ctl->server.envelope ? ctl->server.envelope : "Received");
1867 if (ctl->server.envskip || outlevel >= O_VERBOSE)
1868 printf(GT_(" Number of envelope headers to be skipped over: %d\n"),
1869 ctl->server.envskip);
1870 if (ctl->server.qvirtual)
1871 printf(GT_(" Prefix %s will be removed from user id\n"),
1872 ctl->server.qvirtual);
1873 else if (outlevel >= O_VERBOSE)
1874 printf(GT_(" No prefix stripping\n"));
1877 if (ctl->server.akalist)
1881 printf(GT_(" Predeclared mailserver aliases:"));
1882 for (idp = ctl->server.akalist; idp; idp = idp->next)
1883 printf(" %s", idp->id);
1886 if (ctl->server.localdomains)
1890 printf(GT_(" Local domains:"));
1891 for (idp = ctl->server.localdomains; idp; idp = idp->next)
1892 printf(" %s", idp->id);
1899 if (ctl->server.interface)
1900 printf(GT_(" Connection must be through interface %s.\n"), ctl->server.interface);
1901 else if (outlevel >= O_VERBOSE)
1902 printf(GT_(" No interface requirement specified.\n"));
1903 if (ctl->server.monitor)
1904 printf(GT_(" Polling loop will monitor %s.\n"), ctl->server.monitor);
1905 else if (outlevel >= O_VERBOSE)
1906 printf(GT_(" No monitor interface specified.\n"));
1909 if (ctl->server.plugin)
1910 printf(GT_(" Server connections will be made via plugin %s (--plugin %s).\n"), ctl->server.plugin, ctl->server.plugin);
1911 else if (outlevel >= O_VERBOSE)
1912 printf(GT_(" No plugin command specified.\n"));
1913 if (ctl->server.plugout)
1914 printf(GT_(" Listener connections will be made via plugout %s (--plugout %s).\n"), ctl->server.plugout, ctl->server.plugout);
1915 else if (outlevel >= O_VERBOSE)
1916 printf(GT_(" No plugout command specified.\n"));
1918 if (ctl->server.protocol > P_POP2 && MAILBOX_PROTOCOL(ctl))
1921 printf(GT_(" No UIDs saved from this host.\n"));
1927 for (idp = ctl->oldsaved; idp; idp = idp->next)
1930 printf(GT_(" %d UIDs saved.\n"), count);
1931 if (outlevel >= O_VERBOSE)
1932 for (idp = ctl->oldsaved; idp; idp = idp->next)
1933 printf("\t%s\n", idp->id);
1937 if (ctl->server.tracepolls)
1938 printf(GT_(" Poll trace information will be added to the Received header.\n"));
1939 else if (outlevel >= O_VERBOSE)
1940 printf(GT_(" No poll trace information will be added to the Received header.\n.\n"));
1942 if (ctl->properties)
1943 printf(GT_(" Pass-through properties \"%s\".\n"),
1944 visbuf(ctl->properties));
1948 /* fetchmail.c ends here */