]> Pileus Git - ~andy/fetchmail/blobdiff - options.c
Rediff patch.
[~andy/fetchmail] / options.c
index 4206b12c7373643a8adae9dcce34b6f185a2e3dc..cee5fae453ec77fc73a4edded2a9580b8777131c 100644 (file)
--- a/options.c
+++ b/options.c
@@ -51,7 +51,8 @@ enum {
     LA_IDLE,
     LA_NOSOFTBOUNCE,
     LA_SOFTBOUNCE,
-    LA_BADHEADER
+    LA_BADHEADER,
+    LA_RETRIEVEERROR
 };
 
 static const char *shortoptions =
@@ -113,6 +114,7 @@ static const struct option longoptions[] = {
   {"norewrite",        no_argument,       (int *) 0, 'n' },
   {"limit",    required_argument, (int *) 0, 'l' },
   {"warnings", required_argument, (int *) 0, 'w' },
+  {"retrieve-error",   required_argument, (int *) 0, LA_RETRIEVEERROR },
 
   {"folder",   required_argument, (int *) 0, 'r' },
   {"smtphost", required_argument, (int *) 0, 'S' },
@@ -199,7 +201,10 @@ static int xatoi(char *s, int *errflagptr)
 int parsecmdline (int argc /** argument count */,
                  char **argv /** argument strings */,
                  struct runctl *rctl /** global run controls to modify */,
-                 struct query *ctl /** option record to initialize */)
+                 struct query *ctl /** option record to initialize */,
+                 flag *safewithbg /** set to whether options are
+                                    compatible with another copy
+                                    running in the background */)
 {
     /*
      * return value: if positive, argv index of last parsed option + 1
@@ -214,9 +219,12 @@ int parsecmdline (int argc /** argument count */,
     int errflag = 0;   /* TRUE when a syntax error is detected */
     int helpflag = 0;  /* TRUE when option help was explicitly requested */
     int option_index;
+    int option_safe;   /* to track if option currently parsed is safe
+                          with a background copy */
     char *buf, *cp;
 
     rctl->poll_interval = -1;
+    *safewithbg = TRUE;
 
     memset(ctl, '\0', sizeof(struct query));    /* start clean */
     ctl->smtp_socket = -1;
@@ -225,6 +233,8 @@ int parsecmdline (int argc /** argument count */,
           (c = getopt_long(argc,argv,shortoptions,
                            longoptions, &option_index)) != -1)
     {
+       option_safe = FALSE;
+
        switch (c) {
 #ifdef HAVE_LIBPWMD
        case 'C':
@@ -239,18 +249,21 @@ int parsecmdline (int argc /** argument count */,
 #endif
        case 'V':
            versioninfo = TRUE;
+           option_safe = TRUE;
            break;
        case 'c':
            check_only = TRUE;
            break;
        case 's':
            outlevel = O_SILENT;
+           option_safe = 1;
            break;
        case 'v':
            if (outlevel >= O_VERBOSE)
                outlevel = O_DEBUG;
            else
                outlevel = O_VERBOSE;
+           option_safe = TRUE;
            break;
        case 'd':
            rctl->poll_interval = xatoi(optarg, &errflag);
@@ -317,12 +330,10 @@ int parsecmdline (int argc /** argument count */,
 #endif /* SDPS_ENABLE */
            else if (strcasecmp(optarg,"pop3") == 0)
                ctl->server.protocol = P_POP3;
-           else if (strcasecmp(optarg,"apop") == 0)
-               ctl->server.protocol = P_APOP;
            else if (strcasecmp(optarg,"kpop") == 0)
            {
                ctl->server.protocol = P_POP3;
-               ctl->server.service = KPOP_PORT;
+               ctl->server.service = xstrdup(KPOP_PORT);
 #ifdef KERBEROS_V5
                ctl->server.authenticate =  A_KERBEROS_V5;
 #endif /* KERBEROS_V5 */
@@ -339,7 +350,7 @@ int parsecmdline (int argc /** argument count */,
            }
            break;
        case 'U':
-           ctl->server.uidl = FLAG_TRUE;
+           /* EMPTY - removed in 7.0.0 */
            break;
        case LA_IDLE:
            ctl->idle = FLAG_TRUE;
@@ -376,6 +387,8 @@ int parsecmdline (int argc /** argument count */,
                ctl->server.authenticate = A_ANY;
            else if (strcmp(optarg, "msn") == 0)
                ctl->server.authenticate = A_MSN;
+           else if (strcmp(optarg, "apop") == 0)
+               ctl->server.authenticate = A_APOP;
            else {
                fprintf(stderr,GT_("Invalid authentication `%s' specified.\n"), optarg);
                errflag++;
@@ -563,6 +576,7 @@ int parsecmdline (int argc /** argument count */,
 
        case LA_CONFIGDUMP:
            configdump = TRUE;
+           option_safe = TRUE;
            break;
 
        case LA_SYSLOG:
@@ -577,10 +591,25 @@ int parsecmdline (int argc /** argument count */,
            ctl->server.tracepolls = FLAG_TRUE;
            break;
 
+       case LA_RETRIEVEERROR:
+           if (strcasecmp(optarg,"abort") == 0) {
+               ctl->server.retrieveerror = RE_ABORT;
+           } else if (strcasecmp(optarg,"continue") == 0) {
+               ctl->server.retrieveerror = RE_CONTINUE;
+           } else if (strcasecmp(optarg,"markseen") == 0) {
+               ctl->server.retrieveerror = RE_MARKSEEN;
+           } else {
+               fprintf(stderr,GT_("Invalid retrieve-error policy `%s' specified.\n"), optarg);
+               errflag++;
+           }
+           break;
+
        case '?':
+           helpflag = 1;
        default:
-           helpflag++;
+           break;
        }
+       *safewithbg &= option_safe;
     }
 
     if (errflag || ocount > 1 || helpflag) {
@@ -626,6 +655,8 @@ int parsecmdline (int argc /** argument count */,
        P(GT_("      --plugout     specify external command to open smtp connection\n"));
        P(GT_("      --bad-header {reject|accept}\n"
              "                    specify policy for handling messages with bad headers\n"));
+       P(GT_("      --retrieve-error {abort|continue|markseen}\n"
+              "                        specify policy for processing messages with retrieve errors\n"));
 
        P(GT_("  -p, --protocol    specify retrieval protocol (see man page)\n"));
 #ifdef HAVE_LIBPWMD
@@ -633,8 +664,7 @@ int parsecmdline (int argc /** argument count */,
         P(GT_("  -G, --pwmd-file   filename to use on the pwmd server\n"));
         P(GT_("  -O, --pinentry-timeout   seconds until pinentry is canceled\n"));
 #endif
-       P(GT_("  -U, --uidl        force the use of UIDLs (pop3 only)\n"));
+
        P(GT_("      --port        TCP port to connect to (obsolete, use --service)\n"));
        P(GT_("  -P, --service     TCP service to connect to (can be numeric TCP port)\n"));
        P(GT_("      --auth        authentication type (password/kerberos/ssh/otp)\n"));