fetchmail.c
上传用户:xxcykj
上传日期:2007-01-04
资源大小:727k
文件大小:54k
源码类别:

Email客户端

开发平台:

Unix_Linux

  1. /*
  2.  * fetchmail.c -- main driver module for fetchmail
  3.  *
  4.  * For license terms, see the file COPYING in this directory.
  5.  */
  6. #include "config.h"
  7. #include <stdio.h>
  8. #include <ctype.h>
  9. #if defined(STDC_HEADERS)
  10. #include <stdlib.h>
  11. #endif
  12. #if defined(HAVE_UNISTD_H)
  13. #include <unistd.h>
  14. #endif
  15. #include <fcntl.h>
  16. #include <string.h>
  17. #include <signal.h>
  18. #include <getopt.h>
  19. #if defined(HAVE_SYSLOG)
  20. #include <syslog.h>
  21. #endif
  22. #include <pwd.h>
  23. #ifdef __FreeBSD__
  24. #include <grp.h>
  25. #endif
  26. #include <errno.h>
  27. #include <sys/time.h>
  28. #include <sys/types.h>
  29. #include <sys/stat.h>
  30. #ifdef HAVE_SETRLIMIT
  31. #include <sys/resource.h>
  32. #endif /* HAVE_SETRLIMIT */
  33. #ifdef HAVE_SYS_WAIT_H
  34. #include <sys/wait.h>
  35. #endif /* HAVE_SYS_WAIT_H */
  36. #include <sys/utsname.h>
  37. #ifdef HAVE_GETHOSTBYNAME
  38. #include <netdb.h>
  39. #endif /* HAVE_GETHOSTBYNAME */
  40. #ifdef HESIOD
  41. #include <hesiod.h>
  42. #endif
  43. #include "fetchmail.h"
  44. #include "tunable.h"
  45. #include "smtp.h"
  46. #include "netrc.h"
  47. #include "i18n.h"
  48. #ifndef ENETUNREACH
  49. #define ENETUNREACH   128       /* Interactive doesn't know this */
  50. #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 *);
  55. /* controls the detail level of status/progress messages written to stderr */
  56. int outlevel;         /* see the O_.* constants above */
  57. /* miscellaneous global controls */
  58. struct runctl run;     /* global controls for this run */
  59. flag nodetach;     /* if TRUE, don't detach daemon process */
  60. flag quitmode;     /* if --quit was set */
  61. flag check_only;     /* if --probe was set */
  62. flag versioninfo;     /* emit only version info */
  63. char *user;     /* the name of the invoking user */
  64. char *home;     /* invoking user's home directory */
  65. char *program_name;     /* the name to prefix error messages with */
  66. flag configdump;     /* dump control blocks for configurator */
  67. const char *fetchmailhost;  /* either `localhost' or the host's FQDN */
  68. volatile int lastsig; /* last signal received */
  69. #if NET_SECURITY
  70. void *request = NULL;
  71. int requestlen = 0;
  72. #endif /* NET_SECURITY */
  73. static char *lockfile; /* name of lockfile */
  74. static int lock_acquired; /* have we acquired a lock */
  75. static int querystatus; /* status of query */
  76. static int successes; /* count number of successful polls */
  77. static struct runctl cmd_run; /* global options set from command line */
  78. static time_t parsetime; /* time of last parse */
  79. static void terminate_run(int);
  80. static void terminate_poll(int);
  81. #ifdef SLEEP_WITH_ALARM
  82. /*
  83.  * The function of this variable is to remove the window during which a
  84.  * SIGALRM can hose the code (ALARM is triggered *before* pause() is called).
  85.  * This is a bit of a kluge; the real right thing would use sigprocmask(),
  86.  * sigsuspend().  This workaround lets the interval timer trigger the first
  87.  * alarm after the required interval and will then generate alarms all 5
  88.  * seconds, until it is certain, that the critical section (ie., the window)
  89.  * is left.
  90.  */
  91. #if defined(STDC_HEADERS)
  92. static sig_atomic_t alarm_latch = FALSE;
  93. #else
  94. /* assume int can be written in one atomic operation on non ANSI-C systems */
  95. static int alarm_latch = FALSE;
  96. #endif
  97. RETSIGTYPE gotsigalrm(sig)
  98. int sig;
  99. {
  100.     signal(sig, gotsigalrm);
  101.     lastsig = sig;
  102.     alarm_latch = TRUE;
  103. }
  104. #endif /* SLEEP_WITH_ALARM */
  105. RETSIGTYPE donothing(int sig) {signal(sig, donothing); lastsig = sig;}
  106. #ifdef HAVE_ON_EXIT
  107. static void unlockit(int n, void *p)
  108. #else
  109. static void unlockit(void)
  110. #endif
  111. /* must-do actions for exit (but we can't count on being able to do malloc) */
  112. {
  113.     if (lockfile && lock_acquired)
  114. unlink(lockfile);
  115. }
  116. #ifdef __EMX__
  117. /* Various EMX-specific definitions */
  118. int itimerflag;
  119. void itimerthread(void* dummy) {
  120.   if (outlevel >= O_VERBOSE)
  121.     report(stderr, _("fetchmail: thread sleeping for %d sec.n"), poll_interval);
  122.   while(1) {
  123.     _sleep2(poll_interval*1000);
  124.     kill((getpid()), SIGALRM);
  125.   }
  126. }
  127. #endif
  128. #ifdef __FreeBSD__
  129. /* drop SGID kmem privileage until we need it */
  130. static void dropprivs(void)
  131. {
  132.     struct group *gr;
  133.     gid_t        egid;
  134.     gid_t        rgid;
  135.     
  136.     egid = getegid();
  137.     rgid = getgid();
  138.     gr = getgrgid(egid);
  139.     
  140.     if (gr && !strcmp(gr->gr_name, "kmem"))
  141.     {
  142.      extern void interface_set_gids(gid_t egid, gid_t rgid);
  143.      interface_set_gids(egid, rgid);
  144.      setegid(rgid);
  145.     }
  146. }
  147. #endif
  148. int main(int argc, char **argv)
  149. {
  150.     int st, bkgd = FALSE;
  151.     int parsestatus, implicitmode = FALSE;
  152.     FILE *lockfp;
  153.     struct query *ctl;
  154.     netrc_entry *netrc_list;
  155.     char *netrc_file, *tmpbuf;
  156.     pid_t pid;
  157. #ifdef __FreeBSD__
  158.     dropprivs();
  159. #endif
  160.     envquery(argc, argv);
  161. #ifdef ENABLE_NLS
  162.     bindtextdomain(PACKAGE, LOCALEDIR);
  163.     textdomain(PACKAGE);
  164. #endif
  165.     /*
  166.      * Note: because we can't initialize reporting before we  know whether
  167.      * syslog is supposed to be on, this message will go to stdout and
  168.      * be lost when running in background.
  169.      */
  170.     if (outlevel >= O_VERBOSE)
  171.     {
  172. int i;
  173. report(stdout, "fetchmail: invoked with");
  174. for (i = 0; i < argc; i++)
  175.     report(stdout, " %s", argv[i]);
  176. report(stdout, "n");
  177.     }
  178. #define IDFILE_NAME ".fetchids"
  179.     run.idfile = (char *) xmalloc(strlen(home)+sizeof(IDFILE_NAME)+1);
  180.     strcpy(run.idfile, home);
  181.     strcat(run.idfile, "/");
  182.     strcat(run.idfile, IDFILE_NAME);
  183.   
  184.     outlevel = O_NORMAL;
  185.     /*
  186.      * We used to arrange for the lockfile to be removed on exit close
  187.      * to where the lock was asserted.  Now we need to do it here, because
  188.      * we might have re-executed in background with an existing lockfile
  189.      * as the result of a changed rcfile (see the code near the execvp(3)
  190.      * call near the beginning of the polling loop for details).  We want
  191.      * to be sure the lockfile gets nuked on any error exit, basically.
  192.      */
  193. #ifdef HAVE_ATEXIT
  194.     atexit(unlockit);
  195. #endif
  196. #ifdef HAVE_ON_EXIT
  197.     on_exit(unlockit, (char *)NULL);
  198. #endif
  199.     if ((parsestatus = parsecmdline(argc,argv, &cmd_run, &cmd_opts)) < 0)
  200. exit(PS_SYNTAX);
  201.     if (versioninfo)
  202.     {
  203. printf(_("This is fetchmail release %s"), VERSION);
  204. #ifdef POP2_ENABLE
  205. printf("+POP2");
  206. #endif /* POP2_ENABLE */
  207. #ifndef POP3_ENABLE
  208. printf("-POP3");
  209. #endif /* POP3_ENABLE */
  210. #ifndef IMAP_ENABLE
  211. printf("-IMAP");
  212. #endif /* IMAP_ENABLE */
  213. #ifdef GSSAPI
  214. printf("+IMAP-GSS");
  215. #endif /* GSSAPI */
  216. #ifdef RPA_ENABLE
  217. printf("+RPA");
  218. #endif /* RPA_ENABLE */
  219. #ifdef NTLM_ENABLE
  220. printf("+NTLM");
  221. #endif /* NTLM_ENABLE */
  222. #ifdef SDPS_ENABLE
  223. printf("+SDPS");
  224. #endif /* SDPS_ENABLE */
  225. #ifndef ETRN_ENABLE
  226. printf("-ETRN");
  227. #endif /* ETRN_ENABLE */
  228. #ifdef SSL_ENABLE
  229. printf("+SSL");
  230. #endif
  231. #if OPIE_ENABLE
  232. printf("+OPIE");
  233. #endif /* OPIE_ENABLE */
  234. #if INET6_ENABLE
  235. printf("+INET6");
  236. #endif /* INET6_ENABLE */
  237. #if NET_SECURITY
  238. printf("+NETSEC");
  239. #endif /* NET_SECURITY */
  240. #ifdef HAVE_SOCKS
  241. printf("+SOCKS");
  242. #endif /* HAVE_SOCKS */
  243. #if ENABLE_NLS
  244. printf("+NLS");
  245. #endif /* ENABLE_NLS */
  246. putchar('n');
  247. fflush(stdout);
  248. /* this is an attempt to help remote debugging */
  249. system("uname -a");
  250.     }
  251.     /* avoid parsing the config file if all we're doing is killing a daemon */ 
  252.     if (!(quitmode && argc == 2))
  253. implicitmode = load_params(argc, argv, optind);
  254. #if defined(HAVE_SYSLOG)
  255.     /* logging should be set up early in case we were restarted from exec */
  256.     if (run.use_syslog)
  257.     {
  258. openlog(program_name, LOG_PID, LOG_MAIL);
  259. report_init(-1);
  260.     }
  261.     else
  262. #endif
  263. report_init((run.poll_interval == 0 || nodetach) && !run.logfile);
  264.     /* set up to do lock protocol */
  265. #define FETCHMAIL_PIDFILE "fetchmail.pid"
  266.     if (!getuid()) {
  267. xalloca(tmpbuf, char *,
  268. sizeof(PID_DIR) + sizeof(FETCHMAIL_PIDFILE));
  269. sprintf(tmpbuf, "%s/%s", PID_DIR, FETCHMAIL_PIDFILE);
  270.     } else {
  271. xalloca(tmpbuf, char *, strlen(home) + sizeof(FETCHMAIL_PIDFILE) + 2);
  272. strcpy(tmpbuf, home);
  273. strcat(tmpbuf, "/.");
  274. strcat(tmpbuf, FETCHMAIL_PIDFILE);
  275.     }
  276. #undef FETCHMAIL_PIDFILE
  277. #ifdef HAVE_SETRLIMIT
  278.     /*
  279.      * Before getting passwords, disable core dumps unless -v -d0 mode is on.
  280.      * Core dumps could otherwise contain passwords to be scavenged by a
  281.      * cracker.
  282.      */
  283.     if (outlevel < O_VERBOSE || run.poll_interval > 0)
  284.     {
  285. struct rlimit corelimit;
  286. corelimit.rlim_cur = 0;
  287. corelimit.rlim_max = 0;
  288. setrlimit(RLIMIT_CORE, &corelimit);
  289.     }
  290. #endif /* HAVE_SETRLIMIT */
  291. #define NETRC_FILE ".netrc"
  292.     /* parse the ~/.netrc file (if present) for future password lookups. */
  293.     xalloca(netrc_file, char *, strlen (home) + sizeof(NETRC_FILE) + 1);
  294.     strcpy (netrc_file, home);
  295.     strcat (netrc_file, "/");
  296.     strcat (netrc_file, NETRC_FILE);
  297.     netrc_list = parse_netrc(netrc_file);
  298. #undef NETRC_FILE
  299.     /* pick up passwords where we can */ 
  300.     for (ctl = querylist; ctl; ctl = ctl->next)
  301.     {
  302. if (ctl->active && !(implicitmode && ctl->server.skip)&&!ctl->password)
  303. {
  304.     if (ctl->server.preauthenticate == A_KERBEROS_V4 ||
  305. ctl->server.preauthenticate == A_KERBEROS_V5 ||
  306. ctl->server.preauthenticate == A_SSH ||
  307. #ifdef GSSAPI
  308. ctl->server.protocol == P_IMAP_GSS ||
  309. #endif /* GSSAPI */
  310. ctl->server.protocol == P_IMAP_K4)
  311. /* Server won't care what the password is, but there
  312.    must be some non-null string here.  */
  313. ctl->password = ctl->remotename;
  314.     else
  315.     {
  316. netrc_entry *p;
  317. /* look up the pollname and account in the .netrc file. */
  318. p = search_netrc(netrc_list,
  319.  ctl->server.pollname, ctl->remotename);
  320. /* if we find a matching entry with a password, use it */
  321. if (p && p->password)
  322.     ctl->password = xstrdup(p->password);
  323. /* otherwise try with "via" name if there is one */
  324. else if (ctl->server.via)
  325. {
  326.     p = search_netrc(netrc_list, 
  327.      ctl->server.via, ctl->remotename);
  328.     if (p && p->password)
  329.         ctl->password = xstrdup(p->password);
  330. }
  331.     }
  332. }
  333.     }
  334.     /* perhaps we just want to check options? */
  335.     if (versioninfo)
  336.     {
  337. int havercfile = access(rcfile, 0);
  338. printf(_("Taking options from command line%s%sn"),
  339. havercfile ? "" :  _(" and "),
  340. havercfile ? "" : rcfile);
  341. if (outlevel >= O_VERBOSE)
  342.     printf(_("Lockfile at %sn"), tmpbuf);
  343. if (querylist == NULL)
  344.     fprintf(stderr,
  345.     _("No mailservers set up -- perhaps %s is missing?n"),
  346.     rcfile);
  347. else
  348.     dump_params(&run, querylist, implicitmode);
  349. exit(0);
  350.     }
  351.     /* dump options as a Python dictionary, for configurator use */
  352.     if (configdump)
  353.     {
  354. dump_config(&run, querylist);
  355. exit(0);
  356.     }
  357.     /* check for another fetchmail running concurrently */
  358.     pid = -1;
  359.     if ((lockfile = (char *) malloc(strlen(tmpbuf) + 1)) == NULL)
  360.     {
  361. report(stderr,_("fetchmail: cannot allocate memory for lock name.n"));
  362. exit(PS_EXCLUDE);
  363.     }
  364.     else
  365. (void) strcpy(lockfile, tmpbuf);
  366.     if ((lockfp = fopen(lockfile, "r")) != NULL )
  367.     {
  368. bkgd = (fscanf(lockfp,"%d %d", &pid, &st) == 2);
  369. if (kill(pid, 0) == -1) {
  370.     fprintf(stderr,_("fetchmail: removing stale lockfilen"));
  371.     pid = -1;
  372.     bkgd = FALSE;
  373.     unlink(lockfile);
  374. }
  375. fclose(lockfp); /* not checking should be safe, file mode was "r" */
  376.     }
  377.     /* if no mail servers listed and nothing in background, we're done */
  378.     if (!(quitmode && argc == 2) && pid == -1 && querylist == NULL) {
  379. (void)fputs(_("fetchmail: no mailservers have been specified.n"),stderr);
  380. exit(PS_SYNTAX);
  381.     }
  382.     /* perhaps user asked us to kill the other fetchmail */
  383.     if (quitmode)
  384.     {
  385. if (pid == -1) 
  386. {
  387.     fprintf(stderr,_("fetchmail: no other fetchmail is runningn"));
  388.     if (argc == 2)
  389. exit(PS_EXCLUDE);
  390. }
  391. else if (kill(pid, SIGTERM) < 0)
  392. {
  393.     fprintf(stderr,_("fetchmail: error killing %s fetchmail at %d; bailing out.n"),
  394.     bkgd ? _("background") : _("foreground"), pid);
  395.     exit(PS_EXCLUDE);
  396. }
  397. else
  398. {
  399.     fprintf(stderr,_("fetchmail: %s fetchmail at %d killed.n"),
  400.     bkgd ? _("background") : _("foreground"), pid);
  401.     unlink(lockfile);
  402.     if (argc == 2)
  403. exit(0);
  404.     else
  405. pid = -1; 
  406. }
  407.     }
  408.     /* another fetchmail is running -- wake it up or die */
  409.     if (pid != -1)
  410.     {
  411. if (check_only)
  412. {
  413.     fprintf(stderr,
  414.  _("fetchmail: can't check mail while another fetchmail to same host is running.n"));
  415.     return(PS_EXCLUDE);
  416.         }
  417. else if (!implicitmode)
  418. {
  419.     fprintf(stderr,
  420.  _("fetchmail: can't poll specified hosts with another fetchmail running at %d.n"),
  421.  pid);
  422. return(PS_EXCLUDE);
  423. }
  424. else if (!bkgd)
  425. {
  426.     fprintf(stderr,
  427.  _("fetchmail: another foreground fetchmail is running at %d.n"),
  428.  pid);
  429. return(PS_EXCLUDE);
  430. }
  431. else if (argc > 1)
  432. {
  433.     /* this test enables re-execing on a changed rcfile */
  434.     if (getpid() == pid)
  435. lock_acquired = TRUE;
  436.     else
  437.     {
  438. fprintf(stderr,
  439. _("fetchmail: can't accept options while a background fetchmail is running.n"));
  440. return(PS_EXCLUDE);
  441.     }
  442. }
  443. else if (kill(pid, SIGUSR1) == 0)
  444. {
  445.     fprintf(stderr,
  446.     _("fetchmail: background fetchmail at %d awakened.n"),
  447.     pid);
  448.     return(0);
  449. }
  450. else
  451. {
  452.     /*
  453.      * Should never happen -- possible only if a background fetchmail
  454.      * croaks after the first kill probe above but before the
  455.      * SIGUSR1/SIGHUP transmission.
  456.      */
  457.     fprintf(stderr,
  458.     _("fetchmail: elder sibling at %d died mysteriously.n"),
  459.     pid);
  460.     return(PS_UNDEFINED);
  461. }
  462.     }
  463.     /* pick up interactively any passwords we need but don't have */ 
  464.     for (ctl = querylist; ctl; ctl = ctl->next)
  465.     {
  466. if (ctl->active && !(implicitmode && ctl->server.skip)
  467.     && ctl->server.protocol != P_ETRN 
  468.     && ctl->server.protocol != P_IMAP_K4
  469. #ifdef GSSAPI
  470.     && ctl->server.protocol != P_IMAP_GSS
  471. #endif /* GSSAPI */
  472.     && !ctl->password)
  473. {
  474.     char* password_prompt = _("Enter password for %s@%s: ");
  475.     xalloca(tmpbuf, char *, strlen(password_prompt) +
  476.     strlen(ctl->remotename) +
  477.     strlen(ctl->server.pollname) + 1);
  478.     (void) sprintf(tmpbuf, password_prompt,
  479.    ctl->remotename, ctl->server.pollname);
  480.     ctl->password = xstrdup((char *)getpassword(tmpbuf));
  481. }
  482.     }
  483.     /*
  484.      * Time to initiate the SOCKS library (this is not mandatory: it just
  485.      * registers the correct application name for logging purpose. If you
  486.      * have some problem, comment out these lines).
  487.      */
  488. #ifdef HAVE_SOCKS
  489.     SOCKSinit("fetchmail");
  490. #endif /* HAVE_SOCKS */
  491.     /*
  492.      * Maybe time to go to demon mode...
  493.      */
  494.     if (run.poll_interval)
  495.     {
  496. if (!nodetach)
  497.     daemonize(run.logfile, terminate_run);
  498. report(stdout, _("starting fetchmail %s daemon n"), VERSION);
  499. /*
  500.  * We'll set up a handler for these when we're sleeping,
  501.  * but ignore them otherwise so as not to interrupt a poll.
  502.  */
  503. signal(SIGUSR1, SIG_IGN);
  504. if (run.poll_interval && !getuid())
  505.     signal(SIGHUP, SIG_IGN);
  506.     }
  507.     else if (run.logfile && access(run.logfile, F_OK) == 0)
  508.     {
  509. freopen(run.logfile, "a", stdout);
  510. freopen(run.logfile, "a", stderr);
  511.     }
  512. #ifdef linux
  513.     interface_init();
  514. #endif /* linux */
  515.     /* beyond here we don't want more than one fetchmail running per user */
  516.     umask(0077);
  517.     signal(SIGABRT, terminate_run);
  518.     signal(SIGINT, terminate_run);
  519.     signal(SIGTERM, terminate_run);
  520.     signal(SIGALRM, terminate_run);
  521.     signal(SIGPIPE, terminate_run);
  522.     signal(SIGQUIT, terminate_run);
  523.     /* here's the exclusion lock */
  524.     if ((st = open(lockfile, O_WRONLY|O_CREAT|O_EXCL|O_SYNC, 0666)) != -1)
  525.     {
  526. sprintf(tmpbuf,"%d", getpid());
  527. write(st, tmpbuf, strlen(tmpbuf));
  528. if (run.poll_interval)
  529. {
  530.     sprintf(tmpbuf," %d", run.poll_interval);
  531.     write(st, tmpbuf, strlen(tmpbuf));
  532. }
  533. close(st); /* should be safe, fd was opened with O_SYNC */
  534. lock_acquired = TRUE;
  535.     }
  536.     /*
  537.      * Query all hosts. If there's only one, the error return will
  538.      * reflect the status of that transaction.
  539.      */
  540.     do {
  541. /* 
  542.  * Check to see if the rcfile has been touched.  If so,
  543.  * re-exec so the file will be reread.  Doing it this way
  544.  * avoids all the complications of trying to deallocate the
  545.  * in-core control structures -- and the potential memory
  546.  * leaks...
  547.  */
  548. struct stat rcstat;
  549. if (stat(rcfile, &rcstat) == -1)
  550. {
  551.     if (errno != ENOENT)
  552. report(stderr, 
  553.        _("couldn't time-check %s (error %d)n"),
  554.        rcfile, errno);
  555. }
  556. else if (rcstat.st_mtime > parsetime)
  557. {
  558.     report(stdout, _("restarting fetchmail (%s changed)n"), rcfile);
  559.     execvp("fetchmail", argv);
  560.     report(stderr, _("attempt to re-exec fetchmail failedn"));
  561. }
  562. #if defined(HAVE_RES_SEARCH) && defined(USE_TCPIP_FOR_DNS)
  563. /*
  564.  * This was an efficiency hack that backfired.  The theory
  565.  * was that using TCP/IP for DNS queries would get us better
  566.  * reliability and shave off some per-UDP-packet costs.
  567.  * Unfortunately it interacted badly with diald, which effectively 
  568.  * filters out DNS queries over TCP/IP for reasons having to do
  569.  * with some obscure kernel problem involving bootstrapping of
  570.  * dynamically-addressed links.  I don't understand this mess
  571.  * and don't want to, so it's "See ya!" to this hack.
  572.  */
  573. sethostent(TRUE); /* use TCP/IP for mailserver queries */
  574. #endif /* HAVE_RES_SEARCH */
  575. batchcount = 0;
  576. for (ctl = querylist; ctl; ctl = ctl->next)
  577. {
  578.     if (ctl->active && !(implicitmode && ctl->server.skip))
  579.     {
  580. if (ctl->wedged)
  581. {
  582.     report(stderr, 
  583.   _("poll of %s skipped (failed authentication or too many timeouts)n"),
  584.   ctl->server.pollname);
  585.     continue;
  586. }
  587. /* check skip interval first so that it counts all polls */
  588. if (run.poll_interval && ctl->server.interval) 
  589. {
  590.     if (ctl->server.poll_count++ % ctl->server.interval) 
  591.     {
  592. if (outlevel >= O_VERBOSE)
  593.     report(stdout,
  594.     _("interval not reached, not querying %sn"),
  595.     ctl->server.pollname);
  596. continue;
  597.     }
  598. }
  599. #if (defined(linux) && !INET6_ENABLE) || defined(__FreeBSD__)
  600. /* interface_approve() does its own error logging */
  601. if (!interface_approve(&ctl->server))
  602.     continue;
  603. #endif /* (defined(linux) && !INET6_ENABLE) || defined(__FreeBSD__) */
  604. querystatus = query_host(ctl);
  605. #ifdef POP3_ENABLE
  606. if (!check_only)
  607.     uid_end_query(ctl);
  608. #endif  /* POP3_ENABLE */
  609. if (querystatus == PS_SUCCESS)
  610.     successes++;
  611. else if (!check_only && 
  612.  ((querystatus!=PS_NOMAIL) || (outlevel==O_DEBUG)))
  613.     report(stdout, _("Query status=%dn"), querystatus);
  614. #if (defined(linux) && !INET6_ENABLE) || defined (__FreeBSD__)
  615. if (ctl->server.monitor)
  616. {
  617.     /*
  618.      * Allow some time for the link to quiesce.  One
  619.      * second is usually sufficient, three is safe.
  620.      * Note:  this delay is important - don't remove!
  621.      */
  622.     sleep(3);
  623.     interface_note_activity(&ctl->server);
  624. }
  625. #endif /* (defined(linux) && !INET6_ENABLE) || defined(__FreeBSD__) */
  626.     }
  627. }
  628. #if defined(HAVE_RES_SEARCH) && defined(USE_TCPIP_FOR_DNS)
  629. endhostent(); /* release TCP/IP connection to nameserver */
  630. #endif /* HAVE_RES_SEARCH */
  631. /* close connections cleanly */
  632. terminate_poll(0);
  633. /*
  634.  * OK, we've polled.  Now sleep.
  635.  */
  636. if (run.poll_interval)
  637. {
  638.     /* 
  639.      * Because passwords can expire, it may happen that *all*
  640.      * hosts are now out of the loop due to authfail
  641.      * conditions.  If this happens daemon-mode fetchmail
  642.      * should softly and silently vanish away, rather than
  643.      * spinning uselessly.
  644.      */
  645.     int unwedged = 0;
  646.     for (ctl = querylist; ctl; ctl = ctl->next)
  647. if (ctl->active && !(implicitmode && ctl->server.skip))
  648.     if (!ctl->wedged)
  649. unwedged++;
  650.     if (!unwedged)
  651.     {
  652. report(stderr, _("All connections are wedged.  Exiting.n"));
  653. /* FIXME: someday, send notification mail */
  654. exit(PS_AUTHFAIL);
  655.     }
  656.     if (outlevel >= O_VERBOSE)
  657. report(stdout, 
  658.        _("fetchmail: sleeping at %sn"), rfc822timestamp());
  659.     /*
  660.      * With this simple hack, we make it possible for a foreground 
  661.      * fetchmail to wake up one in daemon mode.  What we want is the
  662.      * side effect of interrupting any sleep that may be going on,
  663.      * forcing fetchmail to re-poll its hosts.  The second line is
  664.      * for people who think all system daemons wake up on SIGHUP.
  665.      */
  666.     signal(SIGUSR1, donothing);
  667.     if (!getuid())
  668. signal(SIGHUP, donothing);
  669.     /* time for a pause in the action... */
  670.     {
  671. #ifndef __EMX__
  672. #ifdef SLEEP_WITH_ALARM /* not normally on */
  673. /*
  674.  * We can't use sleep(3) here because we need an alarm(3)
  675.  * equivalent in order to implement server nonresponse timeout.
  676.  * We'll just assume setitimer(2) is available since fetchmail
  677.  * has to have a BSDoid socket layer to work at all.
  678.  */
  679. /* 
  680.  * This code stopped working under glibc-2, apparently due
  681.  * to the change in signal(2) semantics.  (The siginterrupt
  682.  * line, added later, should fix this problem.) John Stracke
  683.  * <francis@netscape.com> wrote:
  684.  *
  685.  * The problem seems to be that, after hitting the interval
  686.  * timer while talking to the server, the process no longer
  687.  * responds to SIGALRM.  I put in printf()s to see when it
  688.  * reached the pause() for the poll interval, and I checked
  689.  * the return from setitimer(), and everything seemed to be
  690.  * working fine, except that the pause() just ignored SIGALRM.
  691.  * I thought maybe the itimer wasn't being fired, so I hit
  692.  * it with a SIGALRM from the command line, and it ignored
  693.  * that, too.  SIGUSR1 woke it up just fine, and it proceeded
  694.  * to repoll--but, when the dummy server didn't respond, it
  695.  * never timed out, and SIGALRM wouldn't make it.
  696.  *
  697.  * (continued below...)
  698.  */
  699. struct itimerval ntimeout;
  700. ntimeout.it_interval.tv_sec = 5; /* repeat alarm every 5 secs */
  701. ntimeout.it_interval.tv_usec = 0;
  702. ntimeout.it_value.tv_sec  = run.poll_interval;
  703. ntimeout.it_value.tv_usec = 0;
  704. siginterrupt(SIGALRM, 1);
  705. alarm_latch = FALSE;
  706. signal(SIGALRM, gotsigalrm); /* first trap signals */
  707. setitimer(ITIMER_REAL,&ntimeout,NULL); /* then start timer */
  708. /* there is a very small window between the next two lines */
  709. /* which could result in a deadlock.  But this will now be  */
  710. /* caught by periodical alarms (see it_interval) */
  711. if (!alarm_latch)
  712.     pause();
  713. /* stop timer */
  714. ntimeout.it_interval.tv_sec = ntimeout.it_interval.tv_usec = 0;
  715. ntimeout.it_value.tv_sec  = ntimeout.it_value.tv_usec = 0;
  716. setitimer(ITIMER_REAL,&ntimeout,NULL); /* now stop timer */
  717. signal(SIGALRM, SIG_IGN);
  718. #else
  719. /* 
  720.  * So the workaround I used is to make it sleep by using
  721.  * select() instead of setitimer()/pause().  select() is
  722.  * perfectly happy being called with a timeout and
  723.  * no file descriptors; it just sleeps until it hits the
  724.  * timeout.  The only concern I had was that it might
  725.  * implement its timeout with SIGALRM--there are some
  726.  * Unices where this is done, because select() is a library
  727.  * function--but apparently not.
  728.  */
  729.                 struct timeval timeout;
  730.                 timeout.tv_sec = run.poll_interval;
  731.                 timeout.tv_usec = 0;
  732.                 do {
  733.                     lastsig = 0;
  734.                     select(0,0,0,0, &timeout);
  735.                 } while (lastsig == SIGCHLD);
  736. #endif
  737. #else /* EMX */
  738. alarm_latch = FALSE;
  739. signal(SIGALRM, gotsigalrm);
  740. _beginthread(itimerthread, NULL, 32768, NULL);
  741. /* see similar code above */
  742. if (!alarm_latch)
  743.     pause();
  744. signal(SIGALRM, SIG_IGN);
  745. #endif /* ! EMX */
  746. if (lastsig == SIGUSR1
  747. || ((run.poll_interval && !getuid()) && lastsig == SIGHUP))
  748. {
  749. #ifdef SYS_SIGLIST_DECLARED
  750.     report(stdout, 
  751.    _("awakened by %sn"), sys_siglist[lastsig]);
  752. #else
  753.     report(stdout, 
  754.    _("awakened by signal %dn"), lastsig);
  755. #endif
  756.     /* received a wakeup - unwedge all servers in case */
  757.     /* the problem has been manually repaired          */
  758.     for (ctl = querylist; ctl; ctl = ctl->next)
  759.         ctl->wedged = FALSE;
  760. }
  761.     }
  762.     /* now lock out interrupts again */
  763.     signal(SIGUSR1, SIG_IGN);
  764.     if (!getuid())
  765. signal(SIGHUP, SIG_IGN);
  766.     if (outlevel >= O_VERBOSE)
  767. report(stdout, _("awakened at %sn"), rfc822timestamp());
  768. }
  769.     } while
  770. (run.poll_interval);
  771.     if (outlevel >= O_VERBOSE)
  772. report(stdout, _("normal termination, status %dn"),
  773. successes ? PS_SUCCESS : querystatus);
  774.     terminate_run(0);
  775.     exit(successes ? PS_SUCCESS : querystatus);
  776. }
  777. static void optmerge(struct query *h2, struct query *h1, int force)
  778. /* merge two options records */
  779. {
  780.     /*
  781.      * If force is off, modify h2 fields only when they're empty (treat h1
  782.      * as defaults).  If force is on, modify each h2 field whenever h1
  783.      * is nonempty (treat h1 as an override).  
  784.      */
  785. #define LIST_MERGE(dstl, srcl) if (force ? !!srcl : !dstl) 
  786.      free_str_list(&dstl), 
  787. append_str_list(&dstl, &srcl)
  788.     LIST_MERGE(h2->server.localdomains, h1->server.localdomains);
  789.     LIST_MERGE(h2->localnames, h1->localnames);
  790.     LIST_MERGE(h2->mailboxes, h1->mailboxes);
  791.     LIST_MERGE(h2->smtphunt, h1->smtphunt);
  792.     LIST_MERGE(h2->antispam, h1->antispam);
  793. #undef LIST_MERGE
  794. #define FLAG_MERGE(fld) if (force ? !!h1->fld : !h2->fld) h2->fld = h1->fld
  795.     FLAG_MERGE(server.via);
  796.     FLAG_MERGE(server.protocol);
  797. #if INET6_ENABLE
  798.     FLAG_MERGE(server.service);
  799.     FLAG_MERGE(server.netsec);
  800. #else /* INET6_ENABLE */
  801.     FLAG_MERGE(server.port);
  802. #endif /* INET6_ENABLE */
  803.     FLAG_MERGE(server.interval);
  804.     FLAG_MERGE(server.preauthenticate);
  805.     FLAG_MERGE(server.timeout);
  806.     FLAG_MERGE(server.envelope);
  807.     FLAG_MERGE(server.envskip);
  808.     FLAG_MERGE(server.qvirtual);
  809.     FLAG_MERGE(server.skip);
  810.     FLAG_MERGE(server.dns);
  811.     FLAG_MERGE(server.checkalias);
  812.     FLAG_MERGE(server.uidl);
  813. #if defined(linux) || defined(__FreeBSD__)
  814.     FLAG_MERGE(server.interface);
  815.     FLAG_MERGE(server.monitor);
  816.     FLAG_MERGE(server.interface_pair);
  817. #endif /* linux || defined(__FreeBSD__) */
  818.     FLAG_MERGE(server.plugin);
  819.     FLAG_MERGE(server.plugout);
  820.     FLAG_MERGE(wildcard);
  821.     FLAG_MERGE(remotename);
  822.     FLAG_MERGE(password);
  823.     FLAG_MERGE(mda);
  824.     FLAG_MERGE(bsmtp);
  825.     FLAG_MERGE(listener);
  826.     FLAG_MERGE(smtpaddress);
  827.     FLAG_MERGE(preconnect);
  828.     FLAG_MERGE(postconnect);
  829.     FLAG_MERGE(keep);
  830.     FLAG_MERGE(flush);
  831.     FLAG_MERGE(fetchall);
  832.     FLAG_MERGE(rewrite);
  833.     FLAG_MERGE(forcecr);
  834.     FLAG_MERGE(stripcr);
  835.     FLAG_MERGE(pass8bits);
  836.     FLAG_MERGE(dropstatus);
  837.     FLAG_MERGE(mimedecode);
  838.     FLAG_MERGE(limit);
  839.     FLAG_MERGE(warnings);
  840.     FLAG_MERGE(fetchlimit);
  841.     FLAG_MERGE(batchlimit);
  842. #ifdef SSL_ENABLE
  843.     FLAG_MERGE(use_ssl);
  844.     FLAG_MERGE(sslkey);
  845.     FLAG_MERGE(sslcert);
  846. #endif
  847.     FLAG_MERGE(expunge);
  848.     FLAG_MERGE(properties);
  849. #undef FLAG_MERGE
  850. }
  851. static int load_params(int argc, char **argv, int optind)
  852. {
  853.     int implicitmode, st;
  854.     struct passwd *pw;
  855.     struct query def_opts, *ctl;
  856.     struct stat rcstat;
  857.     run.bouncemail = TRUE;
  858.     memset(&def_opts, '', sizeof(struct query));
  859.     def_opts.smtp_socket = -1;
  860.     def_opts.smtpaddress = (char *)0;
  861. #define ANTISPAM(n) save_str(&def_opts.antispam, STRING_DUMMY, 0)->val.status.num = (n)
  862.     ANTISPAM(571); /* sendmail */
  863.     ANTISPAM(550); /* old exim */
  864.     ANTISPAM(501); /* new exim */
  865.     ANTISPAM(554); /* Postfix */
  866. #undef ANTISPAM
  867.     def_opts.server.protocol = P_AUTO;
  868.     def_opts.server.timeout = CLIENT_TIMEOUT;
  869.     def_opts.warnings = WARNING_INTERVAL;
  870.     def_opts.remotename = user;
  871.     def_opts.listener = SMTP_MODE;
  872.     /* note the parse time, so we can pick up on modifications */
  873.     parsetime = 0; /* foil compiler warnings */
  874.     if (stat(rcfile, &rcstat) != -1)
  875. parsetime = rcstat.st_mtime;
  876.     else if (errno != ENOENT)
  877. report(stderr, _("couldn't time-check the run-control filen"));
  878.     /* this builds the host list */
  879.     if ((st = prc_parse_file(rcfile, !versioninfo)) != 0)
  880. /*
  881.  * FIXME: someday, send notification mail here if backgrounded.
  882.  * Right now, that can happen if the user changes the rcfile
  883.  * while the fetchmail is running in background.  Do similarly
  884.  * for the other exit() calls in this function.
  885.  */
  886. exit(st);
  887.     if ((implicitmode = (optind >= argc)))
  888.     {
  889. for (ctl = querylist; ctl; ctl = ctl->next)
  890.     ctl->active = TRUE;
  891.     }
  892.     else
  893. for (; optind < argc; optind++) 
  894. {
  895.     flag predeclared =  FALSE;
  896.     /*
  897.      * If hostname corresponds to a host known from the rc file,
  898.      * simply declare it active.  Otherwise synthesize a host
  899.      * record from command line and defaults
  900.      */
  901.     for (ctl = querylist; ctl; ctl = ctl->next)
  902. if (!strcmp(ctl->server.pollname, argv[optind])
  903. || str_in_list(&ctl->server.akalist, argv[optind], TRUE))
  904. {
  905.     /* Is this correct? */
  906.     if(predeclared)
  907. fprintf(stderr,_("Warning: multiple mentions of host %s in config filen"),argv[optind]);
  908.     ctl->active = TRUE;
  909.     predeclared = TRUE;
  910. }
  911.     if (!predeclared)
  912.     {
  913. /*
  914.  * Allocate and link record without copying in
  915.  * command-line args; we'll do that with the optmerge
  916.  * call later on.
  917.  */
  918. ctl = hostalloc((struct query *)NULL);
  919. ctl->server.via =
  920.     ctl->server.pollname = xstrdup(argv[optind]);
  921. ctl->active = TRUE;
  922. ctl->server.lead_server = (struct hostdata *)NULL;
  923.     }
  924. }
  925.     /*
  926.      * If there's a defaults record, merge it and lose it.
  927.      */ 
  928.     if (querylist && strcmp(querylist->server.pollname, "defaults") == 0)
  929.     {
  930. for (ctl = querylist->next; ctl; ctl = ctl->next)
  931.     optmerge(ctl, querylist, FALSE);
  932. querylist = querylist->next;
  933.     }
  934.     /* don't allow a defaults record after the first */
  935.     for (ctl = querylist; ctl; ctl = ctl->next)
  936. if (ctl != querylist && strcmp(ctl->server.pollname, "defaults") == 0)
  937.     exit(PS_SYNTAX);
  938.     /* use localhost if we never fetch the FQDN of this host */
  939.     fetchmailhost = "localhost";
  940.     /* merge in wired defaults, do sanity checks and prepare internal fields */
  941.     for (ctl = querylist; ctl; ctl = ctl->next)
  942.     {
  943. ctl->wedged = FALSE;
  944. if (configdump || (ctl->active && !(implicitmode && ctl->server.skip)))
  945. {
  946.     /* merge in defaults */
  947.     optmerge(ctl, &def_opts, FALSE);
  948.     /* force command-line options */
  949.     optmerge(ctl, &cmd_opts, TRUE);
  950.     /* this code enables flags to be turned off */
  951. #define DEFAULT(flag, dflt) if (flag == FLAG_TRUE)
  952.      flag = TRUE;
  953. else if (flag == FLAG_FALSE)
  954. flag = FALSE;
  955. else
  956. flag = (dflt)
  957.     DEFAULT(ctl->keep, FALSE);
  958.     DEFAULT(ctl->fetchall, FALSE);
  959.     DEFAULT(ctl->flush, FALSE);
  960.     DEFAULT(ctl->rewrite, TRUE);
  961.     DEFAULT(ctl->stripcr, (ctl->mda != (char *)NULL)); 
  962.     DEFAULT(ctl->forcecr, FALSE);
  963.     DEFAULT(ctl->pass8bits, FALSE);
  964.     DEFAULT(ctl->dropstatus, FALSE);
  965.     DEFAULT(ctl->mimedecode, FALSE);
  966.     DEFAULT(ctl->server.dns, TRUE);
  967.     DEFAULT(ctl->server.uidl, FALSE);
  968. #ifdef SSL_ENABLE
  969.     DEFAULT(ctl->use_ssl, FALSE);
  970. #endif
  971.     DEFAULT(ctl->server.checkalias, FALSE);
  972. #undef DEFAULT
  973.     /*
  974.      * DNS support is required for some protocols.  We used to
  975.      * do this unconditionally, but it made fetchmail excessively
  976.      * vulnerable to misconfigured DNS setups.
  977.      *
  978.      * If we're using ETRN, the smtp hunt list is the list of
  979.      * systems we're polling on behalf of; these have to be 
  980.      * fully-qualified domain names.  The default for this list
  981.      * should be the FQDN of localhost.
  982.      *
  983.      * If we're using Kerberos for authentication, we need 
  984.      * the FQDN in order to generate capability keys.
  985.      */
  986.     if (ctl->server.protocol == P_ETRN
  987.  || ctl->server.preauthenticate == A_KERBEROS_V4
  988.  || ctl->server.preauthenticate == A_KERBEROS_V5)
  989. if (strcmp(fetchmailhost, "localhost") == 0)
  990. fetchmailhost = host_fqdn();
  991.     /*
  992.      * Make sure we have a nonempty host list to forward to.
  993.      */
  994.     if (!ctl->smtphunt)
  995. save_str(&ctl->smtphunt, fetchmailhost, FALSE);
  996.     /* if `user' doesn't name a real local user, try to run as root */
  997.     if ((pw = getpwnam(user)) == (struct passwd *)NULL)
  998. ctl->uid = 0;
  999.             else
  1000. ctl->uid = pw->pw_uid; /* for local delivery via MDA */
  1001.     if (!ctl->localnames) /* for local delivery via SMTP */
  1002. save_str_pair(&ctl->localnames, user, NULL);
  1003. #if !defined(HAVE_GETHOSTBYNAME) || !defined(HAVE_RES_SEARCH)
  1004.     /* can't handle multidrop mailboxes unless we can do DNS lookups */
  1005.     if (ctl->localnames && ctl->localnames->next && ctl->server.dns)
  1006.     {
  1007. ctl->server.dns = FALSE;
  1008. report(stderr, _("fetchmail: warning: no DNS available to check multidrop fetches from %sn"), ctl->server.pollname);
  1009.     }
  1010. #endif /* !HAVE_GETHOSTBYNAME || !HAVE_RES_SEARCH */
  1011.     /*
  1012.      *
  1013.      * Compute the true name of the mailserver host.  
  1014.      * There are two clashing cases here:
  1015.      *
  1016.      * (1) The poll name is a label, possibly on one of several
  1017.      *     poll configurations for the same host.  In this case 
  1018.      *     the `via' option will be present and give the true name.
  1019.      *
  1020.      * (2) The poll name is the true one, the via name is 
  1021.      *     localhost.   This is going to be typical for ssh-using
  1022.      *     configurations.
  1023.      *
  1024.      * We're going to assume the via name is true unless it's
  1025.      * localhost.
  1026.      */
  1027.     if (ctl->server.via && strcmp(ctl->server.via, "localhost"))
  1028. ctl->server.queryname = xstrdup(ctl->server.via);
  1029.     else
  1030. ctl->server.queryname = xstrdup(ctl->server.pollname);
  1031. #ifdef HESIOD
  1032.         /* If either the pollname or vianame are "hesiod" we want to
  1033.            lookup the user's hesiod pobox host */
  1034.         if (!strcasecmp(ctl->server.queryname, "hesiod")) {
  1035.             struct hes_postoffice *hes_p;
  1036.             hes_p = hes_getmailhost(ctl->remotename);
  1037.             if (hes_p != NULL && strcmp(hes_p->po_type, "POP") == 0) {
  1038.                  free(ctl->server.queryname);
  1039.                  ctl->server.queryname = xstrdup(hes_p->po_host);
  1040.                  if (ctl->server.via)
  1041.                      free(ctl->server.via);
  1042.                  ctl->server.via = xstrdup(hes_p->po_host);
  1043.             } else {
  1044.                  report(stderr,
  1045. _("couldn't find HESIOD pobox for %sn"),
  1046. ctl->remotename);
  1047.             }
  1048.         }
  1049. #endif /* HESIOD */
  1050.     /*
  1051.      * We may have to canonicalize the server truename for later use.
  1052.      * Do this just once for each lead server, if necessary, in order
  1053.      * to minimize DNS round trips.
  1054.      */
  1055.     if (ctl->server.lead_server)
  1056.     {
  1057. char *leadname = ctl->server.lead_server->truename;
  1058. /* prevent core dump from ill-formed or duplicate entry */
  1059. if (!leadname)
  1060. {
  1061.     report(stderr, 
  1062.    _("Lead server has no name.n"));
  1063.     exit(PS_SYNTAX);
  1064. }
  1065. ctl->server.truename = xstrdup(leadname);
  1066.     }
  1067. #ifdef HAVE_GETHOSTBYNAME
  1068.     else if (ctl->server.preauthenticate==A_KERBEROS_V4 ||
  1069. ctl->server.preauthenticate==A_KERBEROS_V5 ||
  1070. (ctl->server.dns && MULTIDROP(ctl)))
  1071.     {
  1072. struct hostent *namerec;
  1073. /* compute the canonical name of the host */
  1074. errno = 0;
  1075. namerec = gethostbyname(ctl->server.queryname);
  1076. if (namerec == (struct hostent *)NULL)
  1077. {
  1078.     report(stderr,
  1079.   _("couldn't find canonical DNS name of %sn"),
  1080.   ctl->server.pollname);
  1081.     exit(PS_DNS);
  1082. }
  1083. else
  1084.     ctl->server.truename=xstrdup((char *)namerec->h_name);
  1085.     }
  1086. #endif /* HAVE_GETHOSTBYNAME */
  1087.     else
  1088. ctl->server.truename = xstrdup(ctl->server.queryname);
  1089.     /* if no folders were specified, set up the null one as default */
  1090.     if (!ctl->mailboxes)
  1091. save_str(&ctl->mailboxes, (char *)NULL, 0);
  1092.     /* maybe user overrode timeout on command line? */
  1093.     if (ctl->server.timeout == -1)
  1094. ctl->server.timeout = CLIENT_TIMEOUT;
  1095. #if !INET6_ENABLE
  1096.     /* sanity checks */
  1097.     if (ctl->server.port < 0)
  1098.     {
  1099. (void) fprintf(stderr,
  1100.        _("%s configuration invalid, port number cannot be negativen"),
  1101.        ctl->server.pollname);
  1102. exit(PS_SYNTAX);
  1103.     }
  1104.     if (ctl->server.protocol == P_RPOP && ctl->server.port >= 1024)
  1105.     {
  1106. (void) fprintf(stderr,
  1107.        _("%s configuration invalid, RPOP requires a privileged portn"),
  1108.        ctl->server.pollname);
  1109. exit(PS_SYNTAX);
  1110.     }
  1111.     if (ctl->listener == LMTP_MODE)
  1112.     {
  1113. struct idlist *idp;
  1114. for (idp = ctl->smtphunt; idp; idp = idp->next)
  1115. {
  1116.     char *cp;
  1117.     if (!(cp = strrchr(idp->id, '/')) ||
  1118. (atoi(++cp) == SMTP_PORT))
  1119.     {
  1120. (void) fprintf(stderr,
  1121.        _("%s configuration invalid, LMTP can't use default SMTP portn"),
  1122.        ctl->server.pollname);
  1123. exit(PS_SYNTAX);
  1124.     }
  1125. }
  1126.     }
  1127. #endif /* !INET6_ENABLE */
  1128.     /*
  1129.      * "I beg to you, have mercy on the week minds like myself."
  1130.      * wrote Pehr Anderson.  Your petition is granted.
  1131.      */
  1132.     if (ctl->fetchall && ctl->keep && run.poll_interval && !nodetach)
  1133.     {
  1134. (void) fprintf(stderr,
  1135.        _("Both fetchall and keep on in daemon mode is a mistake!n"));
  1136. exit(PS_SYNTAX);
  1137.     }
  1138. }
  1139.     }
  1140.     /* here's where we override globals */
  1141.     if (cmd_run.logfile)
  1142. run.logfile = cmd_run.logfile;
  1143.     if (cmd_run.idfile)
  1144. run.idfile = cmd_run.idfile;
  1145.     if (cmd_run.poll_interval >= 0)
  1146. run.poll_interval = cmd_run.poll_interval;
  1147.     if (cmd_run.invisible)
  1148. run.invisible = cmd_run.invisible;
  1149.     if (cmd_run.use_syslog)
  1150. run.use_syslog = (cmd_run.use_syslog == FLAG_TRUE);
  1151.     if (cmd_run.postmaster)
  1152. run.postmaster = cmd_run.postmaster;
  1153.     if (cmd_run.bouncemail)
  1154. run.bouncemail = cmd_run.bouncemail;
  1155.     /* check and daemon options are not compatible */
  1156.     if (check_only && run.poll_interval)
  1157. run.poll_interval = 0;
  1158. #ifdef POP3_ENABLE
  1159.     /* initialize UID handling */
  1160.     if (!versioninfo && (st = prc_filecheck(run.idfile, !versioninfo)) != 0)
  1161. exit(st);
  1162.     else
  1163. initialize_saved_lists(querylist, run.idfile);
  1164. #endif /* POP3_ENABLE */
  1165.     /*
  1166.      * If the user didn't set a last-resort user to get misaddressed
  1167.      * multidrop mail, set an appropriate default here.
  1168.      */
  1169.     if (!run.postmaster)
  1170.     {
  1171. if (getuid()) /* ordinary user */
  1172.     run.postmaster = user;
  1173. else /* root */
  1174.     run.postmaster = "postmaster";
  1175.     }
  1176.     return(implicitmode);
  1177. }
  1178. static void terminate_poll(int sig)
  1179. /* to be executed at the nd of a poll cycle */
  1180. {
  1181.     /*
  1182.      * Close all SMTP delivery sockets.  For optimum performance
  1183.      * we'd like to hold them open til end of run, but (1) this
  1184.      * loses if our poll interval is longer than the MTA's inactivity
  1185.      * timeout, and (2) some MTAs (like smail) don't deliver after
  1186.      * each message, but rather queue up mail and wait to actually
  1187.      * deliver it until the input socket is closed. 
  1188.      *
  1189.      * Sending SMTP QUIT on signal is theoretically nice, but led to a 
  1190.      * subtle bug.  If fetchmail was terminated by signal while it was 
  1191.      * shipping message text, it would hang forever waiting for a
  1192.      * command acknowledge.  In theory we could enable the QUIT
  1193.      * only outside of the message send.  In practice, we don't
  1194.      * care.  All mailservers hang up on a dropped TCP/IP connection
  1195.      * anyway.
  1196.      */
  1197.     if (sig != 0)
  1198.         report(stdout, _("terminated with signal %dn"), sig);
  1199.     else
  1200.     {
  1201. struct query *ctl;
  1202. /* terminate all SMTP connections cleanly */
  1203. for (ctl = querylist; ctl; ctl = ctl->next)
  1204.     if (ctl->smtp_socket != -1)
  1205.     {
  1206. SMTP_quit(ctl->smtp_socket);
  1207. SockClose(ctl->smtp_socket);
  1208. ctl->smtp_socket = -1;
  1209.     }
  1210.     }
  1211. #ifdef POP3_ENABLE
  1212.     /*
  1213.      * Update UID information at end of each poll, rather than at end
  1214.      * of run, because that way we don't lose all UIDL information since
  1215.      * the beginning of time if fetchmail crashes.
  1216.      */
  1217.     if (!check_only)
  1218. write_saved_lists(querylist, run.idfile);
  1219. #endif /* POP3_ENABLE */
  1220. }
  1221. static void terminate_run(int sig)
  1222. /* to be executed on normal or signal-induced termination */
  1223. {
  1224.     struct query *ctl;
  1225.     terminate_poll(sig);
  1226.     /* 
  1227.      * Craig Metz, the RFC1938 one-time-password guy, points out:
  1228.      * "Remember that most kernels don't zero pages before handing them to the
  1229.      * next process and many kernels share pages between user and kernel space.
  1230.      * You'd be very surprised what you can find from a short program to do a
  1231.      * malloc() and then dump the contents of the pages you got. By zeroing
  1232.      * the secrets at end of run (earlier if you can), you make sure the next
  1233.      * guy can't get the password/pass phrase."
  1234.      *
  1235.      * Right you are, Craig!
  1236.      */
  1237.     for (ctl = querylist; ctl; ctl = ctl->next)
  1238. if (ctl->password)
  1239.   memset(ctl->password, '', strlen(ctl->password));
  1240. #if !defined(HAVE_ATEXIT) && !defined(HAVE_ON_EXIT)
  1241.     unlockit();
  1242. #endif
  1243.     exit(successes ? PS_SUCCESS : querystatus);
  1244. }
  1245. /*
  1246.  * Sequence of protocols to try when autoprobing, most capable to least.
  1247.  */
  1248. static const int autoprobe[] = 
  1249. {
  1250. #ifdef IMAP_ENABLE
  1251.     P_IMAP,
  1252. #endif /* IMAP_ENABLE */
  1253. #ifdef POP3_ENABLE
  1254.     P_POP3,
  1255. #endif /* POP3_ENABLE */
  1256. #ifdef POP2_ENABLE
  1257.     P_POP2
  1258. #endif /* POP2_ENABLE */
  1259. };
  1260. static int query_host(struct query *ctl)
  1261. /* perform fetch transaction with single host */
  1262. {
  1263.     int i, st;
  1264.     /*
  1265.      * If we're syslogging the progress messages are automatically timestamped.
  1266.      * Force timestamping if we're going to a logfile.
  1267.      */
  1268.     if (outlevel >= O_VERBOSE || (run.logfile && outlevel > O_SILENT))
  1269.     {
  1270. report(stdout, _("%s querying %s (protocol %s) at %sn"),
  1271.        VERSION,
  1272.        ctl->server.pollname,
  1273.        showproto(ctl->server.protocol),
  1274.        rfc822timestamp());
  1275.     }
  1276.     switch (ctl->server.protocol) {
  1277.     case P_AUTO:
  1278. for (i = 0; i < sizeof(autoprobe)/sizeof(autoprobe[0]); i++)
  1279. {
  1280.     ctl->server.protocol = autoprobe[i];
  1281.     if ((st = query_host(ctl)) == PS_SUCCESS || st == PS_NOMAIL || st == PS_AUTHFAIL || st == PS_LOCKBUSY || st == PS_SMTP)
  1282. break;
  1283. }
  1284. ctl->server.protocol = P_AUTO;
  1285. return(st);
  1286.     case P_POP2:
  1287. #ifdef POP2_ENABLE
  1288. return(doPOP2(ctl));
  1289. #else
  1290. report(stderr, _("POP2 support is not configured.n"));
  1291. return(PS_PROTOCOL);
  1292. #endif /* POP2_ENABLE */
  1293. break;
  1294.     case P_POP3:
  1295.     case P_APOP:
  1296.     case P_RPOP:
  1297. #ifdef POP3_ENABLE
  1298. return(doPOP3(ctl));
  1299. #else
  1300. report(stderr, _("POP3 support is not configured.n"));
  1301. return(PS_PROTOCOL);
  1302. #endif /* POP3_ENABLE */
  1303. break;
  1304.     case P_IMAP:
  1305.     case P_IMAP_K4:
  1306.     case P_IMAP_CRAM_MD5:
  1307.     case P_IMAP_LOGIN:
  1308. #ifdef GSSAPI
  1309.     case P_IMAP_GSS:
  1310. #endif /* GSSAPI */
  1311. #ifdef IMAP_ENABLE
  1312. return(doIMAP(ctl));
  1313. #else
  1314. report(stderr, _("IMAP support is not configured.n"));
  1315. return(PS_PROTOCOL);
  1316. #endif /* IMAP_ENABLE */
  1317.     case P_ETRN:
  1318. #ifndef ETRN_ENABLE
  1319. report(stderr, _("ETRN support is not configured.n"));
  1320. return(PS_PROTOCOL);
  1321. #else
  1322. #ifdef HAVE_GETHOSTBYNAME
  1323. return(doETRN(ctl));
  1324. #else
  1325. report(stderr, _("Cannot support ETRN without gethostbyname(2).n"));
  1326. return(PS_PROTOCOL);
  1327. #endif /* HAVE_GETHOSTBYNAME */
  1328. #endif /* ETRN_ENABLE */
  1329.     default:
  1330. report(stderr, _("unsupported protocol selected.n"));
  1331. return(PS_PROTOCOL);
  1332.     }
  1333. }
  1334. static void dump_params (struct runctl *runp,
  1335.  struct query *querylist, flag implicit)
  1336. /* display query parameters in English */
  1337. {
  1338.     struct query *ctl;
  1339.     if (runp->poll_interval)
  1340. printf(_("Poll interval is %d secondsn"), runp->poll_interval);
  1341.     if (runp->logfile)
  1342. printf(_("Logfile is %sn"), runp->logfile);
  1343.     if (strcmp(runp->idfile, IDFILE_NAME))
  1344. printf(_("Idfile is %sn"), runp->idfile);
  1345. #if defined(HAVE_SYSLOG)
  1346.     if (runp->use_syslog)
  1347. printf(_("Progress messages will be logged via syslogn"));
  1348. #endif
  1349.     if (runp->invisible)
  1350. printf(_("Fetchmail will masquerade and will not generate Receivedn"));
  1351.     if (runp->postmaster)
  1352. printf(_("Fetchmail will forward misaddressed multidrop messages to %s.n"),
  1353.        runp->postmaster);
  1354.     if (!runp->bouncemail)
  1355. printf(_("Fetchmail will direct error mail to the postmaster.n"));
  1356.     else if (outlevel >= O_VERBOSE)
  1357. printf(_("Fetchmail will direct error mail to the sender.n"));
  1358.     for (ctl = querylist; ctl; ctl = ctl->next)
  1359.     {
  1360. if (!ctl->active || (implicit && ctl->server.skip))
  1361.     continue;
  1362. printf(_("Options for retrieving from %s@%s:n"),
  1363.        ctl->remotename, visbuf(ctl->server.pollname));
  1364. if (ctl->server.via && (ctl->server.protocol != P_ETRN))
  1365.     printf(_("  Mail will be retrieved via %sn"), ctl->server.via);
  1366. if (ctl->server.interval)
  1367.     printf(_("  Poll of this server will occur every %d intervals.n"),
  1368.    ctl->server.interval);
  1369. if (ctl->server.truename)
  1370.     printf(_("  True name of server is %s.n"), ctl->server.truename);
  1371. if (ctl->server.skip || outlevel >= O_VERBOSE)
  1372.     printf(_("  This host %s be queried when no host is specified.n"),
  1373.    ctl->server.skip ? _("will not") : _("will"));
  1374. /*
  1375.  * Don't poll for password when there is one or when using the ETRN
  1376.  * or IMAP-GSS protocol
  1377.  */
  1378. /* ETRN, IMAP_GSS, and IMAP_K4 do not need a password, so skip this */
  1379. if ( (ctl->server.protocol != P_ETRN)
  1380. #ifdef GSSAPI
  1381. && (ctl->server.protocol != P_IMAP_GSS)
  1382. #endif /* GSSAPI */
  1383.         && (ctl->server.protocol != P_IMAP_K4) ) {
  1384. if (!ctl->password)
  1385. printf(_("  Password will be prompted for.n"));
  1386. else if (outlevel >= O_VERBOSE)
  1387. {
  1388. if (ctl->server.protocol == P_APOP)
  1389. printf(_("  APOP secret = "%s".n"),
  1390. visbuf(ctl->password));
  1391. else if (ctl->server.protocol == P_RPOP)
  1392. printf(_("  RPOP id = "%s".n"),
  1393. visbuf(ctl->password));
  1394. else
  1395. printf(_("  Password = "%s".n"),
  1396. visbuf(ctl->password));
  1397. }
  1398. }
  1399. if (ctl->server.protocol == P_POP3 
  1400. #if INET6_ENABLE
  1401.     && !strcmp(ctl->server.service, KPOP_PORT)
  1402. #else /* INET6_ENABLE */
  1403.     && ctl->server.port == KPOP_PORT
  1404. #endif /* INET6_ENABLE */
  1405.     && (ctl->server.preauthenticate == A_KERBEROS_V4 ||
  1406. ctl->server.preauthenticate == A_KERBEROS_V5))
  1407.     printf(_("  Protocol is KPOP with Kerberos %s authentication"),
  1408.    ctl->server.preauthenticate == A_KERBEROS_V5 ? "V" : "IV");
  1409. else
  1410.     printf(_("  Protocol is %s"), showproto(ctl->server.protocol));
  1411. #if INET6_ENABLE
  1412. if (ctl->server.service)
  1413.     printf(_(" (using service %s)"), ctl->server.service);
  1414. if (ctl->server.netsec)
  1415.     printf(_(" (using network security options %s)"), ctl->server.netsec);
  1416. #else /* INET6_ENABLE */
  1417. if (ctl->server.port)
  1418.     printf(_(" (using port %d)"), ctl->server.port);
  1419. #endif /* INET6_ENABLE */
  1420. else if (outlevel >= O_VERBOSE)
  1421.     printf(_(" (using default port)"));
  1422. if (ctl->server.uidl && (ctl->server.protocol != P_ETRN))
  1423.     printf(_(" (forcing UIDL use)"));
  1424. putchar('.');
  1425. putchar('n');
  1426. if (ctl->server.preauthenticate == A_KERBEROS_V4)
  1427.     printf(_("  Kerberos V4 preauthentication enabled.n"));
  1428. else if (ctl->server.preauthenticate == A_KERBEROS_V5)
  1429.     printf(_("  Kerberos V5 preauthentication enabled.n"));
  1430. else if (ctl->server.preauthenticate == A_SSH)
  1431.     printf(_("  End-to-end encryption assumed.n"));
  1432. #ifdef SSL_ENABLE
  1433. if (ctl->use_ssl)
  1434.     printf("  SSL encrypted sessions enabled.n");
  1435. #endif
  1436. if (ctl->server.timeout > 0)
  1437.     printf(_("  Server nonresponse timeout is %d seconds"), ctl->server.timeout);
  1438. if (ctl->server.timeout ==  CLIENT_TIMEOUT)
  1439.     printf(_(" (default).n"));
  1440. else
  1441.     printf(".n");
  1442. if (ctl->server.protocol != P_ETRN) {
  1443. if (!ctl->mailboxes->id)
  1444.     printf(_("  Default mailbox selected.n"));
  1445. else
  1446. {
  1447.     struct idlist *idp;
  1448.     printf(_("  Selected mailboxes are:"));
  1449.     for (idp = ctl->mailboxes; idp; idp = idp->next)
  1450. printf(" %s", idp->id);
  1451.     printf("n");
  1452. }
  1453. printf(_("  %s messages will be retrieved (--all %s).n"),
  1454.        ctl->fetchall ? _("All") : _("Only new"),
  1455.        ctl->fetchall ? "on" : "off");
  1456. printf(_("  Fetched messages %s be kept on the server (--keep %s).n"),
  1457.        ctl->keep ? _("will") : _("will not"),
  1458.        ctl->keep ? "on" : "off");
  1459. printf(_("  Old messages %s be flushed before message retrieval (--flush %s).n"),
  1460.        ctl->flush ? _("will") : _("will not"),
  1461.        ctl->flush ? "on" : "off");
  1462. printf(_("  Rewrite of server-local addresses is %s (--norewrite %s).n"),
  1463.        ctl->rewrite ? _("enabled") : _("disabled"),
  1464.        ctl->rewrite ? "off" : "on");
  1465. printf(_("  Carriage-return stripping is %s (stripcr %s).n"),
  1466.        ctl->stripcr ? _("enabled") : _("disabled"),
  1467.        ctl->stripcr ? "on" : "off");
  1468. printf(_("  Carriage-return forcing is %s (forcecr %s).n"),
  1469.        ctl->forcecr ? _("enabled") : _("disabled"),
  1470.        ctl->forcecr ? "on" : "off");
  1471. printf(_("  Interpretation of Content-Transfer-Encoding is %s (pass8bits %s).n"),
  1472.        ctl->pass8bits ? _("disabled") : _("enabled"),
  1473.        ctl->pass8bits ? "on" : "off");
  1474. printf(_("  MIME decoding is %s (mimedecode %s).n"),
  1475.        ctl->mimedecode ? _("enabled") : _("disabled"),
  1476.        ctl->mimedecode ? "on" : "off");
  1477. printf(_("  Nonempty Status lines will be %s (dropstatus %s)n"),
  1478.        ctl->dropstatus ? _("discarded") : _("kept"),
  1479.        ctl->dropstatus ? "on" : "off");
  1480. if (NUM_NONZERO(ctl->limit))
  1481. {
  1482.     if (NUM_NONZERO(ctl->limit))
  1483. printf(_("  Message size limit is %d octets (--limit %d).n"), 
  1484.        ctl->limit, ctl->limit);
  1485.     else if (outlevel >= O_VERBOSE)
  1486. printf(_("  No message size limit (--limit 0).n"));
  1487.     if (run.poll_interval > 0)
  1488. printf(_("  Message size warning interval is %d seconds (--warnings %d).n"), 
  1489.        ctl->warnings, ctl->warnings);
  1490.     else if (outlevel >= O_VERBOSE)
  1491. printf(_("  Size warnings on every poll (--warnings 0).n"));
  1492. }
  1493. if (NUM_NONZERO(ctl->fetchlimit))
  1494.     printf(_("  Received-message limit is %d (--fetchlimit %d).n"),
  1495.    ctl->fetchlimit, ctl->fetchlimit);
  1496. else if (outlevel >= O_VERBOSE)
  1497.     printf(_("  No received-message limit (--fetchlimit 0).n"));
  1498. if (NUM_NONZERO(ctl->batchlimit))
  1499.     printf(_("  SMTP message batch limit is %d.n"), ctl->batchlimit);
  1500. else if (outlevel >= O_VERBOSE)
  1501.     printf(_("  No SMTP message batch limit (--batchlimit 0).n"));
  1502. if (ctl->server.protocol == P_IMAP)
  1503. {
  1504.     if (NUM_NONZERO(ctl->expunge))
  1505. printf(_("  Deletion interval between expunges forced to %d (--expunge %d).n"), ctl->expunge, ctl->expunge);
  1506.     else if (outlevel >= O_VERBOSE)
  1507. printf(_("  No forced expunges (--expunge 0).n"));
  1508. }
  1509. }
  1510. if (ctl->bsmtp)
  1511.     printf(_("  Messages will be appended to %s as BSMTPn"), visbuf(ctl->bsmtp));
  1512. else if (ctl->mda && (ctl->server.protocol != P_ETRN))
  1513.     printf(_("  Messages will be delivered with "%s".n"), visbuf(ctl->mda));
  1514. else
  1515. {
  1516.     struct idlist *idp;
  1517.     printf(_("  Messages will be %cMTP-forwarded to:"), ctl->listener);
  1518.     for (idp = ctl->smtphunt; idp; idp = idp->next)
  1519.     {
  1520.                 printf(" %s", idp->id);
  1521. if (!idp->val.status.mark)
  1522.     printf(_(" (default)"));
  1523.     }
  1524.     printf("n");
  1525.     if (ctl->smtpaddress)
  1526. printf(_("  Host part of MAIL FROM line will be %sn"),
  1527.        ctl->smtpaddress);
  1528. }
  1529. if (ctl->server.protocol != P_ETRN)
  1530. {
  1531. if (ctl->antispam != (struct idlist *)NULL)
  1532. {
  1533.     struct idlist *idp;
  1534.     printf(_("  Recognized listener spam block responses are:"));
  1535.     for (idp = ctl->antispam; idp; idp = idp->next)
  1536. printf(" %d", idp->val.status.num);
  1537.     printf("n");
  1538. }
  1539. else if (outlevel >= O_VERBOSE)
  1540.     printf(_("  Spam-blocking disabledn"));
  1541. }
  1542. if (ctl->preconnect)
  1543.     printf(_("  Server connection will be brought up with "%s".n"),
  1544.    visbuf(ctl->preconnect));
  1545. else if (outlevel >= O_VERBOSE)
  1546.     printf(_("  No pre-connection command.n"));
  1547. if (ctl->postconnect)
  1548.     printf(_("  Server connection will be taken down with "%s".n"),
  1549.    visbuf(ctl->postconnect));
  1550. else if (outlevel >= O_VERBOSE)
  1551.     printf(_("  No post-connection command.n"));
  1552. if (ctl->server.protocol != P_ETRN) {
  1553. if (!ctl->localnames)
  1554.     printf(_("  No localnames declared for this host.n"));
  1555. else
  1556. {
  1557.     struct idlist *idp;
  1558.     int count = 0;
  1559.     for (idp = ctl->localnames; idp; idp = idp->next)
  1560. ++count;
  1561.     if (count > 1 || ctl->wildcard)
  1562. printf(_("  Multi-drop mode: "));
  1563.     else
  1564. printf(_("  Single-drop mode: "));
  1565.     printf(_("%d local name(s) recognized.n"), count);
  1566.     if (outlevel >= O_VERBOSE)
  1567.     {
  1568. for (idp = ctl->localnames; idp; idp = idp->next)
  1569.     if (idp->val.id2)
  1570. printf("t%s -> %sn", idp->id, idp->val.id2);
  1571.     else
  1572. printf("t%sn", idp->id);
  1573. if (ctl->wildcard)
  1574.     fputs("t*n", stdout);
  1575.     }
  1576.     if (count > 1 || ctl->wildcard)
  1577.     {
  1578. printf(_("  DNS lookup for multidrop addresses is %s.n"),
  1579.        ctl->server.dns ? _("enabled") : _("disabled"));
  1580. if (ctl->server.dns)
  1581. {
  1582.     printf(_("  Server aliases will be compared with multidrop addresses by "));
  1583.             if (ctl->server.checkalias)
  1584. printf(_("IP address.n"));
  1585.     else
  1586. printf(_("name.n"));
  1587. }
  1588. if (ctl->server.envelope == STRING_DISABLED)
  1589.     printf(_("  Envelope-address routing is disabledn"));
  1590. else
  1591. {
  1592.     printf(_("  Envelope header is assumed to be: %sn"),
  1593.    ctl->server.envelope ? ctl->server.envelope:_("Received"));
  1594.     if (ctl->server.envskip > 1 || outlevel >= O_VERBOSE)
  1595. printf(_("  Number of envelope header to be parsed: %dn"),
  1596.        ctl->server.envskip);
  1597.     if (ctl->server.qvirtual)
  1598. printf(_("  Prefix %s will be removed from user idn"),
  1599.        ctl->server.qvirtual);
  1600.     else if (outlevel >= O_VERBOSE) 
  1601. printf(_("  No prefix strippingn"));
  1602. }
  1603. if (ctl->server.akalist)
  1604. {
  1605.     struct idlist *idp;
  1606.     printf(_("  Predeclared mailserver aliases:"));
  1607.     for (idp = ctl->server.akalist; idp; idp = idp->next)
  1608. printf(" %s", idp->id);
  1609.     putchar('n');
  1610. }
  1611. if (ctl->server.localdomains)
  1612. {
  1613.     struct idlist *idp;
  1614.     printf(_("  Local domains:"));
  1615.     for (idp = ctl->server.localdomains; idp; idp = idp->next)
  1616. printf(" %s", idp->id);
  1617.     putchar('n');
  1618. }
  1619.     }
  1620. }
  1621. }
  1622. #if defined(linux) || defined(__FreeBSD__)
  1623. if (ctl->server.interface)
  1624.     printf(_("  Connection must be through interface %s.n"), ctl->server.interface);
  1625. else if (outlevel >= O_VERBOSE)
  1626.     printf(_("  No interface requirement specified.n"));
  1627. if (ctl->server.monitor)
  1628.     printf(_("  Polling loop will monitor %s.n"), ctl->server.monitor);
  1629. else if (outlevel >= O_VERBOSE)
  1630.     printf(_("  No monitor interface specified.n"));
  1631. #endif
  1632. if (ctl->server.plugin)
  1633.     printf(_("  Server connections will be mode via plugin %s (--plugin %s).n"), ctl->server.plugin, ctl->server.plugin);
  1634. else if (outlevel >= O_VERBOSE)
  1635.     printf(_("  No plugin command specified.n"));
  1636. if (ctl->server.plugout)
  1637.     printf(_("  Listener connections will be mode via plugout %s (--plugout %s).n"), ctl->server.plugout, ctl->server.plugout);
  1638. else if (outlevel >= O_VERBOSE)
  1639.     printf(_("  No plugout command specified.n"));
  1640. if (ctl->server.protocol > P_POP2 && (ctl->server.protocol != P_ETRN))
  1641. {
  1642.     if (!ctl->oldsaved)
  1643. printf(_("  No UIDs saved from this host.n"));
  1644.     else
  1645.     {
  1646. struct idlist *idp;
  1647. int count = 0;
  1648. for (idp = ctl->oldsaved; idp; idp = idp->next)
  1649.     ++count;
  1650. printf(_("  %d UIDs saved.n"), count);
  1651. if (outlevel >= O_VERBOSE)
  1652.     for (idp = ctl->oldsaved; idp; idp = idp->next)
  1653. printf("t%sn", idp->id);
  1654.     }
  1655. }
  1656. if (ctl->properties)
  1657.     printf(_("  Pass-through properties "%s".n"),
  1658.    visbuf(ctl->properties));
  1659.     }
  1660. }
  1661. /* fetchmail.c ends here */