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>
28 #ifdef HAVE_SYS_WAIT_H
32 #ifdef HAVE_NET_SOCKET_H
33 #include <net/socket.h>
39 #if defined(HAVE_RES_SEARCH) || defined(HAVE_GETHOSTBYNAME)
42 #endif /* defined(HAVE_RES_SEARCH) || defined(HAVE_GETHOSTBYNAME) */
46 #include <netinet/in.h>
47 #endif /* KERBEROS_V4 */
52 #include "fetchmail.h"
55 /* throw types for runtime errors */
56 #define THROW_TIMEOUT 1 /* server timed out */
57 #define THROW_SIGPIPE 2 /* SIGPIPE on stream socket */
59 /* magic values for the message length array */
60 #define MSGLEN_UNKNOWN 0 /* length unknown (0 is impossible) */
61 #define MSGLEN_INVALID -1 /* length passed back is invalid */
62 #define MSGLEN_TOOLARGE -2 /* message is too large */
63 #define MSGLEN_OLD -3 /* message is old */
65 int pass; /* how many times have we re-polled? */
66 int stage; /* where are we? */
67 int phase; /* where are we, for error-logging purposes? */
68 int batchcount; /* count of messages sent in current batch */
69 flag peek_capable; /* can we peek for better error recovery? */
70 int mailserver_socket_temp = -1; /* socket to free if connect timeout */
72 static int timeoutcount; /* count consecutive timeouts */
73 static int idletimeout; /* timeout occured in idle stage? */
75 static jmp_buf restart;
77 int isidletimeout(void)
78 /* last timeout occured in idle stage? */
83 void set_timeout(int timeleft)
84 /* reset the nonresponse-timeout */
86 #if !defined(__EMX__) && !defined(__BEOS__)
87 struct itimerval ntimeout;
94 ntimeout.it_interval.tv_sec = ntimeout.it_interval.tv_usec = 0;
95 ntimeout.it_value.tv_sec = timeleft;
96 ntimeout.it_value.tv_usec = 0;
97 setitimer(ITIMER_REAL, &ntimeout, (struct itimerval *)NULL);
101 static RETSIGTYPE timeout_handler (int signal)
102 /* handle SIGALRM signal indicating a server timeout */
104 if(stage != STAGE_IDLE) {
106 longjmp(restart, THROW_TIMEOUT);
111 static RETSIGTYPE sigpipe_handler (int signal)
112 /* handle SIGPIPE signal indicating a broken stream socket */
114 longjmp(restart, THROW_SIGPIPE);
117 #define CLEANUP_TIMEOUT 60 /* maximum timeout during cleanup */
119 static int cleanupSockClose (int fd)
120 /* close sockets in maximum CLEANUP_TIMEOUT seconds during cleanup */
123 SIGHANDLERTYPE alrmsave;
124 alrmsave = set_signal_handler(SIGALRM, null_signal_handler);
125 set_timeout(CLEANUP_TIMEOUT);
126 scerror = SockClose(fd);
128 set_signal_handler(SIGALRM, alrmsave);
133 static int kerberos_auth(socket, canonical, principal)
134 /* authenticate to the server host using Kerberos V4 */
135 int socket; /* socket to server host */
136 char *canonical; /* server name */
143 Key_schedule schedule;
145 char * prin_copy = (char *) NULL;
146 char * prin = (char *) NULL;
147 char * inst = (char *) NULL;
148 char * realm = (char *) NULL;
150 if (principal != (char *)NULL && *principal)
153 prin = prin_copy = xstrdup(principal);
154 for (cp = prin_copy; *cp && *cp != '.'; ++cp)
160 while (*cp && *cp != '@')
170 xalloca(ticket, KTEXT, sizeof (KTEXT_ST));
171 rem = (krb_sendauth (0L, socket, ticket,
173 inst ? inst : canonical,
174 realm ? realm : ((char *) (krb_realmofhost (canonical))),
179 ((struct sockaddr_in *) 0),
180 ((struct sockaddr_in *) 0),
188 report(stderr, GT_("kerberos error %s\n"), (krb_get_err_text (rem)));
189 return (PS_AUTHFAIL);
193 #endif /* KERBEROS_V4 */
196 static int kerberos5_auth(socket, canonical)
197 /* authenticate to the server host using Kerberos V5 */
198 int socket; /* socket to server host */
199 const char *canonical; /* server name */
201 krb5_error_code retval;
202 krb5_context context;
204 krb5_principal client = NULL, server = NULL;
205 krb5_error *err_ret = NULL;
207 krb5_auth_context auth_context = NULL;
209 krb5_init_context(&context);
210 krb5_init_ets(context);
211 krb5_auth_con_init(context, &auth_context);
213 if (retval = krb5_cc_default(context, &ccdef)) {
214 report(stderr, "krb5_cc_default: %s\n", error_message(retval));
218 if (retval = krb5_cc_get_principal(context, ccdef, &client)) {
219 report(stderr, "krb5_cc_get_principal: %s\n", error_message(retval));
223 if (retval = krb5_sname_to_principal(context, canonical, "pop",
226 report(stderr, "krb5_sname_to_principal: %s\n", error_message(retval));
230 retval = krb5_sendauth(context, &auth_context, (krb5_pointer) &socket,
231 "KPOPV1.0", client, server,
232 AP_OPTS_MUTUAL_REQUIRED,
233 NULL, /* no data to checksum */
234 0, /* no creds, use ccache instead */
238 NULL); /* don't need reply */
240 krb5_free_principal(context, server);
241 krb5_free_principal(context, client);
242 krb5_auth_con_free(context, auth_context);
246 if (err_ret && err_ret->e_text) {
247 report(stderr, GT_("krb5_sendauth: %s [server says '%*s'] \n"),
248 error_message(retval),
251 if (err_ret && err_ret->text.length) {
252 report(stderr, GT_("krb5_sendauth: %s [server says '%*s'] \n"),
253 error_message(retval),
254 err_ret->text.length,
257 krb5_free_error(context, err_ret);
259 report(stderr, "krb5_sendauth: %s\n", error_message(retval));
265 #endif /* KERBEROS_V5 */
267 static void clean_skipped_list(struct idlist **skipped_list)
268 /* struct "idlist" contains no "prev" ptr; we must remove unused items first */
270 struct idlist *current=NULL, *prev=NULL, *tmp=NULL, *head=NULL;
271 prev = current = head = *skipped_list;
277 /* if item has no reference, remove it */
278 if (current && current->val.status.mark == 0)
280 if (current == head) /* remove first item (head) */
282 head = current->next;
283 if (current->id) free(current->id);
285 prev = current = head;
287 else /* remove middle/last item */
291 if (current->id) free(current->id);
296 else /* skip this item */
299 current = current->next;
303 *skipped_list = head;
306 static void send_size_warnings(struct query *ctl)
307 /* send warning mail with skipped msg; reset msg count when user notified */
310 int msg_to_send = FALSE;
311 struct idlist *head=NULL, *current=NULL;
312 int max_warning_poll_count;
318 /* don't start a notification message unless we need to */
319 for (current = head; current; current = current->next)
320 if (current->val.status.num == 0 && current->val.status.mark)
326 * There's no good way to recover if we can't send notification mail,
327 * but it's not a disaster, either, since the skipped mail will not
330 if (open_warning_by_mail(ctl, (struct msgblk *)NULL))
333 GT_("Subject: Fetchmail oversized-messages warning.\n"
335 "The following oversized messages remain on the mail server %s:"),
336 ctl->server.pollname);
338 if (run.poll_interval == 0)
339 max_warning_poll_count = 0;
341 max_warning_poll_count = ctl->warnings/run.poll_interval;
343 /* parse list of skipped msg, adding items to the mail */
344 for (current = head; current; current = current->next)
346 if (current->val.status.num == 0 && current->val.status.mark)
348 nbr = current->val.status.mark;
349 size = atoi(current->id);
351 GT_("\t%d msg %d octets long skipped by fetchmail.\n"),
354 current->val.status.num++;
355 current->val.status.mark = 0;
357 if (current->val.status.num >= max_warning_poll_count)
358 current->val.status.num = 0;
361 close_warning_by_mail(ctl, (struct msgblk *)NULL);
364 static void mark_oversized(struct query *ctl, int num, int size)
365 /* mark a message oversized */
367 struct idlist *current=NULL, *tmp=NULL;
371 /* convert size to string */
373 snprintf(sizestr, sizeof(sizestr),
376 #endif /* HAVE_SNPRINTF */
379 /* build a list of skipped messages
380 * val.id = size of msg (string cnvt)
381 * val.status.num = warning_poll_count
382 * val.status.mask = nbr of msg this size
385 current = ctl->skipped;
387 /* initialise warning_poll_count to the
388 * current value so that all new msg will
389 * be included in the next mail
391 cnt = current ? current->val.status.num : 0;
393 /* if entry exists, increment the count */
394 if (current && str_in_list(¤t, sizestr, FALSE))
396 for ( ; current; current = current->next)
398 if (strcmp(current->id, sizestr) == 0)
400 current->val.status.mark++;
405 /* otherwise, create a new entry */
406 /* initialise with current poll count */
409 tmp = save_str(&ctl->skipped, sizestr, 1);
410 tmp->val.status.num = cnt;
414 static int fetch_messages(int mailserver_socket, struct query *ctl,
415 int count, int *msgsizes, int *msgcodes, int maxfetch,
416 int *fetches, int *dispatches, int *deletions)
417 /* fetch messages in lockstep mode */
421 for (num = 1; num <= count; num++)
423 flag suppress_delete = FALSE;
424 flag suppress_forward = FALSE;
425 flag suppress_readbody = FALSE;
426 flag retained = FALSE;
428 if (msgcodes[num-1] < 0)
430 if ((msgcodes[num-1] == MSGLEN_TOOLARGE) && !check_only)
431 mark_oversized(ctl, num, msgsizes[num-1]);
432 /* To avoid flooding the syslog when using --keep,
433 * report "Skipped message" only when:
434 * 1) --verbose is on, or
435 * 2) fetchmail does not use syslog, or
436 * 3) the message was skipped for some other
437 * reason than being old.
439 if ( (outlevel >= O_VERBOSE) ||
440 (outlevel > O_SILENT && (!run.use_syslog || msgcodes[num-1] != MSGLEN_OLD))
444 GT_("skipping message %s@%s:%d (%d octets)"),
445 ctl->remotename, ctl->server.truename, num,
447 switch (msgcodes[num-1])
451 * Invalid lengths are produced by Post Office/NT's
452 * annoying habit of randomly prepending bogus
453 * LIST items of length -1. Patrick Audley
454 * <paudley@pobox.com> tells us: LIST shows a
455 * size of -1, RETR and TOP return "-ERR
456 * System error - couldn't open message", and
457 * DELE succeeds but doesn't actually delete
460 report_build(stdout, GT_(" (length -1)"));
462 case MSGLEN_TOOLARGE:
463 report_build(stdout, GT_(" (oversized)"));
470 flag wholesize = !ctl->server.base_protocol->fetch_body;
472 /* request a message */
473 err = (ctl->server.base_protocol->fetch_headers)(mailserver_socket,ctl,num, &len);
474 if (err == PS_TRANSIENT) /* server is probably Exchange */
477 GT_("couldn't fetch headers, message %s@%s:%d (%d octets)\n"),
478 ctl->remotename, ctl->server.truename, num,
485 /* -1 means we didn't see a size in the response */
488 len = msgsizes[num - 1];
492 if (outlevel > O_SILENT)
494 report_build(stdout, GT_("reading message %s@%s:%d of %d"),
495 ctl->remotename, ctl->server.truename,
499 report_build(stdout, GT_(" (%d %soctets)"),
500 len, wholesize ? "" : GT_("header "));
501 if (outlevel >= O_VERBOSE)
502 report_complete(stdout, "\n");
504 report_complete(stdout, " ");
508 * Read the message headers and ship them to the
511 err = readheaders(mailserver_socket, len, msgsizes[num-1],
513 if (err == PS_RETAINED)
515 suppress_forward = suppress_delete = retained = TRUE;
516 suppress_readbody = TRUE;
518 else if (err == PS_TRANSIENT)
520 suppress_delete = suppress_forward = TRUE;
521 suppress_readbody = TRUE;
523 else if (err == PS_REFUSED)
525 suppress_forward = TRUE;
526 suppress_readbody = TRUE;
528 else if (err == PS_TRUNCATED)
530 suppress_readbody = TRUE;
531 len = 0; /* suppress body processing */
537 * If we're using IMAP4 or something else that
538 * can fetch headers separately from bodies,
539 * it's time to request the body now. This
540 * fetch may be skipped if we got an anti-spam
541 * or other PS_REFUSED error response during
544 if (ctl->server.base_protocol->fetch_body && !suppress_readbody)
546 if (outlevel >= O_VERBOSE && !isafile(1))
552 if ((err = (ctl->server.base_protocol->trail)(mailserver_socket, ctl, num)))
555 if (!suppress_forward)
557 if ((err=(ctl->server.base_protocol->fetch_body)(mailserver_socket,ctl,num,&len)))
560 * Work around a bug in Novell's
561 * broken GroupWise IMAP server;
562 * its body FETCH response is missing
563 * the required length for the data
564 * string. This violates RFC2060.
567 len = msgsizes[num-1] - msgblk.msglen;
568 if (outlevel > O_SILENT && !wholesize)
569 report_complete(stdout,
570 GT_(" (%d body octets) "), len);
574 /* process the body now */
577 if (suppress_readbody)
583 err = readbody(mailserver_socket,
588 if (err == PS_TRANSIENT)
589 suppress_delete = suppress_forward = TRUE;
593 /* tell server we got it OK and resynchronize */
594 if (ctl->server.base_protocol->trail)
596 if (outlevel >= O_VERBOSE && !isafile(1))
602 err = (ctl->server.base_protocol->trail)(mailserver_socket, ctl, num);
608 /* count # messages forwarded on this pass */
609 if (!suppress_forward)
613 * Check to see if the numbers matched?
615 * Yes, some servers foo this up horribly.
616 * All IMAP servers seem to get it right, and
617 * so does Eudora QPOP at least in 2.xx
620 * Microsoft Exchange gets it completely
621 * wrong, reporting compressed rather than
622 * actual sizes (so the actual length of
623 * message is longer than the reported size).
624 * Another fine example of Microsoft brain death!
626 * Some older POP servers, like the old UCB
627 * POP server and the pre-QPOP QUALCOMM
628 * versions, report a longer size in the LIST
629 * response than actually gets shipped up.
630 * It's unclear what is going on here, as the
631 * QUALCOMM server (at least) seems to be
632 * reporting the on-disk size correctly.
634 if (msgblk.msglen != msgsizes[num-1])
636 if (outlevel >= O_DEBUG)
638 GT_("message %s@%s:%d was not the expected length (%d actual != %d expected)\n"),
639 ctl->remotename, ctl->server.truename, num,
640 msgblk.msglen, msgsizes[num-1]);
643 /* end-of-message processing starts here */
644 if (!close_sink(ctl, &msgblk, !suppress_forward))
647 suppress_delete = TRUE;
654 * At this point in flow of control, either
655 * we've bombed on a protocol error or had
656 * delivery refused by the SMTP server
657 * (unlikely -- I've never seen it) or we've
658 * seen `accepted for delivery' and the
659 * message is shipped. It's safe to mark the
660 * message seen and delete it on the server
664 /* maybe we delete this message now? */
667 if (outlevel > O_SILENT)
668 report(stdout, GT_(" retained\n"));
670 else if (ctl->server.base_protocol->delete
672 && ((msgcodes[num-1] >= 0) ? !ctl->keep : ctl->flush))
675 if (outlevel > O_SILENT)
676 report_complete(stdout, GT_(" flushed\n"));
677 err = (ctl->server.base_protocol->delete)(mailserver_socket, ctl, num);
683 if ( (outlevel >= O_VERBOSE) ||
684 /* To avoid flooding the syslog when using --keep,
685 * report "Skipped message" only when:
686 * 1) --verbose is on, or
687 * 2) fetchmail does not use syslog, or
688 * 3) the message was skipped for some other
689 * reason than just being old.
691 (outlevel > O_SILENT && (!run.use_syslog || msgcodes[num-1] != MSGLEN_OLD))
693 report_complete(stdout, GT_(" not flushed\n"));
695 /* maybe we mark this message as seen now? */
696 if (ctl->server.base_protocol->mark_seen
698 && (msgcodes[num-1] >= 0 && ctl->keep))
700 err = (ctl->server.base_protocol->mark_seen)(mailserver_socket, ctl, num);
706 /* perhaps this as many as we're ready to handle */
707 if (maxfetch && maxfetch <= *fetches && *fetches < count)
709 report(stdout, GT_("fetchlimit %d reached; %d messages left on server %s account %s\n"),
710 maxfetch, count - *fetches, ctl->server.truename, ctl->remotename);
718 static int do_session(ctl, proto, maxfetch)
719 /* retrieve messages from server using given protocol method table */
720 struct query *ctl; /* parsed options with merged-in defaults */
721 const struct method *proto; /* protocol method table */
722 const int maxfetch; /* maximum number of messages to fetch */
726 volatile int err, mailserver_socket = -1; /* pacifies -Wall */
728 int err, mailserver_socket = -1;
729 #endif /* HAVE_VOLATILE */
731 SIGHANDLERTYPE pipesave;
732 SIGHANDLERTYPE alrmsave;
734 ctl->server.base_protocol = proto;
738 init_transact(proto);
740 /* set up the server-nonresponse timeout */
741 alrmsave = set_signal_handler(SIGALRM, timeout_handler);
742 mytimeout = ctl->server.timeout;
744 /* set up the broken-pipe timeout */
745 pipesave = set_signal_handler(SIGPIPE, sigpipe_handler);
747 if ((js = setjmp(restart)))
749 #ifdef HAVE_SIGPROCMASK
751 * Don't rely on setjmp() to restore the blocked-signal mask.
752 * It does this under BSD but is required not to under POSIX.
754 * If your Unix doesn't have sigprocmask, better hope it has
755 * BSD-like behavior. Otherwise you may see fetchmail get
756 * permanently wedged after a second timeout on a bad read,
757 * because alarm signals were blocked after the first.
761 sigfillset(&allsigs);
762 sigprocmask(SIG_UNBLOCK, &allsigs, NULL);
763 #endif /* HAVE_SIGPROCMASK */
765 if (js == THROW_SIGPIPE)
767 set_signal_handler(SIGPIPE, SIG_IGN);
769 GT_("SIGPIPE thrown from an MDA or a stream socket error\n"));
772 else if (js == THROW_TIMEOUT)
774 if (phase == OPEN_WAIT)
776 GT_("timeout after %d seconds waiting to connect to server %s.\n"),
777 ctl->server.timeout, ctl->server.pollname);
778 else if (phase == SERVER_WAIT)
780 GT_("timeout after %d seconds waiting for server %s.\n"),
781 ctl->server.timeout, ctl->server.pollname);
782 else if (phase == FORWARDING_WAIT)
784 GT_("timeout after %d seconds waiting for %s.\n"),
786 ctl->mda ? "MDA" : "SMTP");
787 else if (phase == LISTENER_WAIT)
789 GT_("timeout after %d seconds waiting for listener to respond.\n"), ctl->server.timeout);
792 GT_("timeout after %d seconds.\n"), ctl->server.timeout);
795 * If we've exceeded our threshold for consecutive timeouts,
796 * try to notify the user, then mark the connection wedged.
797 * Don't do this if the connection can idle, though; idle
798 * timeouts just mean the frequency of mail is low.
800 if (timeoutcount > MAX_TIMEOUTS
801 && !open_warning_by_mail(ctl, (struct msgblk *)NULL))
804 GT_("Subject: fetchmail sees repeated timeouts\n"));
806 GT_("Fetchmail saw more than %d timeouts while attempting to get mail from %s@%s.\n"),
809 ctl->server.truename);
811 GT_("This could mean that your mailserver is stuck, or that your SMTP\n" \
812 "server is wedged, or that your mailbox file on the server has been\n" \
813 "corrupted by a server error. You can run `fetchmail -v -v' to\n" \
814 "diagnose the problem.\n\n" \
815 "Fetchmail won't poll this mailbox again until you restart it.\n"));
816 close_warning_by_mail(ctl, (struct msgblk *)NULL);
826 char buf[MSGBUFSIZE+1], *realhost;
827 int count, new, bytes, deletions = 0;
828 int *msgsizes = (int *)NULL;
829 int *msgcodes = (int *)NULL;
831 int fetches, dispatches, oldphase;
832 #else /* INET6_ENABLE */
833 int port, fetches, dispatches, oldphase;
834 #endif /* INET6_ENABLE */
837 /* execute pre-initialization command, if any */
838 if (ctl->preconnect && (err = system(ctl->preconnect)))
841 GT_("pre-connection command failed with status %d\n"), err);
846 /* open a socket to the mail server */
849 set_timeout(mytimeout);
852 port = ctl->server.port ? ctl->server.port : ( ctl->use_ssl ? ctl->server.base_protocol->sslport : ctl->server.base_protocol->port );
854 port = ctl->server.port ? ctl->server.port : ctl->server.base_protocol->port;
856 #endif /* !INET6_ENABLE */
859 /* If either the pollname or vianame are "hesiod" we want to
860 lookup the user's hesiod pobox host */
861 if (!strcasecmp(ctl->server.queryname, "hesiod")) {
862 struct hes_postoffice *hes_p;
863 hes_p = hes_getmailhost(ctl->remotename);
864 if (hes_p != NULL && strcmp(hes_p->po_type, "POP") == 0) {
865 free(ctl->server.queryname);
866 ctl->server.queryname = xstrdup(hes_p->po_host);
868 free(ctl->server.via);
869 ctl->server.via = xstrdup(hes_p->po_host);
872 GT_("couldn't find HESIOD pobox for %s\n"),
878 #ifdef HAVE_GETHOSTBYNAME
880 * Canonicalize the server truename for later use. This also
881 * functions as a probe for whether the mailserver is accessible.
882 * We try it on each poll cycle until we get a result. This way,
883 * fetchmail won't fail if started up when the network is inaccessible.
885 if (ctl->server.dns && !ctl->server.trueaddr)
887 if (ctl->server.lead_server)
889 char *leadname = ctl->server.lead_server->truename;
891 /* prevent core dump from ill-formed or duplicate entry */
894 report(stderr, GT_("Lead server has no name.\n"));
901 ctl->server.truename = xstrdup(leadname);
905 struct hostent *namerec;
908 * Get the host's IP, so we can report it like this:
910 * Received: from hostname [10.0.0.1]
913 namerec = gethostbyname(ctl->server.queryname);
914 if (namerec == (struct hostent *)NULL)
917 GT_("couldn't find canonical DNS name of %s (%s)\n"),
918 ctl->server.pollname, ctl->server.queryname);
926 ctl->server.truename=xstrdup((char *)namerec->h_name);
927 ctl->server.trueaddr=xmalloc(namerec->h_length);
928 memcpy(ctl->server.trueaddr,
929 namerec->h_addr_list[0],
934 #endif /* HAVE_GETHOSTBYNAME */
936 realhost = ctl->server.via ? ctl->server.via : ctl->server.pollname;
938 /* allow time for the port to be set up if we have a plugin */
939 if (ctl->server.plugin)
942 if ((mailserver_socket = SockOpen(realhost,
943 ctl->server.service ? ctl->server.service : ( ctl->use_ssl ? ctl->server.base_protocol->sslservice : ctl->server.base_protocol->service ),
944 ctl->server.netsec, ctl->server.plugin)) == -1)
945 #else /* INET6_ENABLE */
946 if ((mailserver_socket = SockOpen(realhost, port, NULL, ctl->server.plugin)) == -1)
947 #endif /* INET6_ENABLE */
952 #ifdef HAVE_RES_SEARCH
953 if (err_no != 0 && h_errno != 0)
954 report(stderr, GT_("internal inconsistency\n"));
957 * Avoid generating a bogus error every poll cycle when we're
958 * in daemon mode but the connection to the outside world
961 if (!((err_no == EHOSTUNREACH || err_no == ENETUNREACH)
962 && run.poll_interval))
964 report_build(stderr, GT_("%s connection to %s failed"),
965 ctl->server.base_protocol->name, ctl->server.pollname);
966 #ifdef HAVE_RES_SEARCH
969 if (h_errno == HOST_NOT_FOUND)
970 strcpy(errbuf, GT_("host is unknown."));
972 else if (h_errno == NO_ADDRESS)
973 strcpy(errbuf, GT_("name is valid but has no IP address."));
975 else if (h_errno == NO_RECOVERY)
976 strcpy(errbuf, GT_("unrecoverable name server error."));
977 else if (h_errno == TRY_AGAIN)
978 strcpy(errbuf, GT_("temporary name server error."));
981 snprintf(errbuf, sizeof(errbuf),
984 #endif /* HAVE_SNPRINTF */
985 GT_("unknown DNS error %d."), h_errno);
988 #endif /* HAVE_RES_SEARCH */
989 strcpy(errbuf, strerror(err_no));
990 report_complete(stderr, ": %s\n", errbuf);
994 * Don't use this. It was an attempt to address Debian bug
995 * #47143 (Notify user by mail when pop server nonexistent).
996 * Trouble is, that doesn't work; you trip over the case
997 * where your SLIP or PPP link is down...
999 /* warn the system administrator */
1000 if (open_warning_by_mail(ctl, (struct msgblk *)NULL) == 0)
1003 GT_("Subject: Fetchmail unreachable-server warning.\n"
1005 "Fetchmail could not reach the mail server %s:")
1006 ctl->server.pollname);
1007 stuff_warning(ctl, errbuf, ctl->server.pollname);
1008 close_warning_by_mail(ctl, (struct msgblk *)NULL);
1012 #endif /* INET6_ENABLE */
1020 /* Save the socket opened. Useful if Fetchmail hangs on SSLOpen
1021 * because the socket can be closed.
1023 mailserver_socket_temp = mailserver_socket;
1024 set_timeout(mytimeout);
1026 /* perform initial SSL handshake on open connection */
1027 /* Note: We pass the realhost name over for certificate
1028 verification. We may want to make this configurable */
1029 if (ctl->use_ssl && SSLOpen(mailserver_socket,ctl->sslcert,ctl->sslkey,ctl->sslproto,ctl->sslcertck,
1030 ctl->sslcertpath,ctl->sslfingerprint,realhost,ctl->server.pollname) == -1)
1032 report(stderr, GT_("SSL connection failed.\n"));
1037 /* Fetchmail didn't hang on SSLOpen,
1038 * then no need to set mailserver_socket_temp
1040 mailserver_socket_temp = -1;
1043 /* A timeout is still defined before SSLOpen,
1044 * then Fetchmail hanging on SSLOpen is handled.
1049 if (ctl->server.authenticate == A_KERBEROS_V4 && (strcasecmp(proto->name,"IMAP") != 0))
1051 set_timeout(mytimeout);
1052 err = kerberos_auth(mailserver_socket, ctl->server.truename,
1053 ctl->server.principal);
1058 #endif /* KERBEROS_V4 */
1061 if (ctl->server.authenticate == A_KERBEROS_V5)
1063 set_timeout(mytimeout);
1064 err = kerberos5_auth(mailserver_socket, ctl->server.truename);
1069 #endif /* KERBEROS_V5 */
1071 /* accept greeting message from mail server */
1072 err = (ctl->server.base_protocol->parse_response)(mailserver_socket, buf);
1076 /* try to get authorized to fetch mail */
1077 stage = STAGE_GETAUTH;
1078 if (ctl->server.base_protocol->getauth)
1080 err = (ctl->server.base_protocol->getauth)(mailserver_socket, ctl, buf);
1084 if (err == PS_LOCKBUSY)
1085 report(stderr, GT_("Lock-busy error on %s@%s\n"),
1087 ctl->server.truename);
1088 else if (err == PS_SERVBUSY)
1089 report(stderr, GT_("Server busy error on %s@%s\n"),
1091 ctl->server.truename);
1092 else if (err == PS_AUTHFAIL)
1094 report(stderr, GT_("Authorization failure on %s@%s%s\n"),
1096 ctl->server.truename,
1097 (ctl->wehaveauthed ? GT_(" (previously authorized)") : "")
1101 * If we're running in background, try to mail the
1102 * calling user a heads-up about the authentication
1103 * failure once it looks like this isn't a fluke
1104 * due to the server being temporarily inaccessible.
1105 * When we get third succesive failure, we notify the user
1106 * but only if we haven't already managed to get
1107 * authorization. After that, once we get authorization
1108 * we let the user know service is restored.
1110 if (run.poll_interval
1111 && !ctl->wehavesentauthnote
1112 && ((ctl->wehaveauthed && ++ctl->authfailcount >= 10)
1113 || (!ctl->wehaveauthed && ++ctl->authfailcount >= 3))
1114 && !open_warning_by_mail(ctl, (struct msgblk *)NULL))
1116 ctl->wehavesentauthnote = 1;
1118 GT_("Subject: fetchmail authentication failed on %s@%s\n"),
1119 ctl->remotename, ctl->server.truename);
1121 GT_("Fetchmail could not get mail from %s@%s.\n"),
1123 ctl->server.truename);
1124 if (ctl->wehaveauthed)
1125 stuff_warning(ctl, GT_("\
1126 The attempt to get authorization failed.\n\
1127 Since we have already succeeded in getting authorization for this\n\
1128 connection, this is probably another failure mode (such as busy server)\n\
1129 that fetchmail cannot distinguish because the server didn't send a useful\n\
1132 However, if you HAVE changed your account details since starting the\n\
1133 fetchmail daemon, you need to stop the daemon, change your configuration\n\
1134 of fetchmail, and then restart the daemon.\n\
1136 The fetchmail daemon will continue running and attempt to connect\n\
1137 at each cycle. No future notifications will be sent until service\n\
1140 stuff_warning(ctl, GT_("\
1141 The attempt to get authorization failed.\n\
1142 This probably means your password is invalid, but some servers have\n\
1143 other failure modes that fetchmail cannot distinguish from this\n\
1144 because they don't send useful error messages on login failure.\n\
1146 The fetchmail daemon will continue running and attempt to connect\n\
1147 at each cycle. No future notifications will be sent until service\n\
1149 close_warning_by_mail(ctl, (struct msgblk *)NULL);
1152 else if (err == PS_REPOLL)
1154 if (outlevel >= O_VERBOSE)
1155 report(stderr, GT_("Repoll immediately on %s@%s\n"),
1157 ctl->server.truename);
1160 report(stderr, GT_("Unknown login or authentication error on %s@%s\n"),
1162 ctl->server.truename);
1169 * This connection has given us authorization at least once.
1171 * There are dodgy server (clubinternet.fr for example) that
1172 * give spurious authorization failures on patently good
1173 * account/password details, then 5 minutes later let you in!
1175 * This is meant to build in some tolerance of such nasty bits
1178 ctl->wehaveauthed = 1;
1179 /*if (ctl->authfailcount >= 3)*/
1180 if (ctl->wehavesentauthnote)
1182 ctl->wehavesentauthnote = 0;
1184 GT_("Authorization OK on %s@%s\n"),
1186 ctl->server.truename);
1187 if (!open_warning_by_mail(ctl, (struct msgblk *)NULL))
1190 GT_("Subject: fetchmail authentication OK on %s@%s\n"),
1191 ctl->remotename, ctl->server.truename);
1193 GT_("Fetchmail was able to log into %s@%s.\n"),
1195 ctl->server.truename);
1197 GT_("Service has been restored.\n"));
1198 close_warning_by_mail(ctl, (struct msgblk *)NULL);
1203 * Reporting only after the first three
1204 * consecutive failures, or ten consecutive
1205 * failures after we have managed to get
1208 ctl->authfailcount = 0;
1212 ctl->errcount = fetches = 0;
1214 /* now iterate over each folder selected */
1215 for (idp = ctl->mailboxes; idp; idp = idp->next)
1222 /* reset timeout, in case we did an IDLE */
1223 mytimeout = ctl->server.timeout;
1225 if (outlevel >= O_DEBUG)
1228 report(stdout, GT_("selecting or re-polling folder %s\n"), idp->id);
1230 report(stdout, GT_("selecting or re-polling default folder\n"));
1233 /* compute # of messages and number of new messages waiting */
1234 stage = STAGE_GETRANGE;
1235 err = (ctl->server.base_protocol->getrange)(mailserver_socket, ctl, idp->id, &count, &new, &bytes);
1239 /* show user how many messages we downloaded */
1241 #ifdef HAVE_SNPRINTF
1242 (void) snprintf(buf, sizeof(buf),
1245 #endif /* HAVE_SNPRINTF */
1246 GT_("%s at %s (folder %s)"),
1247 ctl->remotename, ctl->server.pollname, idp->id);
1249 #ifdef HAVE_SNPRINTF
1250 (void) snprintf(buf, sizeof(buf),
1253 #endif /* HAVE_SNPRINTF */
1255 ctl->remotename, ctl->server.pollname);
1256 if (outlevel > O_SILENT)
1258 if (count == -1) /* only used for ETRN */
1259 report(stdout, GT_("Polling %s\n"), ctl->server.truename);
1260 else if (count != 0)
1262 if (new != -1 && (count - new) > 0)
1263 report_build(stdout, GT_("%d %s (%d seen) for %s"),
1264 count, count > 1 ? GT_("messages") :
1268 report_build(stdout, GT_("%d %s for %s"),
1269 count, count > 1 ? GT_("messages") :
1270 GT_("message"), buf);
1272 report_complete(stdout, ".\n");
1274 report_complete(stdout, GT_(" (%d octets).\n"), bytes);
1278 /* these are pointless in normal daemon mode */
1279 if (pass == 1 && (run.poll_interval == 0 || outlevel >= O_VERBOSE))
1280 report(stdout, GT_("No mail for %s\n"), buf);
1284 /* very important, this is where we leave the do loop */
1290 if (new == -1 || ctl->fetchall)
1292 fetches = new; /* set error status correctly */
1294 * There used to be a `goto noerror' here, but this
1295 * prevented checking of multiple folders. This
1296 * comment is a reminder in case I introduced some
1297 * subtle bug by removing it...
1302 flag force_retrieval;
1306 * What forces this code is that in POP2 and
1307 * IMAP2bis you can't fetch a message without
1308 * having it marked `seen'. In POP3 and IMAP4, on the
1309 * other hand, you can (peek_capable is set by
1310 * each driver module to convey this; it's not a
1311 * method constant because of the difference between
1312 * IMAP2bis and IMAP4, and because POP3 doesn't peek
1313 * if fetchall is on).
1315 * The result of being unable to peek is that if there's
1316 * any kind of transient error (DNS lookup failure, or
1317 * sendmail refusing delivery due to process-table limits)
1318 * the message will be marked "seen" on the server without
1319 * having been delivered. This is not a big problem if
1320 * fetchmail is running in foreground, because the user
1321 * will see a "skipped" message when it next runs and get
1324 * But in daemon mode this leads to the message
1325 * being silently ignored forever. This is not
1328 * We compensate for this by checking the error
1329 * count from the previous pass and forcing all
1330 * messages to be considered new if it's nonzero.
1332 force_retrieval = !peek_capable && (ctl->errcount > 0);
1335 * Don't trust the message count passed by the server.
1336 * Without this check, it might be possible to do a
1337 * DNS-spoofing attack that would pass back a ridiculous
1338 * count, and allocate a malloc area that would overlap
1339 * a portion of the stack.
1341 if (count > INT_MAX/sizeof(int))
1343 report(stderr, GT_("bogus message count!"));
1344 return(PS_PROTOCOL);
1347 /* OK, we're going to gather size info next */
1348 xalloca(msgsizes, int *, sizeof(int) * count);
1349 xalloca(msgcodes, int *, sizeof(int) * count);
1350 for (i = 0; i < count; i++) {
1352 msgcodes[i] = MSGLEN_UNKNOWN;
1356 * We need the size of each message before it's
1357 * loaded in order to pass it to the ESMTP SIZE
1358 * option. If the protocol has a getsizes method,
1359 * we presume this means it doesn't get reliable
1360 * sizes from message fetch responses.
1362 if (proto->getsizes)
1364 stage = STAGE_GETSIZES;
1365 err = (proto->getsizes)(mailserver_socket, count, msgsizes);
1372 for (i = 0; i < count; i++)
1373 bytes += msgsizes[i];
1377 /* mark some messages not to be retrieved */
1378 for (num = 1; num <= count; num++)
1380 if (NUM_NONZERO(ctl->limit) && (msgsizes[num-1] > ctl->limit))
1381 msgcodes[num-1] = MSGLEN_TOOLARGE;
1382 else if (ctl->fetchall || force_retrieval)
1384 else if (ctl->server.base_protocol->is_old && (ctl->server.base_protocol->is_old)(mailserver_socket,ctl,num))
1385 msgcodes[num-1] = MSGLEN_OLD;
1386 /* else if (msgsizes[num-1] == 512)
1387 msgcodes[num-1] = MSGLEN_OLD; (hmh) sample code to skip message */
1390 /* read, forward, and delete messages */
1391 stage = STAGE_FETCH;
1393 /* fetch in lockstep mode */
1394 err = fetch_messages(mailserver_socket, ctl,
1395 count, msgsizes, msgcodes,
1397 &fetches, &dispatches, &deletions);
1401 if (!check_only && ctl->skipped
1402 && run.poll_interval > 0 && !nodetach)
1404 clean_skipped_list(&ctl->skipped);
1405 send_size_warnings(ctl);
1410 * Only re-poll if we either had some actual forwards and
1411 * either allowed deletions and had no errors.
1412 * Otherwise it is far too easy to get into infinite loops.
1414 (dispatches && ctl->server.base_protocol->retry && !ctl->keep && !ctl->errcount);
1418 /* ordinary termination with no errors -- officially log out */
1419 err = (ctl->server.base_protocol->logout_cmd)(mailserver_socket, ctl);
1421 * Hmmmm...arguably this would be incorrect if we had fetches but
1422 * no dispatches (due to oversized messages, etc.)
1425 err = (fetches > 0) ? PS_SUCCESS : PS_NOMAIL;
1426 cleanupSockClose(mailserver_socket);
1430 /* we only get here on error */
1431 if (err != 0 && err != PS_SOCKET && err != PS_REPOLL)
1433 stage = STAGE_LOGOUT;
1434 (ctl->server.base_protocol->logout_cmd)(mailserver_socket, ctl);
1437 /* try to clean up all streams */
1440 if (mailserver_socket != -1) {
1441 cleanupSockClose(mailserver_socket);
1442 mailserver_socket = -1;
1444 /* If there was a connect timeout, the socket should be closed.
1445 * mailserver_socket_temp contains the socket to close.
1447 if (mailserver_socket_temp != -1) {
1448 cleanupSockClose(mailserver_socket_temp);
1449 mailserver_socket_temp = -1;
1453 msg = (const char *)NULL; /* sacrifice to -Wall */
1457 msg = GT_("socket");
1460 msg = GT_("missing or bad RFC822 header");
1466 msg = GT_("client/server synchronization");
1469 msg = GT_("client/server protocol");
1472 msg = GT_("lock busy on server");
1475 msg = GT_("SMTP transaction");
1478 msg = GT_("DNS lookup");
1481 report(stderr, GT_("undefined error\n"));
1484 /* no report on PS_MAXFETCH or PS_UNDEFINED or PS_AUTHFAIL */
1485 if (err==PS_SOCKET || err==PS_SYNTAX
1486 || err==PS_IOERR || err==PS_ERROR || err==PS_PROTOCOL
1487 || err==PS_LOCKBUSY || err==PS_SMTP || err==PS_DNS)
1491 if (phase == FORWARDING_WAIT || phase == LISTENER_WAIT)
1492 stem = GT_("%s error while delivering to SMTP host %s\n");
1494 stem = GT_("%s error while fetching from %s\n");
1495 report(stderr, stem, msg, ctl->server.pollname);
1499 /* execute wrapup command, if any */
1500 if (ctl->postconnect && (err = system(ctl->postconnect)))
1502 report(stderr, GT_("post-connection command failed with status %d\n"), err);
1503 if (err == PS_SUCCESS)
1507 set_timeout(0); /* cancel any pending alarm */
1508 set_signal_handler(SIGALRM, alrmsave);
1509 set_signal_handler(SIGPIPE, pipesave);
1513 int do_protocol(ctl, proto)
1514 /* retrieve messages from server using given protocol method table */
1515 struct query *ctl; /* parsed options with merged-in defaults */
1516 const struct method *proto; /* protocol method table */
1521 if (ctl->server.authenticate == A_KERBEROS_V4)
1523 report(stderr, GT_("Kerberos V4 support not linked.\n"));
1526 #endif /* KERBEROS_V4 */
1529 if (ctl->server.authenticate == A_KERBEROS_V5)
1531 report(stderr, GT_("Kerberos V5 support not linked.\n"));
1534 #endif /* KERBEROS_V5 */
1536 /* lacking methods, there are some options that may fail */
1539 /* check for unsupported options */
1542 GT_("Option --flush is not supported with %s\n"),
1546 else if (ctl->fetchall) {
1548 GT_("Option --all is not supported with %s\n"),
1553 if (!proto->getsizes && NUM_SPECIFIED(ctl->limit))
1556 GT_("Option --limit is not supported with %s\n"),
1562 * If no expunge limit or we do expunges within the driver,
1563 * then just do one session, passing in any fetchlimit.
1565 if (proto->retry || !NUM_SPECIFIED(ctl->expunge))
1566 return(do_session(ctl, proto, NUM_VALUE_OUT(ctl->fetchlimit)));
1568 * There's an expunge limit, and it isn't handled in the driver itself.
1569 * OK; do multiple sessions, each fetching a limited # of messages.
1570 * Stop if the total count of retrieved messages exceeds ctl->fetchlimit
1571 * (if it was nonzero).
1577 int expunge = NUM_VALUE_OUT(ctl->expunge);
1578 int fetchlimit = NUM_VALUE_OUT(ctl->fetchlimit);
1581 if (fetchlimit > 0 && (expunge == 0 || expunge > fetchlimit - totalcount))
1582 expunge = fetchlimit - totalcount;
1583 err = do_session(ctl, proto, expunge);
1584 totalcount += expunge;
1585 if (NUM_SPECIFIED(ctl->fetchlimit) && totalcount >= fetchlimit)
1587 if (err != PS_LOCKBUSY)
1589 else if (lockouts >= MAX_LOCKOUTS)
1591 else /* err == PS_LOCKBUSY */
1594 * Allow time for the server lock to release. if we
1595 * don't do this, we'll often hit a locked-mailbox
1596 * condition and fail.
1602 (err == PS_MAXFETCH || err == PS_LOCKBUSY);
1609 /* driver.c ends here */