X-Git-Url: http://git.ozlabs.org/?p=ppp.git;a=blobdiff_plain;f=pppd%2Foptions.c;h=d17df58709e70afe15af92156521603b8fbdebcc;hp=689bde6c64c661e95071523d4c82237856a09f78;hb=fcec736c6140de7ac8fa9a8fe425932d13b0e45a;hpb=37a8acc7ee2527693d0c8ba82b2eaea249abde34 diff --git a/pppd/options.c b/pppd/options.c index 689bde6..d17df58 100644 --- a/pppd/options.c +++ b/pppd/options.c @@ -17,7 +17,7 @@ * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ -#define RCSID "$Id: options.c,v 1.79 2001/03/08 05:11:15 paulus Exp $" +#define RCSID "$Id: options.c,v 1.86 2002/09/07 05:15:25 carlsonj Exp $" #include #include @@ -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 } }; @@ -497,6 +521,7 @@ options_from_list(w, priv) } if (!process_option(opt, w0->word, argv)) goto err; + w = w->next; } ret = 1; @@ -622,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: @@ -723,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; @@ -815,8 +848,9 @@ print_option(opt, mainopt, printer, arg) case o_bool: v = opt->flags & OPT_VALUE; if (*(bool *)opt->addr != v) - printer(arg, "oops, %s value is %d not %d?\n", - opt->name, *(bool *)opt->addr, v); + /* this can happen legitimately, e.g. lock + option turned off for default device */ + break; printer(arg, "%s", opt->name); break; case o_int: @@ -868,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; @@ -892,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); @@ -929,6 +965,7 @@ print_options(printer, arg) struct option_list *list; int i; + printer(arg, "pppd options in effect:\n"); print_option_list(general_options, printer, arg); print_option_list(auth_options, printer, arg); for (list = extra_options; list != NULL; list = list->next) @@ -1452,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 @@ -1493,7 +1549,7 @@ loadplugin(argv) warn("Warning: plugin %s has no version information", arg); } else if (strcmp(vers, VERSION) != 0) { option_error("Plugin %s is for pppd version %s, this is %s", - vers, VERSION); + arg, vers, VERSION); goto errclose; } info("Plugin %s loaded.", arg);