]> git.ozlabs.org Git - ppp.git/blobdiff - pppd/sys-bsd.c
Fixes for freebsd
[ppp.git] / pppd / sys-bsd.c
index 5f0d66d9a2f85cf2624cb072a5654f7d31bfb03f..0e64dcd364cbffd197291d326acb590f69c0fce4 100644 (file)
@@ -21,7 +21,8 @@
  */
 
 #ifndef lint
-static char rcsid[] = "$Id: sys-bsd.c,v 1.27 1997/03/04 03:43:53 paulus Exp $";
+static char rcsid[] = "$Id: sys-bsd.c,v 1.31 1998/04/02 12:04:19 paulus Exp $";
+/*     $NetBSD: sys-bsd.c,v 1.1.1.3 1997/09/26 18:53:04 christos Exp $ */
 #endif
 
 /*
@@ -42,6 +43,13 @@ static char rcsid[] = "$Id: sys-bsd.c,v 1.27 1997/03/04 03:43:53 paulus Exp $";
 #include <sys/socket.h>
 #include <sys/time.h>
 #include <sys/stat.h>
+#include <sys/param.h>
+#ifdef NetBSD1_2
+#include <util.h>
+#endif
+#ifdef PPP_FILTER
+#include <net/bpf.h>
+#endif
 
 #include <net/if.h>
 #include <net/ppp_defs.h>
@@ -51,10 +59,21 @@ static char rcsid[] = "$Id: sys-bsd.c,v 1.27 1997/03/04 03:43:53 paulus Exp $";
 #include <netinet/in.h>
 
 #if RTM_VERSION >= 3
+#include <sys/param.h>
+#if defined(NetBSD) && (NetBSD >= 199703)
+#include <netinet/if_inarp.h>
+#else  /* NetBSD 1.2D or later */
+#ifdef __FreeBSD__
 #include <netinet/if_ether.h>
+#else
+#include <net/if_ether.h>
+#endif
+#endif
 #endif
 
 #include "pppd.h"
+#include "fsm.h"
+#include "ipcp.h"
 
 static int initdisc = -1;      /* Initial TTY discipline for ppp_fd */
 static int initfdflags = -1;   /* Initial file descriptor flags for ppp_fd */
@@ -145,7 +164,6 @@ sys_check_options()
 {
 }
 
-
 /*
  * ppp_available - check whether the system has any ppp interfaces
  * (in fact we check whether we can do an ioctl on ppp0).
@@ -523,7 +541,7 @@ output(unit, p, len)
     int len;
 {
     if (debug)
-       log_packet(p, len, "sent ");
+       log_packet(p, len, "sent ", LOG_DEBUG);
 
     if (write(ttyfd, p, len) < 0) {
        if (errno != EIO)
@@ -793,6 +811,32 @@ get_idle_time(u, ip)
 }
 
 
+#ifdef PPP_FILTER
+/*
+ * set_filters - transfer the pass and active filters to the kernel.
+ */
+int
+set_filters(pass, active)
+    struct bpf_program *pass, *active;
+{
+    int ret = 1;
+
+    if (pass->bf_len > 0) {
+       if (ioctl(ppp_fd, PPPIOCSPASS, pass) < 0) {
+           syslog(LOG_ERR, "Couldn't set pass-filter in kernel: %m");
+           ret = 0;
+       }
+    }
+    if (active->bf_len > 0) {
+       if (ioctl(ppp_fd, PPPIOCSACTIVE, active) < 0) {
+           syslog(LOG_ERR, "Couldn't set active-filter in kernel: %m");
+           ret = 0;
+       }
+    }
+    return ret;
+}
+#endif
+
 /*
  * sifvjcomp - config tcp header compression
  */
@@ -912,6 +956,7 @@ sifaddr(u, o, h, m)
     u_int32_t o, h, m;
 {
     struct ifaliasreq ifra;
+    struct ifreq ifr;
 
     strncpy(ifra.ifra_name, ifname, sizeof(ifra.ifra_name));
     SET_SA_FAMILY(ifra.ifra_addr, AF_INET);
@@ -923,6 +968,12 @@ sifaddr(u, o, h, m)
        ((struct sockaddr_in *) &ifra.ifra_mask)->sin_addr.s_addr = m;
     } else
        BZERO(&ifra.ifra_mask, sizeof(ifra.ifra_mask));
+    BZERO(&ifr, sizeof(ifr));
+    strncpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name));
+    if (ioctl(sockfd, SIOCDIFADDR, (caddr_t) &ifr) < 0) {
+       if (errno != EADDRNOTAVAIL)
+           syslog(LOG_WARNING, "Couldn't remove interface address: %m");
+    }
     if (ioctl(sockfd, SIOCAIFADDR, (caddr_t) &ifra) < 0) {
        if (errno != EEXIST) {
            syslog(LOG_ERR, "Couldn't set interface address: %m");
@@ -1343,6 +1394,15 @@ GetMask(addr)
     return mask;
 }
 
+/*
+ * Use the hostid as part of the random number seed.
+ */
+int
+get_host_seed()
+{
+    return gethostid();
+}
+
 /*
  * lock - create a lock file for the named lock device
  */