X-Git-Url: http://git.ozlabs.org/?p=ppp.git;a=blobdiff_plain;f=pppd%2Fsys-svr4.c;h=f43427ed94585258c4ef5df5b0d3681bbfda16f0;hp=cccfeaa1972902e33c967c243ef9285ae26ca76a;hb=9966eb6276e5bf255944a163aabb7e7633b47f34;hpb=410dec1de0ee4520be8fd6840dc5974bb627101b diff --git a/pppd/sys-svr4.c b/pppd/sys-svr4.c index cccfeaa..f43427e 100644 --- a/pppd/sys-svr4.c +++ b/pppd/sys-svr4.c @@ -26,14 +26,18 @@ */ #ifndef lint -static char rcsid[] = "$Id: sys-svr4.c,v 1.9 1996/01/01 23:06:39 paulus Exp $"; +static char rcsid[] = "$Id: sys-svr4.c,v 1.13 1996/09/14 05:18:24 paulus Exp $"; #endif #include #include #include #include +#ifdef SNI +extern void *alloca(size_t); +#else #include +#endif #include #include #include @@ -100,6 +104,7 @@ static int dlpi_info_req __P((int)); static int dlpi_get_reply __P((int, union DL_primitives *, int, int)); static int strioctl __P((int, int, void *, int, int)); + /* * sys_init - System-dependent initialization. */ @@ -115,11 +120,6 @@ sys_init() } reply; #endif - openlog("pppd", LOG_PID | LOG_NDELAY, LOG_PPP); - setlogmask(LOG_UPTO(LOG_INFO)); - if (debug) - setlogmask(LOG_UPTO(LOG_DEBUG)); - ipfd = open("/dev/ip", O_RDWR, 0); if (ipfd < 0) { syslog(LOG_ERR, "Couldn't open IP device: %m"); @@ -134,7 +134,7 @@ sys_init() syslog(LOG_ERR, "Can't open /dev/ppp: %m"); die(1); } - if (kdebugflag) { + if (kdebugflag & 1) { x = PPPDBG_LOG + PPPDBG_DRIVER; strioctl(pppfd, PPPIO_DEBUG, &x, sizeof(int), 0); } @@ -155,7 +155,7 @@ sys_init() syslog(LOG_ERR, "Can't open /dev/ppp (2): %m"); die(1); } - if (kdebugflag) { + if (kdebugflag & 1) { x = PPPDBG_LOG + PPPDBG_DRIVER; strioctl(ifd, PPPIO_DEBUG, &x, sizeof(int), 0); } @@ -218,7 +218,6 @@ sys_close() close(ipfd); if (pppfd >= 0) close(pppfd); - closelog(); } /* @@ -254,19 +253,6 @@ daemon(nochdir, noclose) return 0; } -/* - * note_debug_level - note a change in the debug level. - */ -void -note_debug_level() -{ - if (debug) { - setlogmask(LOG_UPTO(LOG_DEBUG)); - } else { - setlogmask(LOG_UPTO(LOG_WARNING)); - } -} - /* * ppp_available - check whether the system has any ppp interfaces */ @@ -299,10 +285,18 @@ establish_ppp(fd) syslog(LOG_ERR, "Couldn't push PPP Async HDLC module: %m"); die(1); } + if (kdebugflag & 4) { + i = PPPDBG_LOG + PPPDBG_AHDLC; + strioctl(pppfd, PPPIO_DEBUG, &i, sizeof(int), 0); + } if (ioctl(fd, I_PUSH, "ppp_comp") < 0) { syslog(LOG_ERR, "Couldn't push PPP compression module: %m"); /* die(1); */ } + if (kdebugflag & 2) { + i = PPPDBG_LOG + PPPDBG_COMP; + strioctl(pppfd, PPPIO_DEBUG, &i, sizeof(int), 0); + } /* Link the serial port under the PPP multiplexor. */ if ((fdmuxid = ioctl(pppfd, I_LINK, fd)) < 0) { @@ -711,6 +705,7 @@ wait_input(timo) * loopback, for the length of time specified by *timo (indefinite * if timo is NULL). */ +void wait_loop_output(timo) struct timeval *timo; { @@ -721,6 +716,7 @@ wait_loop_output(timo) * wait_time - wait for a given length of time or until a * signal is received. */ +void wait_time(timo) struct timeval *timo; { @@ -809,13 +805,16 @@ ppp_send_config(unit, mtu, asyncmap, pcomp, accomp) return; syslog(LOG_ERR, "Couldn't set MTU: %m"); } - if (strioctl(pppfd, PPPIO_XACCM, &asyncmap, sizeof(asyncmap), 0) < 0) { - syslog(LOG_ERR, "Couldn't set transmit ACCM: %m"); - } - cf[0] = (pcomp? COMP_PROT: 0) + (accomp? COMP_AC: 0); - cf[1] = COMP_PROT | COMP_AC; - if (strioctl(pppfd, PPPIO_CFLAGS, cf, sizeof(cf), sizeof(int)) < 0) { - syslog(LOG_ERR, "Couldn't set prot/AC compression: %m"); + if (fdmuxid >= 0) { + /* can't set these if we don't have a stream attached below /dev/ppp */ + if (strioctl(pppfd, PPPIO_XACCM, &asyncmap, sizeof(asyncmap), 0) < 0) { + syslog(LOG_ERR, "Couldn't set transmit ACCM: %m"); + } + cf[0] = (pcomp? COMP_PROT: 0) + (accomp? COMP_AC: 0); + cf[1] = COMP_PROT | COMP_AC; + if (strioctl(pppfd, PPPIO_CFLAGS, cf, sizeof(cf), sizeof(int)) < 0) { + syslog(LOG_ERR, "Couldn't set prot/AC compression: %m"); + } } } @@ -827,7 +826,8 @@ ppp_set_xaccm(unit, accm) int unit; ext_accm accm; { - if (strioctl(pppfd, PPPIO_XACCM, accm, sizeof(ext_accm), 0) < 0) { + if (fdmuxid >= 0 + && strioctl(pppfd, PPPIO_XACCM, accm, sizeof(ext_accm), 0) < 0) { if (!hungup || errno != ENXIO) syslog(LOG_WARNING, "Couldn't set extended ACCM: %m"); } @@ -851,13 +851,16 @@ ppp_recv_config(unit, mru, asyncmap, pcomp, accomp) return; syslog(LOG_ERR, "Couldn't set MRU: %m"); } - if (strioctl(pppfd, PPPIO_RACCM, &asyncmap, sizeof(asyncmap), 0) < 0) { - syslog(LOG_ERR, "Couldn't set receive ACCM: %m"); - } - cf[0] = (pcomp? DECOMP_PROT: 0) + (accomp? DECOMP_AC: 0); - cf[1] = DECOMP_PROT | DECOMP_AC; - if (strioctl(pppfd, PPPIO_CFLAGS, cf, sizeof(cf), sizeof(int)) < 0) { - syslog(LOG_ERR, "Couldn't set prot/AC decompression: %m"); + if (fdmuxid >= 0) { + /* can't set these if we don't have a stream attached below /dev/ppp */ + if (strioctl(pppfd, PPPIO_RACCM, &asyncmap, sizeof(asyncmap), 0) < 0) { + syslog(LOG_ERR, "Couldn't set receive ACCM: %m"); + } + cf[0] = (pcomp? DECOMP_PROT: 0) + (accomp? DECOMP_AC: 0); + cf[1] = DECOMP_PROT | DECOMP_AC; + if (strioctl(pppfd, PPPIO_CFLAGS, cf, sizeof(cf), sizeof(int)) < 0) { + syslog(LOG_ERR, "Couldn't set prot/AC decompression: %m"); + } } } @@ -904,6 +907,33 @@ get_idle_time(u, ip) return strioctl(pppfd, PPPIO_GIDLE, ip, 0, sizeof(struct ppp_idle)) >= 0; } +#if 0 +/* + * 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 (strioctl(pppfd, PPPIO_PASSFILT, pass, + sizeof(struct bpf_program), 0) < 0) { + syslog(LOG_ERR, "Couldn't set pass-filter in kernel: %m"); + ret = 0; + } + } + if (active->bf_len > 0) { + if (strioctl(pppfd, PPPIO_ACTIVEFILT, active, + sizeof(struct bpf_program), 0) < 0) { + syslog(LOG_ERR, "Couldn't set active-filter in kernel: %m"); + ret = 0; + } + } + return ret; +} +#endif /* * ccp_fatal_error - returns 1 if decompression was disabled as a @@ -1037,6 +1067,11 @@ sifaddr(u, o, h, m) memset(&ifr, 0, sizeof(ifr)); strncpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name)); ifr.ifr_addr.sa_family = AF_INET; + INET_ADDR(ifr.ifr_addr) = m; + if (ioctl(ipfd, SIOCSIFNETMASK, &ifr) < 0) { + syslog(LOG_ERR, "Couldn't set IP netmask: %m"); + } + ifr.ifr_addr.sa_family = AF_INET; INET_ADDR(ifr.ifr_addr) = o; if (ioctl(ipfd, SIOCSIFADDR, &ifr) < 0) { syslog(LOG_ERR, "Couldn't set local IP address: %m"); @@ -1046,11 +1081,6 @@ sifaddr(u, o, h, m) if (ioctl(ipfd, SIOCSIFDSTADDR, &ifr) < 0) { syslog(LOG_ERR, "Couldn't set remote IP address: %m"); } - ifr.ifr_addr.sa_family = AF_INET; - INET_ADDR(ifr.ifr_addr) = m; - if (ioctl(ipfd, SIOCSIFNETMASK, &ifr) < 0) { - syslog(LOG_ERR, "Couldn't set IP netmask: %m"); - } ifr.ifr_metric = link_mtu; if (ioctl(ipfd, SIOCSIFMTU, &ifr) < 0) { syslog(LOG_ERR, "Couldn't set IP MTU: %m"); @@ -1090,6 +1120,7 @@ sifdefaultroute(u, g) { struct rtentry rt; + memset(&rt, 0, sizeof(rt)); rt.rt_dst.sa_family = AF_INET; INET_ADDR(rt.rt_dst) = 0; rt.rt_gateway.sa_family = AF_INET; @@ -1115,6 +1146,7 @@ cifdefaultroute(u, g) { struct rtentry rt; + memset(&rt, 0, sizeof(rt)); rt.rt_dst.sa_family = AF_INET; INET_ADDR(rt.rt_dst) = 0; rt.rt_gateway.sa_family = AF_INET;