options.c
上传用户:xxcykj
上传日期:2007-01-04
资源大小:727k
文件大小:19k
源码类别:

Email客户端

开发平台:

Unix_Linux

  1. /*
  2.  * options.c -- command-line option processing
  3.  *
  4.  * Copyright 1998 by Eric S. Raymond.
  5.  * For license terms, see the file COPYING in this directory.
  6.  */
  7. #include "config.h"
  8. #include <stdio.h>
  9. #include <pwd.h>
  10. #include <string.h>
  11. #include <errno.h>
  12. #if defined(STDC_HEADERS)
  13. #include  <stdlib.h>
  14. #include  <limits.h>
  15. #else
  16. #include  <ctype.h>
  17. #endif
  18. #include "getopt.h"
  19. #include "fetchmail.h"
  20. #include "i18n.h"
  21. #define LA_HELP 1
  22. #define LA_VERSION 2 
  23. #define LA_CHECK 3
  24. #define LA_SILENT 4 
  25. #define LA_VERBOSE 5 
  26. #define LA_DAEMON 6
  27. #define LA_NODETACH 7
  28. #define LA_QUIT 8
  29. #define LA_LOGFILE 9
  30. #define LA_INVISIBLE 10
  31. #define LA_SYSLOG 11
  32. #define LA_NOSYSLOG 12
  33. #define LA_RCFILE 13
  34. #define LA_IDFILE 14
  35. #define LA_POSTMASTER 15
  36. #define LA_NOBOUNCE 16
  37. #define LA_PROTOCOL 17
  38. #define LA_UIDL 18
  39. #define LA_PORT 19
  40. #define LA_PREAUTH 20
  41. #define LA_TIMEOUT 21
  42. #define LA_ENVELOPE 22
  43. #define LA_QVIRTUAL     23
  44. #define LA_USERNAME 24
  45. #define LA_ALL          25
  46. #define LA_NOKEEP 26
  47. #define LA_KEEP 27
  48. #define LA_FLUSH        28
  49. #define LA_NOREWRITE 29
  50. #define LA_LIMIT 30
  51. #define LA_WARNINGS 31
  52. #define LA_FOLDER 32
  53. #define LA_SMTPHOST 33
  54. #define LA_SMTPADDR     34
  55. #define LA_ANTISPAM 35
  56. #define LA_BATCHLIMIT 36
  57. #define LA_FETCHLIMIT 37
  58. #define LA_EXPUNGE 38
  59. #define LA_MDA 39
  60. #define LA_BSMTP 40
  61. #define LA_LMTP 41
  62. #define LA_PLUGIN 42
  63. #define LA_PLUGOUT 43
  64. #define LA_NETSEC 44
  65. #define LA_INTERFACE    45
  66. #define LA_MONITOR      46
  67. #define LA_CONFIGDUMP 47
  68. #define LA_YYDEBUG 48
  69. #ifdef SSL_ENABLE
  70. #define LA_SSL 49
  71. #define LA_SSLKEY 50
  72. #define LA_SSLCERT 51
  73. #endif
  74. /* options still left: CDgGhHjJoORwWxXYz */
  75. static const char *shortoptions = 
  76. "?Vcsvd:NqL:f:i:p:UP:A:t:E:Q:u:akKFnl:r:S:Z:b:B:e:m:T:I:M:yw:";
  77. static const struct option longoptions[] = {
  78. /* this can be const because all flag fields are 0 and will never get set */
  79.   {"help", no_argument,    (int *) 0, LA_HELP        },
  80.   {"version", no_argument,       (int *) 0, LA_VERSION     },
  81.   {"check", no_argument,    (int *) 0, LA_CHECK       },
  82.   {"silent", no_argument,       (int *) 0, LA_SILENT      },
  83.   {"verbose", no_argument,       (int *) 0, LA_VERBOSE     },
  84.   {"daemon", required_argument, (int *) 0, LA_DAEMON      },
  85.   {"nodetach", no_argument,    (int *) 0, LA_NODETACH    },
  86.   {"quit", no_argument,    (int *) 0, LA_QUIT        },
  87.   {"logfile", required_argument, (int *) 0, LA_LOGFILE     },
  88.   {"invisible", no_argument,    (int *) 0, LA_INVISIBLE   },
  89.   {"syslog", no_argument,    (int *) 0, LA_SYSLOG      },
  90.   {"nosyslog", no_argument,    (int *) 0, LA_NOSYSLOG    },
  91.   {"fetchmailrc",required_argument,(int *) 0, LA_RCFILE      },
  92.   {"idfile", required_argument, (int *) 0, LA_IDFILE      },
  93.   {"postmaster",required_argument, (int *) 0, LA_POSTMASTER  },
  94.   {"nobounce",  no_argument,       (int *) 0, LA_NOBOUNCE    },
  95.   {"protocol", required_argument, (int *) 0, LA_PROTOCOL    },
  96.   {"proto", required_argument, (int *) 0, LA_PROTOCOL    },
  97.   {"uidl", no_argument,    (int *) 0, LA_UIDL      },
  98.   {"port", required_argument, (int *) 0, LA_PORT        },
  99.   {"preauth", required_argument, (int *) 0, LA_PREAUTH},
  100.   {"timeout", required_argument, (int *) 0, LA_TIMEOUT     },
  101.   {"envelope", required_argument, (int *) 0, LA_ENVELOPE    },
  102.   {"qvirtual", required_argument, (int *) 0, LA_QVIRTUAL    },
  103.   {"user", required_argument, (int *) 0, LA_USERNAME    },
  104.   {"username", required_argument, (int *) 0, LA_USERNAME    },
  105.   {"all", no_argument,       (int *) 0, LA_ALL         },
  106.   {"nokeep", no_argument,    (int *) 0, LA_NOKEEP      },
  107.   {"keep", no_argument,       (int *) 0, LA_KEEP        },
  108.   {"flush", no_argument,    (int *) 0, LA_FLUSH       },
  109.   {"norewrite", no_argument,    (int *) 0, LA_NOREWRITE   },
  110.   {"limit", required_argument, (int *) 0, LA_LIMIT       },
  111.   {"warnings", required_argument, (int *) 0, LA_WARNINGS    },
  112.   {"folder", required_argument, (int *) 0, LA_FOLDER      },
  113.   {"smtphost", required_argument, (int *) 0, LA_SMTPHOST    },
  114.   {"smtpaddress", required_argument, (int *) 0, LA_SMTPADDR  },
  115.   {"antispam", required_argument, (int *) 0, LA_ANTISPAM    },
  116.   
  117.   {"batchlimit",required_argument, (int *) 0, LA_BATCHLIMIT  },
  118.   {"fetchlimit",required_argument, (int *) 0, LA_FETCHLIMIT  },
  119.   {"expunge", required_argument, (int *) 0, LA_EXPUNGE     },
  120.   {"mda", required_argument, (int *) 0, LA_MDA         },
  121.   {"bsmtp", required_argument, (int *) 0, LA_BSMTP       },
  122.   {"lmtp", no_argument,       (int *) 0, LA_LMTP        },
  123. #ifdef INET6_ENABLE
  124.   {"netsec", required_argument, (int *) 0, LA_NETSEC      },
  125. #endif /* INET6_ENABLE */
  126. #ifdef SSL_ENABLE
  127.   {"ssl",       no_argument,       (int *) 0, LA_SSL        },
  128.   {"sslkey",    required_argument, (int *) 0, LA_SSLKEY     },
  129.   {"sslcert",   required_argument, (int *) 0, LA_SSLCERT    },
  130. #endif
  131. #if (defined(linux) && !INET6_ENABLE) || defined(__FreeBSD__)
  132.   {"interface", required_argument, (int *) 0, LA_INTERFACE   },
  133.   {"monitor", required_argument, (int *) 0, LA_MONITOR     },
  134. #endif /* (defined(linux) && !INET6_ENABLE) || defined(__FreeBSD__) */
  135.   {"plugin", required_argument, (int *) 0, LA_PLUGIN      },
  136.   {"plugout", required_argument, (int *) 0, LA_PLUGOUT     },
  137.   {"configdump",no_argument,    (int *) 0, LA_CONFIGDUMP  },
  138.   {"yydebug", no_argument,    (int *) 0, LA_YYDEBUG     },
  139.   {(char *) 0,  no_argument,       (int *) 0, 0              }
  140. };
  141. static int xatoi(char *s, int *errflagptr)
  142. /* do safe conversion from string to number */
  143. {
  144. #if defined (STDC_HEADERS) && defined (LONG_MAX) && defined (INT_MAX)
  145.     /* parse and convert numbers, but also check for invalid characters in
  146.      * numbers
  147.      */
  148.     char *endptr;
  149.     long value;
  150.     errno = 0;
  151.     value = strtol(s, &endptr, 0);
  152.     /* any invalid chars in string? */
  153.     if ( (endptr == s) || (*endptr != '') ) {
  154.      (void) fprintf(stderr, _("String '%s' is not a valid number string.n"), s);
  155. (*errflagptr)++;
  156. return 0;
  157.     }
  158.     /* is the range valid? */
  159.     if ( (((value == LONG_MAX) || (value == LONG_MIN)) && (errno == ERANGE)) ||
  160. (value > INT_MAX) || (value < INT_MIN)) {
  161.      (void) fprintf(stderr, _("Value of string '%s' is %s than %d.n"), s,
  162. (value < 0) ? _("smaller"): _("larger"),
  163. (value < 0) ? INT_MIN : INT_MAX);
  164. (*errflagptr)++;
  165. return 0;
  166.     }
  167.     return (int) value;  /* shut up, I know what I'm doing */
  168. #else
  169.     int i;
  170.     char *dp;
  171. # if defined (STDC_HEADERS)
  172.     size_t len;
  173. # else
  174.     int len;
  175. # endif
  176.     /* We do only base 10 conversions here (atoi)! */
  177.     len = strlen(s);
  178.     /* check for leading white spaces */
  179.     for (i = 0; (i < len) && isspace(s[i]); i++)
  180.      ;
  181.     dp = &s[i];
  182.     /* check for +/- */
  183.     if (i < len && (s[i] == '+' || s[i] == '-')) i++;
  184.     /* skip over digits */
  185.     for ( /* no init */ ; (i < len) && isdigit(s[i]); i++)
  186.      ;
  187.     /* check for trailing garbage */
  188.     if (i != len) {
  189.      (void) fprintf(stderr, _("String '%s' is not a valid number string.n"), s);
  190.      (*errflagptr)++;
  191. return 0;
  192.     }
  193.     /* atoi should be safe by now, except for number range over/underflow */
  194.     return atoi(dp);
  195. #endif
  196. }
  197. int parsecmdline (argc, argv, rctl, ctl)
  198. /* parse and validate the command line options */
  199. int argc; /* argument count */
  200. char **argv; /* argument strings */
  201. struct runctl *rctl; /* global run controls to modify */
  202. struct query *ctl; /* option record to be initialized */
  203. {
  204.     /*
  205.      * return value: if positive, argv index of last parsed option + 1
  206.      * (presumes one or more server names follows).  if zero, the
  207.      * command line switches are such that no server names are
  208.      * required (e.g. --version).  if negative, the command line is
  209.      * has one or more syntax errors.
  210.      */
  211.     int c;
  212.     int ocount = 0; /* count of destinations specified */
  213.     int errflag = 0; /* TRUE when a syntax error is detected */
  214.     int helpflag = 0; /* TRUE when option help was explicitly requested */
  215.     int option_index;
  216.     char *buf, *cp;
  217.     rctl->poll_interval = -1;
  218.     memset(ctl, '', sizeof(struct query));    /* start clean */
  219.     ctl->smtp_socket = -1;
  220.     while (!errflag && 
  221.    (c = getopt_long(argc,argv,shortoptions,
  222.     longoptions,&option_index)) != -1) {
  223. switch (c) {
  224. case 'V':
  225. case LA_VERSION:
  226.     versioninfo = TRUE;
  227.     break;
  228. case 'c':
  229. case LA_CHECK:
  230.     check_only = TRUE;
  231.     break;
  232. case 's':
  233. case LA_SILENT:
  234.     outlevel = O_SILENT;
  235.     break;
  236. case 'v':
  237. case LA_VERBOSE:
  238.     if (outlevel == O_VERBOSE)
  239. outlevel = O_DEBUG;
  240.     else
  241. outlevel = O_VERBOSE;
  242.     break;
  243. case 'd':
  244. case LA_DAEMON:
  245.     rctl->poll_interval = xatoi(optarg, &errflag);
  246.     break;
  247. case 'N':
  248. case LA_NODETACH:
  249.     nodetach = TRUE;
  250.     break;
  251. case 'q':
  252. case LA_QUIT:
  253.     quitmode = TRUE;
  254.     break;
  255. case 'L':
  256. case LA_LOGFILE:
  257.     rctl->logfile = optarg;
  258.     break;
  259. case LA_INVISIBLE:
  260.     rctl->invisible = TRUE;
  261.     break;
  262. case 'f':
  263. case LA_RCFILE:
  264.     rcfile = (char *) xstrdup(optarg);
  265.     break;
  266. case 'i':
  267. case LA_IDFILE:
  268.     rctl->idfile = (char *) xstrdup(optarg);
  269.     break;
  270. case LA_POSTMASTER:
  271.     rctl->postmaster = (char *) xstrdup(optarg);
  272.     break;
  273. case LA_NOBOUNCE:
  274.     run.bouncemail = FALSE;
  275.     break;
  276. case 'p':
  277. case LA_PROTOCOL:
  278.     /* XXX -- should probably use a table lookup here */
  279.     if (strcasecmp(optarg,"auto") == 0)
  280. ctl->server.protocol = P_AUTO;
  281.     else if (strcasecmp(optarg,"pop2") == 0)
  282. ctl->server.protocol = P_POP2;
  283. #ifdef SDPS_ENABLE
  284.     else if (strcasecmp(optarg,"sdps") == 0)
  285.     {
  286.         ctl->server.protocol = P_POP3; 
  287.                 ctl->server.sdps = TRUE;
  288.     }
  289. #endif /* SDPS_ENABLE */
  290.     else if (strcasecmp(optarg,"pop3") == 0)
  291. ctl->server.protocol = P_POP3;
  292.     else if (strcasecmp(optarg,"apop") == 0)
  293. ctl->server.protocol = P_APOP;
  294.     else if (strcasecmp(optarg,"rpop") == 0)
  295. ctl->server.protocol = P_RPOP;
  296.     else if (strcasecmp(optarg,"kpop") == 0)
  297.     {
  298. ctl->server.protocol = P_POP3;
  299. #if INET6_ENABLE
  300. ctl->server.service = KPOP_PORT;
  301. #else /* INET6_ENABLE */
  302. ctl->server.port = KPOP_PORT;
  303. #endif /* INET6_ENABLE */
  304. #ifdef KERBEROS_V5
  305. ctl->server.preauthenticate =  A_KERBEROS_V5;
  306. #else
  307. ctl->server.preauthenticate =  A_KERBEROS_V4;
  308. #endif /* KERBEROS_V5 */
  309.     }
  310.     else if (strcasecmp(optarg,"imap") == 0)
  311. ctl->server.protocol = P_IMAP;
  312. #ifdef KERBEROS_V4
  313.     else if (strcasecmp(optarg,"imap-k4") == 0)
  314. ctl->server.protocol = P_IMAP_K4;
  315. #endif /* KERBEROS_V4 */
  316. #ifdef GSSAPI
  317.     else if (strcasecmp(optarg, "imap-gss") == 0)
  318.                 ctl->server.protocol = P_IMAP_GSS;
  319. #endif /* GSSAPI */
  320.     else if (strcasecmp(optarg, "imap-crammd5") == 0)
  321.                 ctl->server.protocol = P_IMAP_CRAM_MD5;
  322.     else if (strcasecmp(optarg, "imap-login") == 0)
  323.                 ctl->server.protocol = P_IMAP_LOGIN;
  324.     else if (strcasecmp(optarg,"etrn") == 0)
  325. ctl->server.protocol = P_ETRN;
  326.     else {
  327. fprintf(stderr,_("Invalid protocol `%s' specified.n"), optarg);
  328. errflag++;
  329.     }
  330.     break;
  331. case 'U':
  332. case LA_UIDL:
  333.     ctl->server.uidl = FLAG_TRUE;
  334.     break;
  335. case 'P':
  336. case LA_PORT:
  337. #if INET6_ENABLE
  338.     ctl->server.service = optarg;
  339. #else /* INET6_ENABLE */
  340.     ctl->server.port = xatoi(optarg, &errflag);
  341. #endif /* INET6_ENABLE */
  342.     break;
  343. case LA_PREAUTH:
  344.     if (strcmp(optarg, "password") == 0)
  345. ctl->server.preauthenticate = A_PASSWORD;
  346.     else if (strcmp(optarg, "kerberos") == 0)
  347. #ifdef KERBEROS_V5
  348. ctl->server.preauthenticate = A_KERBEROS_V5;
  349. #else
  350. ctl->server.preauthenticate = A_KERBEROS_V4;
  351. #endif /* KERBEROS_V5 */
  352.     else if (strcmp(optarg, "kerberos_v5") == 0)
  353. ctl->server.preauthenticate = A_KERBEROS_V5;
  354.     else if (strcmp(optarg, "kerberos_v4") == 0)
  355. ctl->server.preauthenticate = A_KERBEROS_V4;
  356.     else if (strcmp(optarg, "ssh") == 0)
  357. ctl->server.preauthenticate = A_SSH;
  358.     else {
  359. fprintf(stderr,_("Invalid preauthentication `%s' specified.n"), optarg);
  360. errflag++;
  361.     }
  362.     break;
  363. case 't':
  364. case LA_TIMEOUT:
  365.     ctl->server.timeout = xatoi(optarg, &errflag);
  366.     if (ctl->server.timeout == 0)
  367. ctl->server.timeout = -1;
  368.     break;
  369. case 'E':
  370. case LA_ENVELOPE:
  371.     ctl->server.envelope = xstrdup(optarg);
  372.     break;
  373. case 'Q':    
  374. case LA_QVIRTUAL:
  375.     ctl->server.qvirtual = xstrdup(optarg);
  376.     break;
  377. case 'u':
  378. case LA_USERNAME:
  379.     ctl->remotename = xstrdup(optarg);
  380.     break;
  381. case 'a':
  382. case LA_ALL:
  383.     ctl->fetchall = FLAG_TRUE;
  384.     break;
  385. case 'K':
  386. case LA_NOKEEP:
  387.     ctl->keep = FLAG_FALSE;
  388.     break;
  389. case 'k':
  390. case LA_KEEP:
  391.     ctl->keep = FLAG_TRUE;
  392.     break;
  393. case 'F':
  394. case LA_FLUSH:
  395.     ctl->flush = FLAG_TRUE;
  396.     break;
  397. case 'n':
  398. case LA_NOREWRITE:
  399.     ctl->rewrite = FLAG_FALSE;
  400.     break;
  401. case 'l':
  402. case LA_LIMIT:
  403.     c = xatoi(optarg, &errflag);
  404.     ctl->limit = NUM_VALUE_IN(c);
  405.     break;
  406. case 'r':
  407. case LA_FOLDER:
  408.     xalloca(buf, char *, strlen(optarg) + 1);
  409.     strcpy(buf, optarg);
  410.     cp = strtok(buf, ",");
  411.     do {
  412. save_str(&ctl->mailboxes, cp, 0);
  413.     } while
  414. ((cp = strtok((char *)NULL, ",")));
  415.     break;
  416. case 'S':
  417. case LA_SMTPHOST:
  418.     xalloca(buf, char *, strlen(optarg) + 1);
  419.     strcpy(buf, optarg);
  420.     cp = strtok(buf, ",");
  421.     do {
  422. save_str(&ctl->smtphunt, cp, TRUE);
  423.     } while
  424. ((cp = strtok((char *)NULL, ",")));
  425.     ocount++;
  426.     break;
  427. case 'D':
  428. case LA_SMTPADDR:
  429.     ctl->smtpaddress = xstrdup(optarg);
  430.     break;
  431. case 'Z':
  432. case LA_ANTISPAM:
  433.     xalloca(buf, char *, strlen(optarg) + 1);
  434.     strcpy(buf, optarg);
  435.     cp = strtok(buf, ",");
  436.     do {
  437. struct idlist *idp = save_str(&ctl->antispam, NULL, 0);;
  438. idp->val.status.num = xatoi(cp, &errflag);
  439.     } while
  440. ((cp = strtok((char *)NULL, ",")));
  441.     break;
  442. case 'b':
  443. case LA_BATCHLIMIT:
  444.     c = xatoi(optarg, &errflag);
  445.     ctl->batchlimit = NUM_VALUE_IN(c);
  446.     break;
  447. case 'B':
  448. case LA_FETCHLIMIT:
  449.     c = xatoi(optarg, &errflag);
  450.     ctl->fetchlimit = NUM_VALUE_IN(c);
  451.     break;
  452. case 'e':
  453. case LA_EXPUNGE:
  454.     c = xatoi(optarg, &errflag);
  455.     ctl->expunge = NUM_VALUE_IN(c);
  456.     break;
  457. case 'm':
  458. case LA_MDA:
  459.     ctl->mda = xstrdup(optarg);
  460.     ocount++;
  461.     break;
  462. case LA_BSMTP:
  463.     ctl->bsmtp = xstrdup(optarg);
  464.     ocount++;
  465.     break;
  466. case LA_LMTP:
  467.     ctl->listener = LMTP_MODE;
  468.     break;
  469. case 'T':
  470. case LA_NETSEC:
  471. #if NET_SECURITY
  472.     ctl->server.netsec = (void *)optarg;
  473. #else
  474.     fprintf(stderr, _("fetchmail: network security support is disabledn"));
  475.     errflag++;
  476. #endif /* NET_SECURITY */
  477.     break;
  478. #if (defined(linux) && !INET6_ENABLE) || defined(__FreeBSD__)
  479. case 'I':
  480. case LA_INTERFACE:
  481.     interface_parse(optarg, &ctl->server);
  482.     break;
  483. case 'M':
  484. case LA_MONITOR:
  485.     ctl->server.monitor = xstrdup(optarg);
  486.     break;
  487. #endif /* (defined(linux) && !INET6_ENABLE) || defined(__FreeBSD__) */
  488. case LA_PLUGIN:
  489.     ctl->server.plugin = xstrdup(optarg);
  490.     break;
  491. case LA_PLUGOUT:
  492.     ctl->server.plugout = xstrdup(optarg);
  493.     break;
  494. #ifdef SSL_ENABLE
  495. case LA_SSL:
  496.     ctl->use_ssl = FLAG_TRUE;
  497.     break;
  498. case LA_SSLKEY:
  499.     ctl->sslkey = xstrdup(optarg);
  500.     break;
  501. case LA_SSLCERT:
  502.     ctl->sslcert = xstrdup(optarg);
  503.     break;
  504. #endif
  505. case 'y':
  506. case LA_YYDEBUG:
  507.     yydebug = TRUE;
  508.     break;
  509. case 'w':
  510. case LA_WARNINGS:
  511.     c = xatoi(optarg, &errflag);
  512.     ctl->warnings = NUM_VALUE_IN(c);
  513.     break;
  514. case LA_CONFIGDUMP:
  515.     configdump = TRUE;
  516.     break;
  517. case LA_SYSLOG:
  518.     rctl->use_syslog = FLAG_TRUE;
  519.     break;
  520. case LA_NOSYSLOG:
  521.     rctl->use_syslog = FLAG_FALSE;
  522.     break;
  523. case '?':
  524. case LA_HELP:
  525. default:
  526.     helpflag++;
  527. }
  528.     }
  529.     if (errflag || ocount > 1 || helpflag) {
  530. /* squawk if syntax errors were detected */
  531. #define P(s) fputs(s, helpflag ? stdout : stderr)
  532. P(_("usage:  fetchmail [options] [server ...]n"));
  533. P(_("  Options are as follows:n"));
  534. P(_("  -?, --help        display this option helpn"));
  535. P(_("  -V, --version     display version infon"));
  536. P(_("  -c, --check       check for messages without fetchingn"));
  537. P(_("  -s, --silent      work silentlyn"));
  538. P(_("  -v, --verbose     work noisily (diagnostic output)n"));
  539. P(_("  -d, --daemon      run as a daemon once per n secondsn"));
  540. P(_("  -N, --nodetach    don't detach daemon processn"));
  541. P(_("  -q, --quit        kill daemon processn"));
  542. P(_("  -L, --logfile     specify logfile namen"));
  543. P(_("      --syslog      use syslog(3) for most messages when running as a daemonn"));
  544. P(_("      --invisible   don't write Received & enable host spoofingn"));
  545. P(_("  -f, --fetchmailrc specify alternate run control filen"));
  546. P(_("  -i, --idfile      specify alternate UIDs filen"));
  547. P(_("      --postmaster  specify recipient of last resortn"));
  548. P(_("      --nobounce    redirect bounces from user to postmaster.n"));
  549. #if (defined(linux) && !INET6_ENABLE) || defined(__FreeBSD__)
  550. P(_("  -I, --interface   interface required specificationn"));
  551. P(_("  -M, --monitor     monitor interface for activityn"));
  552. #endif
  553. #if defined( SSL_ENABLE )
  554. P(_("      --ssl         enable ssl encrypted sessionn"));
  555. P(_("      --sslkey      ssl private key filen"));
  556. P(_("      --sslcert     ssl client certificaten"));
  557. #endif
  558. P(_("      --plugin      specify external command to open connectionn"));
  559. P(_("      --plugout     specify external command to open smtp connectionn"));
  560. P(_("  -p, --protocol    specify retrieval protocol (see man page)n"));
  561. P(_("  -U, --uidl        force the use of UIDLs (pop3 only)n"));
  562. P(_("  -P, --port        TCP/IP service port to connect ton"));
  563. P(_("      --preauth     preauthentication type (password/kerberos/ssh)n"));
  564. P(_("  -t, --timeout     server nonresponse timeoutn"));
  565. P(_("  -E, --envelope    envelope address headern"));
  566. P(_("  -Q, --qvirtual    prefix to remove from local user idn"));
  567. P(_("  -u, --username    specify users's login on servern"));
  568. P(_("  -a, --all         retrieve old and new messagesn"));
  569. P(_("  -K, --nokeep      delete new messages after retrievaln"));
  570. P(_("  -k, --keep        save new messages after retrievaln"));
  571. P(_("  -F, --flush       delete old messages from servern"));
  572. P(_("  -n, --norewrite   don't rewrite header addressesn"));
  573. P(_("  -l, --limit       don't fetch messages over given sizen"));
  574. P(_("  -w, --warnings    interval between warning mail notificationn"));
  575. #if NET_SECURITY
  576. P(_("  -T, --netsec      set IP security requestn"));
  577. #endif /* NET_SECURITY */
  578. P(_("  -S, --smtphost    set SMTP forwarding hostn"));
  579. P(_("  -D, --smtpaddress set SMTP delivery domain to usen"));
  580. P(_("  -Z, --antispam,   set antispam response valuesn"));
  581. P(_("  -b, --batchlimit  set batch limit for SMTP connectionsn"));
  582. P(_("  -B, --fetchlimit  set fetch limit for server connectionsn"));
  583. P(_("  -e, --expunge     set max deletions between expungesn"));
  584.         P(_("  -m, --mda         set MDA to use for forwardingn"));
  585.         P(_("      --bsmtp       set output BSMTP filen"));
  586.         P(_("      --lmtp        use LMTP (RFC2033) for deliveryn"));
  587. P(_("  -r, --folder      specify remote folder namen"));
  588. #undef P
  589. if (helpflag)
  590.     exit(PS_SUCCESS);
  591. else
  592.     exit(PS_SYNTAX);
  593.     }
  594.     return(optind);
  595. }
  596. /* options.c ends here */