*/
#ifndef lint
-static char rcsid[] = "$Id: sys-svr4.c,v 1.11 1996/05/27 00:01:53 paulus Exp $";
+static char rcsid[] = "$Id: sys-svr4.c,v 1.15 1997/03/04 03:43:54 paulus Exp $";
#endif
#include <limits.h>
#include <stdio.h>
#include <stddef.h>
#include <stdlib.h>
+#if defined(SNI) || defined(__USLC__)
+extern void *alloca(size_t);
+#else
#include <alloca.h>
+#endif
#include <ctype.h>
#include <errno.h>
#include <fcntl.h>
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);
}
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);
}
if (if_is_up)
sifdown(0);
if (default_route_gateway)
- cifdefaultroute(0, default_route_gateway);
+ cifdefaultroute(0, default_route_gateway, default_route_gateway);
if (proxy_arp_addr)
cifproxyarp(0, proxy_arp_addr);
}
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) {
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");
+ }
}
}
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");
}
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");
+ }
}
}
int u;
u_int32_t o, h;
{
-#if 0
+#if defined(__USLC__) /* was: #if 0 */
+ cifroute(unit, ouraddr, hisaddr);
if (ipmuxid >= 0) {
+ syslog(LOG_NOTICE, "Removing ppp interface unit");
if (ioctl(ipfd, I_UNLINK, ipmuxid) < 0) {
syslog(LOG_ERR, "Can't remove ppp interface unit: %m");
return 0;
* 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 rtentry rt;
+#if defined(__USLC__)
+ g = l; /* use the local address as gateway */
+#endif
memset(&rt, 0, sizeof(rt));
rt.rt_dst.sa_family = AF_INET;
INET_ADDR(rt.rt_dst) = 0;
* 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 rtentry rt;
+#if defined(__USLC__)
+ g = l; /* use the local address as gateway */
+#endif
memset(&rt, 0, sizeof(rt));
rt.rt_dst.sa_family = AF_INET;
INET_ADDR(rt.rt_dst) = 0;
/*
* logwtmp - write an accounting record to the /var/adm/wtmp file.
*/
-int
+void
logwtmp(line, name, host)
- char *line, *name, *host;
+ const char *line, *name, *host;
{
static struct utmpx utmpx;
}
gettimeofday(&utmpx.ut_tv, NULL);
updwtmpx("/var/adm/wtmpx", &utmpx);
- return 0;
}
/*
lock_file[0] = 0;
}
}
+
+
+/*
+ * cifroute - delete a route through the addresses given.
+ */
+int
+cifroute(u, our, his)
+ int u;
+ u_int32_t our, his;
+{
+ struct rtentry rt;
+
+ memset(&rt, 0, sizeof(rt));
+ rt.rt_dst.sa_family = AF_INET;
+ INET_ADDR(rt.rt_dst) = his;
+ rt.rt_gateway.sa_family = AF_INET;
+ INET_ADDR(rt.rt_gateway) = our;
+ rt.rt_flags = RTF_HOST;
+
+ if (ioctl(ipfd, SIOCDELRT, &rt) < 0) {
+ syslog(LOG_ERR, "Can't delete route: %m");
+ return 0;
+ }
+
+ return 1;
+}