]> Pileus Git - ~andy/fetchmail/commitdiff
Added retrieve-error policy.
authorCraig Brown <j.craig.brown@gmail.com>
Fri, 27 Aug 2010 06:58:32 +0000 (23:58 -0700)
committerCraig Brown <j.craig.brown@gmail.com>
Fri, 27 Aug 2010 06:58:32 +0000 (23:58 -0700)
Modified the rcfile definition to add retrieve-error.
Allow retrieve-error policy to be set via commandline option --retrieve-error.

conf.c
driver.c
fetchmail.c
fetchmail.h
options.c
rcfile_l.l
rcfile_y.y

diff --git a/conf.c b/conf.c
index 8b27042e289f22304971dbcadc2e93fbc59e5e86..ef5709b6d73a5e08dadcd090a0ec65342faa1f11 100644 (file)
--- a/conf.c
+++ b/conf.c
@@ -394,17 +394,14 @@ void dump_config(struct runctl *runp, struct query *querylist)
        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':'");
index fae5add991648927cbe7161942539da9f731483a..49d486cb062358b2a79be7af0cd9d28d127f5789 100644 (file)
--- a/driver.c
+++ b/driver.c
@@ -683,19 +683,19 @@ static int fetch_messages(int mailserver_socket, struct query *ctl,
                {
                    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.
                                 *
index 3b71075c222e20d3eb6d033e40a06c32dad85165..ef2abc7ab5c503614fef01f882eb27f7cdd442d5 100644 (file)
@@ -979,7 +979,7 @@ static void optmerge(struct query *h2, struct query *h1, int force)
     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);
index de01225a0a403a9470dda755df1539d18cfa60ff..15904f22fcaad3fd851fe73f2276f78bc57b6565 100644 (file)
@@ -154,11 +154,6 @@ char *strstr(const char *, const char *);
 #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 */
 
 /*
@@ -320,6 +315,9 @@ struct hostdata             /* shared among all user connections to given server */
  */
 #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 */
@@ -367,8 +365,7 @@ struct query
     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 */
index c20b84011d42a11a17a646892e2a3f62ddf91b4e..e5e170e672bd282dc7afb1e5e88957d464de9f79 100644 (file)
--- a/options.c
+++ b/options.c
@@ -611,22 +611,16 @@ int parsecmdline (int argc /** argument count */,
            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 '?':
@@ -699,7 +693,8 @@ int parsecmdline (int argc /** argument count */,
        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"));
index 4bb0864bbee027fe2ee21928fdecd9cb9ebbcc6f..d1a572ab075ba36e6ec0209095760071d1f60f00 100644 (file)
@@ -126,6 +126,10 @@ fetchlimit { return FETCHLIMIT; }
 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; }
index fe3a59d1b0de39d859aab7951d4e90866d772b59..dc103dce6043b2cb41a908cff474b73b116200ef 100644 (file)
@@ -71,6 +71,7 @@ extern char * yytext;
 %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
@@ -371,6 +372,9 @@ user_option : TO localnames HERE
                | 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;}
                ;