]> git.ozlabs.org Git - ppp.git/blobdiff - pppd/sys-osf.c
fix compile problems on OSF/1
[ppp.git] / pppd / sys-osf.c
index c25c5163fadb65bd81e63df82c2b029c8b91eecc..c748720264b71f0a7ab5d849515db4f3dd3a137a 100644 (file)
@@ -26,7 +26,7 @@
  */
 
 #ifndef lint
-static char rcsid[] = "$Id: sys-osf.c,v 1.10 1996/07/01 01:20:17 paulus Exp $";
+static char rcsid[] = "$Id: sys-osf.c,v 1.17 1999/03/10 03:07:48 paulus Exp $";
 #endif
 
 #include <stdio.h>
@@ -50,12 +50,15 @@ static char rcsid[] = "$Id: sys-osf.c,v 1.10 1996/07/01 01:20:17 paulus Exp $";
 #include <sys/stat.h>
 #include <sys/time.h>
 #include <sys/poll.h>
+#include <sys/ioctl.h>
 #include <net/if.h>
+#include <net/if_dl.h>
 #include <net/if_arp.h>
 #include <net/route.h>
 #include <net/ppp_defs.h>
 #include <net/pppio.h>
 #include <netinet/in.h>
+#include <arpa/inet.h>
 
 #include "pppd.h"
 
@@ -182,7 +185,7 @@ sys_cleanup()
     if (ifaddrs[0])
        cifaddr(0, ifaddrs[0], ifaddrs[1]);
     if (default_route_gateway)
-       cifdefaultroute(0, default_route_gateway);
+       cifdefaultroute(0, 0, default_route_gateway);
     if (proxy_arp_addr)
        cifproxyarp(0, proxy_arp_addr);
 }
@@ -202,9 +205,10 @@ sys_close()
 /*
  * sys_check_options - check the options that the user specified
  */
-void
+int
 sys_check_options()
 {
+    return 1;
 }
 
 
@@ -750,7 +754,7 @@ output(unit, p, len)
     struct pollfd pfd;
 
     if (debug)
-       log_packet(p, len, "sent ");
+       log_packet(p, len, "sent ", LOG_DEBUG);
 
     data.len = len;
     data.buf = (caddr_t) p;
@@ -981,6 +985,8 @@ ccp_test(unit, opt_ptr, opt_len, for_transmit)
            break;
         wait_time(&tval);
     }
+    if (errno != 0)
+       syslog(LOG_ERR, "hard failure trying to get memory for a compressor: %m");
     return (errno == ENOSR)? 0: -1;
 }
 
@@ -1186,6 +1192,12 @@ sifaddr(u, o, h, m)
         ret = 0;
     }
 
+    ifr.ifr_metric = link_mtu;
+    if (ioctl(sockfd, SIOCSIPMTU, &ifr) < 0) {
+       syslog(LOG_ERR, "Couldn't set IP MTU: %m");
+        ret = 0;
+    }
+
     ifaddrs[0] = o;
     ifaddrs[1] = h;
     return (ret);
@@ -1204,6 +1216,7 @@ cifaddr(u, o, h)
     struct ifreq ifr;
 
     ifaddrs[0] = 0;
+    ifaddrs[1] = 0;
     bzero(&ifr, sizeof (ifr));
     strncpy(ifr.ifr_name, ifname, sizeof (ifr.ifr_name));
     SET_SA_FAMILY(ifr.ifr_addr, AF_INET);
@@ -1220,9 +1233,9 @@ cifaddr(u, o, h)
  * sifdefaultroute - assign a default route through the address given.
  */
 int
-sifdefaultroute(u, g)
+sifdefaultroute(u, l, g)
     int u;
-    u_int32_t g;
+    u_int32_t l, g;
 {
     struct ortentry rt;
 
@@ -1244,9 +1257,9 @@ sifdefaultroute(u, g)
  * cifdefaultroute - delete a default route through the address given.
  */
 int
-cifdefaultroute(u, g)
+cifdefaultroute(u, l, g)
     int u;
-    u_int32_t g;
+    u_int32_t l, g;
 {
     struct ortentry rt;
 
@@ -1398,9 +1411,9 @@ get_ether_addr(ipaddr, hwaddr)
 
 #define        WTMPFILE        "/usr/adm/wtmp"
 
-int
+void
 logwtmp(line, name, host)
-    char *line, *name, *host;
+    const char *line, *name, *host;
 {
     int fd;
     struct stat buf;
@@ -1490,6 +1503,71 @@ GetMask(addr)
     return mask;
 }
 
+/*
+ * have_route_to - determine if the system has any route to
+ * a given IP address.  `addr' is in network byte order.
+ * For demand mode to work properly, we have to ignore routes
+ * through our own interface.
+ */
+int have_route_to(u_int32_t addr)
+{
+       char buf[sizeof(struct rt_msghdr) + (sizeof(struct sockaddr_in))];
+       int status;
+       int s, n;
+       struct rt_msghdr *rtm;
+       struct sockaddr_in *sin;
+       int msglen = sizeof(*rtm) + (sizeof(*sin));
+       char *cp;
+       char msg[2048];
+
+       rtm = (struct rt_msghdr *)buf;
+       memset(rtm, 0, msglen);
+       rtm->rtm_msglen = msglen;
+       rtm->rtm_version = RTM_VERSION;
+       rtm->rtm_type = RTM_GET;
+       rtm->rtm_addrs = RTA_DST;
+       /* rtm->rtm_addrs, rtm_flags  should be set on output */
+
+       sin = (struct sockaddr_in *)((u_char *)rtm + sizeof(*rtm));
+       sin->sin_len = sizeof(*sin);
+       sin->sin_family = AF_INET;
+       sin->sin_addr.s_addr = addr;
+
+        status = 0;
+
+       if ((s = socket(PF_ROUTE, SOCK_RAW, 0)) < 0)
+               return -1;
+       if (write(s, (char *)rtm, msglen) != msglen) {
+               close(s);
+               return status == ESRCH? 0: -1;
+       }
+
+       n = read(s, msg, 2048);
+       close(s);
+       if (n <= 0)
+               return -1;
+
+       rtm = (struct rt_msghdr *) msg;
+       if (rtm->rtm_version != RTM_VERSION)
+               return -1;
+
+       /* here we try to work out if the route is through our own interface */
+       cp = (char *)(rtm + 1);
+       if (rtm->rtm_addrs & RTA_DST) {
+               struct sockaddr *sa = (struct sockaddr *) cp;
+               cp = (char *)(((unsigned long)cp + sa->sa_len
+                              + sizeof(long) - 1) & ~(sizeof(long) - 1));
+       }
+       if (rtm->rtm_addrs & RTA_GATEWAY) {
+               sin = (struct sockaddr_in *) cp;
+               if (sin->sin_addr.s_addr == ifaddrs[0]
+                   || sin->sin_addr.s_addr == ifaddrs[1])
+                       return 0;       /* route is through our interface */
+       }
+
+       return 1;
+}
+
 static int
 strioctl(fd, cmd, ptr, ilen, olen)
     int fd, cmd, ilen, olen;
@@ -1509,6 +1587,15 @@ strioctl(fd, cmd, ptr, ilen, olen)
     return 0;
 }
 
+/*
+ * Use the hostid as part of the random number seed.
+ */
+int
+get_host_seed()
+{
+    return gethostid();
+}
+
 /*
  * Code for locking/unlocking the serial device.
  * This code is derived from chat.c.