Modified the rcfile definition to add retrieve-error.
Allow retrieve-error policy to be set via commandline option --retrieve-error.
stringdump("smtpaddress", ctl->smtpaddress);
stringdump("smtpname", ctl->smtpname);
- if (ctl->retrieveerrormode == RE_ABORT)
- stringdump("retrieve-error", "abort");
- else {
- indent('\0');
- fprintf(stdout, "'retrieve-error':'");
- if (ctl->retrieveerrormode & RE_SKIP_MASK)
- fputs("skip,", stdout);
- if (ctl->retrieveerrormode & RE_MARK_SEEN_MASK)
- fputs("markseen", stdout);
- fputs("',\n", stdout);
- }
+ switch (ctl->retrieveerror) {
+ case REABORT:
+ stringdump("retrieve-error", "abort"); break;
+ case RECONTINUE:
+ stringdump("retrieve-error", "continue"); break;
+ case REMARKSEEN:
+ stringdump("retrieve-error", "markseen"); break;
+ }
indent('\0');
fprintf(stdout, "'antispam':'");
{
len = -1;
if ((err=(ctl->server.base_protocol->fetch_body)(mailserver_socket,ctl,num,&len))) {
- if (err == PS_ERROR && ctl->retrieveerrormode) {
+ if (err == PS_ERROR && ctl->retrieveerror) {
/*
* Mark a message with a protocol error as seen.
* This can be used to see which messages we've attempted
* to download, but failed.
*/
- if (ctl->retrieveerrormode & RE_MARK_SEEN_MASK) {
+ if (ctl->retrieveerror == REMARKSEEN) {
if ((ctl->server.base_protocol->mark_seen)(mailserver_socket,ctl,num)) {
return(err);
}
}
- if (ctl->retrieveerrormode & RE_SKIP_MASK) {
+ if (ctl->retrieveerror != REABORT) {
/*
* Do not abort download session. Continue with the next message.
*
FLAG_MERGE(fetchsizelimit);
FLAG_MERGE(fastuidl);
FLAG_MERGE(batchlimit);
- FLAG_MERGE(retrieveerrormode);
+ FLAG_MERGE(retrieveerror);
#ifdef SSL_ENABLE
FLAG_MERGE(use_ssl);
FLAG_MERGE(sslkey);
#define O_DEBUG 3 /* prolix */
#define O_MONITOR O_VERBOSE
-/* Message retrieval error mode */
-#define RE_ABORT 0 /* abort session */
-#define RE_SKIP_MASK 1 /* skip the message, continue session */
-#define RE_MARK_SEEN_MASK 2 /* mark the message as seen */
-
#define SIZETICKER 1024 /* print 1 dot per this many bytes */
/*
*/
#define WKA_TOP (1L << 0) /* Maillennium TOP -> RETR override warning */
+/* Message retrieval error mode */
+enum retrieveerror { REABORT = 0, RECONTINUE, REMARKSEEN };
+
struct query
{
/* mailserver connection controls */
int fastuidlcount; /* internal count for frequency of binary search */
int batchlimit; /* max # msgs to pass in single SMTP session */
int expunge; /* max # msgs to pass between expunges */
- flag retrieveerrormode; /** behaviour when a server error is encountered while reading a message
- (abort|skip|markseen) -default behaviour is abort */
+ enum retrieveerror retrieveerror; /* retrieve-error (abort|continue|markseen) */
flag use_ssl; /* use SSL encrypted session */
char *sslkey; /* optional SSL private key file */
char *sslcert; /* optional SSL certificate file */
break;
case LA_RETRIEVEERROR:
- buf = xstrdup(optarg);
- cp = strtok(buf, ",");
- do {
- if (strcmp(cp, "abort") == 0)
- ctl->retrieveerrormode = RE_ABORT;
- else if (strcmp(cp, "skip") == 0)
- ctl->retrieveerrormode |= RE_SKIP_MASK;
- else if (strcmp(cp, "markseen") == 0)
- ctl->retrieveerrormode |= RE_MARK_SEEN_MASK;
- else {
- fprintf(stderr,GT_("Invalid retrieve-error mode `%s' specified.\n"), cp);
- errflag++;
- }
- } while
- ((cp = strtok((char *)NULL, ",")));
- free(buf);
+ if (strcasecmp(optarg,"abort") == 0) {
+ ctl->retrieveerror = REABORT;
+ } else if (strcasecmp(optarg,"continue") == 0) {
+ ctl->retrieveerror = RECONTINUE;
+ } else if (strcasecmp(optarg,"markseen") == 0) {
+ ctl->retrieveerror = REMARKSEEN;
+ } else {
+ fprintf(stderr,GT_("Invalid retrieve-error policy `%s' specified.\n"), optarg);
+ errflag++;
+ }
break;
case '?':
P(GT_(" -n, --norewrite don't rewrite header addresses\n"));
P(GT_(" -l, --limit don't fetch messages over given size\n"));
P(GT_(" -w, --warnings interval between warning mail notification\n"));
- P(GT_(" --retrieve-error set behaviour when a server error occurs while retrieving a message\n"));
+ P(GT_(" --retrieve-error {abort|continue|markseen}\n"
+ " specify policy for processing messages with retrieve errors\n"));
P(GT_(" -S, --smtphost set SMTP forwarding host\n"));
P(GT_(" --fetchdomains fetch mail for specified domains\n"));
fetchsizelimit { return FETCHSIZELIMIT; }
fastuidl { return FASTUIDL; }
expunge { return EXPUNGE; }
+retrieve-error { return RETRIEVEERROR; }
+abort { return ABORT; }
+continue { return CONTINUE; }
+markseen { return MARKSEEN; }
properties { return PROPERTIES; }
is { SETSTATE(NAME); return IS; }
%token SET LOGFILE DAEMON SYSLOG IDFILE PIDFILE INVISIBLE POSTMASTER BOUNCEMAIL
%token SPAMBOUNCE SOFTBOUNCE SHOWDOTS
%token BADHEADER ACCEPT REJECT_
+%token RETRIEVEERROR ABORT CONTINUE MARKSEEN
%token <proto> PROTO AUTHTYPE
%token <sval> STRING
%token <number> NUMBER
| FASTUIDL NUMBER {current.fastuidl = NUM_VALUE_IN($2);}
| BATCHLIMIT NUMBER {current.batchlimit = NUM_VALUE_IN($2);}
| EXPUNGE NUMBER {current.expunge = NUM_VALUE_IN($2);}
+ | RETRIEVEERROR ABORT {current.retrieveerror = REABORT;}
+ | RETRIEVEERROR CONTINUE {current.retrieveerror = RECONTINUE;}
+ | RETRIEVEERROR MARKSEEN {current.retrieveerror = REMARKSEEN;}
| PROPERTIES STRING {current.properties = $2;}
;