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 - 2009 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 */
279 #ifndef HAVE_RES_SEARCH
283 printf(GT_("This is fetchmail release %s"), VERSION);
284 fputs(features, stdout);
286 printcopyright(stdout);
288 fputs("Fallback MDA: ", stdout);
290 fputs(FALLBACK_MDA, stdout);
292 fputs("(none)", stdout);
297 /* this is an attempt to help remote debugging */
298 if (system("uname -a")) { /* NOOP to quench GCC complaint */ }
301 /* avoid parsing the config file if all we're doing is killing a daemon */
303 implicitmode = load_params(argc, argv, optind);
305 /* precedence: logfile (if effective) overrides syslog. */
306 if (run.logfile && run.poll_interval && !nodetach) {
310 #if defined(HAVE_SYSLOG)
311 /* logging should be set up early in case we were restarted from exec */
314 #if defined(LOG_MAIL)
315 openlog(program_name, LOG_PID, LOG_MAIL);
317 /* Assume BSD4.2 openlog with two arguments */
318 openlog(program_name, LOG_PID);
324 report_init((run.poll_interval == 0 || nodetach) && !run.logfile);
327 /* initialize UID handling */
331 if (!versioninfo && (st = prc_filecheck(run.idfile, !versioninfo)) != 0)
334 initialize_saved_lists(querylist, run.idfile);
336 #endif /* POP3_ENABLE */
338 /* construct the lockfile */
341 #ifdef HAVE_SETRLIMIT
343 * Before getting passwords, disable core dumps unless -v -d0 mode is on.
344 * Core dumps could otherwise contain passwords to be scavenged by a
347 if (outlevel < O_VERBOSE || run.poll_interval > 0)
349 struct rlimit corelimit;
350 corelimit.rlim_cur = 0;
351 corelimit.rlim_max = 0;
352 setrlimit(RLIMIT_CORE, &corelimit);
354 #endif /* HAVE_SETRLIMIT */
356 #define NETRC_FILE ".netrc"
357 /* parse the ~/.netrc file (if present) for future password lookups. */
358 netrc_file = prependdir (NETRC_FILE, home);
359 netrc_list = parse_netrc(netrc_file);
363 /* pick up passwords where we can */
364 for (ctl = querylist; ctl; ctl = ctl->next)
366 if (ctl->active && !(implicitmode && ctl->server.skip)&&!ctl->password)
368 if (NO_PASSWORD(ctl))
369 /* Server won't care what the password is, but there
370 must be some non-null string here. */
371 ctl->password = ctl->remotename;
376 /* look up the pollname and account in the .netrc file. */
377 p = search_netrc(netrc_list,
378 ctl->server.pollname, ctl->remotename);
379 /* if we find a matching entry with a password, use it */
380 if (p && p->password)
381 ctl->password = xstrdup(p->password);
383 /* otherwise try with "via" name if there is one */
384 else if (ctl->server.via)
386 p = search_netrc(netrc_list,
387 ctl->server.via, ctl->remotename);
388 if (p && p->password)
389 ctl->password = xstrdup(p->password);
395 free_netrc(netrc_list);
398 /* perhaps we just want to check options? */
401 int havercfile = access(rcfile, 0);
403 printf(GT_("Taking options from command line%s%s\n"),
404 havercfile ? "" : GT_(" and "),
405 havercfile ? "" : rcfile);
407 if (querylist == NULL)
409 GT_("No mailservers set up -- perhaps %s is missing?\n"),
412 dump_params(&run, querylist, implicitmode);
416 /* dump options as a Python dictionary, for configurator use */
419 dump_config(&run, querylist);
423 /* check for another fetchmail running concurrently */
424 pid = fm_lock_state();
426 pid = bkgd ? -pid : pid;
428 /* if no mail servers listed and nothing in background, we're done */
429 if (!quitonly && pid == 0 && querylist == NULL) {
430 (void)fputs(GT_("fetchmail: no mailservers have been specified.\n"),stderr);
434 /* perhaps user asked us to kill the other fetchmail */
437 if (pid == 0 || pid == getpid())
438 /* this test enables re-execing on a changed rcfile
439 * for pid == getpid() */
442 fprintf(stderr,GT_("fetchmail: no other fetchmail is running\n"));
446 else if (kill(pid, SIGTERM) < 0)
448 fprintf(stderr,GT_("fetchmail: error killing %s fetchmail at %d; bailing out.\n"),
449 bkgd ? GT_("background") : GT_("foreground"), pid);
456 if (outlevel > O_SILENT)
457 fprintf(stderr,GT_("fetchmail: %s fetchmail at %d killed.\n"),
458 bkgd ? GT_("background") : GT_("foreground"), pid);
459 /* We used to nuke the other process's lock here, with
460 * fm_lock_release(), which is broken. The other process
461 * needs to clear its lock by itself. */
465 /* wait for other process to exit */
466 maxwait = 10; /* seconds */
467 while (kill(pid, 0) == 0 && --maxwait >= 0) {
474 /* another fetchmail is running -- wake it up or die */
480 GT_("fetchmail: can't check mail while another fetchmail to same host is running.\n"));
483 else if (!implicitmode)
486 GT_("fetchmail: can't poll specified hosts with another fetchmail running at %d.\n"),
493 GT_("fetchmail: another foreground fetchmail is running at %d.\n"),
497 else if (getpid() == pid)
498 /* this test enables re-execing on a changed rcfile */
503 GT_("fetchmail: can't accept options while a background fetchmail is running.\n"));
506 else if (kill(pid, SIGUSR1) == 0)
509 GT_("fetchmail: background fetchmail at %d awakened.\n"),
516 * Should never happen -- possible only if a background fetchmail
517 * croaks after the first kill probe above but before the
518 * SIGUSR1/SIGHUP transmission.
521 GT_("fetchmail: elder sibling at %d died mysteriously.\n"),
523 return(PS_UNDEFINED);
527 /* pick up interactively any passwords we need but don't have */
528 for (ctl = querylist; ctl; ctl = ctl->next)
530 if (ctl->active && !(implicitmode && ctl->server.skip)
531 && !NO_PASSWORD(ctl) && !ctl->password)
536 GT_("fetchmail: can't find a password for %s@%s.\n"),
537 ctl->remotename, ctl->server.pollname);
540 const char* password_prompt = GT_("Enter password for %s@%s: ");
541 size_t pplen = strlen(password_prompt) + strlen(ctl->remotename) + strlen(ctl->server.pollname) + 1;
543 tmpbuf = (char *)xmalloc(pplen);
544 snprintf(tmpbuf, pplen, password_prompt,
545 ctl->remotename, ctl->server.pollname);
546 ctl->password = xstrdup((char *)fm_getpassword(tmpbuf));
553 * Time to initiate the SOCKS library (this is not mandatory: it just
554 * registers the correct application name for logging purpose. If you
555 * have some problem, comment out these lines).
558 SOCKSinit("fetchmail");
559 #endif /* HAVE_SOCKS */
561 /* avoid zombies from plugins */
564 /* Fix up log destination - if the if() is true, the precedence rule
565 * above hasn't killed off the syslog option, because the logfile
566 * option is ineffective (because we're not detached or not in
567 * deamon mode), so kill it for the benefit of other parts of the
569 if (run.logfile && run.use_syslog)
573 * Maybe time to go to demon mode...
575 if (run.poll_interval)
580 rc = daemonize(run.logfile);
582 report(stderr, GT_("fetchmail: Cannot detach into background. Aborting.\n"));
586 report(stdout, GT_("starting fetchmail %s daemon \n"), VERSION);
589 * We'll set up a handler for these when we're sleeping,
590 * but ignore them otherwise so as not to interrupt a poll.
592 set_signal_handler(SIGUSR1, SIG_IGN);
593 if (run.poll_interval && getuid() == ROOT_UID)
594 set_signal_handler(SIGHUP, SIG_IGN);
598 /* not in daemon mode */
599 if (run.logfile && !nodetach && access(run.logfile, F_OK) == 0)
601 if (!freopen(run.logfile, "a", stdout))
602 report(stderr, GT_("could not open %s to append logs to \n"), run.logfile);
603 if (!freopen(run.logfile, "a", stderr))
604 report(stdout, GT_("could not open %s to append logs to \n"), run.logfile);
606 report(stdout, GT_("fetchmail: Warning: syslog and logfile are set. Check both for logs!\n"));
612 /* beyond here we don't want more than one fetchmail running per user */
614 set_signal_handler(SIGABRT, terminate_run);
615 set_signal_handler(SIGINT, terminate_run);
616 set_signal_handler(SIGTERM, terminate_run);
617 set_signal_handler(SIGALRM, terminate_run);
618 set_signal_handler(SIGPIPE, SIG_IGN);
619 set_signal_handler(SIGQUIT, terminate_run);
621 /* here's the exclusion lock */
624 if (check_only && outlevel >= O_VERBOSE) {
625 report(stdout, GT_("--check mode enabled, not fetching mail\n"));
629 * Query all hosts. If there's only one, the error return will
630 * reflect the status of that transaction.
634 * Check to see if the rcfile has been touched. If so,
635 * re-exec so the file will be reread. Doing it this way
636 * avoids all the complications of trying to deallocate the
637 * in-core control structures -- and the potential memory
642 if (strcmp(rcfile, "-") == 0) {
644 } else if (stat(rcfile, &rcstat) == -1) {
647 GT_("couldn't time-check %s (error %d)\n"),
650 else if (rcstat.st_mtime > parsetime)
652 report(stdout, GT_("restarting fetchmail (%s changed)\n"), rcfile);
655 /* restore the startup directory */
656 if (!currentwd[0] || chdir (currentwd) == -1)
657 report(stderr, GT_("attempt to re-exec may fail as directory has not been restored\n"));
661 * Matthias Andree: Isn't this prone to introduction of
662 * "false" programs by interfering with PATH? Those
663 * path-searching execs might not be the best ideas for
666 * Rob Funk: But is there any way for someone to modify
667 * the PATH variable of a running fetchmail? I don't know
670 * Dave's change makes fetchmail restart itself in exactly
671 * the way it was started from the shell (or shell script)
672 * in the first place. If you're concerned about PATH
673 * contamination, call fetchmail initially with a full
674 * path, and use Dave's patch.
676 * Not using a -p variant of exec means that the restart
677 * will break if both (a) the user depended on PATH to
678 * call fetchmail in the first place, and (b) the system
679 * doesn't save the whole path in argv[0] if the whole
680 * path wasn't used in the initial call. (If I recall
681 * correctly, Linux saves it but many other Unices don't.)
683 execvp(argv[0], argv);
684 report(stderr, GT_("attempt to re-exec fetchmail failed\n"));
687 #ifdef HAVE_RES_SEARCH
688 /* Boldly assume that we also have res_init() if we have
689 * res_search(), and call res_init() to re-read the resolv.conf
690 * file, so that we can pick up changes to that file that are
691 * written by dhpccd, dhclient, pppd, openvpn and similar. */
693 /* NOTE: This assumes that /etc/resolv.conf is written
694 * atomically (i. e. a temporary file is written, flushed and
695 * then renamed into place). To fix Debian Bug#389270. */
697 /* NOTE: If this leaks memory or doesn't re-read
698 * /etc/resolv.conf, we're in trouble. The res_init() interface
699 * is only lightly documented :-( */
705 for (ctl = querylist; ctl; ctl = ctl->next)
709 if (!(implicitmode && ctl->server.skip))
714 GT_("poll of %s skipped (failed authentication or too many timeouts)\n"),
715 ctl->server.pollname);
719 /* check skip interval first so that it counts all polls */
720 if (run.poll_interval && ctl->server.interval)
722 if (ctl->server.poll_count++ % ctl->server.interval)
724 if (outlevel >= O_VERBOSE)
726 GT_("interval not reached, not querying %s\n"),
727 ctl->server.pollname);
734 * Don't do monitoring if we were woken by a signal.
735 * Note that interface_approve() does its own error logging.
737 if (!interface_approve(&ctl->server, !lastsig))
739 #endif /* CAN_MONITOR */
741 dofastuidl = 0; /* this is reset in the driver if required */
743 querystatus = query_host(ctl);
745 if (NUM_NONZERO(ctl->fastuidl))
746 ctl->fastuidlcount = (ctl->fastuidlcount + 1) % ctl->fastuidl;
748 /* leave the UIDL state alone if there have been any errors */
750 ((querystatus==PS_SUCCESS) || (querystatus==PS_NOMAIL) || (querystatus==PS_MAXFETCH)))
753 uid_discard_new_list(ctl);
755 #endif /* POP3_ENABLE */
757 if (querystatus == PS_SUCCESS)
759 else if (!check_only &&
760 ((querystatus!=PS_NOMAIL) || (outlevel==O_DEBUG)))
764 report(stdout,GT_("Query status=0 (SUCCESS)\n"));break;
766 report(stdout,GT_("Query status=1 (NOMAIL)\n")); break;
768 report(stdout,GT_("Query status=2 (SOCKET)\n")); break;
770 report(stdout,GT_("Query status=3 (AUTHFAIL)\n"));break;
772 report(stdout,GT_("Query status=4 (PROTOCOL)\n"));break;
774 report(stdout,GT_("Query status=5 (SYNTAX)\n")); break;
776 report(stdout,GT_("Query status=6 (IOERR)\n")); break;
778 report(stdout,GT_("Query status=7 (ERROR)\n")); break;
780 report(stdout,GT_("Query status=8 (EXCLUDE)\n")); break;
782 report(stdout,GT_("Query status=9 (LOCKBUSY)\n"));break;
784 report(stdout,GT_("Query status=10 (SMTP)\n")); break;
786 report(stdout,GT_("Query status=11 (DNS)\n")); break;
788 report(stdout,GT_("Query status=12 (BSMTP)\n")); break;
790 report(stdout,GT_("Query status=13 (MAXFETCH)\n"));break;
792 report(stdout,GT_("Query status=%d\n"),querystatus);
797 if (ctl->server.monitor)
800 * Allow some time for the link to quiesce. One
801 * second is usually sufficient, three is safe.
802 * Note: this delay is important - don't remove!
805 interface_note_activity(&ctl->server);
807 #endif /* CAN_MONITOR */
811 /* close connections cleanly */
815 * OK, we've polled. Now sleep.
817 if (run.poll_interval)
820 * Because passwords can expire, it may happen that *all*
821 * hosts are now out of the loop due to authfail
822 * conditions. If this happens daemon-mode fetchmail
823 * should softly and silently vanish away, rather than
824 * spinning uselessly.
828 for (ctl = querylist; ctl; ctl = ctl->next)
829 if (ctl->active && !(implicitmode && ctl->server.skip))
834 report(stderr, GT_("All connections are wedged. Exiting.\n"));
835 /* FIXME: someday, send notification mail */
839 if ((outlevel > O_SILENT && !run.use_syslog && isatty(1))
840 || outlevel > O_NORMAL)
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 && !run.use_syslog && isatty(1))
876 || outlevel > O_NORMAL)
877 report(stdout, GT_("awakened at %s\n"), timestamp());
879 } while (run.poll_interval);
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(sslcommonname);
984 FLAG_MERGE(sslfingerprint);
988 FLAG_MERGE(properties);
992 /** Load configuration files.
993 * \return - true if no servers found on the command line
994 * - false if servers found on the command line */
995 static int load_params(int argc, char **argv, int optind)
997 int implicitmode, st;
999 struct query def_opts, *ctl;
1003 run.bouncemail = TRUE;
1004 run.softbounce = TRUE; /* treat permanent errors as temporary */
1005 run.spambounce = FALSE; /* don't bounce back to innocent bystanders */
1007 memset(&def_opts, '\0', sizeof(struct query));
1008 def_opts.smtp_socket = -1;
1009 def_opts.smtpaddress = (char *)0;
1010 def_opts.smtpname = (char *)0;
1011 def_opts.server.protocol = P_AUTO;
1012 def_opts.server.timeout = CLIENT_TIMEOUT;
1013 def_opts.server.esmtp_name = user;
1014 def_opts.warnings = WARNING_INTERVAL;
1015 def_opts.remotename = user;
1016 def_opts.listener = SMTP_MODE;
1017 def_opts.fetchsizelimit = 100;
1018 def_opts.fastuidl = 4;
1020 /* get the location of rcfile */
1022 p = strrchr (rcfile, '/');
1023 if (p && (size_t)(p - rcfile) < sizeof (rcfiledir)) {
1024 *p = 0; /* replace '/' by '0' */
1025 strlcpy (rcfiledir, rcfile, sizeof(rcfiledir));
1026 *p = '/'; /* restore '/' */
1027 if (!rcfiledir[0]) /* "/.fetchmailrc" case */
1028 strcpy (rcfiledir, "/");
1031 /* note the parse time, so we can pick up on modifications */
1032 parsetime = 0; /* foil compiler warnings */
1033 if (strcmp(rcfile, "-") == 0 || stat(rcfile, &rcstat) != -1)
1034 parsetime = rcstat.st_mtime;
1035 else if (errno != ENOENT)
1036 report(stderr, GT_("couldn't time-check the run-control file\n"));
1038 /* this builds the host list */
1039 if ((st = prc_parse_file(rcfile, !versioninfo)) != 0)
1041 * FIXME: someday, send notification mail here if backgrounded.
1042 * Right now, that can happen if the user changes the rcfile
1043 * while the fetchmail is running in background. Do similarly
1044 * for the other exit() calls in this function.
1048 if ((implicitmode = (optind >= argc)))
1050 for (ctl = querylist; ctl; ctl = ctl->next)
1051 ctl->active = !ctl->server.skip;
1054 for (; optind < argc; optind++)
1056 flag predeclared = FALSE;
1059 * If hostname corresponds to a host known from the rc file,
1060 * simply declare it active. Otherwise synthesize a host
1061 * record from command line and defaults
1063 for (ctl = querylist; ctl; ctl = ctl->next)
1064 if (!strcmp(ctl->server.pollname, argv[optind])
1065 || str_in_list(&ctl->server.akalist, argv[optind], TRUE))
1067 /* Is this correct? */
1068 if (predeclared && outlevel >= O_VERBOSE)
1069 fprintf(stderr,GT_("Warning: multiple mentions of host %s in config file\n"),argv[optind]);
1077 * Allocate and link record without copying in
1078 * command-line args; we'll do that with the optmerge
1081 ctl = hostalloc((struct query *)NULL);
1083 ctl->server.pollname = xstrdup(argv[optind]);
1085 ctl->server.lead_server = (struct hostdata *)NULL;
1090 * If there's a defaults record, merge it and lose it.
1092 if (querylist && strcmp(querylist->server.pollname, "defaults") == 0)
1094 for (ctl = querylist->next; ctl; ctl = ctl->next)
1095 optmerge(ctl, querylist, FALSE);
1096 querylist = querylist->next;
1099 /* don't allow a defaults record after the first */
1100 for (ctl = querylist; ctl; ctl = ctl->next) {
1101 if (ctl != querylist && strcmp(ctl->server.pollname, "defaults") == 0) {
1102 fprintf(stderr, GT_("fetchmail: Error: multiple \"defaults\" records in config file.\n"));
1107 /* use localhost if we never fetch the FQDN of this host */
1108 fetchmailhost = "localhost";
1110 /* here's where we override globals */
1111 if (cmd_run.logfile)
1112 run.logfile = cmd_run.logfile;
1114 run.idfile = cmd_run.idfile;
1115 if (cmd_run.pidfile)
1116 run.pidfile = cmd_run.pidfile;
1117 /* do this before the keep/fetchall test below, otherwise -d0 may fail */
1118 if (cmd_run.poll_interval >= 0)
1119 run.poll_interval = cmd_run.poll_interval;
1120 if (cmd_run.invisible)
1121 run.invisible = cmd_run.invisible;
1122 if (cmd_run.showdots)
1123 run.showdots = cmd_run.showdots;
1124 if (cmd_run.use_syslog)
1125 run.use_syslog = (cmd_run.use_syslog == FLAG_TRUE);
1126 if (cmd_run.postmaster)
1127 run.postmaster = cmd_run.postmaster;
1128 if (cmd_run.bouncemail)
1129 run.bouncemail = cmd_run.bouncemail;
1130 if (cmd_run.softbounce)
1131 run.softbounce = cmd_run.softbounce;
1133 /* check and daemon options are not compatible */
1134 if (check_only && run.poll_interval)
1135 run.poll_interval = 0;
1138 * DNS support is required for some protocols. We used to
1139 * do this unconditionally, but it made fetchmail excessively
1140 * vulnerable to misconfigured DNS setups.
1142 * If we're using ETRN or ODMR, the smtp hunt list is the
1143 * list of systems we're polling on behalf of; these have
1144 * to be fully-qualified domain names. The default for
1145 * this list should be the FQDN of localhost.
1147 * If we're using Kerberos for authentication, we need
1148 * the FQDN in order to generate capability keys.
1150 for (ctl = querylist; ctl; ctl = ctl->next)
1152 (ctl->server.protocol==P_ETRN || ctl->server.protocol==P_ODMR
1153 || ctl->server.authenticate == A_KERBEROS_V4
1154 || ctl->server.authenticate == A_KERBEROS_V5))
1156 fetchmailhost = host_fqdn(1);
1160 if (!ctl) /* list exhausted */
1161 fetchmailhost = host_fqdn(0);
1163 /* this code enables flags to be turned off */
1164 #define DEFAULT(flag, dflt) if (flag == FLAG_TRUE)\
1166 else if (flag == FLAG_FALSE)\
1171 /* merge in wired defaults, do sanity checks and prepare internal fields */
1172 for (ctl = querylist; ctl; ctl = ctl->next)
1174 ctl->wedged = FALSE;
1176 /* merge in defaults */
1177 optmerge(ctl, &def_opts, FALSE);
1179 /* force command-line options */
1180 optmerge(ctl, &cmd_opts, TRUE);
1183 * queryname has to be set up for inactive servers too.
1184 * Otherwise the UIDL code core-dumps on startup.
1186 if (ctl->server.via)
1187 ctl->server.queryname = xstrdup(ctl->server.via);
1189 ctl->server.queryname = xstrdup(ctl->server.pollname);
1192 * We no longer do DNS lookups at startup.
1193 * This is a kluge. It enables users to edit their
1194 * configurations when DNS isn't available.
1196 ctl->server.truename = xstrdup(ctl->server.queryname);
1198 if (configdump || ctl->active )
1200 DEFAULT(ctl->keep, FALSE);
1201 DEFAULT(ctl->fetchall, FALSE);
1202 DEFAULT(ctl->flush, FALSE);
1203 DEFAULT(ctl->limitflush, FALSE);
1204 DEFAULT(ctl->rewrite, TRUE);
1205 DEFAULT(ctl->stripcr, (ctl->mda != (char *)NULL));
1206 DEFAULT(ctl->forcecr, FALSE);
1207 DEFAULT(ctl->pass8bits, FALSE);
1208 DEFAULT(ctl->dropstatus, FALSE);
1209 DEFAULT(ctl->dropdelivered, FALSE);
1210 DEFAULT(ctl->mimedecode, FALSE);
1211 DEFAULT(ctl->idle, FALSE);
1212 DEFAULT(ctl->server.dns, TRUE);
1213 DEFAULT(ctl->server.uidl, FALSE);
1214 DEFAULT(ctl->use_ssl, FALSE);
1215 DEFAULT(ctl->sslcertck, FALSE);
1216 DEFAULT(ctl->server.checkalias, FALSE);
1219 * XXX FIXME: do we need this check or can we rely on the .y
1220 * parser handling this?
1224 report(stderr, GT_("SSL support is not compiled in.\n"));
1227 #endif /* SSL_ENABLE */
1230 if (ctl->server.authenticate == A_KERBEROS_V4) {
1231 report(stderr, GT_("KERBEROS v4 support is configured, but not compiled in.\n"));
1236 if (ctl->server.authenticate == A_KERBEROS_V5) {
1237 report(stderr, GT_("KERBEROS v5 support is configured, but not compiled in.\n"));
1242 if (ctl->server.authenticate == A_GSSAPI) {
1243 report(stderr, GT_("GSSAPI support is configured, but not compiled in.\n"));
1249 * Make sure we have a nonempty host list to forward to.
1252 save_str(&ctl->smtphunt, "localhost", FALSE);
1255 * Make sure we have a nonempty list of domains to fetch from.
1257 if ((ctl->server.protocol==P_ETRN || ctl->server.protocol==P_ODMR) && !ctl->domainlist)
1258 save_str(&ctl->domainlist, fetchmailhost, FALSE);
1260 /* if `user' doesn't name a real local user, try to run as root */
1261 if ((pw = getpwnam(user)) == (struct passwd *)NULL)
1264 ctl->uid = pw->pw_uid; /* for local delivery via MDA */
1265 if (!ctl->localnames) /* for local delivery via SMTP */
1266 save_str_pair(&ctl->localnames, user, NULL);
1268 #ifndef HAVE_RES_SEARCH
1269 /* can't handle multidrop mailboxes unless we can do DNS lookups */
1270 if (MULTIDROP(ctl) && ctl->server.dns)
1272 ctl->server.dns = FALSE;
1273 report(stderr, GT_("fetchmail: warning: no DNS available to check multidrop fetches from %s\n"), ctl->server.pollname);
1275 #endif /* !HAVE_RES_SEARCH */
1278 * can't handle multidrop mailboxes without "envelope"
1279 * option, this causes truckloads full of support complaints
1280 * "all mail forwarded to postmaster"
1282 if (MULTIDROP(ctl) && !ctl->server.envelope)
1284 report(stderr, GT_("warning: multidrop for %s requires envelope option!\n"), ctl->server.pollname);
1285 report(stderr, GT_("warning: Do not ask for support if all mail goes to postmaster!\n"));
1288 /* if no folders were specified, set up the null one as default */
1289 if (!ctl->mailboxes)
1290 save_str(&ctl->mailboxes, (char *)NULL, 0);
1292 /* maybe user overrode timeout on command line? */
1293 if (ctl->server.timeout == -1)
1294 ctl->server.timeout = CLIENT_TIMEOUT;
1297 if (ctl->server.service) {
1298 int port = servport(ctl->server.service);
1301 (void) fprintf(stderr,
1302 GT_("fetchmail: %s configuration invalid, specify positive port number for service or port\n"),
1303 ctl->server.pollname);
1306 if (ctl->server.protocol == P_RPOP && port >= 1024)
1308 (void) fprintf(stderr,
1309 GT_("fetchmail: %s configuration invalid, RPOP requires a privileged port\n"),
1310 ctl->server.pollname);
1314 if (ctl->listener == LMTP_MODE)
1318 for (idp = ctl->smtphunt; idp; idp = idp->next)
1322 if (!(cp = strrchr(idp->id, '/'))
1323 || (0 == strcmp(cp + 1, SMTP_PORT))
1324 || servport(cp + 1) == SMTP_PORT_NUM)
1326 (void) fprintf(stderr,
1327 GT_("%s configuration invalid, LMTP can't use default SMTP port\n"),
1328 ctl->server.pollname);
1335 * "I beg to you, have mercy on the we[a]k minds like myself."
1336 * wrote Pehr Anderson. Your petition is granted.
1338 if (ctl->fetchall && ctl->keep && (run.poll_interval || ctl->idle) && !nodetach && !configdump)
1340 (void) fprintf(stderr,
1341 GT_("Both fetchall and keep on in daemon or idle mode is a mistake!\n"));
1347 * If the user didn't set a last-resort user to get misaddressed
1348 * multidrop mail, set an appropriate default here.
1350 if (!run.postmaster)
1352 if (getuid() != ROOT_UID) /* ordinary user */
1353 run.postmaster = user;
1355 run.postmaster = "postmaster";
1358 return(implicitmode);
1361 static RETSIGTYPE terminate_poll(int sig)
1362 /* to be executed at the end of a poll cycle */
1366 report(stdout, GT_("terminated with signal %d\n"), sig);
1370 * Update UID information at end of each poll, rather than at end
1371 * of run, because that way we don't lose all UIDL information since
1372 * the beginning of time if fetchmail crashes.
1375 write_saved_lists(querylist, run.idfile);
1376 #endif /* POP3_ENABLE */
1379 static RETSIGTYPE terminate_run(int sig)
1380 /* to be executed on normal or signal-induced termination */
1384 terminate_poll(sig);
1387 * Craig Metz, the RFC1938 one-time-password guy, points out:
1388 * "Remember that most kernels don't zero pages before handing them to the
1389 * next process and many kernels share pages between user and kernel space.
1390 * You'd be very surprised what you can find from a short program to do a
1391 * malloc() and then dump the contents of the pages you got. By zeroing
1392 * the secrets at end of run (earlier if you can), you make sure the next
1393 * guy can't get the password/pass phrase."
1395 * Right you are, Craig!
1397 for (ctl = querylist; ctl; ctl = ctl->next)
1399 memset(ctl->password, '\0', strlen(ctl->password));
1401 #if !defined(HAVE_ATEXIT)
1405 if (activecount == 0)
1408 exit(successes ? PS_SUCCESS : querystatus);
1412 * Sequence of protocols to try when autoprobing, most capable to least.
1414 static const int autoprobe[] =
1418 #endif /* IMAP_ENABLE */
1421 #endif /* POP3_ENABLE */
1424 #endif /* POP2_ENABLE */
1427 static int query_host(struct query *ctl)
1428 /* perform fetch transaction with single host */
1434 * If we're syslogging the progress messages are automatically timestamped.
1435 * Force timestamping if we're going to a logfile.
1437 if (outlevel >= O_VERBOSE)
1439 report(stdout, GT_("%s querying %s (protocol %s) at %s: poll started\n"),
1441 ctl->server.pollname,
1442 showproto(ctl->server.protocol),
1446 switch (ctl->server.protocol) {
1448 for (i = 0; i < sizeof(autoprobe)/sizeof(autoprobe[0]); i++)
1450 ctl->server.protocol = autoprobe[i];
1452 st = query_host(ctl);
1455 if (st == PS_SUCCESS || st == PS_NOMAIL || st == PS_AUTHFAIL || st == PS_LOCKBUSY || st == PS_SMTP || st == PS_MAXFETCH || st == PS_DNS)
1458 ctl->server.protocol = P_AUTO;
1464 report(stderr, GT_("POP2 support is not configured.\n"));
1466 #endif /* POP2_ENABLE */
1474 } while (st == PS_REPOLL);
1476 report(stderr, GT_("POP3 support is not configured.\n"));
1478 #endif /* POP3_ENABLE */
1484 } while (st == PS_REPOLL);
1486 report(stderr, GT_("IMAP support is not configured.\n"));
1488 #endif /* IMAP_ENABLE */
1492 report(stderr, GT_("ETRN support is not configured.\n"));
1497 #endif /* ETRN_ENABLE */
1500 report(stderr, GT_("ODMR support is not configured.\n"));
1504 #endif /* ODMR_ENABLE */
1507 report(stderr, GT_("unsupported protocol selected.\n"));
1512 * If we're syslogging the progress messages are automatically timestamped.
1513 * Force timestamping if we're going to a logfile.
1515 if (outlevel >= O_VERBOSE)
1517 report(stdout, GT_("%s querying %s (protocol %s) at %s: poll completed\n"),
1519 ctl->server.pollname,
1520 showproto(ctl->server.protocol),
1527 static void dump_params (struct runctl *runp,
1528 struct query *querylist, flag implicit)
1529 /* display query parameters in English */
1533 if (runp->poll_interval)
1534 printf(GT_("Poll interval is %d seconds\n"), runp->poll_interval);
1536 printf(GT_("Logfile is %s\n"), runp->logfile);
1537 if (strcmp(runp->idfile, IDFILE_NAME))
1538 printf(GT_("Idfile is %s\n"), runp->idfile);
1539 #if defined(HAVE_SYSLOG)
1540 if (runp->use_syslog)
1541 printf(GT_("Progress messages will be logged via syslog\n"));
1543 if (runp->invisible)
1544 printf(GT_("Fetchmail will masquerade and will not generate Received\n"));
1546 printf(GT_("Fetchmail will show progress dots even in logfiles.\n"));
1547 if (runp->postmaster)
1548 printf(GT_("Fetchmail will forward misaddressed multidrop messages to %s.\n"),
1551 if (!runp->bouncemail)
1552 printf(GT_("Fetchmail will direct error mail to the postmaster.\n"));
1553 else if (outlevel >= O_VERBOSE)
1554 printf(GT_("Fetchmail will direct error mail to the sender.\n"));
1556 if (!runp->softbounce)
1557 printf(GT_("Fetchmail will treat permanent errors as permanent (drop messsages).\n"));
1558 else if (outlevel >= O_VERBOSE)
1559 printf(GT_("Fetchmail will treat permanent errors as temporary (keep messages).\n"));
1561 for (ctl = querylist; ctl; ctl = ctl->next)
1563 if (!ctl->active || (implicit && ctl->server.skip))
1566 printf(GT_("Options for retrieving from %s@%s:\n"),
1567 ctl->remotename, visbuf(ctl->server.pollname));
1569 if (ctl->server.via && MAILBOX_PROTOCOL(ctl))
1570 printf(GT_(" Mail will be retrieved via %s\n"), ctl->server.via);
1572 if (ctl->server.interval)
1573 printf(ngettext(" Poll of this server will occur every %d interval.\n",
1574 " Poll of this server will occur every %d intervals.\n",
1575 ctl->server.interval), ctl->server.interval);
1576 if (ctl->server.truename)
1577 printf(GT_(" True name of server is %s.\n"), ctl->server.truename);
1578 if (ctl->server.skip || outlevel >= O_VERBOSE)
1579 printf(ctl->server.skip
1580 ? GT_(" This host will not be queried when no host is specified.\n")
1581 : GT_(" This host will be queried when no host is specified.\n"));
1582 if (!NO_PASSWORD(ctl))
1585 printf(GT_(" Password will be prompted for.\n"));
1586 else if (outlevel >= O_VERBOSE)
1588 if (ctl->server.protocol == P_APOP)
1589 printf(GT_(" APOP secret = \"%s\".\n"),
1590 visbuf(ctl->password));
1591 else if (ctl->server.protocol == P_RPOP)
1592 printf(GT_(" RPOP id = \"%s\".\n"),
1593 visbuf(ctl->password));
1595 printf(GT_(" Password = \"%s\".\n"),
1596 visbuf(ctl->password));
1600 if (ctl->server.protocol == P_POP3
1601 && ctl->server.service && !strcmp(ctl->server.service, KPOP_PORT)
1602 && (ctl->server.authenticate == A_KERBEROS_V4 ||
1603 ctl->server.authenticate == A_KERBEROS_V5))
1604 printf(GT_(" Protocol is KPOP with Kerberos %s authentication"),
1605 ctl->server.authenticate == A_KERBEROS_V5 ? "V" : "IV");
1607 printf(GT_(" Protocol is %s"), showproto(ctl->server.protocol));
1608 if (ctl->server.service)
1609 printf(GT_(" (using service %s)"), ctl->server.service);
1610 else if (outlevel >= O_VERBOSE)
1611 printf(GT_(" (using default port)"));
1612 if (ctl->server.uidl && MAILBOX_PROTOCOL(ctl))
1613 printf(GT_(" (forcing UIDL use)"));
1616 switch (ctl->server.authenticate)
1619 printf(GT_(" All available authentication methods will be tried.\n"));
1622 printf(GT_(" Password authentication will be forced.\n"));
1625 printf(GT_(" MSN authentication will be forced.\n"));
1628 printf(GT_(" NTLM authentication will be forced.\n"));
1631 printf(GT_(" OTP authentication will be forced.\n"));
1634 printf(GT_(" CRAM-Md5 authentication will be forced.\n"));
1637 printf(GT_(" GSSAPI authentication will be forced.\n"));
1640 printf(GT_(" Kerberos V4 authentication will be forced.\n"));
1643 printf(GT_(" Kerberos V5 authentication will be forced.\n"));
1646 printf(GT_(" End-to-end encryption assumed.\n"));
1649 if (ctl->server.principal != (char *) NULL)
1650 printf(GT_(" Mail service principal is: %s\n"), ctl->server.principal);
1653 printf(GT_(" SSL encrypted sessions enabled.\n"));
1655 printf(GT_(" SSL protocol: %s.\n"), ctl->sslproto);
1656 if (ctl->sslcertck) {
1657 printf(GT_(" SSL server certificate checking enabled.\n"));
1658 if (ctl->sslcertpath != NULL)
1659 printf(GT_(" SSL trusted certificate directory: %s\n"), ctl->sslcertpath);
1661 if (ctl->sslcommonname != NULL)
1662 printf(GT_(" SSL server CommonName: %s\n"), ctl->sslcommonname);
1663 if (ctl->sslfingerprint != NULL)
1664 printf(GT_(" SSL key fingerprint (checked against the server key): %s\n"), ctl->sslfingerprint);
1666 if (ctl->server.timeout > 0)
1667 printf(GT_(" Server nonresponse timeout is %d seconds"), ctl->server.timeout);
1668 if (ctl->server.timeout == CLIENT_TIMEOUT)
1669 printf(GT_(" (default).\n"));
1673 if (MAILBOX_PROTOCOL(ctl))
1675 if (!ctl->mailboxes->id)
1676 printf(GT_(" Default mailbox selected.\n"));
1681 printf(GT_(" Selected mailboxes are:"));
1682 for (idp = ctl->mailboxes; idp; idp = idp->next)
1683 printf(" %s", idp->id);
1686 printf(ctl->fetchall
1687 ? GT_(" All messages will be retrieved (--all on).\n")
1688 : GT_(" Only new messages will be retrieved (--all off).\n"));
1690 ? GT_(" Fetched messages will be kept on the server (--keep on).\n")
1691 : GT_(" Fetched messages will not be kept on the server (--keep off).\n"));
1693 ? GT_(" Old messages will be flushed before message retrieval (--flush on).\n")
1694 : GT_(" Old messages will not be flushed before message retrieval (--flush off).\n"));
1695 printf(ctl->limitflush
1696 ? GT_(" Oversized messages will be flushed before message retrieval (--limitflush on).\n")
1697 : GT_(" Oversized messages will not be flushed before message retrieval (--limitflush off).\n"));
1699 ? GT_(" Rewrite of server-local addresses is enabled (--norewrite off).\n")
1700 : GT_(" Rewrite of server-local addresses is disabled (--norewrite on).\n"));
1702 ? GT_(" Carriage-return stripping is enabled (stripcr on).\n")
1703 : GT_(" Carriage-return stripping is disabled (stripcr off).\n"));
1705 ? GT_(" Carriage-return forcing is enabled (forcecr on).\n")
1706 : GT_(" Carriage-return forcing is disabled (forcecr off).\n"));
1707 printf(ctl->pass8bits
1708 ? GT_(" Interpretation of Content-Transfer-Encoding is disabled (pass8bits on).\n")
1709 : GT_(" Interpretation of Content-Transfer-Encoding is enabled (pass8bits off).\n"));
1710 printf(ctl->mimedecode
1711 ? GT_(" MIME decoding is enabled (mimedecode on).\n")
1712 : GT_(" MIME decoding is disabled (mimedecode off).\n"));
1714 ? GT_(" Idle after poll is enabled (idle on).\n")
1715 : GT_(" Idle after poll is disabled (idle off).\n"));
1716 printf(ctl->dropstatus
1717 ? GT_(" Nonempty Status lines will be discarded (dropstatus on)\n")
1718 : GT_(" Nonempty Status lines will be kept (dropstatus off)\n"));
1719 printf(ctl->dropdelivered
1720 ? GT_(" Delivered-To lines will be discarded (dropdelivered on)\n")
1721 : GT_(" Delivered-To lines will be kept (dropdelivered off)\n"));
1722 if (NUM_NONZERO(ctl->limit))
1724 if (NUM_NONZERO(ctl->limit))
1725 printf(GT_(" Message size limit is %d octets (--limit %d).\n"),
1726 ctl->limit, ctl->limit);
1727 else if (outlevel >= O_VERBOSE)
1728 printf(GT_(" No message size limit (--limit 0).\n"));
1729 if (run.poll_interval > 0)
1730 printf(GT_(" Message size warning interval is %d seconds (--warnings %d).\n"),
1731 ctl->warnings, ctl->warnings);
1732 else if (outlevel >= O_VERBOSE)
1733 printf(GT_(" Size warnings on every poll (--warnings 0).\n"));
1735 if (NUM_NONZERO(ctl->fetchlimit))
1736 printf(GT_(" Received-message limit is %d (--fetchlimit %d).\n"),
1737 ctl->fetchlimit, ctl->fetchlimit);
1738 else if (outlevel >= O_VERBOSE)
1739 printf(GT_(" No received-message limit (--fetchlimit 0).\n"));
1740 if (NUM_NONZERO(ctl->fetchsizelimit))
1741 printf(GT_(" Fetch message size limit is %d (--fetchsizelimit %d).\n"),
1742 ctl->fetchsizelimit, ctl->fetchsizelimit);
1743 else if (outlevel >= O_VERBOSE)
1744 printf(GT_(" No fetch message size limit (--fetchsizelimit 0).\n"));
1745 if (NUM_NONZERO(ctl->fastuidl) && MAILBOX_PROTOCOL(ctl))
1747 if (ctl->fastuidl == 1)
1748 printf(GT_(" Do binary search of UIDs during each poll (--fastuidl 1).\n"));
1750 printf(GT_(" Do binary search of UIDs during %d out of %d polls (--fastuidl %d).\n"), ctl->fastuidl - 1, ctl->fastuidl, ctl->fastuidl);
1752 else if (outlevel >= O_VERBOSE)
1753 printf(GT_(" Do linear search of UIDs during each poll (--fastuidl 0).\n"));
1754 if (NUM_NONZERO(ctl->batchlimit))
1755 printf(GT_(" SMTP message batch limit is %d.\n"), ctl->batchlimit);
1756 else if (outlevel >= O_VERBOSE)
1757 printf(GT_(" No SMTP message batch limit (--batchlimit 0).\n"));
1758 if (MAILBOX_PROTOCOL(ctl))
1760 if (NUM_NONZERO(ctl->expunge))
1761 printf(GT_(" Deletion interval between expunges forced to %d (--expunge %d).\n"), ctl->expunge, ctl->expunge);
1762 else if (outlevel >= O_VERBOSE)
1763 printf(GT_(" No forced expunges (--expunge 0).\n"));
1766 else /* ODMR or ETRN */
1770 printf(GT_(" Domains for which mail will be fetched are:"));
1771 for (idp = ctl->domainlist; idp; idp = idp->next)
1773 printf(" %s", idp->id);
1774 if (!idp->val.status.mark)
1775 printf(GT_(" (default)"));
1780 printf(GT_(" Messages will be appended to %s as BSMTP\n"), visbuf(ctl->bsmtp));
1781 else if (ctl->mda && MAILBOX_PROTOCOL(ctl))
1782 printf(GT_(" Messages will be delivered with \"%s\".\n"), visbuf(ctl->mda));
1789 printf(GT_(" Messages will be %cMTP-forwarded to:"),
1791 for (idp = ctl->smtphunt; idp; idp = idp->next)
1793 printf(" %s", idp->id);
1794 if (!idp->val.status.mark)
1795 printf(GT_(" (default)"));
1799 if (ctl->smtpaddress)
1800 printf(GT_(" Host part of MAIL FROM line will be %s\n"),
1803 printf(GT_(" Address to be put in RCPT TO lines shipped to SMTP will be %s\n"),
1806 if (MAILBOX_PROTOCOL(ctl))
1808 if (ctl->antispam != (struct idlist *)NULL)
1812 printf(GT_(" Recognized listener spam block responses are:"));
1813 for (idp = ctl->antispam; idp; idp = idp->next)
1814 printf(" %d", idp->val.status.num);
1817 else if (outlevel >= O_VERBOSE)
1818 printf(GT_(" Spam-blocking disabled\n"));
1820 if (ctl->preconnect)
1821 printf(GT_(" Server connection will be brought up with \"%s\".\n"),
1822 visbuf(ctl->preconnect));
1823 else if (outlevel >= O_VERBOSE)
1824 printf(GT_(" No pre-connection command.\n"));
1825 if (ctl->postconnect)
1826 printf(GT_(" Server connection will be taken down with \"%s\".\n"),
1827 visbuf(ctl->postconnect));
1828 else if (outlevel >= O_VERBOSE)
1829 printf(GT_(" No post-connection command.\n"));
1830 if (MAILBOX_PROTOCOL(ctl)) {
1831 if (!ctl->localnames)
1832 printf(GT_(" No localnames declared for this host.\n"));
1838 for (idp = ctl->localnames; idp; idp = idp->next)
1841 if (count > 1 || ctl->wildcard)
1842 printf(GT_(" Multi-drop mode: "));
1844 printf(GT_(" Single-drop mode: "));
1846 printf(ngettext("%d local name recognized.\n", "%d local names recognized.\n", count), count);
1847 if (outlevel >= O_VERBOSE)
1849 for (idp = ctl->localnames; idp; idp = idp->next)
1851 printf("\t%s -> %s\n", idp->id, idp->val.id2);
1853 printf("\t%s\n", idp->id);
1855 fputs("\t*\n", stdout);
1858 if (count > 1 || ctl->wildcard)
1860 printf(ctl->server.dns
1861 ? GT_(" DNS lookup for multidrop addresses is enabled.\n")
1862 : GT_(" DNS lookup for multidrop addresses is disabled.\n"));
1863 if (ctl->server.dns)
1865 if (ctl->server.checkalias)
1866 printf(GT_(" Server aliases will be compared with multidrop addresses by IP address.\n"));
1868 printf(GT_(" Server aliases will be compared with multidrop addresses by name.\n"));
1870 if (ctl->server.envelope == STRING_DISABLED)
1871 printf(GT_(" Envelope-address routing is disabled\n"));
1874 printf(GT_(" Envelope header is assumed to be: %s\n"),
1875 ctl->server.envelope ? ctl->server.envelope : "Received");
1876 if (ctl->server.envskip || outlevel >= O_VERBOSE)
1877 printf(GT_(" Number of envelope headers to be skipped over: %d\n"),
1878 ctl->server.envskip);
1879 if (ctl->server.qvirtual)
1880 printf(GT_(" Prefix %s will be removed from user id\n"),
1881 ctl->server.qvirtual);
1882 else if (outlevel >= O_VERBOSE)
1883 printf(GT_(" No prefix stripping\n"));
1886 if (ctl->server.akalist)
1890 printf(GT_(" Predeclared mailserver aliases:"));
1891 for (idp = ctl->server.akalist; idp; idp = idp->next)
1892 printf(" %s", idp->id);
1895 if (ctl->server.localdomains)
1899 printf(GT_(" Local domains:"));
1900 for (idp = ctl->server.localdomains; idp; idp = idp->next)
1901 printf(" %s", idp->id);
1908 if (ctl->server.interface)
1909 printf(GT_(" Connection must be through interface %s.\n"), ctl->server.interface);
1910 else if (outlevel >= O_VERBOSE)
1911 printf(GT_(" No interface requirement specified.\n"));
1912 if (ctl->server.monitor)
1913 printf(GT_(" Polling loop will monitor %s.\n"), ctl->server.monitor);
1914 else if (outlevel >= O_VERBOSE)
1915 printf(GT_(" No monitor interface specified.\n"));
1918 if (ctl->server.plugin)
1919 printf(GT_(" Server connections will be made via plugin %s (--plugin %s).\n"), ctl->server.plugin, ctl->server.plugin);
1920 else if (outlevel >= O_VERBOSE)
1921 printf(GT_(" No plugin command specified.\n"));
1922 if (ctl->server.plugout)
1923 printf(GT_(" Listener connections will be made via plugout %s (--plugout %s).\n"), ctl->server.plugout, ctl->server.plugout);
1924 else if (outlevel >= O_VERBOSE)
1925 printf(GT_(" No plugout command specified.\n"));
1927 if (ctl->server.protocol > P_POP2 && MAILBOX_PROTOCOL(ctl))
1930 printf(GT_(" No UIDs saved from this host.\n"));
1936 for (idp = ctl->oldsaved; idp; idp = idp->next)
1939 printf(GT_(" %d UIDs saved.\n"), count);
1940 if (outlevel >= O_VERBOSE)
1941 for (idp = ctl->oldsaved; idp; idp = idp->next)
1942 printf("\t%s\n", idp->id);
1946 if (ctl->server.tracepolls)
1947 printf(GT_(" Poll trace information will be added to the Received header.\n"));
1948 else if (outlevel >= O_VERBOSE)
1949 printf(GT_(" No poll trace information will be added to the Received header.\n.\n"));
1951 if (ctl->properties)
1952 printf(GT_(" Pass-through properties \"%s\".\n"),
1953 visbuf(ctl->properties));
1957 /* fetchmail.c ends here */