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"
49 #define ENETUNREACH 128 /* Interactive doesn't know this */
50 #endif /* ENETUNREACH */
52 /* prototypes for internal functions */
53 static int load_params(int, char **, int);
54 static void dump_params (struct runctl *runp, struct query *, flag implicit);
55 static int query_host(struct query *);
57 /* controls the detail level of status/progress messages written to stderr */
58 int outlevel; /* see the O_.* constants above */
60 /* miscellaneous global controls */
61 struct runctl run; /* global controls for this run */
62 flag nodetach; /* if TRUE, don't detach daemon process */
63 flag quitmode; /* if --quit was set */
64 int quitind; /* optind after position of last --quit option */
65 flag check_only; /* if --probe was set */
66 flag versioninfo; /* emit only version info */
67 char *user; /* the name of the invoking user */
68 char *home; /* invoking user's home directory */
69 char *fmhome; /* fetchmail's home directory */
70 char *program_name; /* the name to prefix error messages with */
71 flag configdump; /* dump control blocks for configurator */
72 char *fetchmailhost; /* either `localhost' or the host's FQDN */
74 static int quitonly; /* if we should quit after killing the running daemon */
76 static int querystatus; /* status of query */
77 static int successes; /* count number of successful polls */
78 static int activecount; /* count number of active entries */
79 static struct runctl cmd_run; /* global options set from command line */
80 static time_t parsetime; /* time of last parse */
82 static RETSIGTYPE terminate_run(int);
83 static RETSIGTYPE terminate_poll(int);
85 #if defined(__FreeBSD__) && defined(__FreeBSD_USE_KVM)
86 /* drop SGID kmem privileage until we need it */
87 static void dropprivs(void)
97 if (gr && !strcmp(gr->gr_name, "kmem"))
99 extern void interface_set_gids(gid_t egid, gid_t rgid);
100 interface_set_gids(egid, rgid);
106 #if defined(HAVE_SETLOCALE) && defined(ENABLE_NLS) && defined(HAVE_STRFTIME)
108 /** returns timestamp in current locale,
109 * and resets LC_TIME locale to POSIX. */
110 static char *timestamp (void)
113 static char buf[60]; /* RATS: ignore */
116 setlocale (LC_TIME, "");
117 strftime (buf, sizeof (buf), "%c", localtime(&now));
118 setlocale (LC_TIME, "C");
122 #define timestamp rfc822timestamp
125 static RETSIGTYPE donothing(int sig)
127 set_signal_handler(sig, donothing);
131 static void printcopyright(FILE *fp) {
132 fprintf(fp, GT_("Copyright (C) 2002, 2003 Eric S. Raymond\n"
133 "Copyright (C) 2004 Matthias Andree, Eric S. Raymond, Rob F. Funk, Graham Wilson\n"
134 "Copyright (C) 2005-2006 Matthias Andree, Sunil Shetye\n"
136 fprintf(fp, GT_("Fetchmail comes with ABSOLUTELY NO WARRANTY. This is free software, and you\n"
137 "are welcome to redistribute it under certain conditions. For details,\n"
138 "please see the file COPYING in the source or documentation directory.\n"));
141 const char *iana_charset;
143 int main(int argc, char **argv)
146 int implicitmode = FALSE;
148 netrc_entry *netrc_list;
149 char *netrc_file, *tmpbuf;
153 #if defined(__FreeBSD__) && defined(__FreeBSD_USE_KVM)
157 envquery(argc, argv);
159 setlocale (LC_ALL, "");
160 bindtextdomain(PACKAGE, LOCALEDIR);
162 iana_charset = norm_charmap(nl_langinfo(CODESET)); /* normalize local
166 iana_charset = "US-ASCII";
170 report(stderr, GT_("WARNING: Running as root is discouraged.\n"));
174 * Note: because we can't initialize reporting before we know whether
175 * syslog is supposed to be on, this message will go to stdout and
176 * be lost when running in background.
178 if (outlevel >= O_VERBOSE)
182 report(stdout, GT_("fetchmail: invoked with"));
183 for (i = 0; i < argc; i++)
184 report(stdout, " %s", argv[i]);
185 report(stdout, "\n");
188 #define IDFILE_NAME ".fetchids"
189 run.idfile = prependdir (IDFILE_NAME, fmhome);
194 * We used to arrange for the lock to be removed on exit close
195 * to where the lock was asserted. Now we need to do it here, because
196 * we might have re-executed in background with an existing lock
197 * as the result of a changed rcfile (see the code near the execvp(3)
198 * call near the beginning of the polling loop for details). We want
199 * to be sure the lock gets nuked on any error exit, basically.
204 /* save the current directory */
205 if (getcwd (currentwd, sizeof (currentwd)) == NULL) {
206 report(stderr, GT_("could not get current working directory\n"));
214 i = parsecmdline(argc, argv, &cmd_run, &cmd_opts);
218 if (quitmode && quitind == argc)
224 const char *features =
227 #endif /* POP2_ENABLE */
230 #endif /* POP3_ENABLE */
233 #endif /* IMAP_ENABLE */
239 #endif /* RPA_ENABLE */
242 #endif /* NTLM_ENABLE */
245 #endif /* SDPS_ENABLE */
248 #endif /* ETRN_ENABLE */
251 #endif /* ODMR_ENABLE */
257 #endif /* OPIE_ENABLE */
258 #ifdef HAVE_PKG_hesiod
263 #endif /* HAVE_SOCKS */
266 #endif /* ENABLE_NLS */
268 printf(GT_("This is fetchmail release %s"), VERSION);
269 fputs(features, stdout);
271 printcopyright(stdout);
273 fputs("Fallback MDA: ", stdout);
275 fputs(FALLBACK_MDA, stdout);
277 fputs("(none)", stdout);
282 /* this is an attempt to help remote debugging */
286 /* avoid parsing the config file if all we're doing is killing a daemon */
288 implicitmode = load_params(argc, argv, optind);
290 #if defined(HAVE_SYSLOG)
291 /* logging should be set up early in case we were restarted from exec */
294 #if defined(LOG_MAIL)
295 openlog(program_name, LOG_PID, LOG_MAIL);
297 /* Assume BSD4.2 openlog with two arguments */
298 openlog(program_name, LOG_PID);
304 report_init((run.poll_interval == 0 || nodetach) && !run.logfile);
307 /* initialize UID handling */
311 if (!versioninfo && (st = prc_filecheck(run.idfile, !versioninfo)) != 0)
314 initialize_saved_lists(querylist, run.idfile);
316 #endif /* POP3_ENABLE */
318 /* construct the lockfile */
321 #ifdef HAVE_SETRLIMIT
323 * Before getting passwords, disable core dumps unless -v -d0 mode is on.
324 * Core dumps could otherwise contain passwords to be scavenged by a
327 if (outlevel < O_VERBOSE || run.poll_interval > 0)
329 struct rlimit corelimit;
330 corelimit.rlim_cur = 0;
331 corelimit.rlim_max = 0;
332 setrlimit(RLIMIT_CORE, &corelimit);
334 #endif /* HAVE_SETRLIMIT */
336 #define NETRC_FILE ".netrc"
337 /* parse the ~/.netrc file (if present) for future password lookups. */
338 netrc_file = prependdir (NETRC_FILE, home);
339 netrc_list = parse_netrc(netrc_file);
343 /* pick up passwords where we can */
344 for (ctl = querylist; ctl; ctl = ctl->next)
346 if (ctl->active && !(implicitmode && ctl->server.skip)&&!ctl->password)
348 if (NO_PASSWORD(ctl))
349 /* Server won't care what the password is, but there
350 must be some non-null string here. */
351 ctl->password = ctl->remotename;
356 /* look up the pollname and account in the .netrc file. */
357 p = search_netrc(netrc_list,
358 ctl->server.pollname, ctl->remotename);
359 /* if we find a matching entry with a password, use it */
360 if (p && p->password)
361 ctl->password = xstrdup(p->password);
363 /* otherwise try with "via" name if there is one */
364 else if (ctl->server.via)
366 p = search_netrc(netrc_list,
367 ctl->server.via, ctl->remotename);
368 if (p && p->password)
369 ctl->password = xstrdup(p->password);
375 free_netrc(netrc_list);
378 /* perhaps we just want to check options? */
381 int havercfile = access(rcfile, 0);
383 printf(GT_("Taking options from command line%s%s\n"),
384 havercfile ? "" : GT_(" and "),
385 havercfile ? "" : rcfile);
387 if (querylist == NULL)
389 GT_("No mailservers set up -- perhaps %s is missing?\n"),
392 dump_params(&run, querylist, implicitmode);
396 /* dump options as a Python dictionary, for configurator use */
399 dump_config(&run, querylist);
403 /* check for another fetchmail running concurrently */
404 pid = fm_lock_state();
406 pid = bkgd ? -pid : pid;
408 /* if no mail servers listed and nothing in background, we're done */
409 if (!quitonly && pid == 0 && querylist == NULL) {
410 (void)fputs(GT_("fetchmail: no mailservers have been specified.\n"),stderr);
414 /* perhaps user asked us to kill the other fetchmail */
417 if (pid == 0 || pid == getpid())
418 /* this test enables re-execing on a changed rcfile
419 * for pid == getpid() */
422 fprintf(stderr,GT_("fetchmail: no other fetchmail is running\n"));
426 else if (kill(pid, SIGTERM) < 0)
428 fprintf(stderr,GT_("fetchmail: error killing %s fetchmail at %d; bailing out.\n"),
429 bkgd ? GT_("background") : GT_("foreground"), pid);
436 if (outlevel > O_SILENT)
437 fprintf(stderr,GT_("fetchmail: %s fetchmail at %d killed.\n"),
438 bkgd ? GT_("background") : GT_("foreground"), pid);
439 /* We used to nuke the other process's lock here, with
440 * fm_lock_release(), which is broken. The other process
441 * needs to clear its lock by itself. */
445 /* wait for other process to exit */
446 maxwait = 10; /* seconds */
447 while (kill(pid, 0) == 0 && --maxwait >= 0) {
454 /* another fetchmail is running -- wake it up or die */
460 GT_("fetchmail: can't check mail while another fetchmail to same host is running.\n"));
463 else if (!implicitmode)
466 GT_("fetchmail: can't poll specified hosts with another fetchmail running at %d.\n"),
473 GT_("fetchmail: another foreground fetchmail is running at %d.\n"),
477 else if (getpid() == pid)
478 /* this test enables re-execing on a changed rcfile */
483 GT_("fetchmail: can't accept options while a background fetchmail is running.\n"));
486 else if (kill(pid, SIGUSR1) == 0)
489 GT_("fetchmail: background fetchmail at %d awakened.\n"),
496 * Should never happen -- possible only if a background fetchmail
497 * croaks after the first kill probe above but before the
498 * SIGUSR1/SIGHUP transmission.
501 GT_("fetchmail: elder sibling at %d died mysteriously.\n"),
503 return(PS_UNDEFINED);
507 /* pick up interactively any passwords we need but don't have */
508 for (ctl = querylist; ctl; ctl = ctl->next)
510 if (ctl->active && !(implicitmode && ctl->server.skip)
511 && !NO_PASSWORD(ctl) && !ctl->password)
516 GT_("fetchmail: can't find a password for %s@%s.\n"),
517 ctl->remotename, ctl->server.pollname);
520 const char* password_prompt = GT_("Enter password for %s@%s: ");
521 size_t pplen = strlen(password_prompt) + strlen(ctl->remotename) + strlen(ctl->server.pollname) + 1;
523 tmpbuf = xmalloc(pplen);
524 snprintf(tmpbuf, pplen, password_prompt,
525 ctl->remotename, ctl->server.pollname);
526 ctl->password = xstrdup((char *)fm_getpassword(tmpbuf));
533 * Time to initiate the SOCKS library (this is not mandatory: it just
534 * registers the correct application name for logging purpose. If you
535 * have some problem, comment out these lines).
538 SOCKSinit("fetchmail");
539 #endif /* HAVE_SOCKS */
541 /* avoid zombies from plugins */
544 if (run.logfile && run.use_syslog)
545 fprintf(stderr, GT_("fetchmail: Warning: syslog and logfile are set. Check both for logs!\n"));
548 * Maybe time to go to demon mode...
550 if (run.poll_interval)
555 rc = daemonize(run.logfile);
557 report(stderr, GT_("fetchmail: Cannot detach into background. Aborting.\n"));
561 report(stdout, GT_("starting fetchmail %s daemon \n"), VERSION);
564 * We'll set up a handler for these when we're sleeping,
565 * but ignore them otherwise so as not to interrupt a poll.
567 set_signal_handler(SIGUSR1, SIG_IGN);
568 if (run.poll_interval && getuid() == ROOT_UID)
569 set_signal_handler(SIGHUP, SIG_IGN);
573 /* not in daemon mode */
574 if (run.logfile && !nodetach && access(run.logfile, F_OK) == 0)
576 if (!freopen(run.logfile, "a", stdout))
577 report(stderr, GT_("could not open %s to append logs to \n"), run.logfile);
578 if (!freopen(run.logfile, "a", stderr))
579 report(stdout, GT_("could not open %s to append logs to \n"), run.logfile);
581 report(stdout, GT_("fetchmail: Warning: syslog and logfile are set. Check both for logs!\n"));
587 /* beyond here we don't want more than one fetchmail running per user */
589 set_signal_handler(SIGABRT, terminate_run);
590 set_signal_handler(SIGINT, terminate_run);
591 set_signal_handler(SIGTERM, terminate_run);
592 set_signal_handler(SIGALRM, terminate_run);
593 set_signal_handler(SIGPIPE, SIG_IGN);
594 set_signal_handler(SIGQUIT, terminate_run);
596 /* here's the exclusion lock */
600 * Query all hosts. If there's only one, the error return will
601 * reflect the status of that transaction.
605 * Check to see if the rcfile has been touched. If so,
606 * re-exec so the file will be reread. Doing it this way
607 * avoids all the complications of trying to deallocate the
608 * in-core control structures -- and the potential memory
613 if (strcmp(rcfile, "-") == 0) {
615 } else if (stat(rcfile, &rcstat) == -1) {
618 GT_("couldn't time-check %s (error %d)\n"),
621 else if (rcstat.st_mtime > parsetime)
623 report(stdout, GT_("restarting fetchmail (%s changed)\n"), rcfile);
626 /* restore the startup directory */
627 if (!currentwd[0] || chdir (currentwd) == -1)
628 report(stderr, GT_("attempt to re-exec may fail as directory has not been restored\n"));
632 * Matthias Andree: Isn't this prone to introduction of
633 * "false" programs by interfering with PATH? Those
634 * path-searching execs might not be the best ideas for
637 * Rob Funk: But is there any way for someone to modify
638 * the PATH variable of a running fetchmail? I don't know
641 * Dave's change makes fetchmail restart itself in exactly
642 * the way it was started from the shell (or shell script)
643 * in the first place. If you're concerned about PATH
644 * contamination, call fetchmail initially with a full
645 * path, and use Dave's patch.
647 * Not using a -p variant of exec means that the restart
648 * will break if both (a) the user depended on PATH to
649 * call fetchmail in the first place, and (b) the system
650 * doesn't save the whole path in argv[0] if the whole
651 * path wasn't used in the initial call. (If I recall
652 * correctly, Linux saves it but many other Unices don't.)
654 execvp(argv[0], argv);
655 report(stderr, GT_("attempt to re-exec fetchmail failed\n"));
658 #if defined(HAVE_RES_SEARCH) && defined(USE_TCPIP_FOR_DNS)
660 * This was an efficiency hack that backfired. The theory
661 * was that using TCP/IP for DNS queries would get us better
662 * reliability and shave off some per-UDP-packet costs.
663 * Unfortunately it interacted badly with diald, which effectively
664 * filters out DNS queries over TCP/IP for reasons having to do
665 * with some obscure Linux kernel problem involving bootstrapping of
666 * dynamically-addressed links. I don't understand this mess
667 * and don't want to, so it's "See ya!" to this hack.
669 sethostent(TRUE); /* use TCP/IP for mailserver queries */
670 #endif /* HAVE_RES_SEARCH */
674 for (ctl = querylist; ctl; ctl = ctl->next)
678 if (!(implicitmode && ctl->server.skip))
683 GT_("poll of %s skipped (failed authentication or too many timeouts)\n"),
684 ctl->server.pollname);
688 /* check skip interval first so that it counts all polls */
689 if (run.poll_interval && ctl->server.interval)
691 if (ctl->server.poll_count++ % ctl->server.interval)
693 if (outlevel >= O_VERBOSE)
695 GT_("interval not reached, not querying %s\n"),
696 ctl->server.pollname);
703 * Don't do monitoring if we were woken by a signal.
704 * Note that interface_approve() does its own error logging.
706 if (!interface_approve(&ctl->server, !lastsig))
708 #endif /* CAN_MONITOR */
710 dofastuidl = 0; /* this is reset in the driver if required */
712 querystatus = query_host(ctl);
714 if (NUM_NONZERO(ctl->fastuidl))
715 ctl->fastuidlcount = (ctl->fastuidlcount + 1) % ctl->fastuidl;
717 /* leave the UIDL state alone if there have been any errors */
719 ((querystatus==PS_SUCCESS) || (querystatus==PS_NOMAIL) || (querystatus==PS_MAXFETCH)))
722 uid_discard_new_list(ctl);
724 #endif /* POP3_ENABLE */
726 if (querystatus == PS_SUCCESS)
728 else if (!check_only &&
729 ((querystatus!=PS_NOMAIL) || (outlevel==O_DEBUG)))
733 report(stdout,GT_("Query status=0 (SUCCESS)\n"));break;
735 report(stdout,GT_("Query status=1 (NOMAIL)\n")); break;
737 report(stdout,GT_("Query status=2 (SOCKET)\n")); break;
739 report(stdout,GT_("Query status=3 (AUTHFAIL)\n"));break;
741 report(stdout,GT_("Query status=4 (PROTOCOL)\n"));break;
743 report(stdout,GT_("Query status=5 (SYNTAX)\n")); break;
745 report(stdout,GT_("Query status=6 (IOERR)\n")); break;
747 report(stdout,GT_("Query status=7 (ERROR)\n")); break;
749 report(stdout,GT_("Query status=8 (EXCLUDE)\n")); break;
751 report(stdout,GT_("Query status=9 (LOCKBUSY)\n"));break;
753 report(stdout,GT_("Query status=10 (SMTP)\n")); break;
755 report(stdout,GT_("Query status=11 (DNS)\n")); break;
757 report(stdout,GT_("Query status=12 (BSMTP)\n")); break;
759 report(stdout,GT_("Query status=13 (MAXFETCH)\n"));break;
761 report(stdout,GT_("Query status=%d\n"),querystatus);
766 if (ctl->server.monitor)
769 * Allow some time for the link to quiesce. One
770 * second is usually sufficient, three is safe.
771 * Note: this delay is important - don't remove!
774 interface_note_activity(&ctl->server);
776 #endif /* CAN_MONITOR */
780 #if defined(HAVE_RES_SEARCH) && defined(USE_TCPIP_FOR_DNS)
781 endhostent(); /* release TCP/IP connection to nameserver */
782 #endif /* HAVE_RES_SEARCH */
784 /* close connections cleanly */
788 * OK, we've polled. Now sleep.
790 if (run.poll_interval)
793 * Because passwords can expire, it may happen that *all*
794 * hosts are now out of the loop due to authfail
795 * conditions. If this happens daemon-mode fetchmail
796 * should softly and silently vanish away, rather than
797 * spinning uselessly.
801 for (ctl = querylist; ctl; ctl = ctl->next)
802 if (ctl->active && !(implicitmode && ctl->server.skip))
807 report(stderr, GT_("All connections are wedged. Exiting.\n"));
808 /* FIXME: someday, send notification mail */
812 if (outlevel > O_SILENT)
814 GT_("sleeping at %s for %d seconds\n"), timestamp(), run.poll_interval);
817 * With this simple hack, we make it possible for a foreground
818 * fetchmail to wake up one in daemon mode. What we want is the
819 * side effect of interrupting any sleep that may be going on,
820 * forcing fetchmail to re-poll its hosts. The second line is
821 * for people who think all system daemons wake up on SIGHUP.
823 set_signal_handler(SIGUSR1, donothing);
824 if (getuid() == ROOT_UID)
825 set_signal_handler(SIGHUP, donothing);
828 * OK, now pause until it's time for the next poll cycle.
829 * A nonzero return indicates we received a wakeup signal;
830 * unwedge all servers in case the problem has been
833 if ((lastsig = interruptible_idle(run.poll_interval)))
835 if (outlevel > O_SILENT)
836 #ifdef SYS_SIGLIST_DECLARED
838 GT_("awakened by %s\n"), sys_siglist[lastsig]);
841 GT_("awakened by signal %d\n"), lastsig);
843 for (ctl = querylist; ctl; ctl = ctl->next)
847 if (outlevel > O_SILENT)
848 report(stdout, GT_("awakened at %s\n"), timestamp());
853 if (outlevel >= O_VERBOSE)
854 report(stdout, GT_("normal termination, status %d\n"),
855 successes ? PS_SUCCESS : querystatus);
861 else if (querystatus)
864 /* in case we interrupted before a successful fetch */
868 static void list_merge(struct idlist **dstl, struct idlist **srcl, int force)
871 * If force is off, modify dstl fields only when they're empty (treat srcl
872 * as defaults). If force is on, modify each dstl field whenever scrcl
873 * is nonempty (treat srcl as an override).
875 if (force ? !!*srcl : !*dstl)
877 struct idlist *cpl = copy_str_list(*srcl);
879 append_str_list(dstl, &cpl);
883 static void optmerge(struct query *h2, struct query *h1, int force)
884 /* merge two options records */
886 list_merge(&h2->server.localdomains, &h1->server.localdomains, force);
887 list_merge(&h2->localnames, &h1->localnames, force);
888 list_merge(&h2->mailboxes, &h1->mailboxes, force);
889 list_merge(&h2->smtphunt, &h1->smtphunt, force);
890 list_merge(&h2->domainlist, &h1->domainlist, force);
891 list_merge(&h2->antispam, &h1->antispam, force);
893 #define FLAG_MERGE(fld) if (force ? !!h1->fld : !h2->fld) h2->fld = h1->fld
894 FLAG_MERGE(server.via);
895 FLAG_MERGE(server.protocol);
896 FLAG_MERGE(server.service);
897 FLAG_MERGE(server.interval);
898 FLAG_MERGE(server.authenticate);
899 FLAG_MERGE(server.timeout);
900 FLAG_MERGE(server.envelope);
901 FLAG_MERGE(server.envskip);
902 FLAG_MERGE(server.qvirtual);
903 FLAG_MERGE(server.skip);
904 FLAG_MERGE(server.dns);
905 FLAG_MERGE(server.checkalias);
906 FLAG_MERGE(server.uidl);
907 FLAG_MERGE(server.principal);
910 FLAG_MERGE(server.interface);
911 FLAG_MERGE(server.interface_pair);
912 FLAG_MERGE(server.monitor);
915 FLAG_MERGE(server.plugin);
916 FLAG_MERGE(server.plugout);
917 FLAG_MERGE(server.tracepolls);
919 FLAG_MERGE(wildcard);
920 FLAG_MERGE(remotename);
921 FLAG_MERGE(password);
924 FLAG_MERGE(listener);
925 FLAG_MERGE(smtpaddress);
926 FLAG_MERGE(smtpname);
927 FLAG_MERGE(preconnect);
928 FLAG_MERGE(postconnect);
932 FLAG_MERGE(limitflush);
933 FLAG_MERGE(fetchall);
937 FLAG_MERGE(pass8bits);
938 FLAG_MERGE(dropstatus);
939 FLAG_MERGE(dropdelivered);
940 FLAG_MERGE(mimedecode);
943 FLAG_MERGE(warnings);
944 FLAG_MERGE(fetchlimit);
945 FLAG_MERGE(fetchsizelimit);
946 FLAG_MERGE(fastuidl);
947 FLAG_MERGE(batchlimit);
952 FLAG_MERGE(sslproto);
953 FLAG_MERGE(sslcertck);
954 FLAG_MERGE(sslcertpath);
955 FLAG_MERGE(sslfingerprint);
959 FLAG_MERGE(properties);
963 /** Load configuration files.
964 * \return - true if no servers found on the command line
965 * - false if servers found on the command line */
966 static int load_params(int argc, char **argv, int optind)
968 int implicitmode, st;
970 struct query def_opts, *ctl;
974 run.bouncemail = TRUE;
975 run.spambounce = FALSE; /* don't bounce back to innocent bystanders */
977 memset(&def_opts, '\0', sizeof(struct query));
978 def_opts.smtp_socket = -1;
979 def_opts.smtpaddress = (char *)0;
980 def_opts.smtpname = (char *)0;
981 def_opts.server.protocol = P_AUTO;
982 def_opts.server.timeout = CLIENT_TIMEOUT;
983 def_opts.server.esmtp_name = user;
984 def_opts.warnings = WARNING_INTERVAL;
985 def_opts.remotename = user;
986 def_opts.listener = SMTP_MODE;
987 def_opts.fetchsizelimit = 100;
988 def_opts.fastuidl = 4;
990 /* get the location of rcfile */
992 p = strrchr (rcfile, '/');
993 if (p && (size_t)(p - rcfile) < sizeof (rcfiledir)) {
994 *p = 0; /* replace '/' by '0' */
995 strlcpy (rcfiledir, rcfile, sizeof(rcfiledir));
996 *p = '/'; /* restore '/' */
997 if (!rcfiledir[0]) /* "/.fetchmailrc" case */
998 strcpy (rcfiledir, "/");
1001 /* note the parse time, so we can pick up on modifications */
1002 parsetime = 0; /* foil compiler warnings */
1003 if (strcmp(rcfile, "-") == 0 || stat(rcfile, &rcstat) != -1)
1004 parsetime = rcstat.st_mtime;
1005 else if (errno != ENOENT)
1006 report(stderr, GT_("couldn't time-check the run-control file\n"));
1008 /* this builds the host list */
1009 if ((st = prc_parse_file(rcfile, !versioninfo)) != 0)
1011 * FIXME: someday, send notification mail here if backgrounded.
1012 * Right now, that can happen if the user changes the rcfile
1013 * while the fetchmail is running in background. Do similarly
1014 * for the other exit() calls in this function.
1018 if ((implicitmode = (optind >= argc)))
1020 for (ctl = querylist; ctl; ctl = ctl->next)
1021 ctl->active = !ctl->server.skip;
1024 for (; optind < argc; optind++)
1026 flag predeclared = FALSE;
1029 * If hostname corresponds to a host known from the rc file,
1030 * simply declare it active. Otherwise synthesize a host
1031 * record from command line and defaults
1033 for (ctl = querylist; ctl; ctl = ctl->next)
1034 if (!strcmp(ctl->server.pollname, argv[optind])
1035 || str_in_list(&ctl->server.akalist, argv[optind], TRUE))
1037 /* Is this correct? */
1038 if (predeclared && outlevel >= O_VERBOSE)
1039 fprintf(stderr,GT_("Warning: multiple mentions of host %s in config file\n"),argv[optind]);
1047 * Allocate and link record without copying in
1048 * command-line args; we'll do that with the optmerge
1051 ctl = hostalloc((struct query *)NULL);
1053 ctl->server.pollname = xstrdup(argv[optind]);
1055 ctl->server.lead_server = (struct hostdata *)NULL;
1060 * If there's a defaults record, merge it and lose it.
1062 if (querylist && strcmp(querylist->server.pollname, "defaults") == 0)
1064 for (ctl = querylist->next; ctl; ctl = ctl->next)
1065 optmerge(ctl, querylist, FALSE);
1066 querylist = querylist->next;
1069 /* don't allow a defaults record after the first */
1070 for (ctl = querylist; ctl; ctl = ctl->next) {
1071 if (ctl != querylist && strcmp(ctl->server.pollname, "defaults") == 0) {
1072 fprintf(stderr, GT_("fetchmail: Error: multiple \"defaults\" records in config file.\n"));
1077 /* use localhost if we never fetch the FQDN of this host */
1078 fetchmailhost = "localhost";
1080 /* here's where we override globals */
1081 if (cmd_run.logfile)
1082 run.logfile = cmd_run.logfile;
1084 run.idfile = cmd_run.idfile;
1085 if (cmd_run.pidfile)
1086 run.pidfile = cmd_run.pidfile;
1087 /* do this before the keep/fetchall test below, otherwise -d0 may fail */
1088 if (cmd_run.poll_interval >= 0)
1089 run.poll_interval = cmd_run.poll_interval;
1090 if (cmd_run.invisible)
1091 run.invisible = cmd_run.invisible;
1092 if (cmd_run.showdots)
1093 run.showdots = cmd_run.showdots;
1094 if (cmd_run.use_syslog)
1095 run.use_syslog = (cmd_run.use_syslog == FLAG_TRUE);
1096 if (cmd_run.postmaster)
1097 run.postmaster = cmd_run.postmaster;
1098 if (cmd_run.bouncemail)
1099 run.bouncemail = cmd_run.bouncemail;
1101 /* check and daemon options are not compatible */
1102 if (check_only && run.poll_interval)
1103 run.poll_interval = 0;
1106 * DNS support is required for some protocols. We used to
1107 * do this unconditionally, but it made fetchmail excessively
1108 * vulnerable to misconfigured DNS setups.
1110 * If we're using ETRN or ODMR, the smtp hunt list is the
1111 * list of systems we're polling on behalf of; these have
1112 * to be fully-qualified domain names. The default for
1113 * this list should be the FQDN of localhost.
1115 * If we're using Kerberos for authentication, we need
1116 * the FQDN in order to generate capability keys.
1118 for (ctl = querylist; ctl; ctl = ctl->next)
1120 (ctl->server.protocol==P_ETRN || ctl->server.protocol==P_ODMR
1121 || ctl->server.authenticate == A_KERBEROS_V4
1122 || ctl->server.authenticate == A_KERBEROS_V5))
1124 fetchmailhost = host_fqdn(1);
1128 if (!ctl) /* list exhausted */
1129 fetchmailhost = host_fqdn(0);
1131 /* this code enables flags to be turned off */
1132 #define DEFAULT(flag, dflt) if (flag == FLAG_TRUE)\
1134 else if (flag == FLAG_FALSE)\
1138 /* one global gets treated specially */
1139 DEFAULT(run.showdots, run.poll_interval==0 || nodetach);
1141 /* merge in wired defaults, do sanity checks and prepare internal fields */
1142 for (ctl = querylist; ctl; ctl = ctl->next)
1144 ctl->wedged = FALSE;
1146 /* merge in defaults */
1147 optmerge(ctl, &def_opts, FALSE);
1149 /* force command-line options */
1150 optmerge(ctl, &cmd_opts, TRUE);
1153 * queryname has to be set up for inactive servers too.
1154 * Otherwise the UIDL code core-dumps on startup.
1156 if (ctl->server.via)
1157 ctl->server.queryname = xstrdup(ctl->server.via);
1159 ctl->server.queryname = xstrdup(ctl->server.pollname);
1162 * We no longer do DNS lookups at startup.
1163 * This is a kluge. It enables users to edit their
1164 * configurations when DNS isn't available.
1166 ctl->server.truename = xstrdup(ctl->server.queryname);
1168 if (configdump || ctl->active )
1170 DEFAULT(ctl->keep, FALSE);
1171 DEFAULT(ctl->fetchall, FALSE);
1172 DEFAULT(ctl->flush, FALSE);
1173 DEFAULT(ctl->limitflush, FALSE);
1174 DEFAULT(ctl->rewrite, TRUE);
1175 DEFAULT(ctl->stripcr, (ctl->mda != (char *)NULL));
1176 DEFAULT(ctl->forcecr, FALSE);
1177 DEFAULT(ctl->pass8bits, FALSE);
1178 DEFAULT(ctl->dropstatus, FALSE);
1179 DEFAULT(ctl->dropdelivered, FALSE);
1180 DEFAULT(ctl->mimedecode, FALSE);
1181 DEFAULT(ctl->idle, FALSE);
1182 DEFAULT(ctl->server.dns, TRUE);
1183 DEFAULT(ctl->server.uidl, FALSE);
1184 DEFAULT(ctl->use_ssl, FALSE);
1185 DEFAULT(ctl->sslcertck, FALSE);
1186 DEFAULT(ctl->server.checkalias, FALSE);
1189 * XXX FIXME: do we need this check or can we rely on the .y
1190 * parser handling this?
1194 report(stderr, GT_("SSL support is not compiled in.\n"));
1197 #endif /* SSL_ENABLE */
1201 * Make sure we have a nonempty host list to forward to.
1204 save_str(&ctl->smtphunt, "localhost", FALSE);
1207 * Make sure we have a nonempty list of domains to fetch from.
1209 if ((ctl->server.protocol==P_ETRN || ctl->server.protocol==P_ODMR) && !ctl->domainlist)
1210 save_str(&ctl->domainlist, fetchmailhost, FALSE);
1212 /* if `user' doesn't name a real local user, try to run as root */
1213 if ((pw = getpwnam(user)) == (struct passwd *)NULL)
1216 ctl->uid = pw->pw_uid; /* for local delivery via MDA */
1217 if (!ctl->localnames) /* for local delivery via SMTP */
1218 save_str_pair(&ctl->localnames, user, NULL);
1220 #ifndef HAVE_RES_SEARCH
1221 /* can't handle multidrop mailboxes unless we can do DNS lookups */
1222 if (MULTIDROP(ctl) && ctl->server.dns)
1224 ctl->server.dns = FALSE;
1225 report(stderr, GT_("fetchmail: warning: no DNS available to check multidrop fetches from %s\n"), ctl->server.pollname);
1227 #endif /* !HAVE_RES_SEARCH */
1230 * can't handle multidrop mailboxes without "envelope"
1231 * option, this causes truckloads full of support complaints
1232 * "all mail forwarded to postmaster"
1234 if (MULTIDROP(ctl) && !ctl->server.envelope)
1236 report(stderr, GT_("warning: multidrop for %s requires envelope option!\n"), ctl->server.pollname);
1237 report(stderr, GT_("warning: Do not ask for support if all mail goes to postmaster!\n"));
1240 /* if no folders were specified, set up the null one as default */
1241 if (!ctl->mailboxes)
1242 save_str(&ctl->mailboxes, (char *)NULL, 0);
1244 /* maybe user overrode timeout on command line? */
1245 if (ctl->server.timeout == -1)
1246 ctl->server.timeout = CLIENT_TIMEOUT;
1249 if (ctl->server.service) {
1250 int port = servport(ctl->server.service);
1253 (void) fprintf(stderr,
1254 GT_("fetchmail: %s configuration invalid, specify positive port number for service or port\n"),
1255 ctl->server.pollname);
1258 if (ctl->server.protocol == P_RPOP && port >= 1024)
1260 (void) fprintf(stderr,
1261 GT_("fetchmail: %s configuration invalid, RPOP requires a privileged port\n"),
1262 ctl->server.pollname);
1266 if (ctl->listener == LMTP_MODE)
1270 for (idp = ctl->smtphunt; idp; idp = idp->next)
1274 if (!(cp = strrchr(idp->id, '/'))
1275 || (0 == strcmp(cp + 1, SMTP_PORT))
1276 || servport(cp + 1) == SMTP_PORT_NUM)
1278 (void) fprintf(stderr,
1279 GT_("%s configuration invalid, LMTP can't use default SMTP port\n"),
1280 ctl->server.pollname);
1287 * "I beg to you, have mercy on the we[a]k minds like myself."
1288 * wrote Pehr Anderson. Your petition is granted.
1290 if (ctl->fetchall && ctl->keep && (run.poll_interval || ctl->idle) && !nodetach && !configdump)
1292 (void) fprintf(stderr,
1293 GT_("Both fetchall and keep on in daemon or idle mode is a mistake!\n"));
1299 * If the user didn't set a last-resort user to get misaddressed
1300 * multidrop mail, set an appropriate default here.
1302 if (!run.postmaster)
1304 if (getuid() != ROOT_UID) /* ordinary user */
1305 run.postmaster = user;
1307 run.postmaster = "postmaster";
1310 return(implicitmode);
1313 static RETSIGTYPE terminate_poll(int sig)
1314 /* to be executed at the end of a poll cycle */
1318 report(stdout, GT_("terminated with signal %d\n"), sig);
1322 * Update UID information at end of each poll, rather than at end
1323 * of run, because that way we don't lose all UIDL information since
1324 * the beginning of time if fetchmail crashes.
1327 write_saved_lists(querylist, run.idfile);
1328 #endif /* POP3_ENABLE */
1331 static RETSIGTYPE terminate_run(int sig)
1332 /* to be executed on normal or signal-induced termination */
1336 terminate_poll(sig);
1339 * Craig Metz, the RFC1938 one-time-password guy, points out:
1340 * "Remember that most kernels don't zero pages before handing them to the
1341 * next process and many kernels share pages between user and kernel space.
1342 * You'd be very surprised what you can find from a short program to do a
1343 * malloc() and then dump the contents of the pages you got. By zeroing
1344 * the secrets at end of run (earlier if you can), you make sure the next
1345 * guy can't get the password/pass phrase."
1347 * Right you are, Craig!
1349 for (ctl = querylist; ctl; ctl = ctl->next)
1351 memset(ctl->password, '\0', strlen(ctl->password));
1353 #if !defined(HAVE_ATEXIT)
1357 if (activecount == 0)
1360 exit(successes ? PS_SUCCESS : querystatus);
1364 * Sequence of protocols to try when autoprobing, most capable to least.
1366 static const int autoprobe[] =
1370 #endif /* IMAP_ENABLE */
1373 #endif /* POP3_ENABLE */
1376 #endif /* POP2_ENABLE */
1379 static int query_host(struct query *ctl)
1380 /* perform fetch transaction with single host */
1386 * If we're syslogging the progress messages are automatically timestamped.
1387 * Force timestamping if we're going to a logfile.
1389 if (outlevel >= O_VERBOSE)
1391 report(stdout, GT_("%s querying %s (protocol %s) at %s: poll started\n"),
1393 ctl->server.pollname,
1394 showproto(ctl->server.protocol),
1398 switch (ctl->server.protocol) {
1400 for (i = 0; i < sizeof(autoprobe)/sizeof(autoprobe[0]); i++)
1402 ctl->server.protocol = autoprobe[i];
1404 st = query_host(ctl);
1407 if (st == PS_SUCCESS || st == PS_NOMAIL || st == PS_AUTHFAIL || st == PS_LOCKBUSY || st == PS_SMTP || st == PS_MAXFETCH || st == PS_DNS)
1410 ctl->server.protocol = P_AUTO;
1416 report(stderr, GT_("POP2 support is not configured.\n"));
1418 #endif /* POP2_ENABLE */
1426 } while (st == PS_REPOLL);
1428 report(stderr, GT_("POP3 support is not configured.\n"));
1430 #endif /* POP3_ENABLE */
1436 } while (st == PS_REPOLL);
1438 report(stderr, GT_("IMAP support is not configured.\n"));
1440 #endif /* IMAP_ENABLE */
1444 report(stderr, GT_("ETRN support is not configured.\n"));
1449 #endif /* ETRN_ENABLE */
1452 report(stderr, GT_("ODMR support is not configured.\n"));
1456 #endif /* ODMR_ENABLE */
1459 report(stderr, GT_("unsupported protocol selected.\n"));
1464 * If we're syslogging the progress messages are automatically timestamped.
1465 * Force timestamping if we're going to a logfile.
1467 if (outlevel >= O_VERBOSE)
1469 report(stdout, GT_("%s querying %s (protocol %s) at %s: poll completed\n"),
1471 ctl->server.pollname,
1472 showproto(ctl->server.protocol),
1479 static void dump_params (struct runctl *runp,
1480 struct query *querylist, flag implicit)
1481 /* display query parameters in English */
1485 if (runp->poll_interval)
1486 printf(GT_("Poll interval is %d seconds\n"), runp->poll_interval);
1488 printf(GT_("Logfile is %s\n"), runp->logfile);
1489 if (strcmp(runp->idfile, IDFILE_NAME))
1490 printf(GT_("Idfile is %s\n"), runp->idfile);
1491 #if defined(HAVE_SYSLOG)
1492 if (runp->use_syslog)
1493 printf(GT_("Progress messages will be logged via syslog\n"));
1495 if (runp->invisible)
1496 printf(GT_("Fetchmail will masquerade and will not generate Received\n"));
1498 printf(GT_("Fetchmail will show progress dots even in logfiles.\n"));
1499 if (runp->postmaster)
1500 printf(GT_("Fetchmail will forward misaddressed multidrop messages to %s.\n"),
1503 if (!runp->bouncemail)
1504 printf(GT_("Fetchmail will direct error mail to the postmaster.\n"));
1505 else if (outlevel >= O_VERBOSE)
1506 printf(GT_("Fetchmail will direct error mail to the sender.\n"));
1508 for (ctl = querylist; ctl; ctl = ctl->next)
1510 if (!ctl->active || (implicit && ctl->server.skip))
1513 printf(GT_("Options for retrieving from %s@%s:\n"),
1514 ctl->remotename, visbuf(ctl->server.pollname));
1516 if (ctl->server.via && MAILBOX_PROTOCOL(ctl))
1517 printf(GT_(" Mail will be retrieved via %s\n"), ctl->server.via);
1519 if (ctl->server.interval)
1520 printf(ngettext(" Poll of this server will occur every %d interval.\n",
1521 " Poll of this server will occur every %d intervals.\n",
1522 ctl->server.interval), ctl->server.interval);
1523 if (ctl->server.truename)
1524 printf(GT_(" True name of server is %s.\n"), ctl->server.truename);
1525 if (ctl->server.skip || outlevel >= O_VERBOSE)
1526 printf(ctl->server.skip
1527 ? GT_(" This host will not be queried when no host is specified.\n")
1528 : GT_(" This host will be queried when no host is specified.\n"));
1529 if (!NO_PASSWORD(ctl))
1532 printf(GT_(" Password will be prompted for.\n"));
1533 else if (outlevel >= O_VERBOSE)
1535 if (ctl->server.protocol == P_APOP)
1536 printf(GT_(" APOP secret = \"%s\".\n"),
1537 visbuf(ctl->password));
1538 else if (ctl->server.protocol == P_RPOP)
1539 printf(GT_(" RPOP id = \"%s\".\n"),
1540 visbuf(ctl->password));
1542 printf(GT_(" Password = \"%s\".\n"),
1543 visbuf(ctl->password));
1547 if (ctl->server.protocol == P_POP3
1548 && ctl->server.service && !strcmp(ctl->server.service, KPOP_PORT)
1549 && (ctl->server.authenticate == A_KERBEROS_V4 ||
1550 ctl->server.authenticate == A_KERBEROS_V5))
1551 printf(GT_(" Protocol is KPOP with Kerberos %s authentication"),
1552 ctl->server.authenticate == A_KERBEROS_V5 ? "V" : "IV");
1554 printf(GT_(" Protocol is %s"), showproto(ctl->server.protocol));
1555 if (ctl->server.service)
1556 printf(GT_(" (using service %s)"), ctl->server.service);
1557 else if (outlevel >= O_VERBOSE)
1558 printf(GT_(" (using default port)"));
1559 if (ctl->server.uidl && MAILBOX_PROTOCOL(ctl))
1560 printf(GT_(" (forcing UIDL use)"));
1563 switch (ctl->server.authenticate)
1566 printf(GT_(" All available authentication methods will be tried.\n"));
1569 printf(GT_(" Password authentication will be forced.\n"));
1572 printf(GT_(" MSN authentication will be forced.\n"));
1575 printf(GT_(" NTLM authentication will be forced.\n"));
1578 printf(GT_(" OTP authentication will be forced.\n"));
1581 printf(GT_(" CRAM-Md5 authentication will be forced.\n"));
1584 printf(GT_(" GSSAPI authentication will be forced.\n"));
1587 printf(GT_(" Kerberos V4 authentication will be forced.\n"));
1590 printf(GT_(" Kerberos V5 authentication will be forced.\n"));
1593 printf(GT_(" End-to-end encryption assumed.\n"));
1596 if (ctl->server.principal != (char *) NULL)
1597 printf(GT_(" Mail service principal is: %s\n"), ctl->server.principal);
1600 printf(GT_(" SSL encrypted sessions enabled.\n"));
1602 printf(GT_(" SSL protocol: %s.\n"), ctl->sslproto);
1603 if (ctl->sslcertck) {
1604 printf(GT_(" SSL server certificate checking enabled.\n"));
1605 if (ctl->sslcertpath != NULL)
1606 printf(GT_(" SSL trusted certificate directory: %s\n"), ctl->sslcertpath);
1608 if (ctl->sslfingerprint != NULL)
1609 printf(GT_(" SSL key fingerprint (checked against the server key): %s\n"), ctl->sslfingerprint);
1611 if (ctl->server.timeout > 0)
1612 printf(GT_(" Server nonresponse timeout is %d seconds"), ctl->server.timeout);
1613 if (ctl->server.timeout == CLIENT_TIMEOUT)
1614 printf(GT_(" (default).\n"));
1618 if (MAILBOX_PROTOCOL(ctl))
1620 if (!ctl->mailboxes->id)
1621 printf(GT_(" Default mailbox selected.\n"));
1626 printf(GT_(" Selected mailboxes are:"));
1627 for (idp = ctl->mailboxes; idp; idp = idp->next)
1628 printf(" %s", idp->id);
1631 printf(ctl->fetchall
1632 ? GT_(" All messages will be retrieved (--all on).\n")
1633 : GT_(" Only new messages will be retrieved (--all off).\n"));
1635 ? GT_(" Fetched messages will be kept on the server (--keep on).\n")
1636 : GT_(" Fetched messages will not be kept on the server (--keep off).\n"));
1638 ? GT_(" Old messages will be flushed before message retrieval (--flush on).\n")
1639 : GT_(" Old messages will not be flushed before message retrieval (--flush off).\n"));
1640 printf(ctl->limitflush
1641 ? GT_(" Oversized messages will be flushed before message retrieval (--limitflush on).\n")
1642 : GT_(" Oversized messages will not be flushed before message retrieval (--limitflush off).\n"));
1644 ? GT_(" Rewrite of server-local addresses is enabled (--norewrite off).\n")
1645 : GT_(" Rewrite of server-local addresses is disabled (--norewrite on).\n"));
1647 ? GT_(" Carriage-return stripping is enabled (stripcr on).\n")
1648 : GT_(" Carriage-return stripping is disabled (stripcr off).\n"));
1650 ? GT_(" Carriage-return forcing is enabled (forcecr on).\n")
1651 : GT_(" Carriage-return forcing is disabled (forcecr off).\n"));
1652 printf(ctl->pass8bits
1653 ? GT_(" Interpretation of Content-Transfer-Encoding is disabled (pass8bits on).\n")
1654 : GT_(" Interpretation of Content-Transfer-Encoding is enabled (pass8bits off).\n"));
1655 printf(ctl->mimedecode
1656 ? GT_(" MIME decoding is enabled (mimedecode on).\n")
1657 : GT_(" MIME decoding is disabled (mimedecode off).\n"));
1659 ? GT_(" Idle after poll is enabled (idle on).\n")
1660 : GT_(" Idle after poll is disabled (idle off).\n"));
1661 printf(ctl->dropstatus
1662 ? GT_(" Nonempty Status lines will be discarded (dropstatus on)\n")
1663 : GT_(" Nonempty Status lines will be kept (dropstatus off)\n"));
1664 printf(ctl->dropdelivered
1665 ? GT_(" Delivered-To lines will be discarded (dropdelivered on)\n")
1666 : GT_(" Delivered-To lines will be kept (dropdelivered off)\n"));
1667 if (NUM_NONZERO(ctl->limit))
1669 if (NUM_NONZERO(ctl->limit))
1670 printf(GT_(" Message size limit is %d octets (--limit %d).\n"),
1671 ctl->limit, ctl->limit);
1672 else if (outlevel >= O_VERBOSE)
1673 printf(GT_(" No message size limit (--limit 0).\n"));
1674 if (run.poll_interval > 0)
1675 printf(GT_(" Message size warning interval is %d seconds (--warnings %d).\n"),
1676 ctl->warnings, ctl->warnings);
1677 else if (outlevel >= O_VERBOSE)
1678 printf(GT_(" Size warnings on every poll (--warnings 0).\n"));
1680 if (NUM_NONZERO(ctl->fetchlimit))
1681 printf(GT_(" Received-message limit is %d (--fetchlimit %d).\n"),
1682 ctl->fetchlimit, ctl->fetchlimit);
1683 else if (outlevel >= O_VERBOSE)
1684 printf(GT_(" No received-message limit (--fetchlimit 0).\n"));
1685 if (NUM_NONZERO(ctl->fetchsizelimit))
1686 printf(GT_(" Fetch message size limit is %d (--fetchsizelimit %d).\n"),
1687 ctl->fetchsizelimit, ctl->fetchsizelimit);
1688 else if (outlevel >= O_VERBOSE)
1689 printf(GT_(" No fetch message size limit (--fetchsizelimit 0).\n"));
1690 if (NUM_NONZERO(ctl->fastuidl) && MAILBOX_PROTOCOL(ctl))
1692 if (ctl->fastuidl == 1)
1693 printf(GT_(" Do binary search of UIDs during each poll (--fastuidl 1).\n"));
1695 printf(GT_(" Do binary search of UIDs during %d out of %d polls (--fastuidl %d).\n"), ctl->fastuidl - 1, ctl->fastuidl, ctl->fastuidl);
1697 else if (outlevel >= O_VERBOSE)
1698 printf(GT_(" Do linear search of UIDs during each poll (--fastuidl 0).\n"));
1699 if (NUM_NONZERO(ctl->batchlimit))
1700 printf(GT_(" SMTP message batch limit is %d.\n"), ctl->batchlimit);
1701 else if (outlevel >= O_VERBOSE)
1702 printf(GT_(" No SMTP message batch limit (--batchlimit 0).\n"));
1703 if (MAILBOX_PROTOCOL(ctl))
1705 if (NUM_NONZERO(ctl->expunge))
1706 printf(GT_(" Deletion interval between expunges forced to %d (--expunge %d).\n"), ctl->expunge, ctl->expunge);
1707 else if (outlevel >= O_VERBOSE)
1708 printf(GT_(" No forced expunges (--expunge 0).\n"));
1711 else /* ODMR or ETRN */
1715 printf(GT_(" Domains for which mail will be fetched are:"));
1716 for (idp = ctl->domainlist; idp; idp = idp->next)
1718 printf(" %s", idp->id);
1719 if (!idp->val.status.mark)
1720 printf(GT_(" (default)"));
1725 printf(GT_(" Messages will be appended to %s as BSMTP\n"), visbuf(ctl->bsmtp));
1726 else if (ctl->mda && MAILBOX_PROTOCOL(ctl))
1727 printf(GT_(" Messages will be delivered with \"%s\".\n"), visbuf(ctl->mda));
1734 printf(GT_(" Messages will be %cMTP-forwarded to:"),
1736 for (idp = ctl->smtphunt; idp; idp = idp->next)
1738 printf(" %s", idp->id);
1739 if (!idp->val.status.mark)
1740 printf(GT_(" (default)"));
1744 if (ctl->smtpaddress)
1745 printf(GT_(" Host part of MAIL FROM line will be %s\n"),
1748 printf(GT_(" Address to be put in RCPT TO lines shipped to SMTP will be %s\n"),
1751 if (MAILBOX_PROTOCOL(ctl))
1753 if (ctl->antispam != (struct idlist *)NULL)
1757 printf(GT_(" Recognized listener spam block responses are:"));
1758 for (idp = ctl->antispam; idp; idp = idp->next)
1759 printf(" %d", idp->val.status.num);
1762 else if (outlevel >= O_VERBOSE)
1763 printf(GT_(" Spam-blocking disabled\n"));
1765 if (ctl->preconnect)
1766 printf(GT_(" Server connection will be brought up with \"%s\".\n"),
1767 visbuf(ctl->preconnect));
1768 else if (outlevel >= O_VERBOSE)
1769 printf(GT_(" No pre-connection command.\n"));
1770 if (ctl->postconnect)
1771 printf(GT_(" Server connection will be taken down with \"%s\".\n"),
1772 visbuf(ctl->postconnect));
1773 else if (outlevel >= O_VERBOSE)
1774 printf(GT_(" No post-connection command.\n"));
1775 if (MAILBOX_PROTOCOL(ctl)) {
1776 if (!ctl->localnames)
1777 printf(GT_(" No localnames declared for this host.\n"));
1783 for (idp = ctl->localnames; idp; idp = idp->next)
1786 if (count > 1 || ctl->wildcard)
1787 printf(GT_(" Multi-drop mode: "));
1789 printf(GT_(" Single-drop mode: "));
1791 printf(ngettext("%d local name recognized.\n", "%d local names recognized.\n", count), count);
1792 if (outlevel >= O_VERBOSE)
1794 for (idp = ctl->localnames; idp; idp = idp->next)
1796 printf("\t%s -> %s\n", idp->id, idp->val.id2);
1798 printf("\t%s\n", idp->id);
1800 fputs("\t*\n", stdout);
1803 if (count > 1 || ctl->wildcard)
1805 printf(ctl->server.dns
1806 ? GT_(" DNS lookup for multidrop addresses is enabled.\n")
1807 : GT_(" DNS lookup for multidrop addresses is disabled.\n"));
1808 if (ctl->server.dns)
1810 if (ctl->server.checkalias)
1811 printf(GT_(" Server aliases will be compared with multidrop addresses by IP address.\n"));
1813 printf(GT_(" Server aliases will be compared with multidrop addresses by name.\n"));
1815 if (ctl->server.envelope == STRING_DISABLED)
1816 printf(GT_(" Envelope-address routing is disabled\n"));
1819 printf(GT_(" Envelope header is assumed to be: %s\n"),
1820 ctl->server.envelope ? ctl->server.envelope : "Received");
1821 if (ctl->server.envskip || outlevel >= O_VERBOSE)
1822 printf(GT_(" Number of envelope headers to be skipped over: %d\n"),
1823 ctl->server.envskip);
1824 if (ctl->server.qvirtual)
1825 printf(GT_(" Prefix %s will be removed from user id\n"),
1826 ctl->server.qvirtual);
1827 else if (outlevel >= O_VERBOSE)
1828 printf(GT_(" No prefix stripping\n"));
1831 if (ctl->server.akalist)
1835 printf(GT_(" Predeclared mailserver aliases:"));
1836 for (idp = ctl->server.akalist; idp; idp = idp->next)
1837 printf(" %s", idp->id);
1840 if (ctl->server.localdomains)
1844 printf(GT_(" Local domains:"));
1845 for (idp = ctl->server.localdomains; idp; idp = idp->next)
1846 printf(" %s", idp->id);
1853 if (ctl->server.interface)
1854 printf(GT_(" Connection must be through interface %s.\n"), ctl->server.interface);
1855 else if (outlevel >= O_VERBOSE)
1856 printf(GT_(" No interface requirement specified.\n"));
1857 if (ctl->server.monitor)
1858 printf(GT_(" Polling loop will monitor %s.\n"), ctl->server.monitor);
1859 else if (outlevel >= O_VERBOSE)
1860 printf(GT_(" No monitor interface specified.\n"));
1863 if (ctl->server.plugin)
1864 printf(GT_(" Server connections will be made via plugin %s (--plugin %s).\n"), ctl->server.plugin, ctl->server.plugin);
1865 else if (outlevel >= O_VERBOSE)
1866 printf(GT_(" No plugin command specified.\n"));
1867 if (ctl->server.plugout)
1868 printf(GT_(" Listener connections will be made via plugout %s (--plugout %s).\n"), ctl->server.plugout, ctl->server.plugout);
1869 else if (outlevel >= O_VERBOSE)
1870 printf(GT_(" No plugout command specified.\n"));
1872 if (ctl->server.protocol > P_POP2 && MAILBOX_PROTOCOL(ctl))
1875 printf(GT_(" No UIDs saved from this host.\n"));
1881 for (idp = ctl->oldsaved; idp; idp = idp->next)
1884 printf(GT_(" %d UIDs saved.\n"), count);
1885 if (outlevel >= O_VERBOSE)
1886 for (idp = ctl->oldsaved; idp; idp = idp->next)
1887 printf("\t%s\n", idp->id);
1891 if (ctl->server.tracepolls)
1892 printf(GT_(" Poll trace information will be added to the Received header.\n"));
1893 else if (outlevel >= O_VERBOSE)
1894 printf(GT_(" No poll trace information will be added to the Received header.\n.\n"));
1896 if (ctl->properties)
1897 printf(GT_(" Pass-through properties \"%s\".\n"),
1898 visbuf(ctl->properties));
1902 /* fetchmail.c ends here */