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 #define ENETUNREACH 128 /* Interactive doesn't know this */
49 #endif /* ENETUNREACH */
51 /* prototypes for internal functions */
52 static int load_params(int, char **, int);
53 static void dump_params (struct runctl *runp, struct query *, flag implicit);
54 static int query_host(struct query *);
56 /* controls the detail level of status/progress messages written to stderr */
57 int outlevel; /* see the O_.* constants above */
59 /* miscellaneous global controls */
60 struct runctl run; /* global controls for this run */
61 flag nodetach; /* if TRUE, don't detach daemon process */
62 flag quitmode; /* if --quit was set */
63 int quitind; /* optind after position of last --quit option */
64 flag check_only; /* if --probe was set */
65 flag versioninfo; /* emit only version info */
66 char *user; /* the name of the invoking user */
67 char *home; /* invoking user's home directory */
68 char *fmhome; /* fetchmail's home directory */
69 char *program_name; /* the name to prefix error messages with */
70 flag configdump; /* dump control blocks for configurator */
71 char *fetchmailhost; /* either `localhost' or the host's FQDN */
73 static int quitonly; /* if we should quit after killing the running daemon */
75 static int querystatus; /* status of query */
76 static int successes; /* count number of successful polls */
77 static int activecount; /* count number of active entries */
78 static struct runctl cmd_run; /* global options set from command line */
79 static time_t parsetime; /* time of last parse */
81 static RETSIGTYPE terminate_run(int);
82 static RETSIGTYPE terminate_poll(int);
84 #if defined(__FreeBSD__) && defined(__FreeBSD_USE_KVM)
85 /* drop SGID kmem privileage until we need it */
86 static void dropprivs(void)
96 if (gr && !strcmp(gr->gr_name, "kmem"))
98 extern void interface_set_gids(gid_t egid, gid_t rgid);
99 interface_set_gids(egid, rgid);
105 #if defined(HAVE_SETLOCALE) && defined(ENABLE_NLS) && defined(HAVE_STRFTIME)
107 /** returns timestamp in current locale,
108 * and resets LC_TIME locale to POSIX. */
109 static char *timestamp (void)
112 static char buf[60]; /* RATS: ignore */
115 setlocale (LC_TIME, "");
116 strftime (buf, sizeof (buf), "%c", localtime(&now));
117 setlocale (LC_TIME, "C");
121 #define timestamp rfc822timestamp
124 static RETSIGTYPE donothing(int sig)
126 set_signal_handler(sig, donothing);
130 static void printcopyright(FILE *fp) {
131 fprintf(fp, GT_("Copyright (C) 2002, 2003 Eric S. Raymond\n"
132 "Copyright (C) 2004 Matthias Andree, Eric S. Raymond, Rob F. Funk, Graham Wilson\n"
133 "Copyright (C) 2005-2006 Matthias Andree, Sunil Shetye\n"
135 fprintf(fp, GT_("Fetchmail comes with ABSOLUTELY NO WARRANTY. This is free software, and you\n"
136 "are welcome to redistribute it under certain conditions. For details,\n"
137 "please see the file COPYING in the source or documentation directory.\n"));
140 const char *iana_charset;
142 int main(int argc, char **argv)
145 int implicitmode = FALSE;
147 netrc_entry *netrc_list;
148 char *netrc_file, *tmpbuf;
152 #if defined(__FreeBSD__) && defined(__FreeBSD_USE_KVM)
156 envquery(argc, argv);
158 setlocale (LC_ALL, "");
159 bindtextdomain(PACKAGE, LOCALEDIR);
161 iana_charset = norm_charmap(nl_langinfo(CODESET)); /* normalize local
165 iana_charset = "US-ASCII";
169 report(stderr, GT_("WARNING: Running as root is discouraged.\n"));
173 * Note: because we can't initialize reporting before we know whether
174 * syslog is supposed to be on, this message will go to stdout and
175 * be lost when running in background.
177 if (outlevel >= O_VERBOSE)
181 report(stdout, GT_("fetchmail: invoked with"));
182 for (i = 0; i < argc; i++)
183 report(stdout, " %s", argv[i]);
184 report(stdout, "\n");
187 #define IDFILE_NAME ".fetchids"
188 run.idfile = prependdir (IDFILE_NAME, fmhome);
193 * We used to arrange for the lock to be removed on exit close
194 * to where the lock was asserted. Now we need to do it here, because
195 * we might have re-executed in background with an existing lock
196 * as the result of a changed rcfile (see the code near the execvp(3)
197 * call near the beginning of the polling loop for details). We want
198 * to be sure the lock gets nuked on any error exit, basically.
203 /* save the current directory */
204 if (getcwd (currentwd, sizeof (currentwd)) == NULL) {
205 report(stderr, GT_("could not get current working directory\n"));
213 i = parsecmdline(argc, argv, &cmd_run, &cmd_opts);
217 if (quitmode && quitind == argc)
223 const char *features =
226 #endif /* POP2_ENABLE */
229 #endif /* POP3_ENABLE */
232 #endif /* IMAP_ENABLE */
238 #endif /* RPA_ENABLE */
241 #endif /* NTLM_ENABLE */
244 #endif /* SDPS_ENABLE */
247 #endif /* ETRN_ENABLE */
250 #endif /* ODMR_ENABLE */
256 #endif /* OPIE_ENABLE */
257 #ifdef HAVE_PKG_hesiod
262 #endif /* HAVE_SOCKS */
265 #endif /* ENABLE_NLS */
267 printf(GT_("This is fetchmail release %s"), VERSION);
268 fputs(features, stdout);
270 printcopyright(stdout);
272 fputs("Fallback MDA: ", stdout);
274 fputs(FALLBACK_MDA, stdout);
276 fputs("(none)", stdout);
281 /* this is an attempt to help remote debugging */
285 /* avoid parsing the config file if all we're doing is killing a daemon */
287 implicitmode = load_params(argc, argv, optind);
289 #if defined(HAVE_SYSLOG)
290 /* logging should be set up early in case we were restarted from exec */
293 #if defined(LOG_MAIL)
294 openlog(program_name, LOG_PID, LOG_MAIL);
296 /* Assume BSD4.2 openlog with two arguments */
297 openlog(program_name, LOG_PID);
303 report_init((run.poll_interval == 0 || nodetach) && !run.logfile);
306 /* initialize UID handling */
310 if (!versioninfo && (st = prc_filecheck(run.idfile, !versioninfo)) != 0)
313 initialize_saved_lists(querylist, run.idfile);
315 #endif /* POP3_ENABLE */
317 /* construct the lockfile */
320 #ifdef HAVE_SETRLIMIT
322 * Before getting passwords, disable core dumps unless -v -d0 mode is on.
323 * Core dumps could otherwise contain passwords to be scavenged by a
326 if (outlevel < O_VERBOSE || run.poll_interval > 0)
328 struct rlimit corelimit;
329 corelimit.rlim_cur = 0;
330 corelimit.rlim_max = 0;
331 setrlimit(RLIMIT_CORE, &corelimit);
333 #endif /* HAVE_SETRLIMIT */
335 #define NETRC_FILE ".netrc"
336 /* parse the ~/.netrc file (if present) for future password lookups. */
337 netrc_file = prependdir (NETRC_FILE, home);
338 netrc_list = parse_netrc(netrc_file);
342 /* pick up passwords where we can */
343 for (ctl = querylist; ctl; ctl = ctl->next)
345 if (ctl->active && !(implicitmode && ctl->server.skip)&&!ctl->password)
347 if (NO_PASSWORD(ctl))
348 /* Server won't care what the password is, but there
349 must be some non-null string here. */
350 ctl->password = ctl->remotename;
355 /* look up the pollname and account in the .netrc file. */
356 p = search_netrc(netrc_list,
357 ctl->server.pollname, ctl->remotename);
358 /* if we find a matching entry with a password, use it */
359 if (p && p->password)
360 ctl->password = xstrdup(p->password);
362 /* otherwise try with "via" name if there is one */
363 else if (ctl->server.via)
365 p = search_netrc(netrc_list,
366 ctl->server.via, ctl->remotename);
367 if (p && p->password)
368 ctl->password = xstrdup(p->password);
374 free_netrc(netrc_list);
377 /* perhaps we just want to check options? */
380 int havercfile = access(rcfile, 0);
382 printf(GT_("Taking options from command line%s%s\n"),
383 havercfile ? "" : GT_(" and "),
384 havercfile ? "" : rcfile);
386 if (querylist == NULL)
388 GT_("No mailservers set up -- perhaps %s is missing?\n"),
391 dump_params(&run, querylist, implicitmode);
395 /* dump options as a Python dictionary, for configurator use */
398 dump_config(&run, querylist);
402 /* check for another fetchmail running concurrently */
405 pid = bkgd ? -pid : pid;
407 /* if no mail servers listed and nothing in background, we're done */
408 if (!quitonly && pid == 0 && querylist == NULL) {
409 (void)fputs(GT_("fetchmail: no mailservers have been specified.\n"),stderr);
413 /* perhaps user asked us to kill the other fetchmail */
416 if (pid == 0 || pid == getpid())
417 /* this test enables re-execing on a changed rcfile
418 * for pid == getpid() */
421 fprintf(stderr,GT_("fetchmail: no other fetchmail is running\n"));
425 else if (kill(pid, SIGTERM) < 0)
427 fprintf(stderr,GT_("fetchmail: error killing %s fetchmail at %d; bailing out.\n"),
428 bkgd ? GT_("background") : GT_("foreground"), pid);
435 if (outlevel > O_SILENT)
436 fprintf(stderr,GT_("fetchmail: %s fetchmail at %d killed.\n"),
437 bkgd ? GT_("background") : GT_("foreground"), pid);
438 /* We used to nuke the other process's lock here, with
439 * fm_lock_release(), which is broken. The other process
440 * needs to clear its lock by itself. */
444 /* wait for other process to exit */
445 maxwait = 10; /* seconds */
446 while (kill(pid, 0) == 0 && --maxwait >= 0) {
453 /* another fetchmail is running -- wake it up or die */
459 GT_("fetchmail: can't check mail while another fetchmail to same host is running.\n"));
462 else if (!implicitmode)
465 GT_("fetchmail: can't poll specified hosts with another fetchmail running at %d.\n"),
472 GT_("fetchmail: another foreground fetchmail is running at %d.\n"),
476 else if (getpid() == pid)
477 /* this test enables re-execing on a changed rcfile */
482 GT_("fetchmail: can't accept options while a background fetchmail is running.\n"));
485 else if (kill(pid, SIGUSR1) == 0)
488 GT_("fetchmail: background fetchmail at %d awakened.\n"),
495 * Should never happen -- possible only if a background fetchmail
496 * croaks after the first kill probe above but before the
497 * SIGUSR1/SIGHUP transmission.
500 GT_("fetchmail: elder sibling at %d died mysteriously.\n"),
502 return(PS_UNDEFINED);
506 /* pick up interactively any passwords we need but don't have */
507 for (ctl = querylist; ctl; ctl = ctl->next)
509 if (ctl->active && !(implicitmode && ctl->server.skip)
510 && !NO_PASSWORD(ctl) && !ctl->password)
515 GT_("fetchmail: can't find a password for %s@%s.\n"),
516 ctl->remotename, ctl->server.pollname);
519 const char* password_prompt = GT_("Enter password for %s@%s: ");
520 size_t pplen = strlen(password_prompt) + strlen(ctl->remotename) + strlen(ctl->server.pollname) + 1;
522 tmpbuf = xmalloc(pplen);
523 snprintf(tmpbuf, pplen, password_prompt,
524 ctl->remotename, ctl->server.pollname);
525 ctl->password = xstrdup((char *)fm_getpassword(tmpbuf));
532 * Time to initiate the SOCKS library (this is not mandatory: it just
533 * registers the correct application name for logging purpose. If you
534 * have some problem, comment out these lines).
537 SOCKSinit("fetchmail");
538 #endif /* HAVE_SOCKS */
540 /* avoid zombies from plugins */
544 * Maybe time to go to demon mode...
546 if (run.poll_interval)
549 daemonize(run.logfile, terminate_run);
550 report(stdout, GT_("starting fetchmail %s daemon \n"), VERSION);
553 * We'll set up a handler for these when we're sleeping,
554 * but ignore them otherwise so as not to interrupt a poll.
556 set_signal_handler(SIGUSR1, SIG_IGN);
557 if (run.poll_interval && getuid() == ROOT_UID)
558 set_signal_handler(SIGHUP, SIG_IGN);
562 if (run.logfile && !nodetach && access(run.logfile, F_OK) == 0)
564 if (!freopen(run.logfile, "a", stdout))
565 report(stderr, GT_("could not open %s to append logs to \n"), run.logfile);
566 if (!freopen(run.logfile, "a", stderr))
567 report(stdout, GT_("could not open %s to append logs to \n"), run.logfile);
573 /* beyond here we don't want more than one fetchmail running per user */
575 set_signal_handler(SIGABRT, terminate_run);
576 set_signal_handler(SIGINT, terminate_run);
577 set_signal_handler(SIGTERM, terminate_run);
578 set_signal_handler(SIGALRM, terminate_run);
579 set_signal_handler(SIGPIPE, terminate_run);
580 set_signal_handler(SIGQUIT, terminate_run);
582 /* here's the exclusion lock */
586 * Query all hosts. If there's only one, the error return will
587 * reflect the status of that transaction.
591 * Check to see if the rcfile has been touched. If so,
592 * re-exec so the file will be reread. Doing it this way
593 * avoids all the complications of trying to deallocate the
594 * in-core control structures -- and the potential memory
599 if (stat(rcfile, &rcstat) == -1)
603 GT_("couldn't time-check %s (error %d)\n"),
606 else if (rcstat.st_mtime > parsetime)
608 report(stdout, GT_("restarting fetchmail (%s changed)\n"), rcfile);
611 /* restore the startup directory */
612 if (!currentwd[0] || chdir (currentwd) == -1)
613 report(stderr, GT_("attempt to re-exec may fail as directory has not been restored\n"));
617 * Matthias Andree: Isn't this prone to introduction of
618 * "false" programs by interfering with PATH? Those
619 * path-searching execs might not be the best ideas for
622 * Rob Funk: But is there any way for someone to modify
623 * the PATH variable of a running fetchmail? I don't know
626 * Dave's change makes fetchmail restart itself in exactly
627 * the way it was started from the shell (or shell script)
628 * in the first place. If you're concerned about PATH
629 * contamination, call fetchmail initially with a full
630 * path, and use Dave's patch.
632 * Not using a -p variant of exec means that the restart
633 * will break if both (a) the user depended on PATH to
634 * call fetchmail in the first place, and (b) the system
635 * doesn't save the whole path in argv[0] if the whole
636 * path wasn't used in the initial call. (If I recall
637 * correctly, Linux saves it but many other Unices don't.)
639 execvp(argv[0], argv);
640 report(stderr, GT_("attempt to re-exec fetchmail failed\n"));
643 #if defined(HAVE_RES_SEARCH) && defined(USE_TCPIP_FOR_DNS)
645 * This was an efficiency hack that backfired. The theory
646 * was that using TCP/IP for DNS queries would get us better
647 * reliability and shave off some per-UDP-packet costs.
648 * Unfortunately it interacted badly with diald, which effectively
649 * filters out DNS queries over TCP/IP for reasons having to do
650 * with some obscure Linux kernel problem involving bootstrapping of
651 * dynamically-addressed links. I don't understand this mess
652 * and don't want to, so it's "See ya!" to this hack.
654 sethostent(TRUE); /* use TCP/IP for mailserver queries */
655 #endif /* HAVE_RES_SEARCH */
659 for (ctl = querylist; ctl; ctl = ctl->next)
663 if (!(implicitmode && ctl->server.skip))
668 GT_("poll of %s skipped (failed authentication or too many timeouts)\n"),
669 ctl->server.pollname);
673 /* check skip interval first so that it counts all polls */
674 if (run.poll_interval && ctl->server.interval)
676 if (ctl->server.poll_count++ % ctl->server.interval)
678 if (outlevel >= O_VERBOSE)
680 GT_("interval not reached, not querying %s\n"),
681 ctl->server.pollname);
688 * Don't do monitoring if we were woken by a signal.
689 * Note that interface_approve() does its own error logging.
691 if (!interface_approve(&ctl->server, !lastsig))
693 #endif /* CAN_MONITOR */
695 dofastuidl = 0; /* this is reset in the driver if required */
697 querystatus = query_host(ctl);
699 if (NUM_NONZERO(ctl->fastuidl))
700 ctl->fastuidlcount = (ctl->fastuidlcount + 1) % ctl->fastuidl;
702 /* leave the UIDL state alone if there have been any errors */
704 ((querystatus==PS_SUCCESS) || (querystatus==PS_NOMAIL) || (querystatus==PS_MAXFETCH)))
707 uid_discard_new_list(ctl);
709 #endif /* POP3_ENABLE */
711 if (querystatus == PS_SUCCESS)
713 else if (!check_only &&
714 ((querystatus!=PS_NOMAIL) || (outlevel==O_DEBUG)))
718 report(stdout,GT_("Query status=0 (SUCCESS)\n"));break;
720 report(stdout,GT_("Query status=1 (NOMAIL)\n")); break;
722 report(stdout,GT_("Query status=2 (SOCKET)\n")); break;
724 report(stdout,GT_("Query status=3 (AUTHFAIL)\n"));break;
726 report(stdout,GT_("Query status=4 (PROTOCOL)\n"));break;
728 report(stdout,GT_("Query status=5 (SYNTAX)\n")); break;
730 report(stdout,GT_("Query status=6 (IOERR)\n")); break;
732 report(stdout,GT_("Query status=7 (ERROR)\n")); break;
734 report(stdout,GT_("Query status=8 (EXCLUDE)\n")); break;
736 report(stdout,GT_("Query status=9 (LOCKBUSY)\n"));break;
738 report(stdout,GT_("Query status=10 (SMTP)\n")); break;
740 report(stdout,GT_("Query status=11 (DNS)\n")); break;
742 report(stdout,GT_("Query status=12 (BSMTP)\n")); break;
744 report(stdout,GT_("Query status=13 (MAXFETCH)\n"));break;
746 report(stdout,GT_("Query status=%d\n"),querystatus);
751 if (ctl->server.monitor)
754 * Allow some time for the link to quiesce. One
755 * second is usually sufficient, three is safe.
756 * Note: this delay is important - don't remove!
759 interface_note_activity(&ctl->server);
761 #endif /* CAN_MONITOR */
765 #if defined(HAVE_RES_SEARCH) && defined(USE_TCPIP_FOR_DNS)
766 endhostent(); /* release TCP/IP connection to nameserver */
767 #endif /* HAVE_RES_SEARCH */
769 /* close connections cleanly */
773 * OK, we've polled. Now sleep.
775 if (run.poll_interval)
778 * Because passwords can expire, it may happen that *all*
779 * hosts are now out of the loop due to authfail
780 * conditions. If this happens daemon-mode fetchmail
781 * should softly and silently vanish away, rather than
782 * spinning uselessly.
786 for (ctl = querylist; ctl; ctl = ctl->next)
787 if (ctl->active && !(implicitmode && ctl->server.skip))
792 report(stderr, GT_("All connections are wedged. Exiting.\n"));
793 /* FIXME: someday, send notification mail */
797 if (outlevel > O_SILENT)
799 GT_("sleeping at %s\n"), timestamp());
802 * With this simple hack, we make it possible for a foreground
803 * fetchmail to wake up one in daemon mode. What we want is the
804 * side effect of interrupting any sleep that may be going on,
805 * forcing fetchmail to re-poll its hosts. The second line is
806 * for people who think all system daemons wake up on SIGHUP.
808 set_signal_handler(SIGUSR1, donothing);
809 if (getuid() != ROOT_UID)
810 set_signal_handler(SIGHUP, donothing);
813 * OK, now pause until it's time for the next poll cycle.
814 * A nonzero return indicates we received a wakeup signal;
815 * unwedge all servers in case the problem has been
818 if ((lastsig = interruptible_idle(run.poll_interval)))
820 if (outlevel > O_SILENT)
821 #ifdef SYS_SIGLIST_DECLARED
823 GT_("awakened by %s\n"), sys_siglist[lastsig]);
826 GT_("awakened by signal %d\n"), lastsig);
828 for (ctl = querylist; ctl; ctl = ctl->next)
832 if (outlevel > O_SILENT)
833 report(stdout, GT_("awakened at %s\n"), timestamp());
838 if (outlevel >= O_VERBOSE)
839 report(stdout, GT_("normal termination, status %d\n"),
840 successes ? PS_SUCCESS : querystatus);
846 else if (querystatus)
849 /* in case we interrupted before a successful fetch */
853 static void list_merge(struct idlist **dstl, struct idlist **srcl, int force)
856 * If force is off, modify dstl fields only when they're empty (treat srcl
857 * as defaults). If force is on, modify each dstl field whenever scrcl
858 * is nonempty (treat srcl as an override).
860 if (force ? !!*srcl : !*dstl)
862 struct idlist *cpl = copy_str_list(*srcl);
864 append_str_list(dstl, &cpl);
868 static void optmerge(struct query *h2, struct query *h1, int force)
869 /* merge two options records */
871 list_merge(&h2->server.localdomains, &h1->server.localdomains, force);
872 list_merge(&h2->localnames, &h1->localnames, force);
873 list_merge(&h2->mailboxes, &h1->mailboxes, force);
874 list_merge(&h2->smtphunt, &h1->smtphunt, force);
875 list_merge(&h2->domainlist, &h1->domainlist, force);
876 list_merge(&h2->antispam, &h1->antispam, force);
878 #define FLAG_MERGE(fld) if (force ? !!h1->fld : !h2->fld) h2->fld = h1->fld
879 FLAG_MERGE(server.via);
880 FLAG_MERGE(server.protocol);
881 FLAG_MERGE(server.service);
882 FLAG_MERGE(server.interval);
883 FLAG_MERGE(server.authenticate);
884 FLAG_MERGE(server.timeout);
885 FLAG_MERGE(server.envelope);
886 FLAG_MERGE(server.envskip);
887 FLAG_MERGE(server.qvirtual);
888 FLAG_MERGE(server.skip);
889 FLAG_MERGE(server.dns);
890 FLAG_MERGE(server.checkalias);
891 FLAG_MERGE(server.uidl);
892 FLAG_MERGE(server.principal);
895 FLAG_MERGE(server.interface);
896 FLAG_MERGE(server.interface_pair);
897 FLAG_MERGE(server.monitor);
900 FLAG_MERGE(server.plugin);
901 FLAG_MERGE(server.plugout);
902 FLAG_MERGE(server.tracepolls);
904 FLAG_MERGE(wildcard);
905 FLAG_MERGE(remotename);
906 FLAG_MERGE(password);
909 FLAG_MERGE(listener);
910 FLAG_MERGE(smtpaddress);
911 FLAG_MERGE(smtpname);
912 FLAG_MERGE(preconnect);
913 FLAG_MERGE(postconnect);
917 FLAG_MERGE(limitflush);
918 FLAG_MERGE(fetchall);
922 FLAG_MERGE(pass8bits);
923 FLAG_MERGE(dropstatus);
924 FLAG_MERGE(dropdelivered);
925 FLAG_MERGE(mimedecode);
928 FLAG_MERGE(warnings);
929 FLAG_MERGE(fetchlimit);
930 FLAG_MERGE(fetchsizelimit);
931 FLAG_MERGE(fastuidl);
932 FLAG_MERGE(batchlimit);
937 FLAG_MERGE(sslproto);
938 FLAG_MERGE(sslcertck);
939 FLAG_MERGE(sslcertpath);
940 FLAG_MERGE(sslfingerprint);
944 FLAG_MERGE(properties);
948 /** Load configuration files.
949 * \return - true if no servers found on the command line
950 * - false if servers found on the command line */
951 static int load_params(int argc, char **argv, int optind)
953 int implicitmode, st;
955 struct query def_opts, *ctl;
959 run.bouncemail = TRUE;
960 run.spambounce = FALSE; /* don't bounce back to innocent bystanders */
962 memset(&def_opts, '\0', sizeof(struct query));
963 def_opts.smtp_socket = -1;
964 def_opts.smtpaddress = (char *)0;
965 def_opts.smtpname = (char *)0;
966 def_opts.server.protocol = P_AUTO;
967 def_opts.server.timeout = CLIENT_TIMEOUT;
968 def_opts.server.esmtp_name = user;
969 def_opts.warnings = WARNING_INTERVAL;
970 def_opts.remotename = user;
971 def_opts.listener = SMTP_MODE;
972 def_opts.fetchsizelimit = 100;
973 def_opts.fastuidl = 10;
975 /* get the location of rcfile */
977 p = strrchr (rcfile, '/');
978 if (p && (p - rcfile) < sizeof (rcfiledir)) {
979 *p = 0; /* replace '/' by '0' */
980 strlcpy (rcfiledir, rcfile, sizeof(rcfiledir));
981 *p = '/'; /* restore '/' */
982 if (!rcfiledir[0]) /* "/.fetchmailrc" case */
983 strcpy (rcfiledir, "/");
986 /* note the parse time, so we can pick up on modifications */
987 parsetime = 0; /* foil compiler warnings */
988 if (stat(rcfile, &rcstat) != -1)
989 parsetime = rcstat.st_mtime;
990 else if (errno != ENOENT)
991 report(stderr, GT_("couldn't time-check the run-control file\n"));
993 /* this builds the host list */
994 if ((st = prc_parse_file(rcfile, !versioninfo)) != 0)
996 * FIXME: someday, send notification mail here if backgrounded.
997 * Right now, that can happen if the user changes the rcfile
998 * while the fetchmail is running in background. Do similarly
999 * for the other exit() calls in this function.
1003 if ((implicitmode = (optind >= argc)))
1005 for (ctl = querylist; ctl; ctl = ctl->next)
1006 ctl->active = !ctl->server.skip;
1009 for (; optind < argc; optind++)
1011 flag predeclared = FALSE;
1014 * If hostname corresponds to a host known from the rc file,
1015 * simply declare it active. Otherwise synthesize a host
1016 * record from command line and defaults
1018 for (ctl = querylist; ctl; ctl = ctl->next)
1019 if (!strcmp(ctl->server.pollname, argv[optind])
1020 || str_in_list(&ctl->server.akalist, argv[optind], TRUE))
1022 /* Is this correct? */
1023 if (predeclared && outlevel >= O_VERBOSE)
1024 fprintf(stderr,GT_("Warning: multiple mentions of host %s in config file\n"),argv[optind]);
1032 * Allocate and link record without copying in
1033 * command-line args; we'll do that with the optmerge
1036 ctl = hostalloc((struct query *)NULL);
1038 ctl->server.pollname = xstrdup(argv[optind]);
1040 ctl->server.lead_server = (struct hostdata *)NULL;
1045 * If there's a defaults record, merge it and lose it.
1047 if (querylist && strcmp(querylist->server.pollname, "defaults") == 0)
1049 for (ctl = querylist->next; ctl; ctl = ctl->next)
1050 optmerge(ctl, querylist, FALSE);
1051 querylist = querylist->next;
1054 /* don't allow a defaults record after the first */
1055 for (ctl = querylist; ctl; ctl = ctl->next) {
1056 if (ctl != querylist && strcmp(ctl->server.pollname, "defaults") == 0) {
1057 fprintf(stderr, GT_("fetchmail: Error: multiple \"defaults\" records in config file.\n"));
1062 /* use localhost if we never fetch the FQDN of this host */
1063 fetchmailhost = "localhost";
1065 /* here's where we override globals */
1066 if (cmd_run.logfile)
1067 run.logfile = cmd_run.logfile;
1069 run.idfile = cmd_run.idfile;
1070 /* do this before the keep/fetchall test below, otherwise -d0 may fail */
1071 if (cmd_run.poll_interval >= 0)
1072 run.poll_interval = cmd_run.poll_interval;
1073 if (cmd_run.invisible)
1074 run.invisible = cmd_run.invisible;
1075 if (cmd_run.showdots)
1076 run.showdots = cmd_run.showdots;
1077 if (cmd_run.use_syslog)
1078 run.use_syslog = (cmd_run.use_syslog == FLAG_TRUE);
1079 if (cmd_run.postmaster)
1080 run.postmaster = cmd_run.postmaster;
1081 if (cmd_run.bouncemail)
1082 run.bouncemail = cmd_run.bouncemail;
1084 /* check and daemon options are not compatible */
1085 if (check_only && run.poll_interval)
1086 run.poll_interval = 0;
1089 * DNS support is required for some protocols. We used to
1090 * do this unconditionally, but it made fetchmail excessively
1091 * vulnerable to misconfigured DNS setups.
1093 * If we're using ETRN or ODMR, the smtp hunt list is the
1094 * list of systems we're polling on behalf of; these have
1095 * to be fully-qualified domain names. The default for
1096 * this list should be the FQDN of localhost.
1098 * If we're using Kerberos for authentication, we need
1099 * the FQDN in order to generate capability keys.
1101 for (ctl = querylist; ctl; ctl = ctl->next)
1103 (ctl->server.protocol==P_ETRN || ctl->server.protocol==P_ODMR
1104 || ctl->server.authenticate == A_KERBEROS_V4
1105 || ctl->server.authenticate == A_KERBEROS_V5))
1107 fetchmailhost = host_fqdn(1);
1111 if (!ctl) /* list exhausted */
1112 fetchmailhost = host_fqdn(0);
1114 /* this code enables flags to be turned off */
1115 #define DEFAULT(flag, dflt) if (flag == FLAG_TRUE)\
1117 else if (flag == FLAG_FALSE)\
1121 /* one global gets treated specially */
1122 DEFAULT(run.showdots, run.poll_interval==0 || nodetach);
1124 /* merge in wired defaults, do sanity checks and prepare internal fields */
1125 for (ctl = querylist; ctl; ctl = ctl->next)
1127 ctl->wedged = FALSE;
1129 /* merge in defaults */
1130 optmerge(ctl, &def_opts, FALSE);
1132 /* force command-line options */
1133 optmerge(ctl, &cmd_opts, TRUE);
1136 * queryname has to be set up for inactive servers too.
1137 * Otherwise the UIDL code core-dumps on startup.
1139 if (ctl->server.via)
1140 ctl->server.queryname = xstrdup(ctl->server.via);
1142 ctl->server.queryname = xstrdup(ctl->server.pollname);
1145 * We no longer do DNS lookups at startup.
1146 * This is a kluge. It enables users to edit their
1147 * configurations when DNS isn't available.
1149 ctl->server.truename = xstrdup(ctl->server.queryname);
1151 if (configdump || ctl->active )
1153 DEFAULT(ctl->keep, FALSE);
1154 DEFAULT(ctl->fetchall, FALSE);
1155 DEFAULT(ctl->flush, FALSE);
1156 DEFAULT(ctl->limitflush, FALSE);
1157 DEFAULT(ctl->rewrite, TRUE);
1158 DEFAULT(ctl->stripcr, (ctl->mda != (char *)NULL));
1159 DEFAULT(ctl->forcecr, FALSE);
1160 DEFAULT(ctl->pass8bits, FALSE);
1161 DEFAULT(ctl->dropstatus, FALSE);
1162 DEFAULT(ctl->dropdelivered, FALSE);
1163 DEFAULT(ctl->mimedecode, FALSE);
1164 DEFAULT(ctl->idle, FALSE);
1165 DEFAULT(ctl->server.dns, TRUE);
1166 DEFAULT(ctl->server.uidl, FALSE);
1167 DEFAULT(ctl->use_ssl, FALSE);
1168 DEFAULT(ctl->sslcertck, FALSE);
1169 DEFAULT(ctl->server.checkalias, FALSE);
1172 * XXX FIXME: do we need this check or can we rely on the .y
1173 * parser handling this?
1177 report(stderr, GT_("SSL support is not compiled in.\n"));
1180 #endif /* SSL_ENABLE */
1184 * Make sure we have a nonempty host list to forward to.
1187 save_str(&ctl->smtphunt, "localhost", FALSE);
1190 * Make sure we have a nonempty list of domains to fetch from.
1192 if ((ctl->server.protocol==P_ETRN || ctl->server.protocol==P_ODMR) && !ctl->domainlist)
1193 save_str(&ctl->domainlist, fetchmailhost, FALSE);
1195 /* if `user' doesn't name a real local user, try to run as root */
1196 if ((pw = getpwnam(user)) == (struct passwd *)NULL)
1199 ctl->uid = pw->pw_uid; /* for local delivery via MDA */
1200 if (!ctl->localnames) /* for local delivery via SMTP */
1201 save_str_pair(&ctl->localnames, user, NULL);
1203 #ifndef HAVE_RES_SEARCH
1204 /* can't handle multidrop mailboxes unless we can do DNS lookups */
1205 if (MULTIDROP(ctl) && ctl->server.dns)
1207 ctl->server.dns = FALSE;
1208 report(stderr, GT_("fetchmail: warning: no DNS available to check multidrop fetches from %s\n"), ctl->server.pollname);
1210 #endif /* !HAVE_RES_SEARCH */
1213 * can't handle multidrop mailboxes without "envelope"
1214 * option, this causes truckloads full of support complaints
1215 * "all mail forwarded to postmaster"
1217 if (MULTIDROP(ctl) && !ctl->server.envelope)
1219 report(stderr, GT_("warning: multidrop for %s requires envelope option!\n"), ctl->server.pollname);
1220 report(stderr, GT_("warning: Do not ask for support if all mail goes to postmaster!\n"));
1223 /* if no folders were specified, set up the null one as default */
1224 if (!ctl->mailboxes)
1225 save_str(&ctl->mailboxes, (char *)NULL, 0);
1227 /* maybe user overrode timeout on command line? */
1228 if (ctl->server.timeout == -1)
1229 ctl->server.timeout = CLIENT_TIMEOUT;
1232 if (ctl->server.service) {
1233 int port = servport(ctl->server.service);
1236 (void) fprintf(stderr,
1237 GT_("fetchmail: %s configuration invalid, specify positive port number for service or port\n"),
1238 ctl->server.pollname);
1241 if (ctl->server.protocol == P_RPOP && port >= 1024)
1243 (void) fprintf(stderr,
1244 GT_("fetchmail: %s configuration invalid, RPOP requires a privileged port\n"),
1245 ctl->server.pollname);
1249 if (ctl->listener == LMTP_MODE)
1253 for (idp = ctl->smtphunt; idp; idp = idp->next)
1257 if (!(cp = strrchr((char *)idp->id, '/'))
1258 || (0 == strcmp(cp + 1, SMTP_PORT))
1259 || servport(cp + 1) == SMTP_PORT_NUM)
1261 (void) fprintf(stderr,
1262 GT_("%s configuration invalid, LMTP can't use default SMTP port\n"),
1263 ctl->server.pollname);
1270 * "I beg to you, have mercy on the we[a]k minds like myself."
1271 * wrote Pehr Anderson. Your petition is granted.
1273 if (ctl->fetchall && ctl->keep && run.poll_interval && !nodetach && !configdump)
1275 (void) fprintf(stderr,
1276 GT_("Both fetchall and keep on in daemon mode is a mistake!\n"));
1282 * If the user didn't set a last-resort user to get misaddressed
1283 * multidrop mail, set an appropriate default here.
1285 if (!run.postmaster)
1287 if (getuid() != ROOT_UID) /* ordinary user */
1288 run.postmaster = user;
1290 run.postmaster = "postmaster";
1293 return(implicitmode);
1296 static RETSIGTYPE terminate_poll(int sig)
1297 /* to be executed at the end of a poll cycle */
1301 report(stdout, GT_("terminated with signal %d\n"), sig);
1305 * Update UID information at end of each poll, rather than at end
1306 * of run, because that way we don't lose all UIDL information since
1307 * the beginning of time if fetchmail crashes.
1310 write_saved_lists(querylist, run.idfile);
1311 #endif /* POP3_ENABLE */
1314 static RETSIGTYPE terminate_run(int sig)
1315 /* to be executed on normal or signal-induced termination */
1319 terminate_poll(sig);
1322 * Craig Metz, the RFC1938 one-time-password guy, points out:
1323 * "Remember that most kernels don't zero pages before handing them to the
1324 * next process and many kernels share pages between user and kernel space.
1325 * You'd be very surprised what you can find from a short program to do a
1326 * malloc() and then dump the contents of the pages you got. By zeroing
1327 * the secrets at end of run (earlier if you can), you make sure the next
1328 * guy can't get the password/pass phrase."
1330 * Right you are, Craig!
1332 for (ctl = querylist; ctl; ctl = ctl->next)
1334 memset(ctl->password, '\0', strlen(ctl->password));
1336 #if !defined(HAVE_ATEXIT)
1340 if (activecount == 0)
1343 exit(successes ? PS_SUCCESS : querystatus);
1347 * Sequence of protocols to try when autoprobing, most capable to least.
1349 static const int autoprobe[] =
1353 #endif /* IMAP_ENABLE */
1356 #endif /* POP3_ENABLE */
1359 #endif /* POP2_ENABLE */
1362 static int query_host(struct query *ctl)
1363 /* perform fetch transaction with single host */
1368 * If we're syslogging the progress messages are automatically timestamped.
1369 * Force timestamping if we're going to a logfile.
1371 if (outlevel >= O_VERBOSE)
1373 report(stdout, GT_("%s querying %s (protocol %s) at %s: poll started\n"),
1375 ctl->server.pollname,
1376 showproto(ctl->server.protocol),
1380 switch (ctl->server.protocol) {
1382 for (i = 0; i < sizeof(autoprobe)/sizeof(autoprobe[0]); i++)
1384 ctl->server.protocol = autoprobe[i];
1386 st = query_host(ctl);
1389 if (st == PS_SUCCESS || st == PS_NOMAIL || st == PS_AUTHFAIL || st == PS_LOCKBUSY || st == PS_SMTP || st == PS_MAXFETCH || st == PS_DNS)
1392 ctl->server.protocol = P_AUTO;
1398 report(stderr, GT_("POP2 support is not configured.\n"));
1400 #endif /* POP2_ENABLE */
1408 } while (st == PS_REPOLL);
1410 report(stderr, GT_("POP3 support is not configured.\n"));
1412 #endif /* POP3_ENABLE */
1418 } while (st == PS_REPOLL);
1420 report(stderr, GT_("IMAP support is not configured.\n"));
1422 #endif /* IMAP_ENABLE */
1426 report(stderr, GT_("ETRN support is not configured.\n"));
1431 #endif /* ETRN_ENABLE */
1434 report(stderr, GT_("ODMR support is not configured.\n"));
1438 #endif /* ODMR_ENABLE */
1441 report(stderr, GT_("unsupported protocol selected.\n"));
1446 * If we're syslogging the progress messages are automatically timestamped.
1447 * Force timestamping if we're going to a logfile.
1449 if (outlevel >= O_VERBOSE)
1451 report(stdout, GT_("%s querying %s (protocol %s) at %s: poll completed\n"),
1453 ctl->server.pollname,
1454 showproto(ctl->server.protocol),
1461 static void dump_params (struct runctl *runp,
1462 struct query *querylist, flag implicit)
1463 /* display query parameters in English */
1467 if (runp->poll_interval)
1468 printf(GT_("Poll interval is %d seconds\n"), runp->poll_interval);
1470 printf(GT_("Logfile is %s\n"), runp->logfile);
1471 if (strcmp(runp->idfile, IDFILE_NAME))
1472 printf(GT_("Idfile is %s\n"), runp->idfile);
1473 #if defined(HAVE_SYSLOG)
1474 if (runp->use_syslog)
1475 printf(GT_("Progress messages will be logged via syslog\n"));
1477 if (runp->invisible)
1478 printf(GT_("Fetchmail will masquerade and will not generate Received\n"));
1480 printf(GT_("Fetchmail will show progress dots even in logfiles.\n"));
1481 if (runp->postmaster)
1482 printf(GT_("Fetchmail will forward misaddressed multidrop messages to %s.\n"),
1485 if (!runp->bouncemail)
1486 printf(GT_("Fetchmail will direct error mail to the postmaster.\n"));
1487 else if (outlevel >= O_VERBOSE)
1488 printf(GT_("Fetchmail will direct error mail to the sender.\n"));
1490 for (ctl = querylist; ctl; ctl = ctl->next)
1492 if (!ctl->active || (implicit && ctl->server.skip))
1495 printf(GT_("Options for retrieving from %s@%s:\n"),
1496 ctl->remotename, visbuf(ctl->server.pollname));
1498 if (ctl->server.via && MAILBOX_PROTOCOL(ctl))
1499 printf(GT_(" Mail will be retrieved via %s\n"), ctl->server.via);
1501 if (ctl->server.interval)
1502 printf(ngettext(" Poll of this server will occur every %d interval.\n",
1503 " Poll of this server will occur every %d intervals.\n",
1504 ctl->server.interval), ctl->server.interval);
1505 if (ctl->server.truename)
1506 printf(GT_(" True name of server is %s.\n"), ctl->server.truename);
1507 if (ctl->server.skip || outlevel >= O_VERBOSE)
1508 printf(ctl->server.skip
1509 ? GT_(" This host will not be queried when no host is specified.\n")
1510 : GT_(" This host will be queried when no host is specified.\n"));
1511 if (!NO_PASSWORD(ctl))
1514 printf(GT_(" Password will be prompted for.\n"));
1515 else if (outlevel >= O_VERBOSE)
1517 if (ctl->server.protocol == P_APOP)
1518 printf(GT_(" APOP secret = \"%s\".\n"),
1519 visbuf(ctl->password));
1520 else if (ctl->server.protocol == P_RPOP)
1521 printf(GT_(" RPOP id = \"%s\".\n"),
1522 visbuf(ctl->password));
1524 printf(GT_(" Password = \"%s\".\n"),
1525 visbuf(ctl->password));
1529 if (ctl->server.protocol == P_POP3
1530 && ctl->server.service && !strcmp(ctl->server.service, KPOP_PORT)
1531 && (ctl->server.authenticate == A_KERBEROS_V4 ||
1532 ctl->server.authenticate == A_KERBEROS_V5))
1533 printf(GT_(" Protocol is KPOP with Kerberos %s authentication"),
1534 ctl->server.authenticate == A_KERBEROS_V5 ? "V" : "IV");
1536 printf(GT_(" Protocol is %s"), showproto(ctl->server.protocol));
1537 if (ctl->server.service)
1538 printf(GT_(" (using service %s)"), ctl->server.service);
1539 else if (outlevel >= O_VERBOSE)
1540 printf(GT_(" (using default port)"));
1541 if (ctl->server.uidl && MAILBOX_PROTOCOL(ctl))
1542 printf(GT_(" (forcing UIDL use)"));
1545 switch (ctl->server.authenticate)
1548 printf(GT_(" All available authentication methods will be tried.\n"));
1551 printf(GT_(" Password authentication will be forced.\n"));
1554 printf(GT_(" MSN authentication will be forced.\n"));
1557 printf(GT_(" NTLM authentication will be forced.\n"));
1560 printf(GT_(" OTP authentication will be forced.\n"));
1563 printf(GT_(" CRAM-Md5 authentication will be forced.\n"));
1566 printf(GT_(" GSSAPI authentication will be forced.\n"));
1569 printf(GT_(" Kerberos V4 authentication will be forced.\n"));
1572 printf(GT_(" Kerberos V5 authentication will be forced.\n"));
1575 printf(GT_(" End-to-end encryption assumed.\n"));
1578 if (ctl->server.principal != (char *) NULL)
1579 printf(GT_(" Mail service principal is: %s\n"), ctl->server.principal);
1582 printf(GT_(" SSL encrypted sessions enabled.\n"));
1584 printf(GT_(" SSL protocol: %s.\n"), ctl->sslproto);
1585 if (ctl->sslcertck) {
1586 printf(GT_(" SSL server certificate checking enabled.\n"));
1587 if (ctl->sslcertpath != NULL)
1588 printf(GT_(" SSL trusted certificate directory: %s\n"), ctl->sslcertpath);
1590 if (ctl->sslfingerprint != NULL)
1591 printf(GT_(" SSL key fingerprint (checked against the server key): %s\n"), ctl->sslfingerprint);
1593 if (ctl->server.timeout > 0)
1594 printf(GT_(" Server nonresponse timeout is %d seconds"), ctl->server.timeout);
1595 if (ctl->server.timeout == CLIENT_TIMEOUT)
1596 printf(GT_(" (default).\n"));
1600 if (MAILBOX_PROTOCOL(ctl))
1602 if (!ctl->mailboxes->id)
1603 printf(GT_(" Default mailbox selected.\n"));
1608 printf(GT_(" Selected mailboxes are:"));
1609 for (idp = ctl->mailboxes; idp; idp = idp->next)
1610 printf(" %s", (char *)idp->id);
1613 printf(ctl->fetchall
1614 ? GT_(" All messages will be retrieved (--all on).\n")
1615 : GT_(" Only new messages will be retrieved (--all off).\n"));
1617 ? GT_(" Fetched messages will be kept on the server (--keep on).\n")
1618 : GT_(" Fetched messages will not be kept on the server (--keep off).\n"));
1620 ? GT_(" Old messages will be flushed before message retrieval (--flush on).\n")
1621 : GT_(" Old messages will not be flushed before message retrieval (--flush off).\n"));
1622 printf(ctl->limitflush
1623 ? GT_(" Oversized messages will be flushed before message retrieval (--limitflush on).\n")
1624 : GT_(" Oversized messages will not be flushed before message retrieval (--limitflush off).\n"));
1626 ? GT_(" Rewrite of server-local addresses is enabled (--norewrite off).\n")
1627 : GT_(" Rewrite of server-local addresses is disabled (--norewrite on).\n"));
1629 ? GT_(" Carriage-return stripping is enabled (stripcr on).\n")
1630 : GT_(" Carriage-return stripping is disabled (stripcr off).\n"));
1632 ? GT_(" Carriage-return forcing is enabled (forcecr on).\n")
1633 : GT_(" Carriage-return forcing is disabled (forcecr off).\n"));
1634 printf(ctl->pass8bits
1635 ? GT_(" Interpretation of Content-Transfer-Encoding is disabled (pass8bits on).\n")
1636 : GT_(" Interpretation of Content-Transfer-Encoding is enabled (pass8bits off).\n"));
1637 printf(ctl->mimedecode
1638 ? GT_(" MIME decoding is enabled (mimedecode on).\n")
1639 : GT_(" MIME decoding is disabled (mimedecode off).\n"));
1641 ? GT_(" Idle after poll is enabled (idle on).\n")
1642 : GT_(" Idle after poll is disabled (idle off).\n"));
1643 printf(ctl->dropstatus
1644 ? GT_(" Nonempty Status lines will be discarded (dropstatus on)\n")
1645 : GT_(" Nonempty Status lines will be kept (dropstatus off)\n"));
1646 printf(ctl->dropdelivered
1647 ? GT_(" Delivered-To lines will be discarded (dropdelivered on)\n")
1648 : GT_(" Delivered-To lines will be kept (dropdelivered off)\n"));
1649 if (NUM_NONZERO(ctl->limit))
1651 if (NUM_NONZERO(ctl->limit))
1652 printf(GT_(" Message size limit is %d octets (--limit %d).\n"),
1653 ctl->limit, ctl->limit);
1654 else if (outlevel >= O_VERBOSE)
1655 printf(GT_(" No message size limit (--limit 0).\n"));
1656 if (run.poll_interval > 0)
1657 printf(GT_(" Message size warning interval is %d seconds (--warnings %d).\n"),
1658 ctl->warnings, ctl->warnings);
1659 else if (outlevel >= O_VERBOSE)
1660 printf(GT_(" Size warnings on every poll (--warnings 0).\n"));
1662 if (NUM_NONZERO(ctl->fetchlimit))
1663 printf(GT_(" Received-message limit is %d (--fetchlimit %d).\n"),
1664 ctl->fetchlimit, ctl->fetchlimit);
1665 else if (outlevel >= O_VERBOSE)
1666 printf(GT_(" No received-message limit (--fetchlimit 0).\n"));
1667 if (NUM_NONZERO(ctl->fetchsizelimit))
1668 printf(GT_(" Fetch message size limit is %d (--fetchsizelimit %d).\n"),
1669 ctl->fetchsizelimit, ctl->fetchsizelimit);
1670 else if (outlevel >= O_VERBOSE)
1671 printf(GT_(" No fetch message size limit (--fetchsizelimit 0).\n"));
1672 if (NUM_NONZERO(ctl->fastuidl) && MAILBOX_PROTOCOL(ctl))
1674 if (ctl->fastuidl == 1)
1675 printf(GT_(" Do binary search of UIDs during each poll (--fastuidl 1).\n"));
1677 printf(GT_(" Do binary search of UIDs during %d out of %d polls (--fastuidl %d).\n"), ctl->fastuidl - 1, ctl->fastuidl, ctl->fastuidl);
1679 else if (outlevel >= O_VERBOSE)
1680 printf(GT_(" Do linear search of UIDs during each poll (--fastuidl 0).\n"));
1681 if (NUM_NONZERO(ctl->batchlimit))
1682 printf(GT_(" SMTP message batch limit is %d.\n"), ctl->batchlimit);
1683 else if (outlevel >= O_VERBOSE)
1684 printf(GT_(" No SMTP message batch limit (--batchlimit 0).\n"));
1685 if (MAILBOX_PROTOCOL(ctl))
1687 if (NUM_NONZERO(ctl->expunge))
1688 printf(GT_(" Deletion interval between expunges forced to %d (--expunge %d).\n"), ctl->expunge, ctl->expunge);
1689 else if (outlevel >= O_VERBOSE)
1690 printf(GT_(" No forced expunges (--expunge 0).\n"));
1693 else /* ODMR or ETRN */
1697 printf(GT_(" Domains for which mail will be fetched are:"));
1698 for (idp = ctl->domainlist; idp; idp = idp->next)
1700 printf(" %s", (char *)idp->id);
1701 if (!idp->val.status.mark)
1702 printf(GT_(" (default)"));
1707 printf(GT_(" Messages will be appended to %s as BSMTP\n"), visbuf(ctl->bsmtp));
1708 else if (ctl->mda && MAILBOX_PROTOCOL(ctl))
1709 printf(GT_(" Messages will be delivered with \"%s\".\n"), visbuf(ctl->mda));
1716 printf(GT_(" Messages will be %cMTP-forwarded to:"),
1718 for (idp = ctl->smtphunt; idp; idp = idp->next)
1720 printf(" %s", (char *)idp->id);
1721 if (!idp->val.status.mark)
1722 printf(GT_(" (default)"));
1726 if (ctl->smtpaddress)
1727 printf(GT_(" Host part of MAIL FROM line will be %s\n"),
1730 printf(GT_(" Address to be put in RCPT TO lines shipped to SMTP will be %s\n"),
1733 if (MAILBOX_PROTOCOL(ctl))
1735 if (ctl->antispam != (struct idlist *)NULL)
1739 printf(GT_(" Recognized listener spam block responses are:"));
1740 for (idp = ctl->antispam; idp; idp = idp->next)
1741 printf(" %d", idp->val.status.num);
1744 else if (outlevel >= O_VERBOSE)
1745 printf(GT_(" Spam-blocking disabled\n"));
1747 if (ctl->preconnect)
1748 printf(GT_(" Server connection will be brought up with \"%s\".\n"),
1749 visbuf(ctl->preconnect));
1750 else if (outlevel >= O_VERBOSE)
1751 printf(GT_(" No pre-connection command.\n"));
1752 if (ctl->postconnect)
1753 printf(GT_(" Server connection will be taken down with \"%s\".\n"),
1754 visbuf(ctl->postconnect));
1755 else if (outlevel >= O_VERBOSE)
1756 printf(GT_(" No post-connection command.\n"));
1757 if (MAILBOX_PROTOCOL(ctl)) {
1758 if (!ctl->localnames)
1759 printf(GT_(" No localnames declared for this host.\n"));
1765 for (idp = ctl->localnames; idp; idp = idp->next)
1768 if (count > 1 || ctl->wildcard)
1769 printf(GT_(" Multi-drop mode: "));
1771 printf(GT_(" Single-drop mode: "));
1773 printf(ngettext("%d local name recognized.\n", "%d local names recognized.\n", count), count);
1774 if (outlevel >= O_VERBOSE)
1776 for (idp = ctl->localnames; idp; idp = idp->next)
1778 printf("\t%s -> %s\n", (char *)idp->id, (char *)idp->val.id2);
1780 printf("\t%s\n", (char *)idp->id);
1782 fputs("\t*\n", stdout);
1785 if (count > 1 || ctl->wildcard)
1787 printf(ctl->server.dns
1788 ? GT_(" DNS lookup for multidrop addresses is enabled.\n")
1789 : GT_(" DNS lookup for multidrop addresses is disabled.\n"));
1790 if (ctl->server.dns)
1792 if (ctl->server.checkalias)
1793 printf(GT_(" Server aliases will be compared with multidrop addresses by IP address.\n"));
1795 printf(GT_(" Server aliases will be compared with multidrop addresses by name.\n"));
1797 if (ctl->server.envelope == STRING_DISABLED)
1798 printf(GT_(" Envelope-address routing is disabled\n"));
1801 printf(GT_(" Envelope header is assumed to be: %s\n"),
1802 ctl->server.envelope ? ctl->server.envelope : "Received");
1803 if (ctl->server.envskip || outlevel >= O_VERBOSE)
1804 printf(GT_(" Number of envelope headers to be skipped over: %d\n"),
1805 ctl->server.envskip);
1806 if (ctl->server.qvirtual)
1807 printf(GT_(" Prefix %s will be removed from user id\n"),
1808 ctl->server.qvirtual);
1809 else if (outlevel >= O_VERBOSE)
1810 printf(GT_(" No prefix stripping\n"));
1813 if (ctl->server.akalist)
1817 printf(GT_(" Predeclared mailserver aliases:"));
1818 for (idp = ctl->server.akalist; idp; idp = idp->next)
1819 printf(" %s", (char *)idp->id);
1822 if (ctl->server.localdomains)
1826 printf(GT_(" Local domains:"));
1827 for (idp = ctl->server.localdomains; idp; idp = idp->next)
1828 printf(" %s", (char *)idp->id);
1835 if (ctl->server.interface)
1836 printf(GT_(" Connection must be through interface %s.\n"), ctl->server.interface);
1837 else if (outlevel >= O_VERBOSE)
1838 printf(GT_(" No interface requirement specified.\n"));
1839 if (ctl->server.monitor)
1840 printf(GT_(" Polling loop will monitor %s.\n"), ctl->server.monitor);
1841 else if (outlevel >= O_VERBOSE)
1842 printf(GT_(" No monitor interface specified.\n"));
1845 if (ctl->server.plugin)
1846 printf(GT_(" Server connections will be made via plugin %s (--plugin %s).\n"), ctl->server.plugin, ctl->server.plugin);
1847 else if (outlevel >= O_VERBOSE)
1848 printf(GT_(" No plugin command specified.\n"));
1849 if (ctl->server.plugout)
1850 printf(GT_(" Listener connections will be made via plugout %s (--plugout %s).\n"), ctl->server.plugout, ctl->server.plugout);
1851 else if (outlevel >= O_VERBOSE)
1852 printf(GT_(" No plugout command specified.\n"));
1854 if (ctl->server.protocol > P_POP2 && MAILBOX_PROTOCOL(ctl))
1857 printf(GT_(" No UIDs saved from this host.\n"));
1863 for (idp = ctl->oldsaved; idp; idp = idp->next)
1866 printf(GT_(" %d UIDs saved.\n"), count);
1867 if (outlevel >= O_VERBOSE)
1868 for (idp = ctl->oldsaved; idp; idp = idp->next)
1869 printf("\t%s\n", (char *)idp->id);
1873 if (ctl->server.tracepolls)
1874 printf(GT_(" Poll trace information will be added to the Received header.\n"));
1875 else if (outlevel >= O_VERBOSE)
1876 printf(GT_(" No poll trace information will be added to the Received header.\n.\n"));
1878 if (ctl->properties)
1879 printf(GT_(" Pass-through properties \"%s\".\n"),
1880 visbuf(ctl->properties));
1884 /* fetchmail.c ends here */