* 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.88 2002/09/24 11:35:22 fcusack Exp $"
#include <ctype.h>
#include <stdio.h>
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;
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 *));
"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 }
};
}
if (!process_option(opt, w0->word, argv))
goto err;
+ w = w->next;
}
ret = 1;
*(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;
break;
case o_int:
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;
}
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;
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:
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;
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);
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)
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
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);