X-Git-Url: http://git.ozlabs.org/?p=ppp.git;a=blobdiff_plain;f=pppd%2Fsys-osf.c;h=c748720264b71f0a7ab5d849515db4f3dd3a137a;hp=c25c5163fadb65bd81e63df82c2b029c8b91eecc;hb=f0a6c417e65393d127a9f0fe0ba668ec2d2fdf3b;hpb=8407d5770b822a01eb5776c0cda17f64d9592550 diff --git a/pppd/sys-osf.c b/pppd/sys-osf.c index c25c516..c748720 100644 --- a/pppd/sys-osf.c +++ b/pppd/sys-osf.c @@ -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 @@ -50,12 +50,15 @@ static char rcsid[] = "$Id: sys-osf.c,v 1.10 1996/07/01 01:20:17 paulus Exp $"; #include #include #include +#include #include +#include #include #include #include #include #include +#include #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.