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 Matthias Andree, Sunil Shetye\n"
134 "Copyright (C) 2006 Matthias Andree\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);
305 /* construct the lockfile */
308 #ifdef HAVE_SETRLIMIT
310 * Before getting passwords, disable core dumps unless -v -d0 mode is on.
311 * Core dumps could otherwise contain passwords to be scavenged by a
314 if (outlevel < O_VERBOSE || run.poll_interval > 0)
316 struct rlimit corelimit;
317 corelimit.rlim_cur = 0;
318 corelimit.rlim_max = 0;
319 setrlimit(RLIMIT_CORE, &corelimit);
321 #endif /* HAVE_SETRLIMIT */
323 #define NETRC_FILE ".netrc"
324 /* parse the ~/.netrc file (if present) for future password lookups. */
325 netrc_file = prependdir (NETRC_FILE, home);
326 netrc_list = parse_netrc(netrc_file);
330 /* pick up passwords where we can */
331 for (ctl = querylist; ctl; ctl = ctl->next)
333 if (ctl->active && !(implicitmode && ctl->server.skip)&&!ctl->password)
335 if (NO_PASSWORD(ctl))
336 /* Server won't care what the password is, but there
337 must be some non-null string here. */
338 ctl->password = ctl->remotename;
343 /* look up the pollname and account in the .netrc file. */
344 p = search_netrc(netrc_list,
345 ctl->server.pollname, ctl->remotename);
346 /* if we find a matching entry with a password, use it */
347 if (p && p->password)
348 ctl->password = xstrdup(p->password);
350 /* otherwise try with "via" name if there is one */
351 else if (ctl->server.via)
353 p = search_netrc(netrc_list,
354 ctl->server.via, ctl->remotename);
355 if (p && p->password)
356 ctl->password = xstrdup(p->password);
362 free_netrc(netrc_list);
365 /* perhaps we just want to check options? */
368 int havercfile = access(rcfile, 0);
370 printf(GT_("Taking options from command line%s%s\n"),
371 havercfile ? "" : GT_(" and "),
372 havercfile ? "" : rcfile);
374 if (querylist == NULL)
376 GT_("No mailservers set up -- perhaps %s is missing?\n"),
379 dump_params(&run, querylist, implicitmode);
383 /* dump options as a Python dictionary, for configurator use */
386 dump_config(&run, querylist);
390 /* check for another fetchmail running concurrently */
393 pid = bkgd ? -pid : pid;
395 /* if no mail servers listed and nothing in background, we're done */
396 if (!quitonly && pid == 0 && querylist == NULL) {
397 (void)fputs(GT_("fetchmail: no mailservers have been specified.\n"),stderr);
401 /* perhaps user asked us to kill the other fetchmail */
404 if (pid == 0 || pid == getpid())
405 /* this test enables re-execing on a changed rcfile
406 * for pid == getpid() */
409 fprintf(stderr,GT_("fetchmail: no other fetchmail is running\n"));
413 else if (kill(pid, SIGTERM) < 0)
415 fprintf(stderr,GT_("fetchmail: error killing %s fetchmail at %d; bailing out.\n"),
416 bkgd ? GT_("background") : GT_("foreground"), pid);
423 if (outlevel > O_SILENT)
424 fprintf(stderr,GT_("fetchmail: %s fetchmail at %d killed.\n"),
425 bkgd ? GT_("background") : GT_("foreground"), pid);
426 /* We used to nuke the other process's lock here, with
427 * fm_lock_release(), which is broken. The other process
428 * needs to clear its lock by itself. */
432 /* wait for other process to exit */
433 maxwait = 10; /* seconds */
434 while (kill(pid, 0) == 0 && --maxwait >= 0) {
441 /* another fetchmail is running -- wake it up or die */
447 GT_("fetchmail: can't check mail while another fetchmail to same host is running.\n"));
450 else if (!implicitmode)
453 GT_("fetchmail: can't poll specified hosts with another fetchmail running at %d.\n"),
460 GT_("fetchmail: another foreground fetchmail is running at %d.\n"),
464 else if (getpid() == pid)
465 /* this test enables re-execing on a changed rcfile */
470 GT_("fetchmail: can't accept options while a background fetchmail is running.\n"));
473 else if (kill(pid, SIGUSR1) == 0)
476 GT_("fetchmail: background fetchmail at %d awakened.\n"),
483 * Should never happen -- possible only if a background fetchmail
484 * croaks after the first kill probe above but before the
485 * SIGUSR1/SIGHUP transmission.
488 GT_("fetchmail: elder sibling at %d died mysteriously.\n"),
490 return(PS_UNDEFINED);
494 /* pick up interactively any passwords we need but don't have */
495 for (ctl = querylist; ctl; ctl = ctl->next)
497 if (ctl->active && !(implicitmode && ctl->server.skip)
498 && !NO_PASSWORD(ctl) && !ctl->password)
503 GT_("fetchmail: can't find a password for %s@%s.\n"),
504 ctl->remotename, ctl->server.pollname);
507 const char* password_prompt = GT_("Enter password for %s@%s: ");
508 size_t pplen = strlen(password_prompt) + strlen(ctl->remotename) + strlen(ctl->server.pollname) + 1;
510 tmpbuf = xmalloc(pplen);
511 snprintf(tmpbuf, pplen, password_prompt,
512 ctl->remotename, ctl->server.pollname);
513 ctl->password = xstrdup((char *)fm_getpassword(tmpbuf));
520 * Time to initiate the SOCKS library (this is not mandatory: it just
521 * registers the correct application name for logging purpose. If you
522 * have some problem, comment out these lines).
525 SOCKSinit("fetchmail");
526 #endif /* HAVE_SOCKS */
528 /* avoid zombies from plugins */
532 * Maybe time to go to demon mode...
534 if (run.poll_interval)
537 daemonize(run.logfile, terminate_run);
538 report(stdout, GT_("starting fetchmail %s daemon \n"), VERSION);
541 * We'll set up a handler for these when we're sleeping,
542 * but ignore them otherwise so as not to interrupt a poll.
544 set_signal_handler(SIGUSR1, SIG_IGN);
545 if (run.poll_interval && getuid() == ROOT_UID)
546 set_signal_handler(SIGHUP, SIG_IGN);
550 if (run.logfile && !nodetach && access(run.logfile, F_OK) == 0)
552 if (!freopen(run.logfile, "a", stdout))
553 report(stderr, GT_("could not open %s to append logs to \n"), run.logfile);
554 if (!freopen(run.logfile, "a", stderr))
555 report(stdout, GT_("could not open %s to append logs to \n"), run.logfile);
561 /* beyond here we don't want more than one fetchmail running per user */
563 set_signal_handler(SIGABRT, terminate_run);
564 set_signal_handler(SIGINT, terminate_run);
565 set_signal_handler(SIGTERM, terminate_run);
566 set_signal_handler(SIGALRM, terminate_run);
567 set_signal_handler(SIGPIPE, terminate_run);
568 set_signal_handler(SIGQUIT, terminate_run);
570 /* here's the exclusion lock */
574 * Query all hosts. If there's only one, the error return will
575 * reflect the status of that transaction.
579 * Check to see if the rcfile has been touched. If so,
580 * re-exec so the file will be reread. Doing it this way
581 * avoids all the complications of trying to deallocate the
582 * in-core control structures -- and the potential memory
587 if (stat(rcfile, &rcstat) == -1)
591 GT_("couldn't time-check %s (error %d)\n"),
594 else if (rcstat.st_mtime > parsetime)
596 report(stdout, GT_("restarting fetchmail (%s changed)\n"), rcfile);
599 /* restore the startup directory */
600 if (!currentwd[0] || chdir (currentwd) == -1)
601 report(stderr, GT_("attempt to re-exec may fail as directory has not been restored\n"));
605 * Matthias Andree: Isn't this prone to introduction of
606 * "false" programs by interfering with PATH? Those
607 * path-searching execs might not be the best ideas for
610 * Rob Funk: But is there any way for someone to modify
611 * the PATH variable of a running fetchmail? I don't know
614 * Dave's change makes fetchmail restart itself in exactly
615 * the way it was started from the shell (or shell script)
616 * in the first place. If you're concerned about PATH
617 * contamination, call fetchmail initially with a full
618 * path, and use Dave's patch.
620 * Not using a -p variant of exec means that the restart
621 * will break if both (a) the user depended on PATH to
622 * call fetchmail in the first place, and (b) the system
623 * doesn't save the whole path in argv[0] if the whole
624 * path wasn't used in the initial call. (If I recall
625 * correctly, Linux saves it but many other Unices don't.)
627 execvp(argv[0], argv);
628 report(stderr, GT_("attempt to re-exec fetchmail failed\n"));
631 #if defined(HAVE_RES_SEARCH) && defined(USE_TCPIP_FOR_DNS)
633 * This was an efficiency hack that backfired. The theory
634 * was that using TCP/IP for DNS queries would get us better
635 * reliability and shave off some per-UDP-packet costs.
636 * Unfortunately it interacted badly with diald, which effectively
637 * filters out DNS queries over TCP/IP for reasons having to do
638 * with some obscure Linux kernel problem involving bootstrapping of
639 * dynamically-addressed links. I don't understand this mess
640 * and don't want to, so it's "See ya!" to this hack.
642 sethostent(TRUE); /* use TCP/IP for mailserver queries */
643 #endif /* HAVE_RES_SEARCH */
647 for (ctl = querylist; ctl; ctl = ctl->next)
651 if (!(implicitmode && ctl->server.skip))
656 GT_("poll of %s skipped (failed authentication or too many timeouts)\n"),
657 ctl->server.pollname);
661 /* check skip interval first so that it counts all polls */
662 if (run.poll_interval && ctl->server.interval)
664 if (ctl->server.poll_count++ % ctl->server.interval)
666 if (outlevel >= O_VERBOSE)
668 GT_("interval not reached, not querying %s\n"),
669 ctl->server.pollname);
676 * Don't do monitoring if we were woken by a signal.
677 * Note that interface_approve() does its own error logging.
679 if (!interface_approve(&ctl->server, !lastsig))
681 #endif /* CAN_MONITOR */
683 dofastuidl = 0; /* this is reset in the driver if required */
685 querystatus = query_host(ctl);
687 if (NUM_NONZERO(ctl->fastuidl))
688 ctl->fastuidlcount = (ctl->fastuidlcount + 1) % ctl->fastuidl;
690 /* leave the UIDL state alone if there have been any errors */
692 ((querystatus==PS_SUCCESS) || (querystatus==PS_NOMAIL) || (querystatus==PS_MAXFETCH)))
695 uid_discard_new_list(ctl);
697 #endif /* POP3_ENABLE */
699 if (querystatus == PS_SUCCESS)
701 else if (!check_only &&
702 ((querystatus!=PS_NOMAIL) || (outlevel==O_DEBUG)))
706 report(stdout,GT_("Query status=0 (SUCCESS)\n"));break;
708 report(stdout,GT_("Query status=1 (NOMAIL)\n")); break;
710 report(stdout,GT_("Query status=2 (SOCKET)\n")); break;
712 report(stdout,GT_("Query status=3 (AUTHFAIL)\n"));break;
714 report(stdout,GT_("Query status=4 (PROTOCOL)\n"));break;
716 report(stdout,GT_("Query status=5 (SYNTAX)\n")); break;
718 report(stdout,GT_("Query status=6 (IOERR)\n")); break;
720 report(stdout,GT_("Query status=7 (ERROR)\n")); break;
722 report(stdout,GT_("Query status=8 (EXCLUDE)\n")); break;
724 report(stdout,GT_("Query status=9 (LOCKBUSY)\n"));break;
726 report(stdout,GT_("Query status=10 (SMTP)\n")); break;
728 report(stdout,GT_("Query status=11 (DNS)\n")); break;
730 report(stdout,GT_("Query status=12 (BSMTP)\n")); break;
732 report(stdout,GT_("Query status=13 (MAXFETCH)\n"));break;
734 report(stdout,GT_("Query status=%d\n"),querystatus);
739 if (ctl->server.monitor)
742 * Allow some time for the link to quiesce. One
743 * second is usually sufficient, three is safe.
744 * Note: this delay is important - don't remove!
747 interface_note_activity(&ctl->server);
749 #endif /* CAN_MONITOR */
753 #if defined(HAVE_RES_SEARCH) && defined(USE_TCPIP_FOR_DNS)
754 endhostent(); /* release TCP/IP connection to nameserver */
755 #endif /* HAVE_RES_SEARCH */
757 /* close connections cleanly */
761 * OK, we've polled. Now sleep.
763 if (run.poll_interval)
766 * Because passwords can expire, it may happen that *all*
767 * hosts are now out of the loop due to authfail
768 * conditions. If this happens daemon-mode fetchmail
769 * should softly and silently vanish away, rather than
770 * spinning uselessly.
774 for (ctl = querylist; ctl; ctl = ctl->next)
775 if (ctl->active && !(implicitmode && ctl->server.skip))
780 report(stderr, GT_("All connections are wedged. Exiting.\n"));
781 /* FIXME: someday, send notification mail */
785 if (outlevel > O_SILENT)
787 GT_("sleeping at %s\n"), timestamp());
790 * With this simple hack, we make it possible for a foreground
791 * fetchmail to wake up one in daemon mode. What we want is the
792 * side effect of interrupting any sleep that may be going on,
793 * forcing fetchmail to re-poll its hosts. The second line is
794 * for people who think all system daemons wake up on SIGHUP.
796 set_signal_handler(SIGUSR1, donothing);
797 if (getuid() != ROOT_UID)
798 set_signal_handler(SIGHUP, donothing);
801 * OK, now pause until it's time for the next poll cycle.
802 * A nonzero return indicates we received a wakeup signal;
803 * unwedge all servers in case the problem has been
806 if ((lastsig = interruptible_idle(run.poll_interval)))
808 if (outlevel > O_SILENT)
809 #ifdef SYS_SIGLIST_DECLARED
811 GT_("awakened by %s\n"), sys_siglist[lastsig]);
814 GT_("awakened by signal %d\n"), lastsig);
816 for (ctl = querylist; ctl; ctl = ctl->next)
820 if (outlevel > O_SILENT)
821 report(stdout, GT_("awakened at %s\n"), timestamp());
826 if (outlevel >= O_VERBOSE)
827 report(stdout, GT_("normal termination, status %d\n"),
828 successes ? PS_SUCCESS : querystatus);
834 else if (querystatus)
837 /* in case we interrupted before a successful fetch */
841 static void list_merge(struct idlist **dstl, struct idlist **srcl, int force)
844 * If force is off, modify dstl fields only when they're empty (treat srcl
845 * as defaults). If force is on, modify each dstl field whenever scrcl
846 * is nonempty (treat srcl as an override).
848 if (force ? !!*srcl : !*dstl)
850 struct idlist *cpl = copy_str_list(*srcl);
852 append_str_list(dstl, &cpl);
856 static void optmerge(struct query *h2, struct query *h1, int force)
857 /* merge two options records */
859 list_merge(&h2->server.localdomains, &h1->server.localdomains, force);
860 list_merge(&h2->localnames, &h1->localnames, force);
861 list_merge(&h2->mailboxes, &h1->mailboxes, force);
862 list_merge(&h2->smtphunt, &h1->smtphunt, force);
863 list_merge(&h2->domainlist, &h1->domainlist, force);
864 list_merge(&h2->antispam, &h1->antispam, force);
866 #define FLAG_MERGE(fld) if (force ? !!h1->fld : !h2->fld) h2->fld = h1->fld
867 FLAG_MERGE(server.via);
868 FLAG_MERGE(server.protocol);
869 FLAG_MERGE(server.service);
870 FLAG_MERGE(server.interval);
871 FLAG_MERGE(server.authenticate);
872 FLAG_MERGE(server.timeout);
873 FLAG_MERGE(server.envelope);
874 FLAG_MERGE(server.envskip);
875 FLAG_MERGE(server.qvirtual);
876 FLAG_MERGE(server.skip);
877 FLAG_MERGE(server.dns);
878 FLAG_MERGE(server.checkalias);
879 FLAG_MERGE(server.uidl);
880 FLAG_MERGE(server.principal);
883 FLAG_MERGE(server.interface);
884 FLAG_MERGE(server.interface_pair);
885 FLAG_MERGE(server.monitor);
888 FLAG_MERGE(server.plugin);
889 FLAG_MERGE(server.plugout);
890 FLAG_MERGE(server.tracepolls);
892 FLAG_MERGE(wildcard);
893 FLAG_MERGE(remotename);
894 FLAG_MERGE(password);
897 FLAG_MERGE(listener);
898 FLAG_MERGE(smtpaddress);
899 FLAG_MERGE(smtpname);
900 FLAG_MERGE(preconnect);
901 FLAG_MERGE(postconnect);
905 FLAG_MERGE(limitflush);
906 FLAG_MERGE(fetchall);
910 FLAG_MERGE(pass8bits);
911 FLAG_MERGE(dropstatus);
912 FLAG_MERGE(dropdelivered);
913 FLAG_MERGE(mimedecode);
916 FLAG_MERGE(warnings);
917 FLAG_MERGE(fetchlimit);
918 FLAG_MERGE(fetchsizelimit);
919 FLAG_MERGE(fastuidl);
920 FLAG_MERGE(batchlimit);
925 FLAG_MERGE(sslproto);
926 FLAG_MERGE(sslcertck);
927 FLAG_MERGE(sslcertpath);
928 FLAG_MERGE(sslfingerprint);
932 FLAG_MERGE(properties);
936 /** Load configuration files.
937 * \return - true if no servers found on the command line
938 * - false if servers found on the command line */
939 static int load_params(int argc, char **argv, int optind)
941 int implicitmode, st;
943 struct query def_opts, *ctl;
947 run.bouncemail = TRUE;
948 run.spambounce = FALSE; /* don't bounce back to innocent bystanders */
950 memset(&def_opts, '\0', sizeof(struct query));
951 def_opts.smtp_socket = -1;
952 def_opts.smtpaddress = (char *)0;
953 def_opts.smtpname = (char *)0;
954 def_opts.server.protocol = P_AUTO;
955 def_opts.server.timeout = CLIENT_TIMEOUT;
956 def_opts.server.esmtp_name = user;
957 def_opts.warnings = WARNING_INTERVAL;
958 def_opts.remotename = user;
959 def_opts.listener = SMTP_MODE;
960 def_opts.fetchsizelimit = 100;
961 def_opts.fastuidl = 10;
963 /* get the location of rcfile */
965 p = strrchr (rcfile, '/');
966 if (p && (p - rcfile) < sizeof (rcfiledir)) {
967 *p = 0; /* replace '/' by '0' */
968 strlcpy (rcfiledir, rcfile, sizeof(rcfiledir));
969 *p = '/'; /* restore '/' */
970 if (!rcfiledir[0]) /* "/.fetchmailrc" case */
971 strcpy (rcfiledir, "/");
974 /* note the parse time, so we can pick up on modifications */
975 parsetime = 0; /* foil compiler warnings */
976 if (stat(rcfile, &rcstat) != -1)
977 parsetime = rcstat.st_mtime;
978 else if (errno != ENOENT)
979 report(stderr, GT_("couldn't time-check the run-control file\n"));
981 /* this builds the host list */
982 if ((st = prc_parse_file(rcfile, !versioninfo)) != 0)
984 * FIXME: someday, send notification mail here if backgrounded.
985 * Right now, that can happen if the user changes the rcfile
986 * while the fetchmail is running in background. Do similarly
987 * for the other exit() calls in this function.
991 if ((implicitmode = (optind >= argc)))
993 for (ctl = querylist; ctl; ctl = ctl->next)
994 ctl->active = !ctl->server.skip;
997 for (; optind < argc; optind++)
999 flag predeclared = FALSE;
1002 * If hostname corresponds to a host known from the rc file,
1003 * simply declare it active. Otherwise synthesize a host
1004 * record from command line and defaults
1006 for (ctl = querylist; ctl; ctl = ctl->next)
1007 if (!strcmp(ctl->server.pollname, argv[optind])
1008 || str_in_list(&ctl->server.akalist, argv[optind], TRUE))
1010 /* Is this correct? */
1011 if (predeclared && outlevel >= O_VERBOSE)
1012 fprintf(stderr,GT_("Warning: multiple mentions of host %s in config file\n"),argv[optind]);
1020 * Allocate and link record without copying in
1021 * command-line args; we'll do that with the optmerge
1024 ctl = hostalloc((struct query *)NULL);
1026 ctl->server.pollname = xstrdup(argv[optind]);
1028 ctl->server.lead_server = (struct hostdata *)NULL;
1033 * If there's a defaults record, merge it and lose it.
1035 if (querylist && strcmp(querylist->server.pollname, "defaults") == 0)
1037 for (ctl = querylist->next; ctl; ctl = ctl->next)
1038 optmerge(ctl, querylist, FALSE);
1039 querylist = querylist->next;
1042 /* don't allow a defaults record after the first */
1043 for (ctl = querylist; ctl; ctl = ctl->next) {
1044 if (ctl != querylist && strcmp(ctl->server.pollname, "defaults") == 0) {
1045 fprintf(stderr, GT_("fetchmail: Error: multiple \"defaults\" records in config file.\n"));
1050 /* use localhost if we never fetch the FQDN of this host */
1051 fetchmailhost = "localhost";
1053 /* here's where we override globals */
1054 if (cmd_run.logfile)
1055 run.logfile = cmd_run.logfile;
1057 run.idfile = cmd_run.idfile;
1058 /* do this before the keep/fetchall test below, otherwise -d0 may fail */
1059 if (cmd_run.poll_interval >= 0)
1060 run.poll_interval = cmd_run.poll_interval;
1061 if (cmd_run.invisible)
1062 run.invisible = cmd_run.invisible;
1063 if (cmd_run.showdots)
1064 run.showdots = cmd_run.showdots;
1065 if (cmd_run.use_syslog)
1066 run.use_syslog = (cmd_run.use_syslog == FLAG_TRUE);
1067 if (cmd_run.postmaster)
1068 run.postmaster = cmd_run.postmaster;
1069 if (cmd_run.bouncemail)
1070 run.bouncemail = cmd_run.bouncemail;
1072 /* check and daemon options are not compatible */
1073 if (check_only && run.poll_interval)
1074 run.poll_interval = 0;
1077 * DNS support is required for some protocols. We used to
1078 * do this unconditionally, but it made fetchmail excessively
1079 * vulnerable to misconfigured DNS setups.
1081 * If we're using ETRN or ODMR, the smtp hunt list is the
1082 * list of systems we're polling on behalf of; these have
1083 * to be fully-qualified domain names. The default for
1084 * this list should be the FQDN of localhost.
1086 * If we're using Kerberos for authentication, we need
1087 * the FQDN in order to generate capability keys.
1089 for (ctl = querylist; ctl; ctl = ctl->next)
1091 (ctl->server.protocol==P_ETRN || ctl->server.protocol==P_ODMR
1092 || ctl->server.authenticate == A_KERBEROS_V4
1093 || ctl->server.authenticate == A_KERBEROS_V5))
1095 fetchmailhost = host_fqdn(1);
1099 if (!ctl) /* list exhausted */
1100 fetchmailhost = host_fqdn(0);
1102 /* this code enables flags to be turned off */
1103 #define DEFAULT(flag, dflt) if (flag == FLAG_TRUE)\
1105 else if (flag == FLAG_FALSE)\
1109 /* one global gets treated specially */
1110 DEFAULT(run.showdots, run.poll_interval==0 || nodetach);
1112 /* merge in wired defaults, do sanity checks and prepare internal fields */
1113 for (ctl = querylist; ctl; ctl = ctl->next)
1115 ctl->wedged = FALSE;
1117 /* merge in defaults */
1118 optmerge(ctl, &def_opts, FALSE);
1120 /* force command-line options */
1121 optmerge(ctl, &cmd_opts, TRUE);
1124 * queryname has to be set up for inactive servers too.
1125 * Otherwise the UIDL code core-dumps on startup.
1127 if (ctl->server.via)
1128 ctl->server.queryname = xstrdup(ctl->server.via);
1130 ctl->server.queryname = xstrdup(ctl->server.pollname);
1133 * We no longer do DNS lookups at startup.
1134 * This is a kluge. It enables users to edit their
1135 * configurations when DNS isn't available.
1137 ctl->server.truename = xstrdup(ctl->server.queryname);
1139 if (configdump || ctl->active )
1141 DEFAULT(ctl->keep, FALSE);
1142 DEFAULT(ctl->fetchall, FALSE);
1143 DEFAULT(ctl->flush, FALSE);
1144 DEFAULT(ctl->limitflush, FALSE);
1145 DEFAULT(ctl->rewrite, TRUE);
1146 DEFAULT(ctl->stripcr, (ctl->mda != (char *)NULL));
1147 DEFAULT(ctl->forcecr, FALSE);
1148 DEFAULT(ctl->pass8bits, FALSE);
1149 DEFAULT(ctl->dropstatus, FALSE);
1150 DEFAULT(ctl->dropdelivered, FALSE);
1151 DEFAULT(ctl->mimedecode, FALSE);
1152 DEFAULT(ctl->idle, FALSE);
1153 DEFAULT(ctl->server.dns, TRUE);
1154 DEFAULT(ctl->server.uidl, FALSE);
1155 DEFAULT(ctl->use_ssl, FALSE);
1156 DEFAULT(ctl->sslcertck, FALSE);
1157 DEFAULT(ctl->server.checkalias, FALSE);
1160 * XXX FIXME: do we need this check or can we rely on the .y
1161 * parser handling this?
1165 report(stderr, GT_("SSL support is not compiled in.\n"));
1168 #endif /* SSL_ENABLE */
1172 * Make sure we have a nonempty host list to forward to.
1175 save_str(&ctl->smtphunt, "localhost", FALSE);
1178 * Make sure we have a nonempty list of domains to fetch from.
1180 if ((ctl->server.protocol==P_ETRN || ctl->server.protocol==P_ODMR) && !ctl->domainlist)
1181 save_str(&ctl->domainlist, fetchmailhost, FALSE);
1183 /* if `user' doesn't name a real local user, try to run as root */
1184 if ((pw = getpwnam(user)) == (struct passwd *)NULL)
1187 ctl->uid = pw->pw_uid; /* for local delivery via MDA */
1188 if (!ctl->localnames) /* for local delivery via SMTP */
1189 save_str_pair(&ctl->localnames, user, NULL);
1191 #ifndef HAVE_RES_SEARCH
1192 /* can't handle multidrop mailboxes unless we can do DNS lookups */
1193 if (MULTIDROP(ctl) && ctl->server.dns)
1195 ctl->server.dns = FALSE;
1196 report(stderr, GT_("fetchmail: warning: no DNS available to check multidrop fetches from %s\n"), ctl->server.pollname);
1198 #endif /* !HAVE_RES_SEARCH */
1201 * can't handle multidrop mailboxes without "envelope"
1202 * option, this causes truckloads full of support complaints
1203 * "all mail forwarded to postmaster"
1205 if (MULTIDROP(ctl) && !ctl->server.envelope)
1207 report(stderr, GT_("warning: multidrop for %s requires envelope option!\n"), ctl->server.pollname);
1208 report(stderr, GT_("warning: Do not ask for support if all mail goes to postmaster!\n"));
1211 /* if no folders were specified, set up the null one as default */
1212 if (!ctl->mailboxes)
1213 save_str(&ctl->mailboxes, (char *)NULL, 0);
1215 /* maybe user overrode timeout on command line? */
1216 if (ctl->server.timeout == -1)
1217 ctl->server.timeout = CLIENT_TIMEOUT;
1220 if (ctl->server.service) {
1221 int port = servport(ctl->server.service);
1224 (void) fprintf(stderr,
1225 GT_("fetchmail: %s configuration invalid, specify positive port number for service or port\n"),
1226 ctl->server.pollname);
1229 if (ctl->server.protocol == P_RPOP && port >= 1024)
1231 (void) fprintf(stderr,
1232 GT_("fetchmail: %s configuration invalid, RPOP requires a privileged port\n"),
1233 ctl->server.pollname);
1237 if (ctl->listener == LMTP_MODE)
1241 for (idp = ctl->smtphunt; idp; idp = idp->next)
1245 if (!(cp = strrchr((char *)idp->id, '/')) ||
1246 ++cp, (0 == strcmp(cp, SMTP_PORT))
1247 || servport(cp) == SMTP_PORT_NUM)
1249 (void) fprintf(stderr,
1250 GT_("%s configuration invalid, LMTP can't use default SMTP port\n"),
1251 ctl->server.pollname);
1258 * "I beg to you, have mercy on the we[a]k minds like myself."
1259 * wrote Pehr Anderson. Your petition is granted.
1261 if (ctl->fetchall && ctl->keep && run.poll_interval && !nodetach && !configdump)
1263 (void) fprintf(stderr,
1264 GT_("Both fetchall and keep on in daemon mode is a mistake!\n"));
1270 /* initialize UID handling */
1271 if (!versioninfo && (st = prc_filecheck(run.idfile, !versioninfo)) != 0)
1274 initialize_saved_lists(querylist, run.idfile);
1275 #endif /* POP3_ENABLE */
1278 * If the user didn't set a last-resort user to get misaddressed
1279 * multidrop mail, set an appropriate default here.
1281 if (!run.postmaster)
1283 if (getuid() != ROOT_UID) /* ordinary user */
1284 run.postmaster = user;
1286 run.postmaster = "postmaster";
1289 return(implicitmode);
1292 static RETSIGTYPE terminate_poll(int sig)
1293 /* to be executed at the end of a poll cycle */
1297 report(stdout, GT_("terminated with signal %d\n"), sig);
1301 * Update UID information at end of each poll, rather than at end
1302 * of run, because that way we don't lose all UIDL information since
1303 * the beginning of time if fetchmail crashes.
1306 write_saved_lists(querylist, run.idfile);
1307 #endif /* POP3_ENABLE */
1310 static RETSIGTYPE terminate_run(int sig)
1311 /* to be executed on normal or signal-induced termination */
1315 terminate_poll(sig);
1318 * Craig Metz, the RFC1938 one-time-password guy, points out:
1319 * "Remember that most kernels don't zero pages before handing them to the
1320 * next process and many kernels share pages between user and kernel space.
1321 * You'd be very surprised what you can find from a short program to do a
1322 * malloc() and then dump the contents of the pages you got. By zeroing
1323 * the secrets at end of run (earlier if you can), you make sure the next
1324 * guy can't get the password/pass phrase."
1326 * Right you are, Craig!
1328 for (ctl = querylist; ctl; ctl = ctl->next)
1330 memset(ctl->password, '\0', strlen(ctl->password));
1332 #if !defined(HAVE_ATEXIT)
1336 if (activecount == 0)
1339 exit(successes ? PS_SUCCESS : querystatus);
1343 * Sequence of protocols to try when autoprobing, most capable to least.
1345 static const int autoprobe[] =
1349 #endif /* IMAP_ENABLE */
1352 #endif /* POP3_ENABLE */
1355 #endif /* POP2_ENABLE */
1358 static int query_host(struct query *ctl)
1359 /* perform fetch transaction with single host */
1364 * If we're syslogging the progress messages are automatically timestamped.
1365 * Force timestamping if we're going to a logfile.
1367 if (outlevel >= O_VERBOSE)
1369 report(stdout, GT_("%s querying %s (protocol %s) at %s: poll started\n"),
1371 ctl->server.pollname,
1372 showproto(ctl->server.protocol),
1376 switch (ctl->server.protocol) {
1378 for (i = 0; i < sizeof(autoprobe)/sizeof(autoprobe[0]); i++)
1380 ctl->server.protocol = autoprobe[i];
1382 st = query_host(ctl);
1385 if (st == PS_SUCCESS || st == PS_NOMAIL || st == PS_AUTHFAIL || st == PS_LOCKBUSY || st == PS_SMTP || st == PS_MAXFETCH || st == PS_DNS)
1388 ctl->server.protocol = P_AUTO;
1394 report(stderr, GT_("POP2 support is not configured.\n"));
1396 #endif /* POP2_ENABLE */
1404 } while (st == PS_REPOLL);
1406 report(stderr, GT_("POP3 support is not configured.\n"));
1408 #endif /* POP3_ENABLE */
1414 } while (st == PS_REPOLL);
1416 report(stderr, GT_("IMAP support is not configured.\n"));
1418 #endif /* IMAP_ENABLE */
1422 report(stderr, GT_("ETRN support is not configured.\n"));
1427 #endif /* ETRN_ENABLE */
1430 report(stderr, GT_("ODMR support is not configured.\n"));
1434 #endif /* ODMR_ENABLE */
1437 report(stderr, GT_("unsupported protocol selected.\n"));
1442 * If we're syslogging the progress messages are automatically timestamped.
1443 * Force timestamping if we're going to a logfile.
1445 if (outlevel >= O_VERBOSE)
1447 report(stdout, GT_("%s querying %s (protocol %s) at %s: poll completed\n"),
1449 ctl->server.pollname,
1450 showproto(ctl->server.protocol),
1457 static void dump_params (struct runctl *runp,
1458 struct query *querylist, flag implicit)
1459 /* display query parameters in English */
1463 if (runp->poll_interval)
1464 printf(GT_("Poll interval is %d seconds\n"), runp->poll_interval);
1466 printf(GT_("Logfile is %s\n"), runp->logfile);
1467 if (strcmp(runp->idfile, IDFILE_NAME))
1468 printf(GT_("Idfile is %s\n"), runp->idfile);
1469 #if defined(HAVE_SYSLOG)
1470 if (runp->use_syslog)
1471 printf(GT_("Progress messages will be logged via syslog\n"));
1473 if (runp->invisible)
1474 printf(GT_("Fetchmail will masquerade and will not generate Received\n"));
1476 printf(GT_("Fetchmail will show progress dots even in logfiles.\n"));
1477 if (runp->postmaster)
1478 printf(GT_("Fetchmail will forward misaddressed multidrop messages to %s.\n"),
1481 if (!runp->bouncemail)
1482 printf(GT_("Fetchmail will direct error mail to the postmaster.\n"));
1483 else if (outlevel >= O_VERBOSE)
1484 printf(GT_("Fetchmail will direct error mail to the sender.\n"));
1486 for (ctl = querylist; ctl; ctl = ctl->next)
1488 if (!ctl->active || (implicit && ctl->server.skip))
1491 printf(GT_("Options for retrieving from %s@%s:\n"),
1492 ctl->remotename, visbuf(ctl->server.pollname));
1494 if (ctl->server.via && MAILBOX_PROTOCOL(ctl))
1495 printf(GT_(" Mail will be retrieved via %s\n"), ctl->server.via);
1497 if (ctl->server.interval)
1498 printf(ngettext(" Poll of this server will occur every %d interval.\n",
1499 " Poll of this server will occur every %d intervals.\n",
1500 ctl->server.interval), ctl->server.interval);
1501 if (ctl->server.truename)
1502 printf(GT_(" True name of server is %s.\n"), ctl->server.truename);
1503 if (ctl->server.skip || outlevel >= O_VERBOSE)
1504 printf(ctl->server.skip
1505 ? GT_(" This host will not be queried when no host is specified.\n")
1506 : GT_(" This host will be queried when no host is specified.\n"));
1507 if (!NO_PASSWORD(ctl))
1510 printf(GT_(" Password will be prompted for.\n"));
1511 else if (outlevel >= O_VERBOSE)
1513 if (ctl->server.protocol == P_APOP)
1514 printf(GT_(" APOP secret = \"%s\".\n"),
1515 visbuf(ctl->password));
1516 else if (ctl->server.protocol == P_RPOP)
1517 printf(GT_(" RPOP id = \"%s\".\n"),
1518 visbuf(ctl->password));
1520 printf(GT_(" Password = \"%s\".\n"),
1521 visbuf(ctl->password));
1525 if (ctl->server.protocol == P_POP3
1526 && ctl->server.service && !strcmp(ctl->server.service, KPOP_PORT)
1527 && (ctl->server.authenticate == A_KERBEROS_V4 ||
1528 ctl->server.authenticate == A_KERBEROS_V5))
1529 printf(GT_(" Protocol is KPOP with Kerberos %s authentication"),
1530 ctl->server.authenticate == A_KERBEROS_V5 ? "V" : "IV");
1532 printf(GT_(" Protocol is %s"), showproto(ctl->server.protocol));
1533 if (ctl->server.service)
1534 printf(GT_(" (using service %s)"), ctl->server.service);
1535 else if (outlevel >= O_VERBOSE)
1536 printf(GT_(" (using default port)"));
1537 if (ctl->server.uidl && MAILBOX_PROTOCOL(ctl))
1538 printf(GT_(" (forcing UIDL use)"));
1541 switch (ctl->server.authenticate)
1544 printf(GT_(" All available authentication methods will be tried.\n"));
1547 printf(GT_(" Password authentication will be forced.\n"));
1550 printf(GT_(" MSN authentication will be forced.\n"));
1553 printf(GT_(" NTLM authentication will be forced.\n"));
1556 printf(GT_(" OTP authentication will be forced.\n"));
1559 printf(GT_(" CRAM-Md5 authentication will be forced.\n"));
1562 printf(GT_(" GSSAPI authentication will be forced.\n"));
1565 printf(GT_(" Kerberos V4 authentication will be forced.\n"));
1568 printf(GT_(" Kerberos V5 authentication will be forced.\n"));
1571 printf(GT_(" End-to-end encryption assumed.\n"));
1574 if (ctl->server.principal != (char *) NULL)
1575 printf(GT_(" Mail service principal is: %s\n"), ctl->server.principal);
1578 printf(GT_(" SSL encrypted sessions enabled.\n"));
1580 printf(GT_(" SSL protocol: %s.\n"), ctl->sslproto);
1581 if (ctl->sslcertck) {
1582 printf(GT_(" SSL server certificate checking enabled.\n"));
1583 if (ctl->sslcertpath != NULL)
1584 printf(GT_(" SSL trusted certificate directory: %s\n"), ctl->sslcertpath);
1586 if (ctl->sslfingerprint != NULL)
1587 printf(GT_(" SSL key fingerprint (checked against the server key): %s\n"), ctl->sslfingerprint);
1589 if (ctl->server.timeout > 0)
1590 printf(GT_(" Server nonresponse timeout is %d seconds"), ctl->server.timeout);
1591 if (ctl->server.timeout == CLIENT_TIMEOUT)
1592 printf(GT_(" (default).\n"));
1596 if (MAILBOX_PROTOCOL(ctl))
1598 if (!ctl->mailboxes->id)
1599 printf(GT_(" Default mailbox selected.\n"));
1604 printf(GT_(" Selected mailboxes are:"));
1605 for (idp = ctl->mailboxes; idp; idp = idp->next)
1606 printf(" %s", (char *)idp->id);
1609 printf(ctl->fetchall
1610 ? GT_(" All messages will be retrieved (--all on).\n")
1611 : GT_(" Only new messages will be retrieved (--all off).\n"));
1613 ? GT_(" Fetched messages will be kept on the server (--keep on).\n")
1614 : GT_(" Fetched messages will not be kept on the server (--keep off).\n"));
1616 ? GT_(" Old messages will be flushed before message retrieval (--flush on).\n")
1617 : GT_(" Old messages will not be flushed before message retrieval (--flush off).\n"));
1618 printf(ctl->limitflush
1619 ? GT_(" Oversized messages will be flushed before message retrieval (--limitflush on).\n")
1620 : GT_(" Oversized messages will not be flushed before message retrieval (--limitflush off).\n"));
1622 ? GT_(" Rewrite of server-local addresses is enabled (--norewrite off).\n")
1623 : GT_(" Rewrite of server-local addresses is disabled (--norewrite on).\n"));
1625 ? GT_(" Carriage-return stripping is enabled (stripcr on).\n")
1626 : GT_(" Carriage-return stripping is disabled (stripcr off).\n"));
1628 ? GT_(" Carriage-return forcing is enabled (forcecr on).\n")
1629 : GT_(" Carriage-return forcing is disabled (forcecr off).\n"));
1630 printf(ctl->pass8bits
1631 ? GT_(" Interpretation of Content-Transfer-Encoding is disabled (pass8bits on).\n")
1632 : GT_(" Interpretation of Content-Transfer-Encoding is enabled (pass8bits off).\n"));
1633 printf(ctl->mimedecode
1634 ? GT_(" MIME decoding is enabled (mimedecode on).\n")
1635 : GT_(" MIME decoding is disabled (mimedecode off).\n"));
1637 ? GT_(" Idle after poll is enabled (idle on).\n")
1638 : GT_(" Idle after poll is disabled (idle off).\n"));
1639 printf(ctl->dropstatus
1640 ? GT_(" Nonempty Status lines will be discarded (dropstatus on)\n")
1641 : GT_(" Nonempty Status lines will be kept (dropstatus off)\n"));
1642 printf(ctl->dropdelivered
1643 ? GT_(" Delivered-To lines will be discarded (dropdelivered on)\n")
1644 : GT_(" Delivered-To lines will be kept (dropdelivered off)\n"));
1645 if (NUM_NONZERO(ctl->limit))
1647 if (NUM_NONZERO(ctl->limit))
1648 printf(GT_(" Message size limit is %d octets (--limit %d).\n"),
1649 ctl->limit, ctl->limit);
1650 else if (outlevel >= O_VERBOSE)
1651 printf(GT_(" No message size limit (--limit 0).\n"));
1652 if (run.poll_interval > 0)
1653 printf(GT_(" Message size warning interval is %d seconds (--warnings %d).\n"),
1654 ctl->warnings, ctl->warnings);
1655 else if (outlevel >= O_VERBOSE)
1656 printf(GT_(" Size warnings on every poll (--warnings 0).\n"));
1658 if (NUM_NONZERO(ctl->fetchlimit))
1659 printf(GT_(" Received-message limit is %d (--fetchlimit %d).\n"),
1660 ctl->fetchlimit, ctl->fetchlimit);
1661 else if (outlevel >= O_VERBOSE)
1662 printf(GT_(" No received-message limit (--fetchlimit 0).\n"));
1663 if (NUM_NONZERO(ctl->fetchsizelimit))
1664 printf(GT_(" Fetch message size limit is %d (--fetchsizelimit %d).\n"),
1665 ctl->fetchsizelimit, ctl->fetchsizelimit);
1666 else if (outlevel >= O_VERBOSE)
1667 printf(GT_(" No fetch message size limit (--fetchsizelimit 0).\n"));
1668 if (NUM_NONZERO(ctl->fastuidl) && MAILBOX_PROTOCOL(ctl))
1670 if (ctl->fastuidl == 1)
1671 printf(GT_(" Do binary search of UIDs during each poll (--fastuidl 1).\n"));
1673 printf(GT_(" Do binary search of UIDs during %d out of %d polls (--fastuidl %d).\n"), ctl->fastuidl - 1, ctl->fastuidl, ctl->fastuidl);
1675 else if (outlevel >= O_VERBOSE)
1676 printf(GT_(" Do linear search of UIDs during each poll (--fastuidl 0).\n"));
1677 if (NUM_NONZERO(ctl->batchlimit))
1678 printf(GT_(" SMTP message batch limit is %d.\n"), ctl->batchlimit);
1679 else if (outlevel >= O_VERBOSE)
1680 printf(GT_(" No SMTP message batch limit (--batchlimit 0).\n"));
1681 if (MAILBOX_PROTOCOL(ctl))
1683 if (NUM_NONZERO(ctl->expunge))
1684 printf(GT_(" Deletion interval between expunges forced to %d (--expunge %d).\n"), ctl->expunge, ctl->expunge);
1685 else if (outlevel >= O_VERBOSE)
1686 printf(GT_(" No forced expunges (--expunge 0).\n"));
1689 else /* ODMR or ETRN */
1693 printf(GT_(" Domains for which mail will be fetched are:"));
1694 for (idp = ctl->domainlist; idp; idp = idp->next)
1696 printf(" %s", (char *)idp->id);
1697 if (!idp->val.status.mark)
1698 printf(GT_(" (default)"));
1703 printf(GT_(" Messages will be appended to %s as BSMTP\n"), visbuf(ctl->bsmtp));
1704 else if (ctl->mda && MAILBOX_PROTOCOL(ctl))
1705 printf(GT_(" Messages will be delivered with \"%s\".\n"), visbuf(ctl->mda));
1712 printf(GT_(" Messages will be %cMTP-forwarded to:"),
1714 for (idp = ctl->smtphunt; idp; idp = idp->next)
1716 printf(" %s", (char *)idp->id);
1717 if (!idp->val.status.mark)
1718 printf(GT_(" (default)"));
1722 if (ctl->smtpaddress)
1723 printf(GT_(" Host part of MAIL FROM line will be %s\n"),
1726 printf(GT_(" Address to be put in RCPT TO lines shipped to SMTP will be %s\n"),
1729 if (MAILBOX_PROTOCOL(ctl))
1731 if (ctl->antispam != (struct idlist *)NULL)
1735 printf(GT_(" Recognized listener spam block responses are:"));
1736 for (idp = ctl->antispam; idp; idp = idp->next)
1737 printf(" %d", idp->val.status.num);
1740 else if (outlevel >= O_VERBOSE)
1741 printf(GT_(" Spam-blocking disabled\n"));
1743 if (ctl->preconnect)
1744 printf(GT_(" Server connection will be brought up with \"%s\".\n"),
1745 visbuf(ctl->preconnect));
1746 else if (outlevel >= O_VERBOSE)
1747 printf(GT_(" No pre-connection command.\n"));
1748 if (ctl->postconnect)
1749 printf(GT_(" Server connection will be taken down with \"%s\".\n"),
1750 visbuf(ctl->postconnect));
1751 else if (outlevel >= O_VERBOSE)
1752 printf(GT_(" No post-connection command.\n"));
1753 if (MAILBOX_PROTOCOL(ctl)) {
1754 if (!ctl->localnames)
1755 printf(GT_(" No localnames declared for this host.\n"));
1761 for (idp = ctl->localnames; idp; idp = idp->next)
1764 if (count > 1 || ctl->wildcard)
1765 printf(GT_(" Multi-drop mode: "));
1767 printf(GT_(" Single-drop mode: "));
1769 printf(ngettext("%d local name recognized.\n", "%d local names recognized.\n", count), count);
1770 if (outlevel >= O_VERBOSE)
1772 for (idp = ctl->localnames; idp; idp = idp->next)
1774 printf("\t%s -> %s\n", (char *)idp->id, (char *)idp->val.id2);
1776 printf("\t%s\n", (char *)idp->id);
1778 fputs("\t*\n", stdout);
1781 if (count > 1 || ctl->wildcard)
1783 printf(ctl->server.dns
1784 ? GT_(" DNS lookup for multidrop addresses is enabled.\n")
1785 : GT_(" DNS lookup for multidrop addresses is disabled.\n"));
1786 if (ctl->server.dns)
1788 if (ctl->server.checkalias)
1789 printf(GT_(" Server aliases will be compared with multidrop addresses by IP address.\n"));
1791 printf(GT_(" Server aliases will be compared with multidrop addresses by name.\n"));
1793 if (ctl->server.envelope == STRING_DISABLED)
1794 printf(GT_(" Envelope-address routing is disabled\n"));
1797 printf(GT_(" Envelope header is assumed to be: %s\n"),
1798 ctl->server.envelope ? ctl->server.envelope : "Received");
1799 if (ctl->server.envskip || outlevel >= O_VERBOSE)
1800 printf(GT_(" Number of envelope headers to be skipped over: %d\n"),
1801 ctl->server.envskip);
1802 if (ctl->server.qvirtual)
1803 printf(GT_(" Prefix %s will be removed from user id\n"),
1804 ctl->server.qvirtual);
1805 else if (outlevel >= O_VERBOSE)
1806 printf(GT_(" No prefix stripping\n"));
1809 if (ctl->server.akalist)
1813 printf(GT_(" Predeclared mailserver aliases:"));
1814 for (idp = ctl->server.akalist; idp; idp = idp->next)
1815 printf(" %s", (char *)idp->id);
1818 if (ctl->server.localdomains)
1822 printf(GT_(" Local domains:"));
1823 for (idp = ctl->server.localdomains; idp; idp = idp->next)
1824 printf(" %s", (char *)idp->id);
1831 if (ctl->server.interface)
1832 printf(GT_(" Connection must be through interface %s.\n"), ctl->server.interface);
1833 else if (outlevel >= O_VERBOSE)
1834 printf(GT_(" No interface requirement specified.\n"));
1835 if (ctl->server.monitor)
1836 printf(GT_(" Polling loop will monitor %s.\n"), ctl->server.monitor);
1837 else if (outlevel >= O_VERBOSE)
1838 printf(GT_(" No monitor interface specified.\n"));
1841 if (ctl->server.plugin)
1842 printf(GT_(" Server connections will be made via plugin %s (--plugin %s).\n"), ctl->server.plugin, ctl->server.plugin);
1843 else if (outlevel >= O_VERBOSE)
1844 printf(GT_(" No plugin command specified.\n"));
1845 if (ctl->server.plugout)
1846 printf(GT_(" Listener connections will be made via plugout %s (--plugout %s).\n"), ctl->server.plugout, ctl->server.plugout);
1847 else if (outlevel >= O_VERBOSE)
1848 printf(GT_(" No plugout command specified.\n"));
1850 if (ctl->server.protocol > P_POP2 && MAILBOX_PROTOCOL(ctl))
1853 printf(GT_(" No UIDs saved from this host.\n"));
1859 for (idp = ctl->oldsaved; idp; idp = idp->next)
1862 printf(GT_(" %d UIDs saved.\n"), count);
1863 if (outlevel >= O_VERBOSE)
1864 for (idp = ctl->oldsaved; idp; idp = idp->next)
1865 printf("\t%s\n", (char *)idp->id);
1869 if (ctl->server.tracepolls)
1870 printf(GT_(" Poll trace information will be added to the Received header.\n"));
1871 else if (outlevel >= O_VERBOSE)
1872 printf(GT_(" No poll trace information will be added to the Received header.\n.\n"));
1874 if (ctl->properties)
1875 printf(GT_(" Pass-through properties \"%s\".\n"),
1876 visbuf(ctl->properties));
1880 /* fetchmail.c ends here */