X-Git-Url: http://git.ozlabs.org/?a=blobdiff_plain;f=pppd%2Fsys-bsd.c;h=872986a656cc2390be872528bd6f6704e23482dc;hb=179ee8410220e164904f9808b5dd0512db106ee3;hp=3512867d1d9293f475f82a996a679815e8321a65;hpb=19f8889c4e8a9db53619288b5c69f0f7ab4d4159;p=ppp.git diff --git a/pppd/sys-bsd.c b/pppd/sys-bsd.c index 3512867..872986a 100644 --- a/pppd/sys-bsd.c +++ b/pppd/sys-bsd.c @@ -19,7 +19,7 @@ */ #ifndef lint -static char rcsid[] = "$Id: sys-bsd.c,v 1.10 1994/09/01 00:36:39 paulus Exp $"; +static char rcsid[] = "$Id: sys-bsd.c,v 1.13 1994/09/21 06:47:37 paulus Exp $"; #endif /* @@ -35,6 +35,7 @@ static char rcsid[] = "$Id: sys-bsd.c,v 1.10 1994/09/01 00:36:39 paulus Exp $"; #include #include +#include #include #include #include @@ -45,7 +46,6 @@ static char rcsid[] = "$Id: sys-bsd.c,v 1.10 1994/09/01 00:36:39 paulus Exp $"; #endif #include "pppd.h" -#include "ppp.h" static int initdisc = -1; /* Initial TTY discipline */ static int rtm_seq; @@ -79,6 +79,26 @@ note_debug_level() } } +/* + * ppp_available - check whether the system has any ppp interfaces + * (in fact we check whether we can do an ioctl on ppp0). + */ +int +ppp_available() +{ + int s, ok; + struct ifreq ifr; + + if ((s = socket(AF_INET, SOCK_DGRAM, 0)) < 0) + return 1; /* can't tell - maybe we're not root */ + + strncpy(ifr.ifr_name, "ppp0", sizeof (ifr.ifr_name)); + ok = ioctl(s, SIOCGIFFLAGS, (caddr_t) &ifr) >= 0; + close(s); + + return ok; +} + /* * establish_ppp - Turn the serial port into a ppp interface. */ @@ -181,9 +201,11 @@ set_up_tty(fd, local) if (!restore_term) inittermios = tios; - tios.c_cflag &= ~(CSIZE | CSTOPB | PARENB | CLOCAL | CRTSCTS); - if (crtscts == 1) + tios.c_cflag &= ~(CSIZE | CSTOPB | PARENB | CLOCAL); + if (crtscts > 0) tios.c_cflag |= CRTSCTS; + else if (crtscts < 0) + tios.c_cflag &= ~CRTSCTS; tios.c_cflag |= CS8 | CREAD | HUPCL; if (local || !modem) @@ -303,7 +325,7 @@ read_packet(buf) { int len; - if ((len = read(fd, buf, MTU + DLLHEADERLEN)) < 0) { + if ((len = read(fd, buf, PPP_MTU + PPP_HDRLEN)) < 0) { if (errno == EWOULDBLOCK) { MAINDEBUG((LOG_DEBUG, "read(fd): EWOULDBLOCK")); return -1; @@ -322,7 +344,7 @@ read_packet(buf) void ppp_send_config(unit, mtu, asyncmap, pcomp, accomp) int unit, mtu; - uint32 asyncmap; + u_int32_t asyncmap; int pcomp, accomp; { u_int x; @@ -373,7 +395,7 @@ ppp_set_xaccm(unit, accm) void ppp_recv_config(unit, mru, asyncmap, pcomp, accomp) int unit, mru; - uint32 asyncmap; + u_int32_t asyncmap; int pcomp, accomp; { int x; @@ -405,7 +427,7 @@ ccp_test(unit, opt_ptr, opt_len, for_transmit) int unit, opt_len, for_transmit; u_char *opt_ptr; { - struct ppp_comp_data data; + struct ppp_option_data data; data.ptr = opt_ptr; data.length = opt_len; @@ -432,6 +454,24 @@ ccp_flags_set(unit, isopen, isup) syslog(LOG_ERR, "ioctl(PPPIOCSFLAGS): %m"); } +/* + * ccp_fatal_error - returns 1 if decompression was disabled as a + * result of an error detected after decompression of a packet, + * 0 otherwise. This is necessary because of patent nonsense. + */ +int +ccp_fatal_error(unit) + int unit; +{ + int x; + + if (ioctl(fd, PPPIOCGFLAGS, (caddr_t) &x) < 0) { + syslog(LOG_ERR, "ioctl(PPPIOCGFLAGS): %m"); + return 0; + } + return x & SC_DC_FERROR; +} + /* * sifvjcomp - config tcp header compression */ @@ -467,6 +507,7 @@ sifup(u) { struct ifreq ifr; u_int x; + struct npioctl npi; strncpy(ifr.ifr_name, ifname, sizeof (ifr.ifr_name)); if (ioctl(s, SIOCGIFFLAGS, (caddr_t) &ifr) < 0) { @@ -478,14 +519,23 @@ sifup(u) syslog(LOG_ERR, "ioctl(SIOCSIFFLAGS): %m"); return 0; } - if (ioctl(fd, PPPIOCGFLAGS, (caddr_t) &x) < 0) { - syslog(LOG_ERR, "ioctl (PPPIOCGFLAGS): %m"); - return 0; - } - x |= SC_ENABLE_IP; - if (ioctl(fd, PPPIOCSFLAGS, (caddr_t) &x) < 0) { - syslog(LOG_ERR, "ioctl(PPPIOCSFLAGS): %m"); - return 0; + npi.protocol = PPP_IP; + npi.mode = NPMODE_PASS; + if (ioctl(fd, PPPIOCSNPMODE, &npi) < 0) { + if (errno != ENOTTY) { + syslog(LOG_ERR, "ioctl(PPPIOCSNPMODE): %m"); + return 0; + } + /* for backwards compatibility */ + if (ioctl(fd, PPPIOCGFLAGS, (caddr_t) &x) < 0) { + syslog(LOG_ERR, "ioctl (PPPIOCGFLAGS): %m"); + return 0; + } + x |= SC_ENABLE_IP; + if (ioctl(fd, PPPIOCSFLAGS, (caddr_t) &x) < 0) { + syslog(LOG_ERR, "ioctl(PPPIOCSFLAGS): %m"); + return 0; + } } return 1; } @@ -500,18 +550,30 @@ sifdown(u) struct ifreq ifr; u_int x; int rv; + struct npioctl npi; rv = 1; - if (ioctl(fd, PPPIOCGFLAGS, (caddr_t) &x) < 0) { - syslog(LOG_ERR, "ioctl (PPPIOCGFLAGS): %m"); - rv = 0; - } else { - x &= ~SC_ENABLE_IP; - if (ioctl(fd, PPPIOCSFLAGS, (caddr_t) &x) < 0) { - syslog(LOG_ERR, "ioctl(PPPIOCSFLAGS): %m"); + npi.protocol = PPP_IP; + npi.mode = NPMODE_ERROR; + if (ioctl(fd, PPPIOCSNPMODE, (caddr_t) &npi) < 0) { + if (errno != ENOTTY) { + syslog(LOG_ERR, "ioctl(PPPIOCSNPMODE): %m"); rv = 0; + } else { + /* backwards compatibility */ + if (ioctl(fd, PPPIOCGFLAGS, (caddr_t) &x) < 0) { + syslog(LOG_ERR, "ioctl (PPPIOCGFLAGS): %m"); + rv = 0; + } else { + x &= ~SC_ENABLE_IP; + if (ioctl(fd, PPPIOCSFLAGS, (caddr_t) &x) < 0) { + syslog(LOG_ERR, "ioctl(PPPIOCSFLAGS): %m"); + rv = 0; + } + } } } + strncpy(ifr.ifr_name, ifname, sizeof (ifr.ifr_name)); if (ioctl(s, SIOCGIFFLAGS, (caddr_t) &ifr) < 0) { syslog(LOG_ERR, "ioctl (SIOCGIFFLAGS): %m"); @@ -541,7 +603,7 @@ sifdown(u) int sifaddr(u, o, h, m) int u; - uint32 o, h, m; + u_int32_t o, h, m; { struct ifaliasreq ifra; @@ -572,7 +634,7 @@ sifaddr(u, o, h, m) int cifaddr(u, o, h) int u; - uint32 o, h; + u_int32_t o, h; { struct ifaliasreq ifra; @@ -595,7 +657,7 @@ cifaddr(u, o, h) int sifdefaultroute(u, g) int u; - uint32 g; + u_int32_t g; { return dodefaultroute(g, 's'); } @@ -606,7 +668,7 @@ sifdefaultroute(u, g) int cifdefaultroute(u, g) int u; - uint32 g; + u_int32_t g; { return dodefaultroute(g, 'c'); } @@ -616,7 +678,7 @@ cifdefaultroute(u, g) */ int dodefaultroute(g, cmd) - uint32 g; + u_int32_t g; int cmd; { int routes; @@ -674,7 +736,7 @@ static int arpmsg_valid; int sifproxyarp(unit, hisaddr) int unit; - uint32 hisaddr; + u_int32_t hisaddr; { int routes; int l; @@ -724,7 +786,7 @@ sifproxyarp(unit, hisaddr) int cifproxyarp(unit, hisaddr) int unit; - uint32 hisaddr; + u_int32_t hisaddr; { int routes; @@ -758,7 +820,7 @@ cifproxyarp(unit, hisaddr) int sifproxyarp(unit, hisaddr) int unit; - uint32 hisaddr; + u_int32_t hisaddr; { struct arpreq arpreq; struct { @@ -797,7 +859,7 @@ sifproxyarp(unit, hisaddr) int cifproxyarp(unit, hisaddr) int unit; - uint32 hisaddr; + u_int32_t hisaddr; { struct arpreq arpreq; @@ -821,11 +883,11 @@ cifproxyarp(unit, hisaddr) int get_ether_addr(ipaddr, hwaddr) - uint32 ipaddr; + u_int32_t ipaddr; struct sockaddr_dl *hwaddr; { struct ifreq *ifr, *ifend, *ifp; - uint32 ina, mask; + u_int32_t ina, mask; struct sockaddr_dl *dla; struct ifreq ifreq; struct ifconf ifc; @@ -895,24 +957,3 @@ get_ether_addr(ipaddr, hwaddr) return 0; } - - -/* - * ppp_available - check whether the system has any ppp interfaces - * (in fact we check whether we can do an ioctl on ppp0). - */ -int -ppp_available() -{ - int s, ok; - struct ifreq ifr; - - if ((s = socket(AF_INET, SOCK_DGRAM, 0)) < 0) - return 1; /* can't tell - maybe we're not root */ - - strncpy(ifr.ifr_name, "ppp0", sizeof (ifr.ifr_name)); - ok = ioctl(s, SIOCGIFFLAGS, (caddr_t) &ifr) >= 0; - close(s); - - return ok; -}