*/
#ifndef lint
-static char rcsid[] = "$Id: sys-svr4.c,v 1.13 1996/09/14 05:18:24 paulus Exp $";
+static char rcsid[] = "$Id: sys-svr4.c,v 1.17 1998/03/25 02:19:31 paulus Exp $";
#endif
#include <limits.h>
#include <stdio.h>
#include <stddef.h>
#include <stdlib.h>
-#ifdef SNI
-extern void *alloca(size_t);
-#else
-#include <alloca.h>
-#endif
#include <ctype.h>
#include <errno.h>
#include <fcntl.h>
static struct termios inittermios;
#ifndef CRTSCTS
static struct termiox inittermiox;
+static int termiox_ok;
#endif
static struct winsize wsinfo; /* Initial window size info */
static pid_t tty_sid; /* original session ID for terminal */
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);
}
}
#ifndef CRTSCTS
+ termiox_ok = 1;
if (ioctl (fd, TCGETX, &tiox) < 0) {
- syslog (LOG_ERR, "TCGETX: %m");
- die (1);
+ termiox_ok = 0;
+ if (errno != ENOTTY)
+ syslog (LOG_ERR, "TCGETX: %m");
}
#endif
else if (crtscts < 0)
tios.c_cflag &= ~CRTSCTS;
#else
- if (crtscts > 0) {
+ if (crtscts != 0 && !termiox_ok) {
+ syslog(LOG_ERR, "Can't set RTS/CTS flow control");
+ } else if (crtscts > 0) {
tiox.x_hflag |= RTSXOFF|CTSXON;
- }
- else if (crtscts < 0) {
+ } else if (crtscts < 0) {
tiox.x_hflag &= ~(RTSXOFF|CTSXON);
}
#endif
}
#ifndef CRTSCTS
- if (ioctl (fd, TCSETXF, &tiox) < 0){
+ if (termiox_ok && ioctl (fd, TCSETXF, &tiox) < 0){
syslog (LOG_ERR, "TCSETXF: %m");
- die (1);
}
#endif
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;
int pcomp, accomp;
{
int cf[2];
+ struct ifreq ifr;
link_mtu = mtu;
if (strioctl(pppfd, PPPIO_MTU, &mtu, sizeof(mtu), 0) < 0) {
syslog(LOG_ERR, "Couldn't set prot/AC compression: %m");
}
}
+
+ /* set the MTU for IP as well */
+ memset(&ifr, 0, sizeof(ifr));
+ strncpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name));
+ ifr.ifr_metric = link_mtu;
+ if (ioctl(ipfd, SIOCSIFMTU, &ifr) < 0) {
+ syslog(LOG_ERR, "Couldn't set IP MTU: %m");
+ }
}
/*
u_int32_t o, h, m;
{
struct ifreq ifr;
+ int ret = 1;
memset(&ifr, 0, sizeof(ifr));
strncpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name));
INET_ADDR(ifr.ifr_addr) = m;
if (ioctl(ipfd, SIOCSIFNETMASK, &ifr) < 0) {
syslog(LOG_ERR, "Couldn't set IP netmask: %m");
+ ret = 0;
}
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");
+ ret = 0;
+ }
+
+ /*
+ * On some systems, we have to explicitly set the point-to-point
+ * flag bit before we can set a destination address.
+ */
+ if (ioctl(ipfd, SIOCGIFFLAGS, &ifr) >= 0
+ && (ifr.ifr_flags & IFF_POINTOPOINT) == 0) {
+ ifr.ifr_flags |= IFF_POINTOPOINT;
+ if (ioctl(ipfd, SIOCSIFFLAGS, &ifr) < 0) {
+ syslog(LOG_ERR, "Couldn't mark interface pt-to-pt: %m");
+ ret = 0;
+ }
}
ifr.ifr_dstaddr.sa_family = AF_INET;
INET_ADDR(ifr.ifr_dstaddr) = h;
if (ioctl(ipfd, SIOCSIFDSTADDR, &ifr) < 0) {
syslog(LOG_ERR, "Couldn't set remote IP address: %m");
+ ret = 0;
}
+#if 0 /* now done in ppp_send_config */
ifr.ifr_metric = link_mtu;
if (ioctl(ipfd, SIOCSIFMTU, &ifr) < 0) {
syslog(LOG_ERR, "Couldn't set IP MTU: %m");
}
+#endif
- return 1;
+ return ret;
}
/*
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;
#endif
nif = MAX_IFS;
ifc.ifc_len = nif * sizeof(struct ifreq);
- ifc.ifc_buf = (caddr_t) alloca(ifc.ifc_len);
- if (ifc.ifc_req == 0)
+ ifc.ifc_buf = (caddr_t) malloc(ifc.ifc_len);
+ if (ifc.ifc_buf == 0)
return 0;
if (ioctl(ipfd, SIOCGIFCONF, &ifc) < 0) {
syslog(LOG_WARNING, "Couldn't get system interface list: %m");
+ free(ifc.ifc_buf);
return 0;
}
ifend = (struct ifreq *) (ifc.ifc_buf + ifc.ifc_len);
if (ifr >= ifend) {
syslog(LOG_WARNING, "No suitable interface found for proxy ARP");
+ free(ifc.ifc_buf);
return 0;
}
syslog(LOG_INFO, "found interface %s for proxy ARP", ifr->ifr_name);
if (!get_hw_addr(ifr->ifr_name, hwaddr)) {
syslog(LOG_ERR, "Couldn't get hardware address for %s", ifr->ifr_name);
+ free(ifc.ifc_buf);
return 0;
}
+ free(ifc.ifc_buf);
return 1;
}
#endif
nif = MAX_IFS;
ifc.ifc_len = nif * sizeof(struct ifreq);
- ifc.ifc_buf = (caddr_t) alloca(ifc.ifc_len);
- if (ifc.ifc_req == 0)
+ ifc.ifc_buf = (caddr_t) malloc(ifc.ifc_len);
+ if (ifc.ifc_buf == 0)
return mask;
if (ioctl(ipfd, SIOCGIFCONF, &ifc) < 0) {
syslog(LOG_WARNING, "Couldn't get system interface list: %m");
+ free(ifc.ifc_buf);
return mask;
}
ifend = (struct ifreq *) (ifc.ifc_buf + ifc.ifc_len);
mask |= INET_ADDR(ifreq.ifr_addr);
}
+ free(ifc.ifc_buf);
return mask;
}
/*
* 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;
}
/*
- * gethostid - return the serial number of this machine.
+ * get_host_seed - return the serial number of this machine.
*/
int
-gethostid()
+get_host_seed()
{
char buf[32];
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;
+}