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)
19 #if defined(HAVE_UNISTD_H)
22 #if defined(HAVE_SYS_ITIMER_H)
23 #include <sys/itimer.h>
28 #ifdef HAVE_NET_SOCKET_H
29 #include <net/socket.h>
32 #ifdef HAVE_RES_SEARCH
35 #endif /* HAVE_RES_SEARCH */
39 #include <netinet/in.h>
40 #endif /* KERBEROS_V4 */
45 #include "fetchmail.h"
48 /* throw types for runtime errors */
49 #define THROW_TIMEOUT 1 /* server timed out */
50 #define THROW_SIGPIPE 2 /* SIGPIPE on stream socket */
52 /* magic values for the message length array */
53 #define MSGLEN_UNKNOWN 0 /* length unknown (0 is impossible) */
54 #define MSGLEN_INVALID -1 /* length passed back is invalid */
55 #define MSGLEN_TOOLARGE -2 /* message is too large */
56 #define MSGLEN_OLD -3 /* message is old */
58 int pass; /* how many times have we re-polled? */
59 int stage; /* where are we? */
60 int phase; /* where are we, for error-logging purposes? */
61 int batchcount; /* count of messages sent in current batch */
62 flag peek_capable; /* can we peek for better error recovery? */
64 static int timeoutcount; /* count consecutive timeouts */
66 static jmp_buf restart;
68 void set_timeout(int timeleft)
69 /* reset the nonresponse-timeout */
71 #if !defined(__EMX__) && !defined(__BEOS__)
72 struct itimerval ntimeout;
77 ntimeout.it_interval.tv_sec = ntimeout.it_interval.tv_usec = 0;
78 ntimeout.it_value.tv_sec = timeleft;
79 ntimeout.it_value.tv_usec = 0;
80 setitimer(ITIMER_REAL, &ntimeout, (struct itimerval *)NULL);
84 static void timeout_handler (int signal)
85 /* handle SIGALRM signal indicating a server timeout */
88 longjmp(restart, THROW_TIMEOUT);
91 static void sigpipe_handler (int signal)
92 /* handle SIGPIPE signal indicating a broken stream socket */
94 longjmp(restart, THROW_SIGPIPE);
98 static int kerberos_auth(socket, canonical, principal)
99 /* authenticate to the server host using Kerberos V4 */
100 int socket; /* socket to server host */
101 char *canonical; /* server name */
108 Key_schedule schedule;
110 char * prin_copy = (char *) NULL;
111 char * prin = (char *) NULL;
112 char * inst = (char *) NULL;
113 char * realm = (char *) NULL;
115 if (principal != (char *)NULL && *principal)
118 prin = prin_copy = xstrdup(principal);
119 for (cp = prin_copy; *cp && *cp != '.'; ++cp)
125 while (*cp && *cp != '@')
135 xalloca(ticket, KTEXT, sizeof (KTEXT_ST));
136 rem = (krb_sendauth (0L, socket, ticket,
138 inst ? inst : canonical,
139 realm ? realm : ((char *) (krb_realmofhost (canonical))),
144 ((struct sockaddr_in *) 0),
145 ((struct sockaddr_in *) 0),
153 report(stderr, _("kerberos error %s\n"), (krb_get_err_text (rem)));
154 return (PS_AUTHFAIL);
158 #endif /* KERBEROS_V4 */
161 static int kerberos5_auth(socket, canonical)
162 /* authenticate to the server host using Kerberos V5 */
163 int socket; /* socket to server host */
164 const char *canonical; /* server name */
166 krb5_error_code retval;
167 krb5_context context;
169 krb5_principal client = NULL, server = NULL;
170 krb5_error *err_ret = NULL;
172 krb5_auth_context auth_context = NULL;
174 krb5_init_context(&context);
175 krb5_init_ets(context);
176 krb5_auth_con_init(context, &auth_context);
178 if (retval = krb5_cc_default(context, &ccdef)) {
179 report(stderr, "krb5_cc_default: %s\n", error_message(retval));
183 if (retval = krb5_cc_get_principal(context, ccdef, &client)) {
184 report(stderr, "krb5_cc_get_principal: %s\n", error_message(retval));
188 if (retval = krb5_sname_to_principal(context, canonical, "pop",
191 report(stderr, "krb5_sname_to_principal: %s\n", error_message(retval));
195 retval = krb5_sendauth(context, &auth_context, (krb5_pointer) &socket,
196 "KPOPV1.0", client, server,
197 AP_OPTS_MUTUAL_REQUIRED,
198 NULL, /* no data to checksum */
199 0, /* no creds, use ccache instead */
203 NULL); /* don't need reply */
205 krb5_free_principal(context, server);
206 krb5_free_principal(context, client);
207 krb5_auth_con_free(context, auth_context);
211 if (err_ret && err_ret->e_text) {
212 report(stderr, _("krb5_sendauth: %s [server says '%*s'] \n"),
213 error_message(retval),
216 if (err_ret && err_ret->text.length) {
217 report(stderr, _("krb5_sendauth: %s [server says '%*s'] \n"),
218 error_message(retval),
219 err_ret->text.length,
222 krb5_free_error(context, err_ret);
224 report(stderr, "krb5_sendauth: %s\n", error_message(retval));
230 #endif /* KERBEROS_V5 */
232 static void clean_skipped_list(struct idlist **skipped_list)
233 /* struct "idlist" contains no "prev" ptr; we must remove unused items first */
235 struct idlist *current=NULL, *prev=NULL, *tmp=NULL, *head=NULL;
236 prev = current = head = *skipped_list;
242 /* if item has no reference, remove it */
243 if (current && current->val.status.mark == 0)
245 if (current == head) /* remove first item (head) */
247 head = current->next;
248 if (current->id) free(current->id);
250 prev = current = head;
252 else /* remove middle/last item */
256 if (current->id) free(current->id);
261 else /* skip this item */
264 current = current->next;
268 *skipped_list = head;
271 static void send_size_warnings(struct query *ctl)
272 /* send warning mail with skipped msg; reset msg count when user notified */
275 int msg_to_send = FALSE;
276 struct idlist *head=NULL, *current=NULL;
277 int max_warning_poll_count;
283 /* don't start a notification message unless we need to */
284 for (current = head; current; current = current->next)
285 if (current->val.status.num == 0 && current->val.status.mark)
291 * There's no good way to recover if we can't send notification mail,
292 * but it's not a disaster, either, since the skipped mail will not
295 if (open_warning_by_mail(ctl, (struct msgblk *)NULL))
298 _("Subject: Fetchmail oversized-messages warning.\r\n"
300 "The following oversized messages remain on the mail server %s:"),
301 ctl->server.pollname);
303 if (run.poll_interval == 0)
304 max_warning_poll_count = 0;
306 max_warning_poll_count = ctl->warnings/run.poll_interval;
308 /* parse list of skipped msg, adding items to the mail */
309 for (current = head; current; current = current->next)
311 if (current->val.status.num == 0 && current->val.status.mark)
313 nbr = current->val.status.mark;
314 size = atoi(current->id);
316 _("\t%d msg %d octets long skipped by fetchmail.\r\n"),
319 current->val.status.num++;
320 current->val.status.mark = 0;
322 if (current->val.status.num >= max_warning_poll_count)
323 current->val.status.num = 0;
326 close_warning_by_mail(ctl, (struct msgblk *)NULL);
329 static void mark_oversized(struct query *ctl, int num, int size)
330 /* mark a message oversized */
332 struct idlist *current=NULL, *tmp=NULL;
336 /* convert size to string */
338 snprintf(sizestr, sizeof(sizestr),
341 #endif /* HAVE_SNPRINTF */
344 /* build a list of skipped messages
345 * val.id = size of msg (string cnvt)
346 * val.status.num = warning_poll_count
347 * val.status.mask = nbr of msg this size
350 current = ctl->skipped;
352 /* initialise warning_poll_count to the
353 * current value so that all new msg will
354 * be included in the next mail
356 cnt = current ? current->val.status.num : 0;
358 /* if entry exists, increment the count */
359 if (current && str_in_list(¤t, sizestr, FALSE))
361 for ( ; current; current = current->next)
363 if (strcmp(current->id, sizestr) == 0)
365 current->val.status.mark++;
370 /* otherwise, create a new entry */
371 /* initialise with current poll count */
374 tmp = save_str(&ctl->skipped, sizestr, 1);
375 tmp->val.status.num = cnt;
379 static int fetch_messages(int mailserver_socket, struct query *ctl,
380 int count, int *msgsizes, int *msgcodes, int maxfetch,
381 int *fetches, int *dispatches, int *deletions)
382 /* fetch messages in lockstep mode */
386 for (num = 1; num <= count; num++)
388 flag suppress_delete = FALSE;
389 flag suppress_forward = FALSE;
390 flag suppress_readbody = FALSE;
391 flag retained = FALSE;
393 if (msgcodes[num-1] < 0)
395 if ((msgcodes[num-1] == MSGLEN_TOOLARGE) && !check_only)
396 mark_oversized(ctl, num, msgsizes[num-1]);
397 if (outlevel > O_SILENT)
400 _("skipping message %d (%d octets)"),
401 num, msgsizes[num-1]);
402 switch (msgcodes[num-1])
406 * Invalid lengths are produced by Post Office/NT's
407 * annoying habit of randomly prepending bogus
408 * LIST items of length -1. Patrick Audley
409 * <paudley@pobox.com> tells us: LIST shows a
410 * size of -1, RETR and TOP return "-ERR
411 * System error - couldn't open message", and
412 * DELE succeeds but doesn't actually delete
415 report_build(stdout, _(" (length -1)"));
417 case MSGLEN_TOOLARGE:
419 _(" (oversized, %d octets)"),
427 flag wholesize = !ctl->server.base_protocol->fetch_body;
429 /* request a message */
430 err = (ctl->server.base_protocol->fetch_headers)(mailserver_socket,ctl,num, &len);
431 if (err == PS_TRANSIENT) /* server is probably Exchange */
434 _("couldn't fetch headers, msg %d (%d octets)"),
435 num, msgsizes[num-1]);
441 /* -1 means we didn't see a size in the response */
444 len = msgsizes[num - 1];
448 if (outlevel > O_SILENT)
450 report_build(stdout, _("reading message %d of %d"),
454 report_build(stdout, _(" (%d %soctets)"),
455 len, wholesize ? "" : _("header "));
456 if (outlevel >= O_VERBOSE)
457 report_complete(stdout, "\n");
459 report_complete(stdout, " ");
463 * Read the message headers and ship them to the
466 err = readheaders(mailserver_socket, len, msgsizes[num-1],
468 if (err == PS_RETAINED)
469 suppress_forward = retained = TRUE;
470 else if (err == PS_TRANSIENT)
471 suppress_delete = suppress_forward = TRUE;
472 else if (err == PS_REFUSED)
473 suppress_forward = TRUE;
474 else if (err == PS_TRUNCATED)
475 suppress_readbody = TRUE;
480 * If we're using IMAP4 or something else that
481 * can fetch headers separately from bodies,
482 * it's time to request the body now. This
483 * fetch may be skipped if we got an anti-spam
484 * or other PS_REFUSED error response during
487 if (ctl->server.base_protocol->fetch_body && !suppress_readbody)
489 if (outlevel >= O_VERBOSE && !isafile(1))
495 if ((err = (ctl->server.base_protocol->trail)(mailserver_socket, ctl, num)))
498 if (!suppress_forward)
500 if ((err=(ctl->server.base_protocol->fetch_body)(mailserver_socket,ctl,num,&len)))
503 * Work around a bug in Novell's
504 * broken GroupWise IMAP server;
505 * its body FETCH response is missing
506 * the required length for the data
507 * string. This violates RFC2060.
510 len = msgsizes[num-1] - msgblk.msglen;
511 if (outlevel > O_SILENT && !wholesize)
512 report_complete(stdout,
513 _(" (%d body octets) "), len);
517 /* process the body now */
520 if (suppress_readbody)
522 /* When readheaders returns PS_TRUNCATED,
523 * the body (which has no content)
524 * has already been read by readheaders,
525 * so we say readbody returned PS_SUCCESS
531 err = readbody(mailserver_socket,
536 if (err == PS_TRANSIENT)
537 suppress_delete = suppress_forward = TRUE;
541 /* tell server we got it OK and resynchronize */
542 if (ctl->server.base_protocol->trail)
544 if (outlevel >= O_VERBOSE && !isafile(1))
550 err = (ctl->server.base_protocol->trail)(mailserver_socket, ctl, num);
556 /* count # messages forwarded on this pass */
557 if (!suppress_forward)
561 * Check to see if the numbers matched?
563 * Yes, some servers foo this up horribly.
564 * All IMAP servers seem to get it right, and
565 * so does Eudora QPOP at least in 2.xx
568 * Microsoft Exchange gets it completely
569 * wrong, reporting compressed rather than
570 * actual sizes (so the actual length of
571 * message is longer than the reported size).
572 * Another fine example of Microsoft brain death!
574 * Some older POP servers, like the old UCB
575 * POP server and the pre-QPOP QUALCOMM
576 * versions, report a longer size in the LIST
577 * response than actually gets shipped up.
578 * It's unclear what is going on here, as the
579 * QUALCOMM server (at least) seems to be
580 * reporting the on-disk size correctly.
582 if (msgblk.msglen != msgsizes[num-1])
584 if (outlevel >= O_DEBUG)
586 _("message %d was not the expected length (%d actual != %d expected)\n"),
587 num, msgblk.msglen, msgsizes[num-1]);
590 /* end-of-message processing starts here */
591 if (!close_sink(ctl, &msgblk, !suppress_forward))
594 suppress_delete = TRUE;
600 * At this point in flow of control, either
601 * we've bombed on a protocol error or had
602 * delivery refused by the SMTP server
603 * (unlikely -- I've never seen it) or we've
604 * seen `accepted for delivery' and the
605 * message is shipped. It's safe to mark the
606 * message seen and delete it on the server
610 /* tell the UID code we've seen this */
615 for (sdp = ctl->newsaved; sdp; sdp = sdp->next)
616 if ((sdp->val.status.num == num) && (msgcodes[num-1] >= 0))
618 sdp->val.status.mark = UID_SEEN;
619 save_str(&ctl->oldsaved, sdp->id,UID_SEEN);
623 /* maybe we delete this message now? */
626 if (outlevel > O_SILENT)
627 report(stdout, _(" retained\n"));
629 else if (ctl->server.base_protocol->delete
631 && ((msgcodes[num-1] >= 0) ? !ctl->keep : ctl->flush))
634 if (outlevel > O_SILENT)
635 report_complete(stdout, _(" flushed\n"));
636 err = (ctl->server.base_protocol->delete)(mailserver_socket, ctl, num);
640 delete_str(&ctl->newsaved, num);
641 #endif /* POP3_ENABLE */
643 else if (outlevel > O_SILENT)
644 report_complete(stdout, _(" not flushed\n"));
646 /* perhaps this as many as we're ready to handle */
647 if (maxfetch && maxfetch <= *fetches && *fetches < count)
649 report(stdout, _("fetchlimit %d reached; %d messages left on server\n"),
650 maxfetch, count - *fetches);
658 static int do_session(ctl, proto, maxfetch)
659 /* retrieve messages from server using given protocol method table */
660 struct query *ctl; /* parsed options with merged-in defaults */
661 const struct method *proto; /* protocol method table */
662 const int maxfetch; /* maximum number of messages to fetch */
666 volatile int err, mailserver_socket = -1; /* pacifies -Wall */
668 int err, mailserver_socket = -1;
669 #endif /* HAVE_VOLATILE */
671 void (*pipesave)(int);
672 void (*alrmsave)(int);
674 ctl->server.base_protocol = proto;
678 init_transact(proto);
680 /* set up the server-nonresponse timeout */
681 alrmsave = signal(SIGALRM, timeout_handler);
682 mytimeout = ctl->server.timeout;
684 /* set up the broken-pipe timeout */
685 pipesave = signal(SIGPIPE, sigpipe_handler);
687 if ((js = setjmp(restart)))
689 #ifdef HAVE_SIGPROCMASK
691 * Don't rely on setjmp() to restore the blocked-signal mask.
692 * It does this under BSD but is required not to under POSIX.
694 * If your Unix doesn't have sigprocmask, better hope it has
695 * BSD-like behavior. Otherwise you may see fetchmail get
696 * permanently wedged after a second timeout on a bad read,
697 * because alarm signals were blocked after the first.
701 sigfillset(&allsigs);
702 sigprocmask(SIG_UNBLOCK, &allsigs, NULL);
703 #endif /* HAVE_SIGPROCMASK */
705 if (js == THROW_SIGPIPE)
707 signal(SIGPIPE, SIG_IGN);
709 _("SIGPIPE thrown from an MDA or a stream socket error\n"));
713 else if (js == THROW_TIMEOUT)
715 if (phase == OPEN_WAIT)
717 _("timeout after %d seconds waiting to connect to server %s.\n"),
718 ctl->server.timeout, ctl->server.pollname);
719 else if (phase == SERVER_WAIT)
721 _("timeout after %d seconds waiting for server %s.\n"),
722 ctl->server.timeout, ctl->server.pollname);
723 else if (phase == FORWARDING_WAIT)
725 _("timeout after %d seconds waiting for %s.\n"),
727 ctl->mda ? "MDA" : "SMTP");
728 else if (phase == LISTENER_WAIT)
730 _("timeout after %d seconds waiting for listener to respond.\n"), ctl->server.timeout);
733 _("timeout after %d seconds.\n"), ctl->server.timeout);
736 * If we've exceeded our threshold for consecutive timeouts,
737 * try to notify the user, then mark the connection wedged.
738 * Don't do this if the connection can idle, though; idle
739 * timeouts just mean the frequency of mail is low.
741 if (timeoutcount > MAX_TIMEOUTS
742 && !open_warning_by_mail(ctl, (struct msgblk *)NULL))
745 _("Subject: fetchmail sees repeated timeouts\r\n"));
747 _("Fetchmail saw more than %d timeouts while attempting to get mail from %s@%s.\r\n"),
750 ctl->server.truename);
752 _("This could mean that your mailserver is stuck, or that your SMTP\r\n" \
753 "server is wedged, or that your mailbox file on the server has been\r\n" \
754 "corrupted by a server error. You can run `fetchmail -v -v' to\r\n" \
755 "diagnose the problem.\r\n\r\n" \
756 "Fetchmail won't poll this mailbox again until you restart it.\r\n"));
757 close_warning_by_mail(ctl, (struct msgblk *)NULL);
764 /* try to clean up all streams */
766 if (ctl->smtp_socket != -1)
767 SockClose(ctl->smtp_socket);
768 if (mailserver_socket != -1)
769 SockClose(mailserver_socket);
773 char buf[MSGBUFSIZE+1], *realhost;
774 int count, new, bytes, deletions = 0;
775 int *msgsizes = (int *)NULL;
776 int *msgcodes = (int *)NULL;
778 int fetches, dispatches, oldphase;
779 #else /* INET6_ENABLE */
780 int port, fetches, dispatches, oldphase;
781 #endif /* INET6_ENABLE */
784 /* execute pre-initialization command, if any */
785 if (ctl->preconnect && (err = system(ctl->preconnect)))
788 _("pre-connection command failed with status %d\n"), err);
793 /* open a socket to the mail server */
796 set_timeout(mytimeout);
799 port = ctl->server.port ? ctl->server.port : ( ctl->use_ssl ? ctl->server.base_protocol->sslport : ctl->server.base_protocol->port );
801 port = ctl->server.port ? ctl->server.port : ctl->server.base_protocol->port;
803 #endif /* !INET6_ENABLE */
804 realhost = ctl->server.via ? ctl->server.via : ctl->server.pollname;
806 /* allow time for the port to be set up if we have a plugin */
807 if (ctl->server.plugin)
810 if ((mailserver_socket = SockOpen(realhost,
811 ctl->server.service ? ctl->server.service : ( ctl->use_ssl ? ctl->server.base_protocol->sslservice : ctl->server.base_protocol->service ),
812 ctl->server.netsec, ctl->server.plugin)) == -1)
813 #else /* INET6_ENABLE */
814 if ((mailserver_socket = SockOpen(realhost, port, NULL, ctl->server.plugin)) == -1)
815 #endif /* INET6_ENABLE */
820 #ifdef HAVE_RES_SEARCH
821 if (err_no != 0 && h_errno != 0)
822 report(stderr, _("internal inconsistency\n"));
825 * Avoid generating a bogus error every poll cycle when we're
826 * in daemon mode but the connection to the outside world
829 if (!((err_no == EHOSTUNREACH || err_no == ENETUNREACH)
830 && run.poll_interval))
832 report_build(stderr, _("%s connection to %s failed"),
833 ctl->server.base_protocol->name, ctl->server.pollname);
834 #ifdef HAVE_RES_SEARCH
837 if (h_errno == HOST_NOT_FOUND)
838 strcpy(errbuf, _("host is unknown."));
840 else if (h_errno == NO_ADDRESS)
841 strcpy(errbuf, _("name is valid but has no IP address."));
843 else if (h_errno == NO_RECOVERY)
844 strcpy(errbuf, _("unrecoverable name server error."));
845 else if (h_errno == TRY_AGAIN)
846 strcpy(errbuf, _("temporary name server error."));
849 snprintf(errbuf, sizeof(errbuf),
852 #endif /* HAVE_SNPRINTF */
853 _("unknown DNS error %d."), h_errno);
856 #endif /* HAVE_RES_SEARCH */
857 strcpy(errbuf, strerror(err_no));
858 report_complete(stderr, ": %s\n", errbuf);
862 * Don't use this. It was an attempt to address Debian bug
863 * #47143 (Notify user by mail when pop server nonexistent).
864 * Trouble is, that doesn't work; you trip over the case
865 * where your SLIP or PPP link is down...
867 /* warn the system administrator */
868 if (open_warning_by_mail(ctl, (struct msgblk *)NULL) == 0)
871 _("Subject: Fetchmail unreachable-server warning.\r\n"
873 "Fetchmail could not reach the mail server %s:")
874 ctl->server.pollname);
875 stuff_warning(ctl, errbuf, ctl->server.pollname);
876 close_warning_by_mail(ctl, (struct msgblk *)NULL);
880 #endif /* INET6_ENABLE */
890 /* perform initial SSL handshake on open connection */
891 /* Note: We pass the realhost name over for certificate
892 verification. We may want to make this configurable */
893 if (ctl->use_ssl && SSLOpen(mailserver_socket,ctl->sslkey,ctl->sslcert,ctl->sslproto,ctl->sslcertck,
894 ctl->sslcertpath,ctl->sslfingerprint,realhost,ctl->server.pollname) == -1)
896 report(stderr, _("SSL connection failed.\n"));
902 if (ctl->server.authenticate == A_KERBEROS_V4)
904 set_timeout(mytimeout);
905 err = kerberos_auth(mailserver_socket, ctl->server.truename,
906 ctl->server.principal);
911 #endif /* KERBEROS_V4 */
914 if (ctl->server.authenticate == A_KERBEROS_V5)
916 set_timeout(mytimeout);
917 err = kerberos5_auth(mailserver_socket, ctl->server.truename);
922 #endif /* KERBEROS_V5 */
924 /* accept greeting message from mail server */
925 err = (ctl->server.base_protocol->parse_response)(mailserver_socket, buf);
929 /* try to get authorized to fetch mail */
930 stage = STAGE_GETAUTH;
931 if (ctl->server.base_protocol->getauth)
933 err = (ctl->server.base_protocol->getauth)(mailserver_socket, ctl, buf);
937 if (err == PS_LOCKBUSY)
938 report(stderr, _("Lock-busy error on %s@%s\n"),
940 ctl->server.truename);
941 else if (err == PS_SERVBUSY)
942 report(stderr, _("Server busy error on %s@%s\n"),
944 ctl->server.truename);
945 else if (err == PS_AUTHFAIL)
947 report(stderr, _("Authorization failure on %s@%s%s\n"),
949 ctl->server.truename,
950 (ctl->wehaveauthed ? _(" (previously authorized)") : "")
954 * If we're running in background, try to mail the
955 * calling user a heads-up about the authentication
956 * failure once it looks like this isn't a fluke
957 * due to the server being temporarily inaccessible.
958 * When we get third succesive failure, we notify the user
959 * but only if we haven't already managed to get
960 * authorization. After that, once we get authorization
961 * we let the user know service is restored.
963 if (run.poll_interval
964 && ctl->wehavesentauthnote
965 && ((ctl->wehaveauthed && ++ctl->authfailcount == 10)
966 || ++ctl->authfailcount == 3)
967 && !open_warning_by_mail(ctl, (struct msgblk *)NULL))
969 ctl->wehavesentauthnote = 1;
971 _("Subject: fetchmail authentication failed on %s@%s\r\n"),
972 ctl->remotename, ctl->server.truename);
974 _("Fetchmail could not get mail from %s@%s.\r\n"),
976 ctl->server.truename);
977 if (ctl->wehaveauthed)
978 stuff_warning(ctl, _("\
979 The attempt to get authorization failed.\r\n\
980 Since we have already succeeded in getting authorization for this\r\n\
981 connection, this is probably another failure mode (such as busy server)\r\n\
982 that fetchmail cannot distinguish because the server didn't send a useful\r\n\
985 However, if you HAVE changed you account details since starting the\r\n\
986 fetchmail daemon, you need to stop the daemon, change your configuration\r\n\
987 of fetchmail, and then restart the daemon.\r\n\
989 The fetchmail daemon will continue running and attempt to connect\r\n\
990 at each cycle. No future notifications will be sent until service\r\n\
993 stuff_warning(ctl, _("\
994 The attempt to get authorization failed.\r\n\
995 This probably means your password is invalid, but some servers have\r\n\
996 other failure modes that fetchmail cannot distinguish from this\r\n\
997 because they don't send useful error messages on login failure.\r\n\
999 The fetchmail daemon will continue running and attempt to connect\r\n\
1000 at each cycle. No future notifications will be sent until service\r\n\
1002 close_warning_by_mail(ctl, (struct msgblk *)NULL);
1006 report(stderr, _("Unknown login or authentication error on %s@%s\n"),
1008 ctl->server.truename);
1015 * This connection has given us authorization at least once.
1017 * There are dodgy server (clubinternet.fr for example) that
1018 * give spurious authorization failures on patently good
1019 * account/password details, then 5 minutes later let you in!
1021 * This is meant to build in some tolerance of such nasty bits
1024 ctl->wehaveauthed = 1;
1025 /*if (ctl->authfailcount >= 3)*/
1026 if (ctl->wehavesentauthnote)
1028 ctl->wehavesentauthnote = 0;
1030 _("Authorization OK on %s@%s\n"),
1032 ctl->server.truename);
1033 if (!open_warning_by_mail(ctl, (struct msgblk *)NULL))
1036 _("Subject: fetchmail authentication OK on %s@%s\r\n"),
1037 ctl->remotename, ctl->server.truename);
1039 _("Fetchmail was able to log into %s@%s.\r\n"),
1041 ctl->server.truename);
1043 _("Service has been restored.\r\n"));
1044 close_warning_by_mail(ctl, (struct msgblk *)NULL);
1049 * Reporting only after the first three
1050 * consecutive failures, or ten consecutive
1051 * failures after we have managed to get
1054 ctl->authfailcount = 0;
1058 ctl->errcount = fetches = 0;
1060 /* now iterate over each folder selected */
1061 for (idp = ctl->mailboxes; idp; idp = idp->next)
1068 /* reset timeout, in case we did an IDLE */
1069 mytimeout = ctl->server.timeout;
1071 if (outlevel >= O_DEBUG)
1074 report(stdout, _("selecting or re-polling folder %s\n"), idp->id);
1076 report(stdout, _("selecting or re-polling default folder\n"));
1079 /* compute # of messages and number of new messages waiting */
1080 stage = STAGE_GETRANGE;
1081 err = (ctl->server.base_protocol->getrange)(mailserver_socket, ctl, idp->id, &count, &new, &bytes);
1085 /* show user how many messages we downloaded */
1087 #ifdef HAVE_SNPRINTF
1088 (void) snprintf(buf, sizeof(buf),
1091 #endif /* HAVE_SNPRINTF */
1092 _("%s at %s (folder %s)"),
1093 ctl->remotename, ctl->server.truename, idp->id);
1095 #ifdef HAVE_SNPRINTF
1096 (void) snprintf(buf, sizeof(buf),
1099 #endif /* HAVE_SNPRINTF */
1101 ctl->remotename, ctl->server.truename);
1102 if (outlevel > O_SILENT)
1104 if (count == -1) /* only used for ETRN */
1105 report(stdout, _("Polling %s\n"), ctl->server.truename);
1106 else if (count != 0)
1108 if (new != -1 && (count - new) > 0)
1109 report_build(stdout, _("%d %s (%d seen) for %s"),
1110 count, count > 1 ? _("messages") :
1114 report_build(stdout, _("%d %s for %s"),
1115 count, count > 1 ? _("messages") :
1118 report_complete(stdout, ".\n");
1120 report_complete(stdout, _(" (%d octets).\n"), bytes);
1124 /* these are pointless in normal daemon mode */
1125 if (pass == 1 && (run.poll_interval == 0 || outlevel >= O_VERBOSE))
1126 report(stdout, _("No mail for %s\n"), buf);
1130 /* very important, this is where we leave the do loop */
1136 if (new == -1 || ctl->fetchall)
1138 fetches = new; /* set error status correctly */
1140 * There used to be a `goto noerror' here, but this
1141 * prevneted checking of multiple folders. This
1142 * comment is a reminder in case I introduced some
1143 * subtle bug by removing it...
1148 flag force_retrieval;
1152 * What forces this code is that in POP2 and
1153 * IMAP2bis you can't fetch a message without
1154 * having it marked `seen'. In POP3 and IMAP4, on the
1155 * other hand, you can (peek_capable is set by
1156 * each driver module to convey this; it's not a
1157 * method constant because of the difference between
1158 * IMAP2bis and IMAP4, and because POP3 doesn't peek
1159 * if fetchall is on).
1161 * The result of being unable to peek is that if there's
1162 * any kind of transient error (DNS lookup failure, or
1163 * sendmail refusing delivery due to process-table limits)
1164 * the message will be marked "seen" on the server without
1165 * having been delivered. This is not a big problem if
1166 * fetchmail is running in foreground, because the user
1167 * will see a "skipped" message when it next runs and get
1170 * But in daemon mode this leads to the message
1171 * being silently ignored forever. This is not
1174 * We compensate for this by checking the error
1175 * count from the previous pass and forcing all
1176 * messages to be considered new if it's nonzero.
1178 force_retrieval = !peek_capable && (ctl->errcount > 0);
1180 /* OK, we're going to gather size info next */
1181 xalloca(msgsizes, int *, sizeof(int) * count);
1182 xalloca(msgcodes, int *, sizeof(int) * count);
1183 for (i = 0; i < count; i++)
1184 msgcodes[i] = MSGLEN_UNKNOWN;
1187 * We need the size of each message before it's
1188 * loaded in order to pass it to the ESMTP SIZE
1189 * option. If the protocol has a getsizes method,
1190 * we presume this means it doesn't get reliable
1191 * sizes from message fetch responses.
1193 if (proto->getsizes)
1195 stage = STAGE_GETSIZES;
1196 err = (proto->getsizes)(mailserver_socket, count, msgsizes);
1203 for (i = 0; i < count; i++)
1204 bytes += msgsizes[i];
1208 /* mark some messages not to be retrieved */
1209 for (num = 1; num <= count; num++)
1211 if (NUM_NONZERO(ctl->limit) && (msgsizes[num-1] > ctl->limit))
1212 msgcodes[num-1] = MSGLEN_TOOLARGE;
1213 else if (ctl->fetchall || force_retrieval)
1215 else if (ctl->server.base_protocol->is_old && (ctl->server.base_protocol->is_old)(mailserver_socket,ctl,num))
1216 msgcodes[num-1] = MSGLEN_OLD;
1219 /* read, forward, and delete messages */
1220 stage = STAGE_FETCH;
1222 /* fetch in lockstep mode */
1223 err = fetch_messages(mailserver_socket, ctl,
1224 count, msgsizes, msgcodes,
1226 &fetches, &dispatches, &deletions);
1230 if (!check_only && ctl->skipped
1231 && run.poll_interval > 0 && !nodetach)
1233 clean_skipped_list(&ctl->skipped);
1234 send_size_warnings(ctl);
1239 * Only re-poll if we either had some actual forwards and
1240 * either allowed deletions and had no errors.
1241 * Otherwise it is far too easy to get into infinite loops.
1243 (dispatches && ctl->server.base_protocol->retry && !ctl->keep && !ctl->errcount);
1247 /* ordinary termination with no errors -- officially log out */
1248 err = (ctl->server.base_protocol->logout_cmd)(mailserver_socket, ctl);
1250 * Hmmmm...arguably this would be incorrect if we had fetches but
1251 * no dispatches (due to oversized messages, etc.)
1254 err = (fetches > 0) ? PS_SUCCESS : PS_NOMAIL;
1255 SockClose(mailserver_socket);
1259 /* we only get here on error */
1260 if (err != 0 && err != PS_SOCKET)
1262 stage = STAGE_LOGOUT;
1263 (ctl->server.base_protocol->logout_cmd)(mailserver_socket, ctl);
1265 SockClose(mailserver_socket);
1268 msg = (const char *)NULL; /* sacrifice to -Wall */
1275 msg = _("missing or bad RFC822 header");
1281 msg = _("client/server synchronization");
1284 msg = _("client/server protocol");
1287 msg = _("lock busy on server");
1290 msg = _("SMTP transaction");
1293 msg = _("DNS lookup");
1296 report(stderr, _("undefined error\n"));
1299 /* no report on PS_MAXFETCH or PS_UNDEFINED or PS_AUTHFAIL */
1300 if (err==PS_SOCKET || err==PS_SYNTAX
1301 || err==PS_IOERR || err==PS_ERROR || err==PS_PROTOCOL
1302 || err==PS_LOCKBUSY || err==PS_SMTP || err==PS_DNS)
1306 if (phase == FORWARDING_WAIT || phase == LISTENER_WAIT)
1307 stem = _("%s error while delivering to SMTP host %s\n");
1309 stem = _("%s error while fetching from %s\n");
1310 report(stderr, stem, msg, ctl->server.pollname);
1314 /* execute wrapup command, if any */
1315 if (ctl->postconnect && (err = system(ctl->postconnect)))
1317 report(stderr, _("post-connection command failed with status %d\n"), err);
1318 if (err == PS_SUCCESS)
1322 signal(SIGALRM, alrmsave);
1323 signal(SIGPIPE, pipesave);
1327 int do_protocol(ctl, proto)
1328 /* retrieve messages from server using given protocol method table */
1329 struct query *ctl; /* parsed options with merged-in defaults */
1330 const struct method *proto; /* protocol method table */
1335 if (ctl->server.authenticate == A_KERBEROS_V4)
1337 report(stderr, _("Kerberos V4 support not linked.\n"));
1340 #endif /* KERBEROS_V4 */
1343 if (ctl->server.authenticate == A_KERBEROS_V5)
1345 report(stderr, _("Kerberos V5 support not linked.\n"));
1348 #endif /* KERBEROS_V5 */
1350 /* lacking methods, there are some options that may fail */
1353 /* check for unsupported options */
1356 _("Option --flush is not supported with %s\n"),
1360 else if (ctl->fetchall) {
1362 _("Option --all is not supported with %s\n"),
1367 if (!proto->getsizes && NUM_SPECIFIED(ctl->limit))
1370 _("Option --limit is not supported with %s\n"),
1376 * If no expunge limit or we do expunges within the driver,
1377 * then just do one session, passing in any fetchlimit.
1379 if (proto->retry || !NUM_SPECIFIED(ctl->expunge))
1380 return(do_session(ctl, proto, NUM_VALUE_OUT(ctl->fetchlimit)));
1382 * There's an expunge limit, and it isn't handled in the driver itself.
1383 * OK; do multiple sessions, each fetching a limited # of messages.
1384 * Stop if the total count of retrieved messages exceeds ctl->fetchlimit
1385 * (if it was nonzero).
1391 int expunge = NUM_VALUE_OUT(ctl->expunge);
1392 int fetchlimit = NUM_VALUE_OUT(ctl->fetchlimit);
1395 if (fetchlimit > 0 && (expunge == 0 || expunge > fetchlimit - totalcount))
1396 expunge = fetchlimit - totalcount;
1397 err = do_session(ctl, proto, expunge);
1398 totalcount += expunge;
1399 if (NUM_SPECIFIED(ctl->fetchlimit) && totalcount >= fetchlimit)
1401 if (err != PS_LOCKBUSY)
1403 else if (lockouts >= MAX_LOCKOUTS)
1405 else /* err == PS_LOCKBUSY */
1408 * Allow time for the server lock to release. if we
1409 * don't do this, we'll often hit a locked-mailbox
1410 * condition and fail.
1416 (err == PS_MAXFETCH || err == PS_LOCKBUSY);
1423 /* driver.c ends here */