]> git.ozlabs.org Git - ppp.git/blobdiff - pppd/options.c
Patch from Robert Vogelgesang:
[ppp.git] / pppd / options.c
index 7f4f5eb80af4d68004811a868b4f11e9c7651119..f9f10b74ca4859a1d9181f1629ace04d69691eb1 100644 (file)
@@ -40,7 +40,7 @@
  * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */
 
-#define RCSID  "$Id: options.c,v 1.90 2002/12/04 23:03:32 paulus Exp $"
+#define RCSID  "$Id: options.c,v 1.93 2004/10/28 00:15:08 paulus Exp $"
 
 #include <ctype.h>
 #include <stdio.h>
 #ifdef PLUGIN
 #include <dlfcn.h>
 #endif
+
 #ifdef PPP_FILTER
 #include <pcap.h>
-#include <pcap-int.h>  /* XXX: To get struct pcap */
+/*
+ * DLT_PPP_WITH_DIRECTION is in current libpcap cvs, and should be in
+ * libpcap-0.8.4.  Until that is released, use DLT_PPP - but that means
+ * we lose the inbound and outbound qualifiers.
+ */
+#ifndef DLT_PPP_WITH_DIRECTION
+#define DLT_PPP_WITH_DIRECTION DLT_PPP
+#endif
 #endif
 
 #include "pppd.h"
@@ -77,9 +85,6 @@ struct option_value {
 /*
  * Option variables and default values.
  */
-#ifdef PPP_FILTER
-int    dflag = 0;              /* Tell libpcap we want debugging */
-#endif
 int    debug = 0;              /* Debug flag */
 int    kdebugflag = 0;         /* Tell kernel to print debug messages */
 int    default_device = 1;     /* Using /dev/tty or equivalent */
@@ -122,7 +127,6 @@ extern struct stat devstat;
 #ifdef PPP_FILTER
 struct bpf_program pass_filter;/* Filter program for packets to pass */
 struct bpf_program active_filter; /* Filter program for link-active pkts */
-pcap_t  pc;                    /* Fake struct pcap so we can compile expr */
 #endif
 
 char *current_option;          /* the name of the option being parsed */
@@ -286,9 +290,6 @@ option_t general_options[] = {
 #endif
 
 #ifdef PPP_FILTER
-    { "pdebug", o_int, &dflag,
-      "libpcap debugging", OPT_PRIO },
-
     { "pass-filter", 1, setpassfilter,
       "set filter for packets to pass", OPT_PRIO },
 
@@ -487,8 +488,8 @@ options_for_tty()
     size_t pl;
 
     dev = devnam;
-    if (strncmp(dev, "/dev/", 5) == 0)
-       dev += 5;
+    if ((p = strstr(dev, "/dev/")) != NULL)
+       dev = p + 5;
     if (dev[0] == 0 || strcmp(dev, "tty") == 0)
        return 1;               /* don't look for /etc/ppp/options.tty */
     pl = strlen(_PATH_TTYOPT) + strlen(dev) + 1;
@@ -1439,13 +1440,18 @@ static int
 setpassfilter(argv)
     char **argv;
 {
-    pc.linktype = DLT_PPP;
-    pc.snapshot = PPP_HDRLEN;
-    if (pcap_compile(&pc, &pass_filter, *argv, 1, netmask) == 0)
-       return 1;
-    option_error("error in pass-filter expression: %s\n", pcap_geterr(&pc));
-    return 0;
+    pcap_t *pc;
+    int ret = 0;
+
+    pc = pcap_open_dead(DLT_PPP_WITH_DIRECTION, 65535);
+    if (pcap_compile(pc, &pass_filter, *argv, 1, netmask) == -1) {
+       option_error("error in pass-filter expression: %s\n",
+                    pcap_geterr(pc));
+       ret = 1;
+    }
+    pcap_close(pc);
+
+    return ret;
 }
 
 /*
@@ -1455,13 +1461,18 @@ static int
 setactivefilter(argv)
     char **argv;
 {
-    pc.linktype = DLT_PPP;
-    pc.snapshot = PPP_HDRLEN;
-    if (pcap_compile(&pc, &active_filter, *argv, 1, netmask) == 0)
-       return 1;
-    option_error("error in active-filter expression: %s\n", pcap_geterr(&pc));
-    return 0;
+    pcap_t *pc;
+    int ret = 0;
+
+    pc = pcap_open_dead(DLT_PPP_WITH_DIRECTION, 65535);
+    if (pcap_compile(pc, &active_filter, *argv, 1, netmask) == -1) {
+       option_error("error in active-filter expression: %s\n",
+                    pcap_geterr(pc));
+       ret = 1;
+    }
+    pcap_close(pc);
+
+    return ret;
 }
 #endif
 
@@ -1483,7 +1494,6 @@ setdomain(argv)
     return (1);
 }
 
-
 static int
 setlogfile(argv)
     char **argv;
@@ -1511,6 +1521,7 @@ setlogfile(argv)
     log_default = 0;
     return 1;
 }
+
 #ifdef MAXOCTETS
 static int
 setmodir(argv)