]> git.ozlabs.org Git - ppp.git/blobdiff - pppd/options.c
Fix a SEGV on printing options error (previously a MTU of 65535 in the options
[ppp.git] / pppd / options.c
index 3c1a2950f7cd998f42e83e157fb6954300f78bb4..09a2db17bab52a8f2a7d82f84ea343372e7a1eb3 100644 (file)
@@ -17,7 +17,7 @@
  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  */
 
-#define RCSID  "$Id: options.c,v 1.81 2002/01/11 18:11:51 etbe Exp $"
+#define RCSID  "$Id: options.c,v 1.87 2002/09/14 08:05:27 etbe Exp $"
 
 #include <ctype.h>
 #include <stdio.h>
@@ -86,6 +86,13 @@ bool dump_options;           /* print out option values */
 bool   dryrun;                 /* print out option values and exit */
 char   *domain;                /* domain name set by domain option */
 
+#ifdef MAXOCTETS
+unsigned int  maxoctets = 0;    /* default - no limit */
+int maxoctets_dir = 0;       /* default - sum of traffic */
+int maxoctets_timeout = 1;   /* default 1 second */ 
+#endif
+
+
 extern option_t auth_options[];
 extern struct stat devstat;
 
@@ -123,6 +130,10 @@ static int setpassfilter __P((char **));
 static int setactivefilter __P((char **));
 #endif
 
+#ifdef MAXOCTETS
+static int setmodir __P((char **));
+#endif
+
 static option_t *find_option __P((const char *name));
 static int process_option __P((option_t *, char *, char **));
 static int n_arguments __P((option_t *));
@@ -262,6 +273,19 @@ option_t general_options[] = {
       "set filter for active pkts", OPT_PRIO },
 #endif
 
+#ifdef MAXOCTETS
+    { "maxoctets", o_int, &maxoctets,
+      "Set connection traffic limit",
+      OPT_PRIO | OPT_LLIMIT | OPT_NOINCR | OPT_ZEROINF },
+    { "mo", o_int, &maxoctets,
+      "Set connection traffic limit",
+      OPT_ALIAS | OPT_PRIO | OPT_LLIMIT | OPT_NOINCR | OPT_ZEROINF },
+    { "mo-direction", o_special, setmodir,
+      "Set direction for limit traffic (sum,in,out,max)" },
+    { "mo-timeout", o_int, &maxoctets_timeout,
+      "Check for traffic limit every N seconds", OPT_PRIO | OPT_LLIMIT | 1 },
+#endif
+
     { NULL }
 };
 
@@ -623,6 +647,14 @@ process_option(opt, cmd, argv)
        *(bool *)(opt->addr) = v;
        if (opt->addr2 && (opt->flags & OPT_A2COPY))
            *(bool *)(opt->addr2) = v;
+       else if (opt->addr2 && (opt->flags & OPT_A2CLR))
+           *(bool *)(opt->addr2) = 0;
+       else if (opt->addr2 && (opt->flags & OPT_A2CLRB))
+           *(u_char *)(opt->addr2) &= ~v;
+       else if (opt->addr2 && (opt->flags & OPT_A2OR))
+           *(u_char *)(opt->addr2) |= v;
+       if (opt->addr3 && (opt->flags & OPT_A3OR))
+           *(u_char *)(opt->addr3) |= v;
        break;
 
     case o_int:
@@ -645,7 +677,7 @@ process_option(opt, cmd, argv)
                    break;
                case OPT_LIMITS:
                    option_error("%s value must be%s between %d and %d",
-                               opt->name, opt->lower_limit, opt->upper_limit);
+                               opt->name, zok, opt->lower_limit, opt->upper_limit);
                    break;
                }
                return 0;
@@ -724,7 +756,7 @@ process_option(opt, cmd, argv)
     }
 
     if (opt->addr2 && (opt->flags & (OPT_A2COPY|OPT_ENABLE
-               |OPT_A2PRINTER|OPT_A2STRVAL|OPT_A2LIST)) == 0)
+               |OPT_A2PRINTER|OPT_A2STRVAL|OPT_A2LIST|OPT_A2OR)) == 0)
        *(bool *)(opt->addr2) = !(opt->flags & OPT_A2CLR);
 
     mainopt->source = option_source;
@@ -870,7 +902,9 @@ print_option(opt, mainopt, printer, arg)
                        void (*oprt) __P((option_t *,
                                          void ((*)__P((void *, char *, ...))),
                                          void *));
-                       oprt = opt->addr2;
+                       oprt = (void (*) __P((option_t *,
+                                        void ((*)__P((void *, char *, ...))),
+                                        void *)))opt->addr2;
                        (*oprt)(opt, printer, arg);
                } else if (opt->flags & OPT_A2STRVAL) {
                        p = (char *) opt->addr2;
@@ -894,7 +928,7 @@ print_option(opt, mainopt, printer, arg)
                break;
 
        default:
-               printer(arg, "# %s value (type %d??)", opt->name, opt->type);
+               printer(arg, "# %s value (type %d\?\?)", opt->name, opt->type);
                break;
        }
        printer(arg, "\t\t# (from %s)\n", mainopt->source);
@@ -1455,6 +1489,25 @@ setlogfile(argv)
     log_default = 0;
     return 1;
 }
+#ifdef MAXOCTETS
+static int
+setmodir(argv)
+    char **argv;
+{
+    if(*argv == NULL)
+       return 0;
+    if(!strcmp(*argv,"in")) {
+        maxoctets_dir = PPP_OCTETS_DIRECTION_IN;
+    } else if (!strcmp(*argv,"out")) {
+        maxoctets_dir = PPP_OCTETS_DIRECTION_OUT;
+    } else if (!strcmp(*argv,"max")) {
+        maxoctets_dir = PPP_OCTETS_DIRECTION_MAXOVERAL;
+    } else {
+        maxoctets_dir = PPP_OCTETS_DIRECTION_SUM;
+    }
+    return 1;
+}
+#endif
 
 #ifdef PLUGIN
 static int