2 * driver.c -- generic driver for mail fetch method protocols
4 * Copyright 1997 by Eric S. Raymond
5 * For license terms, see the file COPYING in this directory.
15 #endif /* HAVE_MEMORY_H */
16 #if defined(STDC_HEADERS)
20 #if defined(HAVE_UNISTD_H)
23 #if defined(HAVE_SYS_ITIMER_H)
24 #include <sys/itimer.h>
29 #ifdef HAVE_NET_SOCKET_H
30 #include <net/socket.h>
36 #if defined(HAVE_RES_SEARCH) || defined(HAVE_GETHOSTBYNAME)
39 #endif /* defined(HAVE_RES_SEARCH) || defined(HAVE_GETHOSTBYNAME) */
43 #include <netinet/in.h>
44 #endif /* KERBEROS_V4 */
49 #include "fetchmail.h"
52 /* throw types for runtime errors */
53 #define THROW_TIMEOUT 1 /* server timed out */
54 #define THROW_SIGPIPE 2 /* SIGPIPE on stream socket */
56 /* magic values for the message length array */
57 #define MSGLEN_UNKNOWN 0 /* length unknown (0 is impossible) */
58 #define MSGLEN_INVALID -1 /* length passed back is invalid */
59 #define MSGLEN_TOOLARGE -2 /* message is too large */
60 #define MSGLEN_OLD -3 /* message is old */
62 int pass; /* how many times have we re-polled? */
63 int stage; /* where are we? */
64 int phase; /* where are we, for error-logging purposes? */
65 int batchcount; /* count of messages sent in current batch */
66 flag peek_capable; /* can we peek for better error recovery? */
68 static int timeoutcount; /* count consecutive timeouts */
70 static jmp_buf restart;
72 void set_timeout(int timeleft)
73 /* reset the nonresponse-timeout */
75 #if !defined(__EMX__) && !defined(__BEOS__)
76 struct itimerval ntimeout;
81 ntimeout.it_interval.tv_sec = ntimeout.it_interval.tv_usec = 0;
82 ntimeout.it_value.tv_sec = timeleft;
83 ntimeout.it_value.tv_usec = 0;
84 setitimer(ITIMER_REAL, &ntimeout, (struct itimerval *)NULL);
88 static void timeout_handler (int signal)
89 /* handle SIGALRM signal indicating a server timeout */
92 longjmp(restart, THROW_TIMEOUT);
95 static void sigpipe_handler (int signal)
96 /* handle SIGPIPE signal indicating a broken stream socket */
98 longjmp(restart, THROW_SIGPIPE);
101 /* ignore SIGALRM signal indicating a timeout during cleanup */
102 static void cleanup_timeout_handler (int signal) { }
104 #define CLEANUP_TIMEOUT 60 /* maximum timeout during cleanup */
106 static int cleanupSockClose (int fd)
107 /* close sockets in maximum CLEANUP_TIMEOUT seconds during cleanup */
110 void (*alrmsave)(int);
111 alrmsave = signal(SIGALRM, cleanup_timeout_handler);
112 set_timeout(CLEANUP_TIMEOUT);
113 scerror = SockClose(fd);
115 signal(SIGALRM, alrmsave);
120 static int kerberos_auth(socket, canonical, principal)
121 /* authenticate to the server host using Kerberos V4 */
122 int socket; /* socket to server host */
123 char *canonical; /* server name */
130 Key_schedule schedule;
132 char * prin_copy = (char *) NULL;
133 char * prin = (char *) NULL;
134 char * inst = (char *) NULL;
135 char * realm = (char *) NULL;
137 if (principal != (char *)NULL && *principal)
140 prin = prin_copy = xstrdup(principal);
141 for (cp = prin_copy; *cp && *cp != '.'; ++cp)
147 while (*cp && *cp != '@')
157 xalloca(ticket, KTEXT, sizeof (KTEXT_ST));
158 rem = (krb_sendauth (0L, socket, ticket,
160 inst ? inst : canonical,
161 realm ? realm : ((char *) (krb_realmofhost (canonical))),
166 ((struct sockaddr_in *) 0),
167 ((struct sockaddr_in *) 0),
175 report(stderr, GT_("kerberos error %s\n"), (krb_get_err_text (rem)));
176 return (PS_AUTHFAIL);
180 #endif /* KERBEROS_V4 */
183 static int kerberos5_auth(socket, canonical)
184 /* authenticate to the server host using Kerberos V5 */
185 int socket; /* socket to server host */
186 const char *canonical; /* server name */
188 krb5_error_code retval;
189 krb5_context context;
191 krb5_principal client = NULL, server = NULL;
192 krb5_error *err_ret = NULL;
194 krb5_auth_context auth_context = NULL;
196 krb5_init_context(&context);
197 krb5_init_ets(context);
198 krb5_auth_con_init(context, &auth_context);
200 if (retval = krb5_cc_default(context, &ccdef)) {
201 report(stderr, "krb5_cc_default: %s\n", error_message(retval));
205 if (retval = krb5_cc_get_principal(context, ccdef, &client)) {
206 report(stderr, "krb5_cc_get_principal: %s\n", error_message(retval));
210 if (retval = krb5_sname_to_principal(context, canonical, "pop",
213 report(stderr, "krb5_sname_to_principal: %s\n", error_message(retval));
217 retval = krb5_sendauth(context, &auth_context, (krb5_pointer) &socket,
218 "KPOPV1.0", client, server,
219 AP_OPTS_MUTUAL_REQUIRED,
220 NULL, /* no data to checksum */
221 0, /* no creds, use ccache instead */
225 NULL); /* don't need reply */
227 krb5_free_principal(context, server);
228 krb5_free_principal(context, client);
229 krb5_auth_con_free(context, auth_context);
233 if (err_ret && err_ret->e_text) {
234 report(stderr, GT_("krb5_sendauth: %s [server says '%*s'] \n"),
235 error_message(retval),
238 if (err_ret && err_ret->text.length) {
239 report(stderr, GT_("krb5_sendauth: %s [server says '%*s'] \n"),
240 error_message(retval),
241 err_ret->text.length,
244 krb5_free_error(context, err_ret);
246 report(stderr, "krb5_sendauth: %s\n", error_message(retval));
252 #endif /* KERBEROS_V5 */
254 static void clean_skipped_list(struct idlist **skipped_list)
255 /* struct "idlist" contains no "prev" ptr; we must remove unused items first */
257 struct idlist *current=NULL, *prev=NULL, *tmp=NULL, *head=NULL;
258 prev = current = head = *skipped_list;
264 /* if item has no reference, remove it */
265 if (current && current->val.status.mark == 0)
267 if (current == head) /* remove first item (head) */
269 head = current->next;
270 if (current->id) free(current->id);
272 prev = current = head;
274 else /* remove middle/last item */
278 if (current->id) free(current->id);
283 else /* skip this item */
286 current = current->next;
290 *skipped_list = head;
293 static void send_size_warnings(struct query *ctl)
294 /* send warning mail with skipped msg; reset msg count when user notified */
297 int msg_to_send = FALSE;
298 struct idlist *head=NULL, *current=NULL;
299 int max_warning_poll_count;
305 /* don't start a notification message unless we need to */
306 for (current = head; current; current = current->next)
307 if (current->val.status.num == 0 && current->val.status.mark)
313 * There's no good way to recover if we can't send notification mail,
314 * but it's not a disaster, either, since the skipped mail will not
317 if (open_warning_by_mail(ctl, (struct msgblk *)NULL))
320 GT_("Subject: Fetchmail oversized-messages warning.\r\n"
322 "The following oversized messages remain on the mail server %s:"),
323 ctl->server.pollname);
325 if (run.poll_interval == 0)
326 max_warning_poll_count = 0;
328 max_warning_poll_count = ctl->warnings/run.poll_interval;
330 /* parse list of skipped msg, adding items to the mail */
331 for (current = head; current; current = current->next)
333 if (current->val.status.num == 0 && current->val.status.mark)
335 nbr = current->val.status.mark;
336 size = atoi(current->id);
338 GT_("\t%d msg %d octets long skipped by fetchmail.\r\n"),
341 current->val.status.num++;
342 current->val.status.mark = 0;
344 if (current->val.status.num >= max_warning_poll_count)
345 current->val.status.num = 0;
348 close_warning_by_mail(ctl, (struct msgblk *)NULL);
351 static void mark_oversized(struct query *ctl, int num, int size)
352 /* mark a message oversized */
354 struct idlist *current=NULL, *tmp=NULL;
358 /* convert size to string */
360 snprintf(sizestr, sizeof(sizestr),
363 #endif /* HAVE_SNPRINTF */
366 /* build a list of skipped messages
367 * val.id = size of msg (string cnvt)
368 * val.status.num = warning_poll_count
369 * val.status.mask = nbr of msg this size
372 current = ctl->skipped;
374 /* initialise warning_poll_count to the
375 * current value so that all new msg will
376 * be included in the next mail
378 cnt = current ? current->val.status.num : 0;
380 /* if entry exists, increment the count */
381 if (current && str_in_list(¤t, sizestr, FALSE))
383 for ( ; current; current = current->next)
385 if (strcmp(current->id, sizestr) == 0)
387 current->val.status.mark++;
392 /* otherwise, create a new entry */
393 /* initialise with current poll count */
396 tmp = save_str(&ctl->skipped, sizestr, 1);
397 tmp->val.status.num = cnt;
401 static int fetch_messages(int mailserver_socket, struct query *ctl,
402 int count, int *msgsizes, int *msgcodes, int maxfetch,
403 int *fetches, int *dispatches, int *deletions)
404 /* fetch messages in lockstep mode */
408 for (num = 1; num <= count; num++)
410 flag suppress_delete = FALSE;
411 flag suppress_forward = FALSE;
412 flag suppress_readbody = FALSE;
413 flag retained = FALSE;
415 if (msgcodes[num-1] < 0)
417 if ((msgcodes[num-1] == MSGLEN_TOOLARGE) && !check_only)
418 mark_oversized(ctl, num, msgsizes[num-1]);
419 if (outlevel > O_SILENT)
422 GT_("skipping message %s@%s:%d (%d octets)"),
423 ctl->remotename, ctl->server.truename, num,
425 switch (msgcodes[num-1])
429 * Invalid lengths are produced by Post Office/NT's
430 * annoying habit of randomly prepending bogus
431 * LIST items of length -1. Patrick Audley
432 * <paudley@pobox.com> tells us: LIST shows a
433 * size of -1, RETR and TOP return "-ERR
434 * System error - couldn't open message", and
435 * DELE succeeds but doesn't actually delete
438 report_build(stdout, GT_(" (length -1)"));
440 case MSGLEN_TOOLARGE:
442 GT_(" (oversized, %d octets)"),
450 flag wholesize = !ctl->server.base_protocol->fetch_body;
452 /* request a message */
453 err = (ctl->server.base_protocol->fetch_headers)(mailserver_socket,ctl,num, &len);
454 if (err == PS_TRANSIENT) /* server is probably Exchange */
457 GT_("couldn't fetch headers, message %s@%s:%d (%d octets)"),
458 ctl->remotename, ctl->server.truename, num,
465 /* -1 means we didn't see a size in the response */
468 len = msgsizes[num - 1];
472 if (outlevel > O_SILENT)
474 report_build(stdout, GT_("reading message %s@%s:%d of %d"),
475 ctl->remotename, ctl->server.truename,
479 report_build(stdout, GT_(" (%d %soctets)"),
480 len, wholesize ? "" : GT_("header "));
481 if (outlevel >= O_VERBOSE)
482 report_complete(stdout, "\n");
484 report_complete(stdout, " ");
488 * Read the message headers and ship them to the
491 err = readheaders(mailserver_socket, len, msgsizes[num-1],
493 if (err == PS_RETAINED)
494 suppress_forward = retained = TRUE;
495 else if (err == PS_TRANSIENT)
496 suppress_delete = suppress_forward = TRUE;
497 else if (err == PS_REFUSED)
498 suppress_forward = TRUE;
501 * readheaders does not read the body when it
502 * hits a non-header. It has been recently
503 * fixed to return PS_TRUNCATED (properly) when
504 * that happens, but apparently fixing that bug
505 * opened this one here (which looks like an
506 * inproper fix from some ancient thinko)
508 else if (err == PS_TRUNCATED)
509 suppress_readbody = TRUE;
513 else if (err && err != PS_TRUNCATED)
518 * If we're using IMAP4 or something else that
519 * can fetch headers separately from bodies,
520 * it's time to request the body now. This
521 * fetch may be skipped if we got an anti-spam
522 * or other PS_REFUSED error response during
525 if (ctl->server.base_protocol->fetch_body && !suppress_readbody)
527 if (outlevel >= O_VERBOSE && !isafile(1))
533 if ((err = (ctl->server.base_protocol->trail)(mailserver_socket, ctl, num)))
536 if (!suppress_forward)
538 if ((err=(ctl->server.base_protocol->fetch_body)(mailserver_socket,ctl,num,&len)))
541 * Work around a bug in Novell's
542 * broken GroupWise IMAP server;
543 * its body FETCH response is missing
544 * the required length for the data
545 * string. This violates RFC2060.
548 len = msgsizes[num-1] - msgblk.msglen;
549 if (outlevel > O_SILENT && !wholesize)
550 report_complete(stdout,
551 GT_(" (%d body octets) "), len);
555 /* process the body now */
558 if (suppress_readbody)
560 /* When readheaders returns PS_TRUNCATED,
561 * the body (which has no content)
562 * has already been read by readheaders,
563 * so we say readbody returned PS_SUCCESS
569 err = readbody(mailserver_socket,
574 if (err == PS_TRANSIENT)
575 suppress_delete = suppress_forward = TRUE;
579 /* tell server we got it OK and resynchronize */
580 if (ctl->server.base_protocol->trail)
582 if (outlevel >= O_VERBOSE && !isafile(1))
588 err = (ctl->server.base_protocol->trail)(mailserver_socket, ctl, num);
594 /* count # messages forwarded on this pass */
595 if (!suppress_forward)
599 * Check to see if the numbers matched?
601 * Yes, some servers foo this up horribly.
602 * All IMAP servers seem to get it right, and
603 * so does Eudora QPOP at least in 2.xx
606 * Microsoft Exchange gets it completely
607 * wrong, reporting compressed rather than
608 * actual sizes (so the actual length of
609 * message is longer than the reported size).
610 * Another fine example of Microsoft brain death!
612 * Some older POP servers, like the old UCB
613 * POP server and the pre-QPOP QUALCOMM
614 * versions, report a longer size in the LIST
615 * response than actually gets shipped up.
616 * It's unclear what is going on here, as the
617 * QUALCOMM server (at least) seems to be
618 * reporting the on-disk size correctly.
620 if (msgblk.msglen != msgsizes[num-1])
622 if (outlevel >= O_DEBUG)
624 GT_("message %s@%s:%d was not the expected length (%d actual != %d expected)\n"),
625 ctl->remotename, ctl->server.truename, num,
626 msgblk.msglen, msgsizes[num-1]);
629 /* end-of-message processing starts here */
630 if (!close_sink(ctl, &msgblk, !suppress_forward))
633 suppress_delete = TRUE;
639 * At this point in flow of control, either
640 * we've bombed on a protocol error or had
641 * delivery refused by the SMTP server
642 * (unlikely -- I've never seen it) or we've
643 * seen `accepted for delivery' and the
644 * message is shipped. It's safe to mark the
645 * message seen and delete it on the server
650 * Tell the UID code we've seen this.
651 * Matthias Andree: only register the UID if we could actually
652 * forward this mail. If we omit this !suppress_delete check,
653 * fetchmail will never retry mail that the local listener
654 * refused temporarily.
656 if (ctl->newsaved && !suppress_delete)
660 for (sdp = ctl->newsaved; sdp; sdp = sdp->next)
661 if ((sdp->val.status.num == num) && (msgcodes[num-1] >= 0))
663 sdp->val.status.mark = UID_SEEN;
664 save_str(&ctl->oldsaved, sdp->id,UID_SEEN);
668 /* maybe we delete this message now? */
671 if (outlevel > O_SILENT)
672 report(stdout, GT_(" retained\n"));
674 else if (ctl->server.base_protocol->delete
676 && ((msgcodes[num-1] >= 0) ? !ctl->keep : ctl->flush))
679 if (outlevel > O_SILENT)
680 report_complete(stdout, GT_(" flushed\n"));
681 err = (ctl->server.base_protocol->delete)(mailserver_socket, ctl, num);
685 delete_str(&ctl->newsaved, num);
686 #endif /* POP3_ENABLE */
688 else if (outlevel > O_SILENT)
689 report_complete(stdout, GT_(" not flushed\n"));
691 /* perhaps this as many as we're ready to handle */
692 if (maxfetch && maxfetch <= *fetches && *fetches < count)
694 report(stdout, GT_("fetchlimit %d reached; %d messages left on server %s account %s\n"),
695 maxfetch, count - *fetches, ctl->server.truename, ctl->remotename);
703 static int do_session(ctl, proto, maxfetch)
704 /* retrieve messages from server using given protocol method table */
705 struct query *ctl; /* parsed options with merged-in defaults */
706 const struct method *proto; /* protocol method table */
707 const int maxfetch; /* maximum number of messages to fetch */
711 volatile int err, mailserver_socket = -1; /* pacifies -Wall */
713 int err, mailserver_socket = -1;
714 #endif /* HAVE_VOLATILE */
716 void (*pipesave)(int);
717 void (*alrmsave)(int);
719 ctl->server.base_protocol = proto;
723 init_transact(proto);
725 /* set up the server-nonresponse timeout */
726 alrmsave = signal(SIGALRM, timeout_handler);
727 mytimeout = ctl->server.timeout;
729 /* set up the broken-pipe timeout */
730 pipesave = signal(SIGPIPE, sigpipe_handler);
732 if ((js = setjmp(restart)))
734 #ifdef HAVE_SIGPROCMASK
736 * Don't rely on setjmp() to restore the blocked-signal mask.
737 * It does this under BSD but is required not to under POSIX.
739 * If your Unix doesn't have sigprocmask, better hope it has
740 * BSD-like behavior. Otherwise you may see fetchmail get
741 * permanently wedged after a second timeout on a bad read,
742 * because alarm signals were blocked after the first.
746 sigfillset(&allsigs);
747 sigprocmask(SIG_UNBLOCK, &allsigs, NULL);
748 #endif /* HAVE_SIGPROCMASK */
750 if (js == THROW_SIGPIPE)
752 signal(SIGPIPE, SIG_IGN);
754 GT_("SIGPIPE thrown from an MDA or a stream socket error\n"));
758 else if (js == THROW_TIMEOUT)
760 if (phase == OPEN_WAIT)
762 GT_("timeout after %d seconds waiting to connect to server %s.\n"),
763 ctl->server.timeout, ctl->server.pollname);
764 else if (phase == SERVER_WAIT)
766 GT_("timeout after %d seconds waiting for server %s.\n"),
767 ctl->server.timeout, ctl->server.pollname);
768 else if (phase == FORWARDING_WAIT)
770 GT_("timeout after %d seconds waiting for %s.\n"),
772 ctl->mda ? "MDA" : "SMTP");
773 else if (phase == LISTENER_WAIT)
775 GT_("timeout after %d seconds waiting for listener to respond.\n"), ctl->server.timeout);
778 GT_("timeout after %d seconds.\n"), ctl->server.timeout);
781 * If we've exceeded our threshold for consecutive timeouts,
782 * try to notify the user, then mark the connection wedged.
783 * Don't do this if the connection can idle, though; idle
784 * timeouts just mean the frequency of mail is low.
786 if (timeoutcount > MAX_TIMEOUTS
787 && !open_warning_by_mail(ctl, (struct msgblk *)NULL))
790 GT_("Subject: fetchmail sees repeated timeouts\r\n"));
792 GT_("Fetchmail saw more than %d timeouts while attempting to get mail from %s@%s.\r\n"),
795 ctl->server.truename);
797 GT_("This could mean that your mailserver is stuck, or that your SMTP\r\n" \
798 "server is wedged, or that your mailbox file on the server has been\r\n" \
799 "corrupted by a server error. You can run `fetchmail -v -v' to\r\n" \
800 "diagnose the problem.\r\n\r\n" \
801 "Fetchmail won't poll this mailbox again until you restart it.\r\n"));
802 close_warning_by_mail(ctl, (struct msgblk *)NULL);
809 /* try to clean up all streams */
812 if (mailserver_socket != -1) {
813 cleanupSockClose(mailserver_socket);
814 mailserver_socket = -1;
819 char buf[MSGBUFSIZE+1], *realhost;
820 int count, new, bytes, deletions = 0;
821 int *msgsizes = (int *)NULL;
822 int *msgcodes = (int *)NULL;
824 int fetches, dispatches, oldphase;
825 #else /* INET6_ENABLE */
826 int port, fetches, dispatches, oldphase;
827 #endif /* INET6_ENABLE */
830 /* execute pre-initialization command, if any */
831 if (ctl->preconnect && (err = system(ctl->preconnect)))
834 GT_("pre-connection command failed with status %d\n"), err);
839 /* open a socket to the mail server */
842 set_timeout(mytimeout);
845 port = ctl->server.port ? ctl->server.port : ( ctl->use_ssl ? ctl->server.base_protocol->sslport : ctl->server.base_protocol->port );
847 port = ctl->server.port ? ctl->server.port : ctl->server.base_protocol->port;
849 #endif /* !INET6_ENABLE */
852 /* If either the pollname or vianame are "hesiod" we want to
853 lookup the user's hesiod pobox host */
854 if (!strcasecmp(ctl->server.queryname, "hesiod")) {
855 struct hes_postoffice *hes_p;
856 hes_p = hes_getmailhost(ctl->remotename);
857 if (hes_p != NULL && strcmp(hes_p->po_type, "POP") == 0) {
858 free(ctl->server.queryname);
859 ctl->server.queryname = xstrdup(hes_p->po_host);
861 free(ctl->server.via);
862 ctl->server.via = xstrdup(hes_p->po_host);
865 GT_("couldn't find HESIOD pobox for %s\n"),
871 #ifdef HAVE_GETHOSTBYNAME
873 * Canonicalize the server truename for later use. This also
874 * functions as a probe for whether the mailserver is accessible.
875 * We try it on each poll cycle until we get a result. This way,
876 * fetchmail won't fail if started up when the network is inaccessible.
878 if (ctl->server.dns && !ctl->server.trueaddr)
880 if (ctl->server.lead_server)
882 char *leadname = ctl->server.lead_server->truename;
884 /* prevent core dump from ill-formed or duplicate entry */
887 report(stderr, GT_("Lead server has no name.\n"));
894 ctl->server.truename = xstrdup(leadname);
898 struct hostent *namerec;
901 * Get the host's IP, so we can report it like this:
903 * Received: from hostname [10.0.0.1]
906 namerec = gethostbyname(ctl->server.queryname);
907 if (namerec == (struct hostent *)NULL)
910 GT_("couldn't find canonical DNS name of %s\n"),
911 ctl->server.pollname);
919 ctl->server.truename=xstrdup((char *)namerec->h_name);
920 ctl->server.trueaddr=xmalloc(namerec->h_length);
921 memcpy(ctl->server.trueaddr,
922 namerec->h_addr_list[0],
927 #endif /* HAVE_GETHOSTBYNAME */
929 realhost = ctl->server.via ? ctl->server.via : ctl->server.pollname;
931 /* allow time for the port to be set up if we have a plugin */
932 if (ctl->server.plugin)
935 if ((mailserver_socket = SockOpen(realhost,
936 ctl->server.service ? ctl->server.service : ( ctl->use_ssl ? ctl->server.base_protocol->sslservice : ctl->server.base_protocol->service ),
937 ctl->server.netsec, ctl->server.plugin)) == -1)
938 #else /* INET6_ENABLE */
939 if ((mailserver_socket = SockOpen(realhost, port, NULL, ctl->server.plugin)) == -1)
940 #endif /* INET6_ENABLE */
945 #ifdef HAVE_RES_SEARCH
946 if (err_no != 0 && h_errno != 0)
947 report(stderr, GT_("internal inconsistency\n"));
950 * Avoid generating a bogus error every poll cycle when we're
951 * in daemon mode but the connection to the outside world
954 if (!((err_no == EHOSTUNREACH || err_no == ENETUNREACH)
955 && run.poll_interval))
957 report_build(stderr, GT_("%s connection to %s failed"),
958 ctl->server.base_protocol->name, ctl->server.pollname);
959 #ifdef HAVE_RES_SEARCH
962 if (h_errno == HOST_NOT_FOUND)
963 strcpy(errbuf, GT_("host is unknown."));
965 else if (h_errno == NO_ADDRESS)
966 strcpy(errbuf, GT_("name is valid but has no IP address."));
968 else if (h_errno == NO_RECOVERY)
969 strcpy(errbuf, GT_("unrecoverable name server error."));
970 else if (h_errno == TRY_AGAIN)
971 strcpy(errbuf, GT_("temporary name server error."));
974 snprintf(errbuf, sizeof(errbuf),
977 #endif /* HAVE_SNPRINTF */
978 GT_("unknown DNS error %d."), h_errno);
981 #endif /* HAVE_RES_SEARCH */
982 strcpy(errbuf, strerror(err_no));
983 report_complete(stderr, ": %s\n", errbuf);
987 * Don't use this. It was an attempt to address Debian bug
988 * #47143 (Notify user by mail when pop server nonexistent).
989 * Trouble is, that doesn't work; you trip over the case
990 * where your SLIP or PPP link is down...
992 /* warn the system administrator */
993 if (open_warning_by_mail(ctl, (struct msgblk *)NULL) == 0)
996 GT_("Subject: Fetchmail unreachable-server warning.\r\n"
998 "Fetchmail could not reach the mail server %s:")
999 ctl->server.pollname);
1000 stuff_warning(ctl, errbuf, ctl->server.pollname);
1001 close_warning_by_mail(ctl, (struct msgblk *)NULL);
1005 #endif /* INET6_ENABLE */
1015 /* perform initial SSL handshake on open connection */
1016 /* Note: We pass the realhost name over for certificate
1017 verification. We may want to make this configurable */
1018 if (ctl->use_ssl && SSLOpen(mailserver_socket,ctl->sslcert,ctl->sslkey,ctl->sslproto,ctl->sslcertck,
1019 ctl->sslcertpath,ctl->sslfingerprint,realhost,ctl->server.pollname) == -1)
1021 report(stderr, GT_("SSL connection failed.\n"));
1027 if (ctl->server.authenticate == A_KERBEROS_V4)
1029 set_timeout(mytimeout);
1030 err = kerberos_auth(mailserver_socket, ctl->server.truename,
1031 ctl->server.principal);
1036 #endif /* KERBEROS_V4 */
1039 if (ctl->server.authenticate == A_KERBEROS_V5)
1041 set_timeout(mytimeout);
1042 err = kerberos5_auth(mailserver_socket, ctl->server.truename);
1047 #endif /* KERBEROS_V5 */
1049 /* accept greeting message from mail server */
1050 err = (ctl->server.base_protocol->parse_response)(mailserver_socket, buf);
1054 /* try to get authorized to fetch mail */
1055 stage = STAGE_GETAUTH;
1056 if (ctl->server.base_protocol->getauth)
1058 err = (ctl->server.base_protocol->getauth)(mailserver_socket, ctl, buf);
1062 if (err == PS_LOCKBUSY)
1063 report(stderr, GT_("Lock-busy error on %s@%s\n"),
1065 ctl->server.truename);
1066 else if (err == PS_SERVBUSY)
1067 report(stderr, GT_("Server busy error on %s@%s\n"),
1069 ctl->server.truename);
1070 else if (err == PS_AUTHFAIL)
1072 report(stderr, GT_("Authorization failure on %s@%s%s\n"),
1074 ctl->server.truename,
1075 (ctl->wehaveauthed ? GT_(" (previously authorized)") : "")
1079 * If we're running in background, try to mail the
1080 * calling user a heads-up about the authentication
1081 * failure once it looks like this isn't a fluke
1082 * due to the server being temporarily inaccessible.
1083 * When we get third succesive failure, we notify the user
1084 * but only if we haven't already managed to get
1085 * authorization. After that, once we get authorization
1086 * we let the user know service is restored.
1088 if (run.poll_interval
1089 && ctl->wehavesentauthnote
1090 && ((ctl->wehaveauthed && ++ctl->authfailcount == 10)
1091 || ++ctl->authfailcount == 3)
1092 && !open_warning_by_mail(ctl, (struct msgblk *)NULL))
1094 ctl->wehavesentauthnote = 1;
1096 GT_("Subject: fetchmail authentication failed on %s@%s\r\n"),
1097 ctl->remotename, ctl->server.truename);
1099 GT_("Fetchmail could not get mail from %s@%s.\r\n"),
1101 ctl->server.truename);
1102 if (ctl->wehaveauthed)
1103 stuff_warning(ctl, GT_("\
1104 The attempt to get authorization failed.\r\n\
1105 Since we have already succeeded in getting authorization for this\r\n\
1106 connection, this is probably another failure mode (such as busy server)\r\n\
1107 that fetchmail cannot distinguish because the server didn't send a useful\r\n\
1110 However, if you HAVE changed you account details since starting the\r\n\
1111 fetchmail daemon, you need to stop the daemon, change your configuration\r\n\
1112 of fetchmail, and then restart the daemon.\r\n\
1114 The fetchmail daemon will continue running and attempt to connect\r\n\
1115 at each cycle. No future notifications will be sent until service\r\n\
1118 stuff_warning(ctl, GT_("\
1119 The attempt to get authorization failed.\r\n\
1120 This probably means your password is invalid, but some servers have\r\n\
1121 other failure modes that fetchmail cannot distinguish from this\r\n\
1122 because they don't send useful error messages on login failure.\r\n\
1124 The fetchmail daemon will continue running and attempt to connect\r\n\
1125 at each cycle. No future notifications will be sent until service\r\n\
1127 close_warning_by_mail(ctl, (struct msgblk *)NULL);
1131 report(stderr, GT_("Unknown login or authentication error on %s@%s\n"),
1133 ctl->server.truename);
1140 * This connection has given us authorization at least once.
1142 * There are dodgy server (clubinternet.fr for example) that
1143 * give spurious authorization failures on patently good
1144 * account/password details, then 5 minutes later let you in!
1146 * This is meant to build in some tolerance of such nasty bits
1149 ctl->wehaveauthed = 1;
1150 /*if (ctl->authfailcount >= 3)*/
1151 if (ctl->wehavesentauthnote)
1153 ctl->wehavesentauthnote = 0;
1155 GT_("Authorization OK on %s@%s\n"),
1157 ctl->server.truename);
1158 if (!open_warning_by_mail(ctl, (struct msgblk *)NULL))
1161 GT_("Subject: fetchmail authentication OK on %s@%s\r\n"),
1162 ctl->remotename, ctl->server.truename);
1164 GT_("Fetchmail was able to log into %s@%s.\r\n"),
1166 ctl->server.truename);
1168 GT_("Service has been restored.\r\n"));
1169 close_warning_by_mail(ctl, (struct msgblk *)NULL);
1174 * Reporting only after the first three
1175 * consecutive failures, or ten consecutive
1176 * failures after we have managed to get
1179 ctl->authfailcount = 0;
1183 ctl->errcount = fetches = 0;
1185 /* now iterate over each folder selected */
1186 for (idp = ctl->mailboxes; idp; idp = idp->next)
1193 /* reset timeout, in case we did an IDLE */
1194 mytimeout = ctl->server.timeout;
1196 if (outlevel >= O_DEBUG)
1199 report(stdout, GT_("selecting or re-polling folder %s\n"), idp->id);
1201 report(stdout, GT_("selecting or re-polling default folder\n"));
1204 /* compute # of messages and number of new messages waiting */
1205 stage = STAGE_GETRANGE;
1206 err = (ctl->server.base_protocol->getrange)(mailserver_socket, ctl, idp->id, &count, &new, &bytes);
1210 /* show user how many messages we downloaded */
1212 #ifdef HAVE_SNPRINTF
1213 (void) snprintf(buf, sizeof(buf),
1216 #endif /* HAVE_SNPRINTF */
1217 GT_("%s at %s (folder %s)"),
1218 ctl->remotename, ctl->server.truename, idp->id);
1220 #ifdef HAVE_SNPRINTF
1221 (void) snprintf(buf, sizeof(buf),
1224 #endif /* HAVE_SNPRINTF */
1226 ctl->remotename, ctl->server.truename);
1227 if (outlevel > O_SILENT)
1229 if (count == -1) /* only used for ETRN */
1230 report(stdout, GT_("Polling %s\n"), ctl->server.truename);
1231 else if (count != 0)
1233 if (new != -1 && (count - new) > 0)
1234 report_build(stdout, GT_("%d %s (%d seen) for %s"),
1235 count, count > 1 ? GT_("messages") :
1239 report_build(stdout, GT_("%d %s for %s"),
1240 count, count > 1 ? GT_("messages") :
1241 GT_("message"), buf);
1243 report_complete(stdout, ".\n");
1245 report_complete(stdout, GT_(" (%d octets).\n"), bytes);
1249 /* these are pointless in normal daemon mode */
1250 if (pass == 1 && (run.poll_interval == 0 || outlevel >= O_VERBOSE))
1251 report(stdout, GT_("No mail for %s\n"), buf);
1255 /* very important, this is where we leave the do loop */
1261 if (new == -1 || ctl->fetchall)
1263 fetches = new; /* set error status correctly */
1265 * There used to be a `goto noerror' here, but this
1266 * prevented checking of multiple folders. This
1267 * comment is a reminder in case I introduced some
1268 * subtle bug by removing it...
1273 flag force_retrieval;
1277 * What forces this code is that in POP2 and
1278 * IMAP2bis you can't fetch a message without
1279 * having it marked `seen'. In POP3 and IMAP4, on the
1280 * other hand, you can (peek_capable is set by
1281 * each driver module to convey this; it's not a
1282 * method constant because of the difference between
1283 * IMAP2bis and IMAP4, and because POP3 doesn't peek
1284 * if fetchall is on).
1286 * The result of being unable to peek is that if there's
1287 * any kind of transient error (DNS lookup failure, or
1288 * sendmail refusing delivery due to process-table limits)
1289 * the message will be marked "seen" on the server without
1290 * having been delivered. This is not a big problem if
1291 * fetchmail is running in foreground, because the user
1292 * will see a "skipped" message when it next runs and get
1295 * But in daemon mode this leads to the message
1296 * being silently ignored forever. This is not
1299 * We compensate for this by checking the error
1300 * count from the previous pass and forcing all
1301 * messages to be considered new if it's nonzero.
1303 force_retrieval = !peek_capable && (ctl->errcount > 0);
1306 * Don't trust the message count passed by the server.
1307 * Without this check, it might be possible to do a
1308 * DNS-spoofing attack that would pass back a ridiculous
1309 * count, and allocate a malloc area that would overlap
1310 * a portion of the stack.
1312 if (count > INT_MAX/sizeof(int))
1314 report(stderr, GT_("bogus message count!"));
1315 return(PS_PROTOCOL);
1318 /* OK, we're going to gather size info next */
1319 xalloca(msgsizes, int *, sizeof(int) * count);
1320 xalloca(msgcodes, int *, sizeof(int) * count);
1321 for (i = 0; i < count; i++)
1322 msgcodes[i] = MSGLEN_UNKNOWN;
1325 * We need the size of each message before it's
1326 * loaded in order to pass it to the ESMTP SIZE
1327 * option. If the protocol has a getsizes method,
1328 * we presume this means it doesn't get reliable
1329 * sizes from message fetch responses.
1331 if (proto->getsizes)
1333 stage = STAGE_GETSIZES;
1334 err = (proto->getsizes)(mailserver_socket, count, msgsizes);
1341 for (i = 0; i < count; i++)
1342 bytes += msgsizes[i];
1346 /* mark some messages not to be retrieved */
1347 for (num = 1; num <= count; num++)
1349 if (NUM_NONZERO(ctl->limit) && (msgsizes[num-1] > ctl->limit))
1350 msgcodes[num-1] = MSGLEN_TOOLARGE;
1351 else if (ctl->fetchall || force_retrieval)
1353 else if (ctl->server.base_protocol->is_old && (ctl->server.base_protocol->is_old)(mailserver_socket,ctl,num))
1354 msgcodes[num-1] = MSGLEN_OLD;
1357 /* read, forward, and delete messages */
1358 stage = STAGE_FETCH;
1360 /* fetch in lockstep mode */
1361 err = fetch_messages(mailserver_socket, ctl,
1362 count, msgsizes, msgcodes,
1364 &fetches, &dispatches, &deletions);
1368 if (!check_only && ctl->skipped
1369 && run.poll_interval > 0 && !nodetach)
1371 clean_skipped_list(&ctl->skipped);
1372 send_size_warnings(ctl);
1377 * Only re-poll if we either had some actual forwards and
1378 * either allowed deletions and had no errors.
1379 * Otherwise it is far too easy to get into infinite loops.
1381 (dispatches && ctl->server.base_protocol->retry && !ctl->keep && !ctl->errcount);
1385 /* ordinary termination with no errors -- officially log out */
1386 err = (ctl->server.base_protocol->logout_cmd)(mailserver_socket, ctl);
1388 * Hmmmm...arguably this would be incorrect if we had fetches but
1389 * no dispatches (due to oversized messages, etc.)
1392 err = (fetches > 0) ? PS_SUCCESS : PS_NOMAIL;
1393 cleanupSockClose(mailserver_socket);
1397 /* we only get here on error */
1398 if (err != 0 && err != PS_SOCKET)
1400 stage = STAGE_LOGOUT;
1401 (ctl->server.base_protocol->logout_cmd)(mailserver_socket, ctl);
1403 cleanupSockClose(mailserver_socket);
1406 msg = (const char *)NULL; /* sacrifice to -Wall */
1410 msg = GT_("socket");
1413 msg = GT_("missing or bad RFC822 header");
1419 msg = GT_("client/server synchronization");
1422 msg = GT_("client/server protocol");
1425 msg = GT_("lock busy on server");
1428 msg = GT_("SMTP transaction");
1431 msg = GT_("DNS lookup");
1434 report(stderr, GT_("undefined error\n"));
1437 /* no report on PS_MAXFETCH or PS_UNDEFINED or PS_AUTHFAIL */
1438 if (err==PS_SOCKET || err==PS_SYNTAX
1439 || err==PS_IOERR || err==PS_ERROR || err==PS_PROTOCOL
1440 || err==PS_LOCKBUSY || err==PS_SMTP || err==PS_DNS)
1444 if (phase == FORWARDING_WAIT || phase == LISTENER_WAIT)
1445 stem = GT_("%s error while delivering to SMTP host %s\n");
1447 stem = GT_("%s error while fetching from %s\n");
1448 report(stderr, stem, msg, ctl->server.pollname);
1452 /* execute wrapup command, if any */
1453 if (ctl->postconnect && (err = system(ctl->postconnect)))
1455 report(stderr, GT_("post-connection command failed with status %d\n"), err);
1456 if (err == PS_SUCCESS)
1460 signal(SIGALRM, alrmsave);
1461 signal(SIGPIPE, pipesave);
1465 int do_protocol(ctl, proto)
1466 /* retrieve messages from server using given protocol method table */
1467 struct query *ctl; /* parsed options with merged-in defaults */
1468 const struct method *proto; /* protocol method table */
1473 if (ctl->server.authenticate == A_KERBEROS_V4)
1475 report(stderr, GT_("Kerberos V4 support not linked.\n"));
1478 #endif /* KERBEROS_V4 */
1481 if (ctl->server.authenticate == A_KERBEROS_V5)
1483 report(stderr, GT_("Kerberos V5 support not linked.\n"));
1486 #endif /* KERBEROS_V5 */
1488 /* lacking methods, there are some options that may fail */
1491 /* check for unsupported options */
1494 GT_("Option --flush is not supported with %s\n"),
1498 else if (ctl->fetchall) {
1500 GT_("Option --all is not supported with %s\n"),
1505 if (!proto->getsizes && NUM_SPECIFIED(ctl->limit))
1508 GT_("Option --limit is not supported with %s\n"),
1514 * If no expunge limit or we do expunges within the driver,
1515 * then just do one session, passing in any fetchlimit.
1517 if (proto->retry || !NUM_SPECIFIED(ctl->expunge))
1518 return(do_session(ctl, proto, NUM_VALUE_OUT(ctl->fetchlimit)));
1520 * There's an expunge limit, and it isn't handled in the driver itself.
1521 * OK; do multiple sessions, each fetching a limited # of messages.
1522 * Stop if the total count of retrieved messages exceeds ctl->fetchlimit
1523 * (if it was nonzero).
1529 int expunge = NUM_VALUE_OUT(ctl->expunge);
1530 int fetchlimit = NUM_VALUE_OUT(ctl->fetchlimit);
1533 if (fetchlimit > 0 && (expunge == 0 || expunge > fetchlimit - totalcount))
1534 expunge = fetchlimit - totalcount;
1535 err = do_session(ctl, proto, expunge);
1536 totalcount += expunge;
1537 if (NUM_SPECIFIED(ctl->fetchlimit) && totalcount >= fetchlimit)
1539 if (err != PS_LOCKBUSY)
1541 else if (lockouts >= MAX_LOCKOUTS)
1543 else /* err == PS_LOCKBUSY */
1546 * Allow time for the server lock to release. if we
1547 * don't do this, we'll often hit a locked-mailbox
1548 * condition and fail.
1554 (err == PS_MAXFETCH || err == PS_LOCKBUSY);
1561 /* driver.c ends here */