Home | History | Annotate | Download | only in pppd
      1 /*
      2  * sys-linux.c - System-dependent procedures for setting up
      3  * PPP interfaces on Linux systems
      4  *
      5  * Copyright (c) 1994-2004 Paul Mackerras. All rights reserved.
      6  *
      7  * Redistribution and use in source and binary forms, with or without
      8  * modification, are permitted provided that the following conditions
      9  * are met:
     10  *
     11  * 1. Redistributions of source code must retain the above copyright
     12  *    notice, this list of conditions and the following disclaimer.
     13  *
     14  * 2. The name(s) of the authors of this software must not be used to
     15  *    endorse or promote products derived from this software without
     16  *    prior written permission.
     17  *
     18  * 3. Redistributions of any form whatsoever must retain the following
     19  *    acknowledgment:
     20  *    "This product includes software developed by Paul Mackerras
     21  *     <paulus (at) samba.org>".
     22  *
     23  * THE AUTHORS OF THIS SOFTWARE DISCLAIM ALL WARRANTIES WITH REGARD TO
     24  * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
     25  * AND FITNESS, IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
     26  * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
     27  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
     28  * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
     29  * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
     30  *
     31  * Derived from main.c and pppd.h, which are:
     32  *
     33  * Copyright (c) 1984-2000 Carnegie Mellon University. All rights reserved.
     34  *
     35  * Redistribution and use in source and binary forms, with or without
     36  * modification, are permitted provided that the following conditions
     37  * are met:
     38  *
     39  * 1. Redistributions of source code must retain the above copyright
     40  *    notice, this list of conditions and the following disclaimer.
     41  *
     42  * 2. Redistributions in binary form must reproduce the above copyright
     43  *    notice, this list of conditions and the following disclaimer in
     44  *    the documentation and/or other materials provided with the
     45  *    distribution.
     46  *
     47  * 3. The name "Carnegie Mellon University" must not be used to
     48  *    endorse or promote products derived from this software without
     49  *    prior written permission. For permission or any legal
     50  *    details, please contact
     51  *      Office of Technology Transfer
     52  *      Carnegie Mellon University
     53  *      5000 Forbes Avenue
     54  *      Pittsburgh, PA  15213-3890
     55  *      (412) 268-4387, fax: (412) 268-7395
     56  *      tech-transfer (at) andrew.cmu.edu
     57  *
     58  * 4. Redistributions of any form whatsoever must retain the following
     59  *    acknowledgment:
     60  *    "This product includes software developed by Computing Services
     61  *     at Carnegie Mellon University (http://www.cmu.edu/computing/)."
     62  *
     63  * CARNEGIE MELLON UNIVERSITY DISCLAIMS ALL WARRANTIES WITH REGARD TO
     64  * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
     65  * AND FITNESS, IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY BE LIABLE
     66  * FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
     67  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
     68  * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
     69  * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
     70  */
     71 
     72 #include <sys/ioctl.h>
     73 #include <sys/types.h>
     74 #include <sys/socket.h>
     75 #include <sys/time.h>
     76 #include <sys/errno.h>
     77 #include <sys/file.h>
     78 #include <sys/stat.h>
     79 #include <sys/utsname.h>
     80 #include <sys/sysmacros.h>
     81 
     82 #include <stdio.h>
     83 #include <stdlib.h>
     84 #include <syslog.h>
     85 #include <string.h>
     86 #include <time.h>
     87 #include <memory.h>
     88 #include <utmp.h>
     89 #include <mntent.h>
     90 #include <signal.h>
     91 #include <fcntl.h>
     92 #include <ctype.h>
     93 #include <termios.h>
     94 #include <unistd.h>
     95 #include <paths.h>
     96 
     97 /* This is in netdevice.h. However, this compile will fail miserably if
     98    you attempt to include netdevice.h because it has so many references
     99    to __memcpy functions which it should not attempt to do. So, since I
    100    really don't use it, but it must be defined, define it now. */
    101 
    102 #ifndef MAX_ADDR_LEN
    103 #define xxMAX_ADDR_LEN 7
    104 #endif
    105 
    106 #if __GLIBC__ >= 2
    107 #include <asm/types.h>		/* glibc 2 conflicts with linux/types.h */
    108 #include <net/if.h>
    109 #include <net/if_arp.h>
    110 #include <net/route.h>
    111 #include <netinet/if_ether.h>
    112 #else
    113 #include <linux/types.h>
    114 #include <linux/tty.h>
    115 #include <linux/if.h>
    116 #include <linux/if_arp.h>
    117 #include <linux/route.h>
    118 #include <linux/if_ether.h>
    119 #endif
    120 #include <linux/sockios.h>
    121 #include <netinet/in.h>
    122 #include <arpa/inet.h>
    123 
    124 #include <linux/ppp_defs.h>
    125 #include <linux/if_ppp.h>
    126 
    127 #include "pppd.h"
    128 #include "fsm.h"
    129 #include "ipcp.h"
    130 
    131 #ifdef IPX_CHANGE
    132 #include "ipxcp.h"
    133 #if __GLIBC__ >= 2 && \
    134     !(defined(__powerpc__) && __GLIBC__ == 2 && __GLIBC_MINOR__ == 0)
    135 #include <netipx/ipx.h>
    136 #else
    137 #include <linux/ipx.h>
    138 #endif
    139 #endif /* IPX_CHANGE */
    140 
    141 #ifdef PPP_FILTER
    142 #include <pcap-bpf.h>
    143 #include <linux/filter.h>
    144 #endif /* PPP_FILTER */
    145 
    146 #ifdef LOCKLIB
    147 #include <sys/locks.h>
    148 #endif
    149 
    150 #ifdef INET6
    151 #ifndef _LINUX_IN6_H
    152 /*
    153  *    This is in linux/include/net/ipv6.h.
    154  */
    155 
    156 struct in6_ifreq {
    157     struct in6_addr ifr6_addr;
    158     __u32 ifr6_prefixlen;
    159     unsigned int ifr6_ifindex;
    160 };
    161 #endif
    162 
    163 #define IN6_LLADDR_FROM_EUI64(sin6, eui64) do {			\
    164 	memset(&sin6.s6_addr, 0, sizeof(struct in6_addr));	\
    165 	sin6.s6_addr16[0] = htons(0xfe80);			\
    166 	eui64_copy(eui64, sin6.s6_addr32[2]);			\
    167 	} while (0)
    168 
    169 #endif /* INET6 */
    170 
    171 /* We can get an EIO error on an ioctl if the modem has hung up */
    172 #define ok_error(num) ((num)==EIO)
    173 
    174 static int tty_disc = N_TTY;	/* The TTY discipline */
    175 static int ppp_disc = N_PPP;	/* The PPP discpline */
    176 static int initfdflags = -1;	/* Initial file descriptor flags for fd */
    177 static int ppp_fd = -1;		/* fd which is set to PPP discipline */
    178 static int sock_fd = -1;	/* socket for doing interface ioctls */
    179 static int slave_fd = -1;	/* pty for old-style demand mode, slave */
    180 static int master_fd = -1;	/* pty for old-style demand mode, master */
    181 #ifdef INET6
    182 static int sock6_fd = -1;
    183 #endif /* INET6 */
    184 
    185 /*
    186  * For the old-style kernel driver, this is the same as ppp_fd.
    187  * For the new-style driver, it is the fd of an instance of /dev/ppp
    188  * which is attached to the ppp unit and is used for controlling it.
    189  */
    190 int ppp_dev_fd = -1;		/* fd for /dev/ppp (new style driver) */
    191 
    192 static int chindex;		/* channel index (new style driver) */
    193 
    194 static fd_set in_fds;		/* set of fds that wait_input waits for */
    195 static int max_in_fd;		/* highest fd set in in_fds */
    196 
    197 static int has_proxy_arp       = 0;
    198 static int driver_version      = 0;
    199 static int driver_modification = 0;
    200 static int driver_patch        = 0;
    201 static int driver_is_old       = 0;
    202 static int restore_term        = 0;	/* 1 => we've munged the terminal */
    203 static struct termios inittermios;	/* Initial TTY termios */
    204 
    205 int new_style_driver = 0;
    206 
    207 static char loop_name[20];
    208 static unsigned char inbuf[512]; /* buffer for chars read from loopback */
    209 
    210 static int	if_is_up;	/* Interface has been marked up */
    211 static u_int32_t default_route_gateway;	/* Gateway for default route added */
    212 static u_int32_t proxy_arp_addr;	/* Addr for proxy arp entry added */
    213 static char proxy_arp_dev[16];		/* Device for proxy arp entry */
    214 static u_int32_t our_old_addr;		/* for detecting address changes */
    215 static int	dynaddr_set;		/* 1 if ip_dynaddr set */
    216 static int	looped;			/* 1 if using loop */
    217 static int	link_mtu;		/* mtu for the link (not bundle) */
    218 
    219 static struct utsname utsname;	/* for the kernel version */
    220 static int kernel_version;
    221 #define KVERSION(j,n,p)	((j)*1000000 + (n)*1000 + (p))
    222 
    223 #define MAX_IFS		100
    224 
    225 #define FLAGS_GOOD (IFF_UP          | IFF_BROADCAST)
    226 #define FLAGS_MASK (IFF_UP          | IFF_BROADCAST | \
    227 		    IFF_POINTOPOINT | IFF_LOOPBACK  | IFF_NOARP)
    228 
    229 #define SIN_ADDR(x)	(((struct sockaddr_in *) (&(x)))->sin_addr.s_addr)
    230 
    231 /* Prototypes for procedures local to this file. */
    232 static int modify_flags(int fd, int clear_bits, int set_bits);
    233 static int translate_speed (int bps);
    234 static int baud_rate_of (int speed);
    235 static void close_route_table (void);
    236 static int open_route_table (void);
    237 static int read_route_table (struct rtentry *rt);
    238 static int defaultroute_exists (struct rtentry *rt);
    239 static int get_ether_addr (u_int32_t ipaddr, struct sockaddr *hwaddr,
    240 			   char *name, int namelen);
    241 static void decode_version (char *buf, int *version, int *mod, int *patch);
    242 static int set_kdebugflag(int level);
    243 static int ppp_registered(void);
    244 static int make_ppp_unit(void);
    245 
    246 extern u_char	inpacket_buf[];	/* borrowed from main.c */
    247 
    248 /*
    249  * SET_SA_FAMILY - set the sa_family field of a struct sockaddr,
    250  * if it exists.
    251  */
    252 
    253 #define SET_SA_FAMILY(addr, family)			\
    254     memset ((char *) &(addr), '\0', sizeof(addr));	\
    255     addr.sa_family = (family);
    256 
    257 /*
    258  * Determine if the PPP connection should still be present.
    259  */
    260 
    261 extern int hungup;
    262 
    263 /* new_fd is the fd of a tty */
    264 static void set_ppp_fd (int new_fd)
    265 {
    266 	ppp_fd = new_fd;
    267 	if (!new_style_driver)
    268 		ppp_dev_fd = new_fd;
    269 }
    270 
    271 static int still_ppp(void)
    272 {
    273 	if (new_style_driver)
    274 		return !hungup && ppp_fd >= 0;
    275 	if (!hungup || ppp_fd == slave_fd)
    276 		return 1;
    277 	if (slave_fd >= 0) {
    278 		set_ppp_fd(slave_fd);
    279 		return 1;
    280 	}
    281 	return 0;
    282 }
    283 
    284 /*
    285  * modify_flags - set and clear flag bits controlling the kernel
    286  * PPP driver.
    287  */
    288 static int modify_flags(int fd, int clear_bits, int set_bits)
    289 {
    290 	int flags;
    291 
    292 	if (ioctl(fd, PPPIOCGFLAGS, &flags) == -1)
    293 		goto err;
    294 	flags = (flags & ~clear_bits) | set_bits;
    295 	if (ioctl(fd, PPPIOCSFLAGS, &flags) == -1)
    296 		goto err;
    297 
    298 	return 0;
    299 
    300  err:
    301 	if (errno != EIO)
    302 		error("Failed to set PPP kernel option flags: %m");
    303 	return -1;
    304 }
    305 
    306 /********************************************************************
    307  *
    308  * sys_init - System-dependent initialization.
    309  */
    310 
    311 void sys_init(void)
    312 {
    313     /* Get an internet socket for doing socket ioctls. */
    314     sock_fd = socket(AF_INET, SOCK_DGRAM, 0);
    315     if (sock_fd < 0)
    316 	fatal("Couldn't create IP socket: %m(%d)", errno);
    317 
    318 #ifdef INET6
    319     sock6_fd = socket(AF_INET6, SOCK_DGRAM, 0);
    320     if (sock6_fd < 0)
    321 	sock6_fd = -errno;	/* save errno for later */
    322 #endif
    323 
    324     FD_ZERO(&in_fds);
    325     max_in_fd = 0;
    326 }
    327 
    328 /********************************************************************
    329  *
    330  * sys_cleanup - restore any system state we modified before exiting:
    331  * mark the interface down, delete default route and/or proxy arp entry.
    332  * This shouldn't call die() because it's called from die().
    333  */
    334 
    335 void sys_cleanup(void)
    336 {
    337 /*
    338  * Take down the device
    339  */
    340     if (if_is_up) {
    341 	if_is_up = 0;
    342 	sifdown(0);
    343     }
    344 /*
    345  * Delete any routes through the device.
    346  */
    347     if (default_route_gateway != 0)
    348 	cifdefaultroute(0, 0, default_route_gateway);
    349 
    350     if (has_proxy_arp)
    351 	cifproxyarp(0, proxy_arp_addr);
    352 }
    353 
    354 /********************************************************************
    355  *
    356  * sys_close - Clean up in a child process before execing.
    357  */
    358 void
    359 sys_close(void)
    360 {
    361     if (new_style_driver && ppp_dev_fd >= 0)
    362 	close(ppp_dev_fd);
    363     if (sock_fd >= 0)
    364 	close(sock_fd);
    365 #ifdef INET6
    366     if (sock6_fd >= 0)
    367 	close(sock6_fd);
    368 #endif
    369     if (slave_fd >= 0)
    370 	close(slave_fd);
    371     if (master_fd >= 0)
    372 	close(master_fd);
    373 }
    374 
    375 /********************************************************************
    376  *
    377  * set_kdebugflag - Define the debugging level for the kernel
    378  */
    379 
    380 static int set_kdebugflag (int requested_level)
    381 {
    382     if (ppp_dev_fd < 0)
    383 	return 1;
    384     if (ioctl(ppp_dev_fd, PPPIOCSDEBUG, &requested_level) < 0) {
    385 	if ( ! ok_error (errno) )
    386 	    error("ioctl(PPPIOCSDEBUG): %m (line %d)", __LINE__);
    387 	return (0);
    388     }
    389     return (1);
    390 }
    391 
    392 /********************************************************************
    393  *
    394  * tty_establish_ppp - Turn the serial port into a ppp interface.
    395  */
    396 
    397 int tty_establish_ppp (int tty_fd)
    398 {
    399     int ret_fd;
    400 
    401 /*
    402  * Ensure that the tty device is in exclusive mode.
    403  */
    404     if (ioctl(tty_fd, TIOCEXCL, 0) < 0) {
    405 	if ( ! ok_error ( errno ))
    406 	    warn("Couldn't make tty exclusive: %m");
    407     }
    408 /*
    409  * Demand mode - prime the old ppp device to relinquish the unit.
    410  */
    411     if (!new_style_driver && looped
    412 	&& ioctl(slave_fd, PPPIOCXFERUNIT, 0) < 0) {
    413 	error("ioctl(transfer ppp unit): %m, line %d", __LINE__);
    414 	return -1;
    415     }
    416 /*
    417  * Set the current tty to the PPP discpline
    418  */
    419 
    420 #ifndef N_SYNC_PPP
    421 #define N_SYNC_PPP 14
    422 #endif
    423     ppp_disc = (new_style_driver && sync_serial)? N_SYNC_PPP: N_PPP;
    424     if (ioctl(tty_fd, TIOCSETD, &ppp_disc) < 0) {
    425 	if ( ! ok_error (errno) ) {
    426 	    error("Couldn't set tty to PPP discipline: %m");
    427 	    return -1;
    428 	}
    429     }
    430 
    431     ret_fd = generic_establish_ppp(tty_fd);
    432 
    433 #define SC_RCVB	(SC_RCV_B7_0 | SC_RCV_B7_1 | SC_RCV_EVNP | SC_RCV_ODDP)
    434 #define SC_LOGB	(SC_DEBUG | SC_LOG_INPKT | SC_LOG_OUTPKT | SC_LOG_RAWIN \
    435 		 | SC_LOG_FLUSH)
    436 
    437     if (ret_fd >= 0) {
    438 	modify_flags(ppp_fd, SC_RCVB | SC_LOGB,
    439 		     (kdebugflag * SC_DEBUG) & SC_LOGB);
    440     } else {
    441 	if (ioctl(tty_fd, TIOCSETD, &tty_disc) < 0 && !ok_error(errno))
    442 	    warn("Couldn't reset tty to normal line discipline: %m");
    443     }
    444 
    445     return ret_fd;
    446 }
    447 
    448 /********************************************************************
    449  *
    450  * generic_establish_ppp - Turn the fd into a ppp interface.
    451  */
    452 int generic_establish_ppp (int fd)
    453 {
    454     int x;
    455 
    456     if (new_style_driver) {
    457 	int flags;
    458 
    459 	/* Open an instance of /dev/ppp and connect the channel to it */
    460 	if (ioctl(fd, PPPIOCGCHAN, &chindex) == -1) {
    461 	    error("Couldn't get channel number: %m");
    462 	    goto err;
    463 	}
    464 	dbglog("using channel %d", chindex);
    465 	fd = open("/dev/ppp", O_RDWR);
    466 	if (fd < 0) {
    467 	    error("Couldn't reopen /dev/ppp: %m");
    468 	    goto err;
    469 	}
    470 	(void) fcntl(fd, F_SETFD, FD_CLOEXEC);
    471 	if (ioctl(fd, PPPIOCATTCHAN, &chindex) < 0) {
    472 	    error("Couldn't attach to channel %d: %m", chindex);
    473 	    goto err_close;
    474 	}
    475 	flags = fcntl(fd, F_GETFL);
    476 	if (flags == -1 || fcntl(fd, F_SETFL, flags | O_NONBLOCK) == -1)
    477 	    warn("Couldn't set /dev/ppp (channel) to nonblock: %m");
    478 	set_ppp_fd(fd);
    479 
    480 	if (!looped)
    481 	    ifunit = -1;
    482 	if (!looped && !multilink) {
    483 	    /*
    484 	     * Create a new PPP unit.
    485 	     */
    486 	    if (make_ppp_unit() < 0)
    487 		goto err_close;
    488 	}
    489 
    490 	if (looped)
    491 	    modify_flags(ppp_dev_fd, SC_LOOP_TRAFFIC, 0);
    492 
    493 	if (!multilink) {
    494 	    add_fd(ppp_dev_fd);
    495 	    if (ioctl(fd, PPPIOCCONNECT, &ifunit) < 0) {
    496 		error("Couldn't attach to PPP unit %d: %m", ifunit);
    497 		goto err_close;
    498 	    }
    499 	}
    500 
    501     } else {
    502 	/*
    503 	 * Old-style driver: find out which interface we were given.
    504 	 */
    505 	set_ppp_fd (fd);
    506 	if (ioctl(fd, PPPIOCGUNIT, &x) < 0) {
    507 	    if (ok_error (errno))
    508 		goto err;
    509 	    fatal("ioctl(PPPIOCGUNIT): %m (line %d)", __LINE__);
    510 	}
    511 	/* Check that we got the same unit again. */
    512 	if (looped && x != ifunit)
    513 	    fatal("transfer_ppp failed: wanted unit %d, got %d", ifunit, x);
    514 	ifunit = x;
    515 
    516 	/*
    517 	 * Fetch the initial file flags and reset blocking mode on the file.
    518 	 */
    519 	initfdflags = fcntl(fd, F_GETFL);
    520 	if (initfdflags == -1 ||
    521 	    fcntl(fd, F_SETFL, initfdflags | O_NONBLOCK) == -1) {
    522 	    if ( ! ok_error (errno))
    523 		warn("Couldn't set device to non-blocking mode: %m");
    524 	}
    525     }
    526 
    527     /*
    528      * Enable debug in the driver if requested.
    529      */
    530     if (!looped)
    531 	set_kdebugflag (kdebugflag);
    532 
    533     looped = 0;
    534 
    535     return ppp_fd;
    536 
    537  err_close:
    538     close(fd);
    539  err:
    540     return -1;
    541 }
    542 
    543 /********************************************************************
    544  *
    545  * tty_disestablish_ppp - Restore the serial port to normal operation.
    546  * This shouldn't call die() because it's called from die().
    547  */
    548 
    549 void tty_disestablish_ppp(int tty_fd)
    550 {
    551     if (!hungup) {
    552 /*
    553  * Flush the tty output buffer so that the TIOCSETD doesn't hang.
    554  */
    555 	if (tcflush(tty_fd, TCIOFLUSH) < 0)
    556 	{
    557 	    warn("tcflush failed: %m");
    558 	    goto flushfailed;
    559 	}
    560 /*
    561  * Restore the previous line discipline
    562  */
    563 	if (ioctl(tty_fd, TIOCSETD, &tty_disc) < 0) {
    564 	    if ( ! ok_error (errno))
    565 		error("ioctl(TIOCSETD, N_TTY): %m (line %d)", __LINE__);
    566 	}
    567 
    568 	if (ioctl(tty_fd, TIOCNXCL, 0) < 0) {
    569 	    if ( ! ok_error (errno))
    570 		warn("ioctl(TIOCNXCL): %m (line %d)", __LINE__);
    571 	}
    572 
    573 	/* Reset non-blocking mode on fd. */
    574 	if (initfdflags != -1 && fcntl(tty_fd, F_SETFL, initfdflags) < 0) {
    575 	    if ( ! ok_error (errno))
    576 		warn("Couldn't restore device fd flags: %m");
    577 	}
    578     }
    579 flushfailed:
    580     initfdflags = -1;
    581 
    582     generic_disestablish_ppp(tty_fd);
    583 }
    584 
    585 /********************************************************************
    586  *
    587  * generic_disestablish_ppp - Restore device components to normal
    588  * operation, and reconnect the ppp unit to the loopback if in demand
    589  * mode.  This shouldn't call die() because it's called from die().
    590  */
    591 void generic_disestablish_ppp(int dev_fd)
    592 {
    593     if (new_style_driver) {
    594 	close(ppp_fd);
    595 	ppp_fd = -1;
    596 	if (demand) {
    597 	    modify_flags(ppp_dev_fd, 0, SC_LOOP_TRAFFIC);
    598 	    looped = 1;
    599 	} else if (!doing_multilink && ppp_dev_fd >= 0) {
    600 	    close(ppp_dev_fd);
    601 	    remove_fd(ppp_dev_fd);
    602 	    ppp_dev_fd = -1;
    603 	}
    604     } else {
    605 	/* old-style driver */
    606 	if (demand)
    607 	    set_ppp_fd(slave_fd);
    608 	else
    609 	    ppp_dev_fd = -1;
    610     }
    611 }
    612 
    613 /*
    614  * make_ppp_unit - make a new ppp unit for ppp_dev_fd.
    615  * Assumes new_style_driver.
    616  */
    617 static int make_ppp_unit()
    618 {
    619 	int x, flags;
    620 
    621 	if (ppp_dev_fd >= 0) {
    622 		dbglog("in make_ppp_unit, already had /dev/ppp open?");
    623 		close(ppp_dev_fd);
    624 	}
    625 	ppp_dev_fd = open("/dev/ppp", O_RDWR);
    626 	if (ppp_dev_fd < 0)
    627 		fatal("Couldn't open /dev/ppp: %m");
    628 	flags = fcntl(ppp_dev_fd, F_GETFL);
    629 	if (flags == -1
    630 	    || fcntl(ppp_dev_fd, F_SETFL, flags | O_NONBLOCK) == -1)
    631 		warn("Couldn't set /dev/ppp to nonblock: %m");
    632 
    633 	ifunit = req_unit;
    634 	x = ioctl(ppp_dev_fd, PPPIOCNEWUNIT, &ifunit);
    635 	if (x < 0 && req_unit >= 0 && errno == EEXIST) {
    636 		warn("Couldn't allocate PPP unit %d as it is already in use", req_unit);
    637 		ifunit = -1;
    638 		x = ioctl(ppp_dev_fd, PPPIOCNEWUNIT, &ifunit);
    639 	}
    640 	if (x < 0)
    641 		error("Couldn't create new ppp unit: %m");
    642 	return x;
    643 }
    644 
    645 /*
    646  * cfg_bundle - configure the existing bundle.
    647  * Used in demand mode.
    648  */
    649 void cfg_bundle(int mrru, int mtru, int rssn, int tssn)
    650 {
    651 	if (!new_style_driver)
    652 		return;
    653 
    654 	/* set the mrru, mtu and flags */
    655 	if (ioctl(ppp_dev_fd, PPPIOCSMRRU, &mrru) < 0)
    656 		error("Couldn't set MRRU: %m");
    657 
    658 	modify_flags(ppp_dev_fd, SC_MP_SHORTSEQ|SC_MP_XSHORTSEQ|SC_MULTILINK,
    659 		     ((rssn? SC_MP_SHORTSEQ: 0) | (tssn? SC_MP_XSHORTSEQ: 0)
    660 		      | (mrru? SC_MULTILINK: 0)));
    661 
    662 	/* connect up the channel */
    663 	if (ioctl(ppp_fd, PPPIOCCONNECT, &ifunit) < 0)
    664 		fatal("Couldn't attach to PPP unit %d: %m", ifunit);
    665 	add_fd(ppp_dev_fd);
    666 }
    667 
    668 /*
    669  * make_new_bundle - create a new PPP unit (i.e. a bundle)
    670  * and connect our channel to it.  This should only get called
    671  * if `multilink' was set at the time establish_ppp was called.
    672  * In demand mode this uses our existing bundle instead of making
    673  * a new one.
    674  */
    675 void make_new_bundle(int mrru, int mtru, int rssn, int tssn)
    676 {
    677 	if (!new_style_driver)
    678 		return;
    679 
    680 	/* make us a ppp unit */
    681 	if (make_ppp_unit() < 0)
    682 		die(1);
    683 
    684 	/* set the mrru and flags */
    685 	cfg_bundle(mrru, mtru, rssn, tssn);
    686 }
    687 
    688 /*
    689  * bundle_attach - attach our link to a given PPP unit.
    690  * We assume the unit is controlled by another pppd.
    691  */
    692 int bundle_attach(int ifnum)
    693 {
    694 	int master_fd;
    695 
    696 	if (!new_style_driver)
    697 		return -1;
    698 
    699 	master_fd = open("/dev/ppp", O_RDWR);
    700 	if (master_fd < 0)
    701 		fatal("Couldn't open /dev/ppp: %m");
    702 	if (ioctl(master_fd, PPPIOCATTACH, &ifnum) < 0) {
    703 		if (errno == ENXIO) {
    704 			close(master_fd);
    705 			return 0;	/* doesn't still exist */
    706 		}
    707 		fatal("Couldn't attach to interface unit %d: %m\n", ifnum);
    708 	}
    709 	if (ioctl(ppp_fd, PPPIOCCONNECT, &ifnum) < 0)
    710 		fatal("Couldn't connect to interface unit %d: %m", ifnum);
    711 	modify_flags(master_fd, 0, SC_MULTILINK);
    712 	close(master_fd);
    713 
    714 	ifunit = ifnum;
    715 	return 1;
    716 }
    717 
    718 /*
    719  * destroy_bundle - tell the driver to destroy our bundle.
    720  */
    721 void destroy_bundle(void)
    722 {
    723 	if (ppp_dev_fd >= 0) {
    724 		close(ppp_dev_fd);
    725 		remove_fd(ppp_dev_fd);
    726 		ppp_dev_fd = -1;
    727 	}
    728 }
    729 
    730 /********************************************************************
    731  *
    732  * clean_check - Fetch the flags for the device and generate
    733  * appropriate error messages.
    734  */
    735 void clean_check(void)
    736 {
    737     int x;
    738     char *s;
    739 
    740     if (still_ppp()) {
    741 	if (ioctl(ppp_fd, PPPIOCGFLAGS, (caddr_t) &x) == 0) {
    742 	    s = NULL;
    743 	    switch (~x & (SC_RCV_B7_0|SC_RCV_B7_1|SC_RCV_EVNP|SC_RCV_ODDP)) {
    744 	    case SC_RCV_B7_0:
    745 		s = "all had bit 7 set to 1";
    746 		break;
    747 
    748 	    case SC_RCV_B7_1:
    749 		s = "all had bit 7 set to 0";
    750 		break;
    751 
    752 	    case SC_RCV_EVNP:
    753 		s = "all had odd parity";
    754 		break;
    755 
    756 	    case SC_RCV_ODDP:
    757 		s = "all had even parity";
    758 		break;
    759 	    }
    760 
    761 	    if (s != NULL) {
    762 		warn("Receive serial link is not 8-bit clean:");
    763 		warn("Problem: %s", s);
    764 	    }
    765 	}
    766     }
    767 }
    768 
    769 
    770 /*
    771  * List of valid speeds.
    772  */
    773 
    774 struct speed {
    775     int speed_int, speed_val;
    776 } speeds[] = {
    777 #ifdef B50
    778     { 50, B50 },
    779 #endif
    780 #ifdef B75
    781     { 75, B75 },
    782 #endif
    783 #ifdef B110
    784     { 110, B110 },
    785 #endif
    786 #ifdef B134
    787     { 134, B134 },
    788 #endif
    789 #ifdef B150
    790     { 150, B150 },
    791 #endif
    792 #ifdef B200
    793     { 200, B200 },
    794 #endif
    795 #ifdef B300
    796     { 300, B300 },
    797 #endif
    798 #ifdef B600
    799     { 600, B600 },
    800 #endif
    801 #ifdef B1200
    802     { 1200, B1200 },
    803 #endif
    804 #ifdef B1800
    805     { 1800, B1800 },
    806 #endif
    807 #ifdef B2000
    808     { 2000, B2000 },
    809 #endif
    810 #ifdef B2400
    811     { 2400, B2400 },
    812 #endif
    813 #ifdef B3600
    814     { 3600, B3600 },
    815 #endif
    816 #ifdef B4800
    817     { 4800, B4800 },
    818 #endif
    819 #ifdef B7200
    820     { 7200, B7200 },
    821 #endif
    822 #ifdef B9600
    823     { 9600, B9600 },
    824 #endif
    825 #ifdef B19200
    826     { 19200, B19200 },
    827 #endif
    828 #ifdef B38400
    829     { 38400, B38400 },
    830 #endif
    831 #ifdef B57600
    832     { 57600, B57600 },
    833 #endif
    834 #ifdef B76800
    835     { 76800, B76800 },
    836 #endif
    837 #ifdef B115200
    838     { 115200, B115200 },
    839 #endif
    840 #ifdef EXTA
    841     { 19200, EXTA },
    842 #endif
    843 #ifdef EXTB
    844     { 38400, EXTB },
    845 #endif
    846 #ifdef B230400
    847     { 230400, B230400 },
    848 #endif
    849 #ifdef B460800
    850     { 460800, B460800 },
    851 #endif
    852 #ifdef B921600
    853     { 921600, B921600 },
    854 #endif
    855     { 0, 0 }
    856 };
    857 
    858 /********************************************************************
    859  *
    860  * Translate from bits/second to a speed_t.
    861  */
    862 
    863 static int translate_speed (int bps)
    864 {
    865     struct speed *speedp;
    866 
    867     if (bps != 0) {
    868 	for (speedp = speeds; speedp->speed_int; speedp++) {
    869 	    if (bps == speedp->speed_int)
    870 		return speedp->speed_val;
    871 	}
    872 	warn("speed %d not supported", bps);
    873     }
    874     return 0;
    875 }
    876 
    877 /********************************************************************
    878  *
    879  * Translate from a speed_t to bits/second.
    880  */
    881 
    882 static int baud_rate_of (int speed)
    883 {
    884     struct speed *speedp;
    885 
    886     if (speed != 0) {
    887 	for (speedp = speeds; speedp->speed_int; speedp++) {
    888 	    if (speed == speedp->speed_val)
    889 		return speedp->speed_int;
    890 	}
    891     }
    892     return 0;
    893 }
    894 
    895 /********************************************************************
    896  *
    897  * set_up_tty: Set up the serial port on `fd' for 8 bits, no parity,
    898  * at the requested speed, etc.  If `local' is true, set CLOCAL
    899  * regardless of whether the modem option was specified.
    900  */
    901 
    902 void set_up_tty(int tty_fd, int local)
    903 {
    904     int speed;
    905     struct termios tios;
    906 
    907     setdtr(tty_fd, 1);
    908     if (tcgetattr(tty_fd, &tios) < 0) {
    909 	if (!ok_error(errno))
    910 	    fatal("tcgetattr: %m (line %d)", __LINE__);
    911 	return;
    912     }
    913 
    914     if (!restore_term)
    915 	inittermios = tios;
    916 
    917     tios.c_cflag     &= ~(CSIZE | CSTOPB | PARENB | CLOCAL);
    918     tios.c_cflag     |= CS8 | CREAD | HUPCL;
    919 
    920     tios.c_iflag      = IGNBRK | IGNPAR;
    921     tios.c_oflag      = 0;
    922     tios.c_lflag      = 0;
    923     tios.c_cc[VMIN]   = 1;
    924     tios.c_cc[VTIME]  = 0;
    925 
    926     if (local || !modem)
    927 	tios.c_cflag ^= (CLOCAL | HUPCL);
    928 
    929     switch (crtscts) {
    930     case 1:
    931 	tios.c_cflag |= CRTSCTS;
    932 	break;
    933 
    934     case -2:
    935 	tios.c_iflag     |= IXON | IXOFF;
    936 	tios.c_cc[VSTOP]  = 0x13;	/* DC3 = XOFF = ^S */
    937 	tios.c_cc[VSTART] = 0x11;	/* DC1 = XON  = ^Q */
    938 	break;
    939 
    940     case -1:
    941 	tios.c_cflag &= ~CRTSCTS;
    942 	break;
    943 
    944     default:
    945 	break;
    946     }
    947 
    948     speed = translate_speed(inspeed);
    949     if (speed) {
    950 	cfsetospeed (&tios, speed);
    951 	cfsetispeed (&tios, speed);
    952     }
    953 /*
    954  * We can't proceed if the serial port speed is B0,
    955  * since that implies that the serial port is disabled.
    956  */
    957     else {
    958 	speed = cfgetospeed(&tios);
    959 	if (speed == B0)
    960 	    fatal("Baud rate for %s is 0; need explicit baud rate", devnam);
    961     }
    962 
    963     while (tcsetattr(tty_fd, TCSAFLUSH, &tios) < 0 && !ok_error(errno))
    964 	if (errno != EINTR)
    965 	    fatal("tcsetattr: %m (line %d)", __LINE__);
    966 
    967     baud_rate    = baud_rate_of(speed);
    968     restore_term = 1;
    969 }
    970 
    971 /********************************************************************
    972  *
    973  * setdtr - control the DTR line on the serial port.
    974  * This is called from die(), so it shouldn't call die().
    975  */
    976 
    977 void setdtr (int tty_fd, int on)
    978 {
    979     int modembits = TIOCM_DTR;
    980 
    981     ioctl(tty_fd, (on ? TIOCMBIS : TIOCMBIC), &modembits);
    982 }
    983 
    984 /********************************************************************
    985  *
    986  * restore_tty - restore the terminal to the saved settings.
    987  */
    988 
    989 void restore_tty (int tty_fd)
    990 {
    991     if (restore_term) {
    992 	restore_term = 0;
    993 /*
    994  * Turn off echoing, because otherwise we can get into
    995  * a loop with the tty and the modem echoing to each other.
    996  * We presume we are the sole user of this tty device, so
    997  * when we close it, it will revert to its defaults anyway.
    998  */
    999 	if (!default_device)
   1000 	    inittermios.c_lflag &= ~(ECHO | ECHONL);
   1001 
   1002 	if (tcsetattr(tty_fd, TCSAFLUSH, &inittermios) < 0) {
   1003 	    if (! ok_error (errno))
   1004 		warn("tcsetattr: %m (line %d)", __LINE__);
   1005 	}
   1006     }
   1007 }
   1008 
   1009 /********************************************************************
   1010  *
   1011  * output - Output PPP packet.
   1012  */
   1013 
   1014 void output (int unit, unsigned char *p, int len)
   1015 {
   1016     int fd = ppp_fd;
   1017     int proto;
   1018 
   1019     dump_packet("sent", p, len);
   1020     if (snoop_send_hook) snoop_send_hook(p, len);
   1021 
   1022     if (len < PPP_HDRLEN)
   1023 	return;
   1024     if (new_style_driver) {
   1025 	p += 2;
   1026 	len -= 2;
   1027 	proto = (p[0] << 8) + p[1];
   1028 	if (ppp_dev_fd >= 0 && !(proto >= 0xc000 || proto == PPP_CCPFRAG))
   1029 	    fd = ppp_dev_fd;
   1030     }
   1031     if (write(fd, p, len) < 0) {
   1032 	if (errno == EWOULDBLOCK || errno == EAGAIN || errno == ENOBUFS
   1033 	    || errno == ENXIO || errno == EIO || errno == EINTR)
   1034 	    warn("write: warning: %m (%d)", errno);
   1035 	else
   1036 	    error("write: %m (%d)", errno);
   1037     }
   1038 }
   1039 
   1040 /********************************************************************
   1041  *
   1042  * wait_input - wait until there is data available,
   1043  * for the length of time specified by *timo (indefinite
   1044  * if timo is NULL).
   1045  */
   1046 
   1047 void wait_input(struct timeval *timo)
   1048 {
   1049     fd_set ready, exc;
   1050     int n;
   1051 
   1052     ready = in_fds;
   1053     exc = in_fds;
   1054     n = select(max_in_fd + 1, &ready, NULL, &exc, timo);
   1055     if (n < 0 && errno != EINTR)
   1056 	fatal("select: %m");
   1057 }
   1058 
   1059 /*
   1060  * add_fd - add an fd to the set that wait_input waits for.
   1061  */
   1062 void add_fd(int fd)
   1063 {
   1064     if (fd >= FD_SETSIZE)
   1065 	fatal("internal error: file descriptor too large (%d)", fd);
   1066     FD_SET(fd, &in_fds);
   1067     if (fd > max_in_fd)
   1068 	max_in_fd = fd;
   1069 }
   1070 
   1071 /*
   1072  * remove_fd - remove an fd from the set that wait_input waits for.
   1073  */
   1074 void remove_fd(int fd)
   1075 {
   1076     FD_CLR(fd, &in_fds);
   1077 }
   1078 
   1079 
   1080 /********************************************************************
   1081  *
   1082  * read_packet - get a PPP packet from the serial device.
   1083  */
   1084 
   1085 int read_packet (unsigned char *buf)
   1086 {
   1087     int len, nr;
   1088 
   1089     len = PPP_MRU + PPP_HDRLEN;
   1090     if (new_style_driver) {
   1091 	*buf++ = PPP_ALLSTATIONS;
   1092 	*buf++ = PPP_UI;
   1093 	len -= 2;
   1094     }
   1095     nr = -1;
   1096 
   1097     if (ppp_fd >= 0) {
   1098 	nr = read(ppp_fd, buf, len);
   1099 	if (nr < 0 && errno != EWOULDBLOCK && errno != EAGAIN
   1100 	    && errno != EIO && errno != EINTR)
   1101 	    error("read: %m");
   1102 	if (nr < 0 && errno == ENXIO)
   1103 	    return 0;
   1104     }
   1105     if (nr < 0 && new_style_driver && ppp_dev_fd >= 0 && !bundle_eof) {
   1106 	/* N.B. we read ppp_fd first since LCP packets come in there. */
   1107 	nr = read(ppp_dev_fd, buf, len);
   1108 	if (nr < 0 && errno != EWOULDBLOCK && errno != EAGAIN
   1109 	    && errno != EIO && errno != EINTR)
   1110 	    error("read /dev/ppp: %m");
   1111 	if (nr < 0 && errno == ENXIO)
   1112 	    nr = 0;
   1113 	if (nr == 0 && doing_multilink) {
   1114 	    remove_fd(ppp_dev_fd);
   1115 	    bundle_eof = 1;
   1116 	}
   1117     }
   1118     if (new_style_driver && ppp_fd < 0 && ppp_dev_fd < 0)
   1119 	nr = 0;
   1120     return (new_style_driver && nr > 0)? nr+2: nr;
   1121 }
   1122 
   1123 /********************************************************************
   1124  *
   1125  * get_loop_output - get outgoing packets from the ppp device,
   1126  * and detect when we want to bring the real link up.
   1127  * Return value is 1 if we need to bring up the link, 0 otherwise.
   1128  */
   1129 int
   1130 get_loop_output(void)
   1131 {
   1132     int rv = 0;
   1133     int n;
   1134 
   1135     if (new_style_driver) {
   1136 	while ((n = read_packet(inpacket_buf)) > 0)
   1137 	    if (loop_frame(inpacket_buf, n))
   1138 		rv = 1;
   1139 	return rv;
   1140     }
   1141 
   1142     while ((n = read(master_fd, inbuf, sizeof(inbuf))) > 0)
   1143 	if (loop_chars(inbuf, n))
   1144 	    rv = 1;
   1145 
   1146     if (n == 0)
   1147 	fatal("eof on loopback");
   1148 
   1149     if (errno != EWOULDBLOCK && errno != EAGAIN)
   1150 	fatal("read from loopback: %m(%d)", errno);
   1151 
   1152     return rv;
   1153 }
   1154 
   1155 /*
   1156  * netif_set_mtu - set the MTU on the PPP network interface.
   1157  */
   1158 void
   1159 netif_set_mtu(int unit, int mtu)
   1160 {
   1161     struct ifreq ifr;
   1162 
   1163     memset (&ifr, '\0', sizeof (ifr));
   1164     strlcpy(ifr.ifr_name, ifname, sizeof (ifr.ifr_name));
   1165     ifr.ifr_mtu = mtu;
   1166 
   1167     if (ifunit >= 0 && ioctl(sock_fd, SIOCSIFMTU, (caddr_t) &ifr) < 0)
   1168 	error("ioctl(SIOCSIFMTU): %m (line %d)", __LINE__);
   1169 }
   1170 
   1171 /*
   1172  * netif_get_mtu - get the MTU on the PPP network interface.
   1173  */
   1174 int
   1175 netif_get_mtu(int unit)
   1176 {
   1177     struct ifreq ifr;
   1178 
   1179     memset (&ifr, '\0', sizeof (ifr));
   1180     strlcpy(ifr.ifr_name, ifname, sizeof (ifr.ifr_name));
   1181 
   1182     if (ifunit >= 0 && ioctl(sock_fd, SIOCGIFMTU, (caddr_t) &ifr) < 0) {
   1183 	error("ioctl(SIOCGIFMTU): %m (line %d)", __LINE__);
   1184 	return 0;
   1185     }
   1186     return ifr.ifr_mtu;
   1187 }
   1188 
   1189 /********************************************************************
   1190  *
   1191  * tty_send_config - configure the transmit characteristics of
   1192  * the ppp interface.
   1193  */
   1194 
   1195 void tty_send_config(int mtu, u_int32_t asyncmap, int pcomp, int accomp)
   1196 {
   1197 	int x;
   1198 
   1199 	if (!still_ppp())
   1200 		return;
   1201 	link_mtu = mtu;
   1202 	if (ioctl(ppp_fd, PPPIOCSASYNCMAP, (caddr_t) &asyncmap) < 0) {
   1203 		if (errno != EIO && errno != ENOTTY)
   1204 			error("Couldn't set transmit async character map: %m");
   1205 		++error_count;
   1206 		return;
   1207 	}
   1208 
   1209 	x = (pcomp? SC_COMP_PROT: 0) | (accomp? SC_COMP_AC: 0)
   1210 	    | (sync_serial? SC_SYNC: 0);
   1211 	modify_flags(ppp_fd, SC_COMP_PROT|SC_COMP_AC|SC_SYNC, x);
   1212 }
   1213 
   1214 /********************************************************************
   1215  *
   1216  * tty_set_xaccm - set the extended transmit ACCM for the interface.
   1217  */
   1218 
   1219 void tty_set_xaccm (ext_accm accm)
   1220 {
   1221     if (!still_ppp())
   1222 	return;
   1223     if (ioctl(ppp_fd, PPPIOCSXASYNCMAP, accm) < 0 && errno != ENOTTY) {
   1224 	if ( ! ok_error (errno))
   1225 	    warn("ioctl(set extended ACCM): %m (line %d)", __LINE__);
   1226     }
   1227 }
   1228 
   1229 /********************************************************************
   1230  *
   1231  * tty_recv_config - configure the receive-side characteristics of
   1232  * the ppp interface.
   1233  */
   1234 
   1235 void tty_recv_config(int mru, u_int32_t asyncmap, int pcomp, int accomp)
   1236 {
   1237 /*
   1238  * If we were called because the link has gone down then there is nothing
   1239  * which may be done. Just return without incident.
   1240  */
   1241 	if (!still_ppp())
   1242 		return;
   1243 /*
   1244  * Set the receiver parameters
   1245  */
   1246 	if (ioctl(ppp_fd, PPPIOCSMRU, (caddr_t) &mru) < 0) {
   1247 		if (errno != EIO && errno != ENOTTY)
   1248 			error("Couldn't set channel receive MRU: %m");
   1249 	}
   1250 	if (new_style_driver && ppp_dev_fd >= 0
   1251 	    && ioctl(ppp_dev_fd, PPPIOCSMRU, (caddr_t) &mru) < 0)
   1252 		error("Couldn't set MRU in generic PPP layer: %m");
   1253 
   1254 	if (ioctl(ppp_fd, PPPIOCSRASYNCMAP, (caddr_t) &asyncmap) < 0) {
   1255 		if (errno != EIO && errno != ENOTTY)
   1256 			error("Couldn't set channel receive asyncmap: %m");
   1257 	}
   1258 }
   1259 
   1260 /********************************************************************
   1261  *
   1262  * ccp_test - ask kernel whether a given compression method
   1263  * is acceptable for use.
   1264  */
   1265 
   1266 int
   1267 ccp_test(int unit, u_char *opt_ptr, int opt_len, int for_transmit)
   1268 {
   1269     struct ppp_option_data data;
   1270 
   1271     memset (&data, '\0', sizeof (data));
   1272     data.ptr      = opt_ptr;
   1273     data.length   = opt_len;
   1274     data.transmit = for_transmit;
   1275 
   1276     if (ioctl(ppp_dev_fd, PPPIOCSCOMPRESS, (caddr_t) &data) >= 0)
   1277 	return 1;
   1278 
   1279     return (errno == ENOBUFS)? 0: -1;
   1280 }
   1281 
   1282 /********************************************************************
   1283  *
   1284  * ccp_flags_set - inform kernel about the current state of CCP.
   1285  */
   1286 
   1287 void ccp_flags_set (int unit, int isopen, int isup)
   1288 {
   1289 	int x;
   1290 
   1291 	x = (isopen? SC_CCP_OPEN: 0) | (isup? SC_CCP_UP: 0);
   1292 	if (still_ppp() && ppp_dev_fd >= 0)
   1293 		modify_flags(ppp_dev_fd, SC_CCP_OPEN|SC_CCP_UP, x);
   1294 }
   1295 
   1296 #ifdef PPP_FILTER
   1297 /*
   1298  * set_filters - set the active and pass filters in the kernel driver.
   1299  */
   1300 int set_filters(struct bpf_program *pass, struct bpf_program *active)
   1301 {
   1302 	struct sock_fprog fp;
   1303 
   1304 	fp.len = pass->bf_len;
   1305 	fp.filter = (struct sock_filter *) pass->bf_insns;
   1306 	if (ioctl(ppp_dev_fd, PPPIOCSPASS, &fp) < 0) {
   1307 		if (errno == ENOTTY)
   1308 			warn("kernel does not support PPP filtering");
   1309 		else
   1310 			error("Couldn't set pass-filter in kernel: %m");
   1311 		return 0;
   1312 	}
   1313 	fp.len = active->bf_len;
   1314 	fp.filter = (struct sock_filter *) active->bf_insns;
   1315 	if (ioctl(ppp_dev_fd, PPPIOCSACTIVE, &fp) < 0) {
   1316 		error("Couldn't set active-filter in kernel: %m");
   1317 		return 0;
   1318 	}
   1319 	return 1;
   1320 }
   1321 #endif /* PPP_FILTER */
   1322 
   1323 /********************************************************************
   1324  *
   1325  * get_idle_time - return how long the link has been idle.
   1326  */
   1327 int
   1328 get_idle_time(u, ip)
   1329     int u;
   1330     struct ppp_idle *ip;
   1331 {
   1332     return ioctl(ppp_dev_fd, PPPIOCGIDLE, ip) >= 0;
   1333 }
   1334 
   1335 /********************************************************************
   1336  *
   1337  * get_ppp_stats - return statistics for the link.
   1338  */
   1339 int
   1340 get_ppp_stats(u, stats)
   1341     int u;
   1342     struct pppd_stats *stats;
   1343 {
   1344     struct ifpppstatsreq req;
   1345 
   1346     memset (&req, 0, sizeof (req));
   1347 
   1348     req.stats_ptr = (caddr_t) &req.stats;
   1349     strlcpy(req.ifr__name, ifname, sizeof(req.ifr__name));
   1350     if (ioctl(sock_fd, SIOCGPPPSTATS, &req) < 0) {
   1351 	error("Couldn't get PPP statistics: %m");
   1352 	return 0;
   1353     }
   1354     stats->bytes_in = req.stats.p.ppp_ibytes;
   1355     stats->bytes_out = req.stats.p.ppp_obytes;
   1356     stats->pkts_in = req.stats.p.ppp_ipackets;
   1357     stats->pkts_out = req.stats.p.ppp_opackets;
   1358     return 1;
   1359 }
   1360 
   1361 /********************************************************************
   1362  *
   1363  * ccp_fatal_error - returns 1 if decompression was disabled as a
   1364  * result of an error detected after decompression of a packet,
   1365  * 0 otherwise.  This is necessary because of patent nonsense.
   1366  */
   1367 
   1368 int ccp_fatal_error (int unit)
   1369 {
   1370 	int flags;
   1371 
   1372 	if (ioctl(ppp_dev_fd, PPPIOCGFLAGS, &flags) < 0) {
   1373 		error("Couldn't read compression error flags: %m");
   1374 		flags = 0;
   1375 	}
   1376 	return flags & SC_DC_FERROR;
   1377 }
   1378 
   1379 /********************************************************************
   1380  *
   1381  * path_to_procfs - find the path to the proc file system mount point
   1382  */
   1383 static char proc_path[MAXPATHLEN];
   1384 static int proc_path_len;
   1385 
   1386 static char *path_to_procfs(const char *tail)
   1387 {
   1388     struct mntent *mntent;
   1389     FILE *fp;
   1390 
   1391     if (proc_path_len == 0) {
   1392 	/* Default the mount location of /proc */
   1393 	strlcpy (proc_path, "/proc", sizeof(proc_path));
   1394 	proc_path_len = 5;
   1395 	fp = fopen(_PATH_MOUNTED, "r");
   1396 	if (fp != NULL) {
   1397 	    while ((mntent = getmntent(fp)) != NULL) {
   1398 		if (strcmp(mntent->mnt_type, MNTTYPE_IGNORE) == 0)
   1399 		    continue;
   1400 		if (strcmp(mntent->mnt_type, "proc") == 0) {
   1401 		    strlcpy(proc_path, mntent->mnt_dir, sizeof(proc_path));
   1402 		    proc_path_len = strlen(proc_path);
   1403 		    break;
   1404 		}
   1405 	    }
   1406 	    fclose (fp);
   1407 	}
   1408     }
   1409 
   1410     strlcpy(proc_path + proc_path_len, tail,
   1411 	    sizeof(proc_path) - proc_path_len);
   1412     return proc_path;
   1413 }
   1414 
   1415 /*
   1416  * /proc/net/route parsing stuff.
   1417  */
   1418 #define ROUTE_MAX_COLS	12
   1419 FILE *route_fd = (FILE *) 0;
   1420 static char route_buffer[512];
   1421 static int route_dev_col, route_dest_col, route_gw_col;
   1422 static int route_flags_col, route_mask_col;
   1423 static int route_num_cols;
   1424 
   1425 static int open_route_table (void);
   1426 static void close_route_table (void);
   1427 static int read_route_table (struct rtentry *rt);
   1428 
   1429 /********************************************************************
   1430  *
   1431  * close_route_table - close the interface to the route table
   1432  */
   1433 
   1434 static void close_route_table (void)
   1435 {
   1436     if (route_fd != (FILE *) 0) {
   1437 	fclose (route_fd);
   1438 	route_fd = (FILE *) 0;
   1439     }
   1440 }
   1441 
   1442 /********************************************************************
   1443  *
   1444  * open_route_table - open the interface to the route table
   1445  */
   1446 static char route_delims[] = " \t\n";
   1447 
   1448 static int open_route_table (void)
   1449 {
   1450     char *path;
   1451 
   1452     close_route_table();
   1453 
   1454     path = path_to_procfs("/net/route");
   1455     route_fd = fopen (path, "r");
   1456     if (route_fd == NULL) {
   1457 	error("can't open routing table %s: %m", path);
   1458 	return 0;
   1459     }
   1460 
   1461     route_dev_col = 0;		/* default to usual columns */
   1462     route_dest_col = 1;
   1463     route_gw_col = 2;
   1464     route_flags_col = 3;
   1465     route_mask_col = 7;
   1466     route_num_cols = 8;
   1467 
   1468     /* parse header line */
   1469     if (fgets(route_buffer, sizeof(route_buffer), route_fd) != 0) {
   1470 	char *p = route_buffer, *q;
   1471 	int col;
   1472 	for (col = 0; col < ROUTE_MAX_COLS; ++col) {
   1473 	    int used = 1;
   1474 	    if ((q = strtok(p, route_delims)) == 0)
   1475 		break;
   1476 	    if (strcasecmp(q, "iface") == 0)
   1477 		route_dev_col = col;
   1478 	    else if (strcasecmp(q, "destination") == 0)
   1479 		route_dest_col = col;
   1480 	    else if (strcasecmp(q, "gateway") == 0)
   1481 		route_gw_col = col;
   1482 	    else if (strcasecmp(q, "flags") == 0)
   1483 		route_flags_col = col;
   1484 	    else if (strcasecmp(q, "mask") == 0)
   1485 		route_mask_col = col;
   1486 	    else
   1487 		used = 0;
   1488 	    if (used && col >= route_num_cols)
   1489 		route_num_cols = col + 1;
   1490 	    p = NULL;
   1491 	}
   1492     }
   1493 
   1494     return 1;
   1495 }
   1496 
   1497 /********************************************************************
   1498  *
   1499  * read_route_table - read the next entry from the route table
   1500  */
   1501 
   1502 static int read_route_table(struct rtentry *rt)
   1503 {
   1504     char *cols[ROUTE_MAX_COLS], *p;
   1505     int col;
   1506 
   1507     memset (rt, '\0', sizeof (struct rtentry));
   1508 
   1509     if (fgets (route_buffer, sizeof (route_buffer), route_fd) == (char *) 0)
   1510 	return 0;
   1511 
   1512     p = route_buffer;
   1513     for (col = 0; col < route_num_cols; ++col) {
   1514 	cols[col] = strtok(p, route_delims);
   1515 	if (cols[col] == NULL)
   1516 	    return 0;		/* didn't get enough columns */
   1517 	p = NULL;
   1518     }
   1519 
   1520     SIN_ADDR(rt->rt_dst) = strtoul(cols[route_dest_col], NULL, 16);
   1521     SIN_ADDR(rt->rt_gateway) = strtoul(cols[route_gw_col], NULL, 16);
   1522     SIN_ADDR(rt->rt_genmask) = strtoul(cols[route_mask_col], NULL, 16);
   1523 
   1524     rt->rt_flags = (short) strtoul(cols[route_flags_col], NULL, 16);
   1525     rt->rt_dev   = cols[route_dev_col];
   1526 
   1527     return 1;
   1528 }
   1529 
   1530 /********************************************************************
   1531  *
   1532  * defaultroute_exists - determine if there is a default route
   1533  */
   1534 
   1535 static int defaultroute_exists (struct rtentry *rt)
   1536 {
   1537     int result = 0;
   1538 
   1539     if (!open_route_table())
   1540 	return 0;
   1541 
   1542     while (read_route_table(rt) != 0) {
   1543 	if ((rt->rt_flags & RTF_UP) == 0)
   1544 	    continue;
   1545 
   1546 	if (kernel_version > KVERSION(2,1,0) && SIN_ADDR(rt->rt_genmask) != 0)
   1547 	    continue;
   1548 	if (SIN_ADDR(rt->rt_dst) == 0L) {
   1549 	    result = 1;
   1550 	    break;
   1551 	}
   1552     }
   1553 
   1554     close_route_table();
   1555     return result;
   1556 }
   1557 
   1558 /*
   1559  * have_route_to - determine if the system has any route to
   1560  * a given IP address.  `addr' is in network byte order.
   1561  * Return value is 1 if yes, 0 if no, -1 if don't know.
   1562  * For demand mode to work properly, we have to ignore routes
   1563  * through our own interface.
   1564  */
   1565 int have_route_to(u_int32_t addr)
   1566 {
   1567     struct rtentry rt;
   1568     int result = 0;
   1569 
   1570     if (!open_route_table())
   1571 	return -1;		/* don't know */
   1572 
   1573     while (read_route_table(&rt)) {
   1574 	if ((rt.rt_flags & RTF_UP) == 0 || strcmp(rt.rt_dev, ifname) == 0)
   1575 	    continue;
   1576 	if ((addr & SIN_ADDR(rt.rt_genmask)) == SIN_ADDR(rt.rt_dst)) {
   1577 	    result = 1;
   1578 	    break;
   1579 	}
   1580     }
   1581 
   1582     close_route_table();
   1583     return result;
   1584 }
   1585 
   1586 /********************************************************************
   1587  *
   1588  * sifdefaultroute - assign a default route through the address given.
   1589  */
   1590 
   1591 int sifdefaultroute (int unit, u_int32_t ouraddr, u_int32_t gateway)
   1592 {
   1593     struct rtentry rt;
   1594 
   1595     if (defaultroute_exists(&rt) && strcmp(rt.rt_dev, ifname) != 0) {
   1596 	u_int32_t old_gateway = SIN_ADDR(rt.rt_gateway);
   1597 
   1598 	if (old_gateway != gateway)
   1599 	    error("not replacing existing default route to %s [%I]",
   1600 		  rt.rt_dev, old_gateway);
   1601 	return 0;
   1602     }
   1603 
   1604     memset (&rt, '\0', sizeof (rt));
   1605     SET_SA_FAMILY (rt.rt_dst,     AF_INET);
   1606     SET_SA_FAMILY (rt.rt_gateway, AF_INET);
   1607 
   1608     rt.rt_dev = ifname;
   1609 
   1610     if (kernel_version > KVERSION(2,1,0)) {
   1611 	SET_SA_FAMILY (rt.rt_genmask, AF_INET);
   1612 	SIN_ADDR(rt.rt_genmask) = 0L;
   1613     }
   1614 
   1615     SIN_ADDR(rt.rt_gateway) = gateway;
   1616 
   1617     rt.rt_flags = RTF_UP | RTF_GATEWAY;
   1618     if (ioctl(sock_fd, SIOCADDRT, &rt) < 0) {
   1619 	if ( ! ok_error ( errno ))
   1620 	    error("default route ioctl(SIOCADDRT): %m");
   1621 	return 0;
   1622     }
   1623 
   1624     default_route_gateway = gateway;
   1625     return 1;
   1626 }
   1627 
   1628 /********************************************************************
   1629  *
   1630  * cifdefaultroute - delete a default route through the address given.
   1631  */
   1632 
   1633 int cifdefaultroute (int unit, u_int32_t ouraddr, u_int32_t gateway)
   1634 {
   1635     struct rtentry rt;
   1636 
   1637     default_route_gateway = 0;
   1638 
   1639     memset (&rt, '\0', sizeof (rt));
   1640     SET_SA_FAMILY (rt.rt_dst,     AF_INET);
   1641     SET_SA_FAMILY (rt.rt_gateway, AF_INET);
   1642 
   1643     if (kernel_version > KVERSION(2,1,0)) {
   1644 	SET_SA_FAMILY (rt.rt_genmask, AF_INET);
   1645 	SIN_ADDR(rt.rt_genmask) = 0L;
   1646     }
   1647 
   1648     SIN_ADDR(rt.rt_gateway) = gateway;
   1649 
   1650     rt.rt_flags = RTF_UP | RTF_GATEWAY;
   1651     if (ioctl(sock_fd, SIOCDELRT, &rt) < 0 && errno != ESRCH) {
   1652 	if (still_ppp()) {
   1653 	    if ( ! ok_error ( errno ))
   1654 		error("default route ioctl(SIOCDELRT): %m");
   1655 	    return 0;
   1656 	}
   1657     }
   1658 
   1659     return 1;
   1660 }
   1661 
   1662 /********************************************************************
   1663  *
   1664  * sifproxyarp - Make a proxy ARP entry for the peer.
   1665  */
   1666 
   1667 int sifproxyarp (int unit, u_int32_t his_adr)
   1668 {
   1669     struct arpreq arpreq;
   1670     char *forw_path;
   1671 
   1672     if (has_proxy_arp == 0) {
   1673 	memset (&arpreq, '\0', sizeof(arpreq));
   1674 
   1675 	SET_SA_FAMILY(arpreq.arp_pa, AF_INET);
   1676 	SIN_ADDR(arpreq.arp_pa) = his_adr;
   1677 	arpreq.arp_flags = ATF_PERM | ATF_PUBL;
   1678 /*
   1679  * Get the hardware address of an interface on the same subnet
   1680  * as our local address.
   1681  */
   1682 	if (!get_ether_addr(his_adr, &arpreq.arp_ha, proxy_arp_dev,
   1683 			    sizeof(proxy_arp_dev))) {
   1684 	    error("Cannot determine ethernet address for proxy ARP");
   1685 	    return 0;
   1686 	}
   1687 	strlcpy(arpreq.arp_dev, proxy_arp_dev, sizeof(arpreq.arp_dev));
   1688 
   1689 	if (ioctl(sock_fd, SIOCSARP, (caddr_t)&arpreq) < 0) {
   1690 	    if ( ! ok_error ( errno ))
   1691 		error("ioctl(SIOCSARP): %m");
   1692 	    return 0;
   1693 	}
   1694 	proxy_arp_addr = his_adr;
   1695 	has_proxy_arp = 1;
   1696 
   1697 	if (tune_kernel) {
   1698 	    forw_path = path_to_procfs("/sys/net/ipv4/ip_forward");
   1699 	    if (forw_path != 0) {
   1700 		int fd = open(forw_path, O_WRONLY);
   1701 		if (fd >= 0) {
   1702 		    if (write(fd, "1", 1) != 1)
   1703 			error("Couldn't enable IP forwarding: %m");
   1704 		    close(fd);
   1705 		}
   1706 	    }
   1707 	}
   1708     }
   1709 
   1710     return 1;
   1711 }
   1712 
   1713 /********************************************************************
   1714  *
   1715  * cifproxyarp - Delete the proxy ARP entry for the peer.
   1716  */
   1717 
   1718 int cifproxyarp (int unit, u_int32_t his_adr)
   1719 {
   1720     struct arpreq arpreq;
   1721 
   1722     if (has_proxy_arp) {
   1723 	has_proxy_arp = 0;
   1724 	memset (&arpreq, '\0', sizeof(arpreq));
   1725 	SET_SA_FAMILY(arpreq.arp_pa, AF_INET);
   1726 	SIN_ADDR(arpreq.arp_pa) = his_adr;
   1727 	arpreq.arp_flags = ATF_PERM | ATF_PUBL;
   1728 	strlcpy(arpreq.arp_dev, proxy_arp_dev, sizeof(arpreq.arp_dev));
   1729 
   1730 	if (ioctl(sock_fd, SIOCDARP, (caddr_t)&arpreq) < 0) {
   1731 	    if ( ! ok_error ( errno ))
   1732 		warn("ioctl(SIOCDARP): %m");
   1733 	    return 0;
   1734 	}
   1735     }
   1736     return 1;
   1737 }
   1738 
   1739 /********************************************************************
   1740  *
   1741  * get_ether_addr - get the hardware address of an interface on the
   1742  * the same subnet as ipaddr.
   1743  */
   1744 
   1745 static int get_ether_addr (u_int32_t ipaddr,
   1746 			   struct sockaddr *hwaddr,
   1747 			   char *name, int namelen)
   1748 {
   1749     struct ifreq *ifr, *ifend;
   1750     u_int32_t ina, mask;
   1751     char *aliasp;
   1752     struct ifreq ifreq, bestifreq;
   1753     struct ifconf ifc;
   1754     struct ifreq ifs[MAX_IFS];
   1755 
   1756     u_int32_t bestmask=0;
   1757     int found_interface = 0;
   1758 
   1759     ifc.ifc_len = sizeof(ifs);
   1760     ifc.ifc_req = ifs;
   1761     if (ioctl(sock_fd, SIOCGIFCONF, &ifc) < 0) {
   1762 	if ( ! ok_error ( errno ))
   1763 	    error("ioctl(SIOCGIFCONF): %m (line %d)", __LINE__);
   1764 	return 0;
   1765     }
   1766 
   1767 /*
   1768  * Scan through looking for an interface with an Internet
   1769  * address on the same subnet as `ipaddr'.
   1770  */
   1771     ifend = ifs + (ifc.ifc_len / sizeof(struct ifreq));
   1772     for (ifr = ifc.ifc_req; ifr < ifend; ifr++) {
   1773 	if (ifr->ifr_addr.sa_family == AF_INET) {
   1774 	    ina = SIN_ADDR(ifr->ifr_addr);
   1775 	    strlcpy(ifreq.ifr_name, ifr->ifr_name, sizeof(ifreq.ifr_name));
   1776 /*
   1777  * Check that the interface is up, and not point-to-point
   1778  * nor loopback.
   1779  */
   1780 	    if (ioctl(sock_fd, SIOCGIFFLAGS, &ifreq) < 0)
   1781 		continue;
   1782 
   1783 	    if (((ifreq.ifr_flags ^ FLAGS_GOOD) & FLAGS_MASK) != 0)
   1784 		continue;
   1785 /*
   1786  * Get its netmask and check that it's on the right subnet.
   1787  */
   1788 	    if (ioctl(sock_fd, SIOCGIFNETMASK, &ifreq) < 0)
   1789 		continue;
   1790 
   1791 	    mask = SIN_ADDR(ifreq.ifr_addr);
   1792 
   1793 	    if (((ipaddr ^ ina) & mask) != 0)
   1794 		continue; /* no match */
   1795 	    /* matched */
   1796 	    if (mask >= bestmask) {
   1797 		/* Compare using >= instead of > -- it is possible for
   1798 		   an interface to have a netmask of 0.0.0.0 */
   1799 		found_interface = 1;
   1800 		bestifreq = ifreq;
   1801 		bestmask = mask;
   1802 	    }
   1803 	}
   1804     }
   1805 
   1806     if (!found_interface) return 0;
   1807 
   1808     strlcpy(name, bestifreq.ifr_name, namelen);
   1809 
   1810     /* trim off the :1 in eth0:1 */
   1811     aliasp = strchr(name, ':');
   1812     if (aliasp != 0)
   1813 	*aliasp = 0;
   1814 
   1815     info("found interface %s for proxy arp", name);
   1816 /*
   1817  * Now get the hardware address.
   1818  */
   1819     memset (&bestifreq.ifr_hwaddr, 0, sizeof (struct sockaddr));
   1820     if (ioctl (sock_fd, SIOCGIFHWADDR, &bestifreq) < 0) {
   1821 	error("SIOCGIFHWADDR(%s): %m", bestifreq.ifr_name);
   1822 	return 0;
   1823     }
   1824 
   1825     memcpy (hwaddr,
   1826 	    &bestifreq.ifr_hwaddr,
   1827 	    sizeof (struct sockaddr));
   1828 
   1829     return 1;
   1830 }
   1831 
   1832 /*
   1833  * get_if_hwaddr - get the hardware address for the specified
   1834  * network interface device.
   1835  */
   1836 int
   1837 get_if_hwaddr(u_char *addr, char *name)
   1838 {
   1839 	struct ifreq ifreq;
   1840 	int ret, sock_fd;
   1841 
   1842 	sock_fd = socket(AF_INET, SOCK_DGRAM, 0);
   1843 	if (sock_fd < 0)
   1844 		return 0;
   1845 	memset(&ifreq.ifr_hwaddr, 0, sizeof(struct sockaddr));
   1846 	strlcpy(ifreq.ifr_name, name, sizeof(ifreq.ifr_name));
   1847 	ret = ioctl(sock_fd, SIOCGIFHWADDR, &ifreq);
   1848 	close(sock_fd);
   1849 	if (ret >= 0)
   1850 		memcpy(addr, ifreq.ifr_hwaddr.sa_data, 6);
   1851 	return ret;
   1852 }
   1853 
   1854 /*
   1855  * get_first_ethernet - return the name of the first ethernet-style
   1856  * interface on this system.
   1857  */
   1858 char *
   1859 get_first_ethernet()
   1860 {
   1861 	return "eth0";
   1862 }
   1863 
   1864 /********************************************************************
   1865  *
   1866  * Return user specified netmask, modified by any mask we might determine
   1867  * for address `addr' (in network byte order).
   1868  * Here we scan through the system's list of interfaces, looking for
   1869  * any non-point-to-point interfaces which might appear to be on the same
   1870  * network as `addr'.  If we find any, we OR in their netmask to the
   1871  * user-specified netmask.
   1872  */
   1873 
   1874 u_int32_t GetMask (u_int32_t addr)
   1875 {
   1876     u_int32_t mask, nmask, ina;
   1877     struct ifreq *ifr, *ifend, ifreq;
   1878     struct ifconf ifc;
   1879     struct ifreq ifs[MAX_IFS];
   1880 
   1881     addr = ntohl(addr);
   1882 
   1883     if (IN_CLASSA(addr))	/* determine network mask for address class */
   1884 	nmask = IN_CLASSA_NET;
   1885     else if (IN_CLASSB(addr))
   1886 	    nmask = IN_CLASSB_NET;
   1887     else
   1888 	    nmask = IN_CLASSC_NET;
   1889 
   1890     /* class D nets are disallowed by bad_ip_adrs */
   1891     mask = netmask | htonl(nmask);
   1892 /*
   1893  * Scan through the system's network interfaces.
   1894  */
   1895     ifc.ifc_len = sizeof(ifs);
   1896     ifc.ifc_req = ifs;
   1897     if (ioctl(sock_fd, SIOCGIFCONF, &ifc) < 0) {
   1898 	if ( ! ok_error ( errno ))
   1899 	    warn("ioctl(SIOCGIFCONF): %m (line %d)", __LINE__);
   1900 	return mask;
   1901     }
   1902 
   1903     ifend = (struct ifreq *) (ifc.ifc_buf + ifc.ifc_len);
   1904     for (ifr = ifc.ifc_req; ifr < ifend; ifr++) {
   1905 /*
   1906  * Check the interface's internet address.
   1907  */
   1908 	if (ifr->ifr_addr.sa_family != AF_INET)
   1909 	    continue;
   1910 	ina = SIN_ADDR(ifr->ifr_addr);
   1911 	if (((ntohl(ina) ^ addr) & nmask) != 0)
   1912 	    continue;
   1913 /*
   1914  * Check that the interface is up, and not point-to-point nor loopback.
   1915  */
   1916 	strlcpy(ifreq.ifr_name, ifr->ifr_name, sizeof(ifreq.ifr_name));
   1917 	if (ioctl(sock_fd, SIOCGIFFLAGS, &ifreq) < 0)
   1918 	    continue;
   1919 
   1920 	if (((ifreq.ifr_flags ^ FLAGS_GOOD) & FLAGS_MASK) != 0)
   1921 	    continue;
   1922 /*
   1923  * Get its netmask and OR it into our mask.
   1924  */
   1925 	if (ioctl(sock_fd, SIOCGIFNETMASK, &ifreq) < 0)
   1926 	    continue;
   1927 	mask |= SIN_ADDR(ifreq.ifr_addr);
   1928 	break;
   1929     }
   1930     return mask;
   1931 }
   1932 
   1933 /********************************************************************
   1934  *
   1935  * Internal routine to decode the version.modification.patch level
   1936  */
   1937 
   1938 static void decode_version (char *buf, int *version,
   1939 			    int *modification, int *patch)
   1940 {
   1941     char *endp;
   1942 
   1943     *version      = (int) strtoul (buf, &endp, 10);
   1944     *modification = 0;
   1945     *patch        = 0;
   1946 
   1947     if (endp != buf && *endp == '.') {
   1948 	buf = endp + 1;
   1949 	*modification = (int) strtoul (buf, &endp, 10);
   1950 	if (endp != buf && *endp == '.') {
   1951 	    buf = endp + 1;
   1952 	    *patch = (int) strtoul (buf, &buf, 10);
   1953 	}
   1954     }
   1955 }
   1956 
   1957 /********************************************************************
   1958  *
   1959  * Procedure to determine if the PPP line discipline is registered.
   1960  */
   1961 
   1962 static int
   1963 ppp_registered(void)
   1964 {
   1965     int local_fd;
   1966     int mfd = -1;
   1967     int ret = 0;
   1968     char slave[16];
   1969 
   1970     /*
   1971      * We used to open the serial device and set it to the ppp line
   1972      * discipline here, in order to create a ppp unit.  But that is
   1973      * not a good idea - the user might have specified a device that
   1974      * they can't open (permission, or maybe it doesn't really exist).
   1975      * So we grab a pty master/slave pair and use that.
   1976      */
   1977     if (!get_pty(&mfd, &local_fd, slave, 0)) {
   1978 	no_ppp_msg = "Couldn't determine if PPP is supported (no free ptys)";
   1979 	return 0;
   1980     }
   1981 
   1982     /*
   1983      * Try to put the device into the PPP discipline.
   1984      */
   1985     if (ioctl(local_fd, TIOCSETD, &ppp_disc) < 0) {
   1986 	error("ioctl(TIOCSETD(PPP)): %m (line %d)", __LINE__);
   1987     } else
   1988 	ret = 1;
   1989 
   1990     close(local_fd);
   1991     close(mfd);
   1992     return ret;
   1993 }
   1994 
   1995 /********************************************************************
   1996  *
   1997  * ppp_available - check whether the system has any ppp interfaces
   1998  * (in fact we check whether we can do an ioctl on ppp0).
   1999  */
   2000 
   2001 int ppp_available(void)
   2002 {
   2003     int s, ok, fd;
   2004     struct ifreq ifr;
   2005     int    size;
   2006     int    my_version, my_modification, my_patch;
   2007     int osmaj, osmin, ospatch;
   2008 
   2009     no_ppp_msg =
   2010 	"This system lacks kernel support for PPP.  This could be because\n"
   2011 	"the PPP kernel module could not be loaded, or because PPP was not\n"
   2012 	"included in the kernel configuration.  If PPP was included as a\n"
   2013 	"module, try `/sbin/modprobe -v ppp'.  If that fails, check that\n"
   2014 	"ppp.o exists in /lib/modules/`uname -r`/net.\n"
   2015 	"See README.linux file in the ppp distribution for more details.\n";
   2016 
   2017     /* get the kernel version now, since we are called before sys_init */
   2018     uname(&utsname);
   2019     osmaj = osmin = ospatch = 0;
   2020     sscanf(utsname.release, "%d.%d.%d", &osmaj, &osmin, &ospatch);
   2021     kernel_version = KVERSION(osmaj, osmin, ospatch);
   2022 
   2023     fd = open("/dev/ppp", O_RDWR);
   2024 #if 0
   2025     if (fd < 0 && errno == ENOENT) {
   2026 	/* try making it and see if that helps. */
   2027 	if (mknod("/dev/ppp", S_IFCHR | S_IRUSR | S_IWUSR,
   2028 		  makedev(108, 0)) >= 0) {
   2029 	    fd = open("/dev/ppp", O_RDWR);
   2030 	    if (fd >= 0)
   2031 		info("Created /dev/ppp device node");
   2032 	    else
   2033 		unlink("/dev/ppp");	/* didn't work, undo the mknod */
   2034 	} else if (errno == EEXIST) {
   2035 	    fd = open("/dev/ppp", O_RDWR);
   2036 	}
   2037     }
   2038 #endif /* 0 */
   2039     if (fd >= 0) {
   2040 	new_style_driver = 1;
   2041 
   2042 	/* XXX should get from driver */
   2043 	driver_version = 2;
   2044 	driver_modification = 4;
   2045 	driver_patch = 0;
   2046 	close(fd);
   2047 	return 1;
   2048     }
   2049     if (kernel_version >= KVERSION(2,3,13)) {
   2050 	if (errno == ENOENT)
   2051 	    no_ppp_msg =
   2052 		"pppd is unable to open the /dev/ppp device.\n"
   2053 		"You need to create the /dev/ppp device node by\n"
   2054 		"executing the following command as root:\n"
   2055 		"	mknod /dev/ppp c 108 0\n";
   2056 	return 0;
   2057     }
   2058 
   2059 /*
   2060  * Open a socket for doing the ioctl operations.
   2061  */
   2062     s = socket(AF_INET, SOCK_DGRAM, 0);
   2063     if (s < 0)
   2064 	return 0;
   2065 
   2066     strlcpy (ifr.ifr_name, "ppp0", sizeof (ifr.ifr_name));
   2067     ok = ioctl(s, SIOCGIFFLAGS, (caddr_t) &ifr) >= 0;
   2068 /*
   2069  * If the device did not exist then attempt to create one by putting the
   2070  * current tty into the PPP discipline. If this works then obtain the
   2071  * flags for the device again.
   2072  */
   2073     if (!ok) {
   2074 	if (ppp_registered()) {
   2075 	    strlcpy (ifr.ifr_name, "ppp0", sizeof (ifr.ifr_name));
   2076 	    ok = ioctl(s, SIOCGIFFLAGS, (caddr_t) &ifr) >= 0;
   2077 	}
   2078     }
   2079 /*
   2080  * Ensure that the hardware address is for PPP and not something else
   2081  */
   2082     if (ok)
   2083 	ok = ioctl (s, SIOCGIFHWADDR, (caddr_t) &ifr) >= 0;
   2084 
   2085     if (ok && ((ifr.ifr_hwaddr.sa_family & ~0xFF) != ARPHRD_PPP))
   2086 	ok = 0;
   2087 
   2088 /*
   2089  *  This is the PPP device. Validate the version of the driver at this
   2090  *  point to ensure that this program will work with the driver.
   2091  */
   2092     if (ok) {
   2093 	char   abBuffer [1024];
   2094 
   2095 	ifr.ifr_data = abBuffer;
   2096 	size = ioctl (s, SIOCGPPPVER, (caddr_t) &ifr);
   2097 	if (size < 0) {
   2098 	    error("Couldn't read driver version: %m");
   2099 	    ok = 0;
   2100 	    no_ppp_msg = "Sorry, couldn't verify kernel driver version\n";
   2101 
   2102 	} else {
   2103 	    decode_version(abBuffer,
   2104 			   &driver_version,
   2105 			   &driver_modification,
   2106 			   &driver_patch);
   2107 /*
   2108  * Validate the version of the driver against the version that we used.
   2109  */
   2110 	    decode_version(VERSION,
   2111 			   &my_version,
   2112 			   &my_modification,
   2113 			   &my_patch);
   2114 
   2115 	    /* The version numbers must match */
   2116 	    if (driver_version != my_version)
   2117 		ok = 0;
   2118 
   2119 	    /* The modification levels must be legal */
   2120 	    if (driver_modification < 3) {
   2121 		if (driver_modification >= 2) {
   2122 		    /* we can cope with 2.2.0 and above */
   2123 		    driver_is_old = 1;
   2124 		} else {
   2125 		    ok = 0;
   2126 		}
   2127 	    }
   2128 
   2129 	    close (s);
   2130 	    if (!ok) {
   2131 		slprintf(route_buffer, sizeof(route_buffer),
   2132 			 "Sorry - PPP driver version %d.%d.%d is out of date\n",
   2133 			 driver_version, driver_modification, driver_patch);
   2134 
   2135 		no_ppp_msg = route_buffer;
   2136 	    }
   2137 	}
   2138     }
   2139     return ok;
   2140 }
   2141 
   2142 /********************************************************************
   2143  *
   2144  * Update the wtmp file with the appropriate user name and tty device.
   2145  */
   2146 
   2147 void logwtmp (const char *line, const char *name, const char *host)
   2148 {
   2149     struct utmp ut, *utp;
   2150     pid_t  mypid = getpid();
   2151 #if __GLIBC__ < 2
   2152     int    wtmp;
   2153 #endif
   2154 
   2155 /*
   2156  * Update the signon database for users.
   2157  * Christoph Lameter: Copied from poeigl-1.36 Jan 3, 1996
   2158  */
   2159     utmpname(_PATH_UTMP);
   2160     setutent();
   2161     while ((utp = getutent()) && (utp->ut_pid != mypid))
   2162 	/* nothing */;
   2163 
   2164     if (utp)
   2165 	memcpy(&ut, utp, sizeof(ut));
   2166     else
   2167 	/* some gettys/telnetds don't initialize utmp... */
   2168 	memset(&ut, 0, sizeof(ut));
   2169 
   2170     if (ut.ut_id[0] == 0)
   2171 	strncpy(ut.ut_id, line + 3, sizeof(ut.ut_id));
   2172 
   2173     strncpy(ut.ut_user, name, sizeof(ut.ut_user));
   2174     strncpy(ut.ut_line, line, sizeof(ut.ut_line));
   2175 
   2176     time(&ut.ut_time);
   2177 
   2178     ut.ut_type = USER_PROCESS;
   2179     ut.ut_pid  = mypid;
   2180 
   2181     /* Insert the host name if one is supplied */
   2182     if (*host)
   2183 	strncpy (ut.ut_host, host, sizeof(ut.ut_host));
   2184 
   2185     /* Insert the IP address of the remote system if IP is enabled */
   2186     if (ipcp_protent.enabled_flag && ipcp_hisoptions[0].neg_addr)
   2187 	memcpy(&ut.ut_addr, (char *) &ipcp_hisoptions[0].hisaddr,
   2188 		 sizeof(ut.ut_addr));
   2189 
   2190     /* CL: Makes sure that the logout works */
   2191     if (*host == 0 && *name==0)
   2192 	ut.ut_host[0]=0;
   2193 
   2194     pututline(&ut);
   2195     endutent();
   2196 /*
   2197  * Update the wtmp file.
   2198  */
   2199 #if __GLIBC__ >= 2
   2200     updwtmp(_PATH_WTMP, &ut);
   2201 #else
   2202     wtmp = open(_PATH_WTMP, O_APPEND|O_WRONLY);
   2203     if (wtmp >= 0) {
   2204 	flock(wtmp, LOCK_EX);
   2205 
   2206 	if (write (wtmp, (char *)&ut, sizeof(ut)) != sizeof(ut))
   2207 	    warn("error writing %s: %m", _PATH_WTMP);
   2208 
   2209 	flock(wtmp, LOCK_UN);
   2210 
   2211 	close (wtmp);
   2212     }
   2213 #endif
   2214 }
   2215 
   2216 
   2217 /********************************************************************
   2218  *
   2219  * sifvjcomp - config tcp header compression
   2220  */
   2221 
   2222 int sifvjcomp (int u, int vjcomp, int cidcomp, int maxcid)
   2223 {
   2224 	u_int x;
   2225 
   2226 	if (vjcomp) {
   2227 		if (ioctl(ppp_dev_fd, PPPIOCSMAXCID, (caddr_t) &maxcid) < 0)
   2228 			error("Couldn't set up TCP header compression: %m");
   2229 		vjcomp = 0;
   2230 	}
   2231 
   2232 	x = (vjcomp? SC_COMP_TCP: 0) | (cidcomp? 0: SC_NO_TCP_CCID);
   2233 	modify_flags(ppp_dev_fd, SC_COMP_TCP|SC_NO_TCP_CCID, x);
   2234 
   2235 	return 1;
   2236 }
   2237 
   2238 /********************************************************************
   2239  *
   2240  * sifup - Config the interface up and enable IP packets to pass.
   2241  */
   2242 
   2243 int sifup(int u)
   2244 {
   2245     struct ifreq ifr;
   2246 
   2247     memset (&ifr, '\0', sizeof (ifr));
   2248     strlcpy(ifr.ifr_name, ifname, sizeof (ifr.ifr_name));
   2249     if (ioctl(sock_fd, SIOCGIFFLAGS, (caddr_t) &ifr) < 0) {
   2250 	if (! ok_error (errno))
   2251 	    error("ioctl (SIOCGIFFLAGS): %m (line %d)", __LINE__);
   2252 	return 0;
   2253     }
   2254 
   2255     ifr.ifr_flags |= (IFF_UP | IFF_POINTOPOINT);
   2256     if (ioctl(sock_fd, SIOCSIFFLAGS, (caddr_t) &ifr) < 0) {
   2257 	if (! ok_error (errno))
   2258 	    error("ioctl(SIOCSIFFLAGS): %m (line %d)", __LINE__);
   2259 	return 0;
   2260     }
   2261     if_is_up++;
   2262 
   2263     return 1;
   2264 }
   2265 
   2266 /********************************************************************
   2267  *
   2268  * sifdown - Disable the indicated protocol and config the interface
   2269  *	     down if there are no remaining protocols.
   2270  */
   2271 
   2272 int sifdown (int u)
   2273 {
   2274     struct ifreq ifr;
   2275 
   2276     if (if_is_up && --if_is_up > 0)
   2277 	return 1;
   2278 
   2279     memset (&ifr, '\0', sizeof (ifr));
   2280     strlcpy(ifr.ifr_name, ifname, sizeof (ifr.ifr_name));
   2281     if (ioctl(sock_fd, SIOCGIFFLAGS, (caddr_t) &ifr) < 0) {
   2282 	if (! ok_error (errno))
   2283 	    error("ioctl (SIOCGIFFLAGS): %m (line %d)", __LINE__);
   2284 	return 0;
   2285     }
   2286 
   2287     ifr.ifr_flags &= ~IFF_UP;
   2288     ifr.ifr_flags |= IFF_POINTOPOINT;
   2289     if (ioctl(sock_fd, SIOCSIFFLAGS, (caddr_t) &ifr) < 0) {
   2290 	if (! ok_error (errno))
   2291 	    error("ioctl(SIOCSIFFLAGS): %m (line %d)", __LINE__);
   2292 	return 0;
   2293     }
   2294     return 1;
   2295 }
   2296 
   2297 /********************************************************************
   2298  *
   2299  * sifaddr - Config the interface IP addresses and netmask.
   2300  */
   2301 
   2302 int sifaddr (int unit, u_int32_t our_adr, u_int32_t his_adr,
   2303 	     u_int32_t net_mask)
   2304 {
   2305     struct ifreq   ifr;
   2306     struct rtentry rt;
   2307 
   2308     memset (&ifr, '\0', sizeof (ifr));
   2309     memset (&rt,  '\0', sizeof (rt));
   2310 
   2311     SET_SA_FAMILY (ifr.ifr_addr,    AF_INET);
   2312     SET_SA_FAMILY (ifr.ifr_dstaddr, AF_INET);
   2313     SET_SA_FAMILY (ifr.ifr_netmask, AF_INET);
   2314 
   2315     strlcpy (ifr.ifr_name, ifname, sizeof (ifr.ifr_name));
   2316 /*
   2317  *  Set our IP address
   2318  */
   2319     SIN_ADDR(ifr.ifr_addr) = our_adr;
   2320     if (ioctl(sock_fd, SIOCSIFADDR, (caddr_t) &ifr) < 0) {
   2321 	if (errno != EEXIST) {
   2322 	    if (! ok_error (errno))
   2323 		error("ioctl(SIOCSIFADDR): %m (line %d)", __LINE__);
   2324 	}
   2325 	else {
   2326 	    warn("ioctl(SIOCSIFADDR): Address already exists");
   2327 	}
   2328 	return (0);
   2329     }
   2330 /*
   2331  *  Set the gateway address
   2332  */
   2333     SIN_ADDR(ifr.ifr_dstaddr) = his_adr;
   2334     if (ioctl(sock_fd, SIOCSIFDSTADDR, (caddr_t) &ifr) < 0) {
   2335 	if (! ok_error (errno))
   2336 	    error("ioctl(SIOCSIFDSTADDR): %m (line %d)", __LINE__);
   2337 	return (0);
   2338     }
   2339 /*
   2340  *  Set the netmask.
   2341  *  For recent kernels, force the netmask to 255.255.255.255.
   2342  */
   2343     if (kernel_version >= KVERSION(2,1,16))
   2344 	net_mask = ~0L;
   2345     if (net_mask != 0) {
   2346 	SIN_ADDR(ifr.ifr_netmask) = net_mask;
   2347 	if (ioctl(sock_fd, SIOCSIFNETMASK, (caddr_t) &ifr) < 0) {
   2348 	    if (! ok_error (errno))
   2349 		error("ioctl(SIOCSIFNETMASK): %m (line %d)", __LINE__);
   2350 	    return (0);
   2351 	}
   2352     }
   2353 /*
   2354  *  Add the device route
   2355  */
   2356     if (kernel_version < KVERSION(2,1,16)) {
   2357 	SET_SA_FAMILY (rt.rt_dst,     AF_INET);
   2358 	SET_SA_FAMILY (rt.rt_gateway, AF_INET);
   2359 	rt.rt_dev = ifname;
   2360 
   2361 	SIN_ADDR(rt.rt_gateway) = 0L;
   2362 	SIN_ADDR(rt.rt_dst)     = his_adr;
   2363 	rt.rt_flags = RTF_UP | RTF_HOST;
   2364 
   2365 	if (kernel_version > KVERSION(2,1,0)) {
   2366 	    SET_SA_FAMILY (rt.rt_genmask, AF_INET);
   2367 	    SIN_ADDR(rt.rt_genmask) = -1L;
   2368 	}
   2369 
   2370 	if (ioctl(sock_fd, SIOCADDRT, &rt) < 0) {
   2371 	    if (! ok_error (errno))
   2372 		error("ioctl(SIOCADDRT) device route: %m (line %d)", __LINE__);
   2373 	    return (0);
   2374 	}
   2375     }
   2376 
   2377     /* set ip_dynaddr in demand mode if address changes */
   2378     if (demand && tune_kernel && !dynaddr_set
   2379 	&& our_old_addr && our_old_addr != our_adr) {
   2380 	/* set ip_dynaddr if possible */
   2381 	char *path;
   2382 	int fd;
   2383 
   2384 	path = path_to_procfs("/sys/net/ipv4/ip_dynaddr");
   2385 	if (path != 0 && (fd = open(path, O_WRONLY)) >= 0) {
   2386 	    if (write(fd, "1", 1) != 1)
   2387 		error("Couldn't enable dynamic IP addressing: %m");
   2388 	    close(fd);
   2389 	}
   2390 	dynaddr_set = 1;	/* only 1 attempt */
   2391     }
   2392     our_old_addr = 0;
   2393 
   2394     return 1;
   2395 }
   2396 
   2397 /********************************************************************
   2398  *
   2399  * cifaddr - Clear the interface IP addresses, and delete routes
   2400  * through the interface if possible.
   2401  */
   2402 
   2403 int cifaddr (int unit, u_int32_t our_adr, u_int32_t his_adr)
   2404 {
   2405     struct ifreq ifr;
   2406 
   2407     if (kernel_version < KVERSION(2,1,16)) {
   2408 /*
   2409  *  Delete the route through the device
   2410  */
   2411 	struct rtentry rt;
   2412 	memset (&rt, '\0', sizeof (rt));
   2413 
   2414 	SET_SA_FAMILY (rt.rt_dst,     AF_INET);
   2415 	SET_SA_FAMILY (rt.rt_gateway, AF_INET);
   2416 	rt.rt_dev = ifname;
   2417 
   2418 	SIN_ADDR(rt.rt_gateway) = 0;
   2419 	SIN_ADDR(rt.rt_dst)     = his_adr;
   2420 	rt.rt_flags = RTF_UP | RTF_HOST;
   2421 
   2422 	if (kernel_version > KVERSION(2,1,0)) {
   2423 	    SET_SA_FAMILY (rt.rt_genmask, AF_INET);
   2424 	    SIN_ADDR(rt.rt_genmask) = -1L;
   2425 	}
   2426 
   2427 	if (ioctl(sock_fd, SIOCDELRT, &rt) < 0 && errno != ESRCH) {
   2428 	    if (still_ppp() && ! ok_error (errno))
   2429 		error("ioctl(SIOCDELRT) device route: %m (line %d)", __LINE__);
   2430 	    return (0);
   2431 	}
   2432     }
   2433 
   2434     /* This way it is possible to have an IPX-only or IPv6-only interface */
   2435     memset(&ifr, 0, sizeof(ifr));
   2436     SET_SA_FAMILY(ifr.ifr_addr, AF_INET);
   2437     strlcpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name));
   2438 
   2439     if (ioctl(sock_fd, SIOCSIFADDR, (caddr_t) &ifr) < 0) {
   2440 	if (! ok_error (errno)) {
   2441 	    error("ioctl(SIOCSIFADDR): %m (line %d)", __LINE__);
   2442 	    return 0;
   2443 	}
   2444     }
   2445 
   2446     our_old_addr = our_adr;
   2447 
   2448     return 1;
   2449 }
   2450 
   2451 #ifdef INET6
   2452 /********************************************************************
   2453  *
   2454  * sif6addr - Config the interface with an IPv6 link-local address
   2455  */
   2456 int sif6addr (int unit, eui64_t our_eui64, eui64_t his_eui64)
   2457 {
   2458     struct in6_ifreq ifr6;
   2459     struct ifreq ifr;
   2460     struct in6_rtmsg rt6;
   2461 
   2462     if (sock6_fd < 0) {
   2463 	errno = -sock6_fd;
   2464 	error("IPv6 socket creation failed: %m");
   2465 	return 0;
   2466     }
   2467     memset(&ifr, 0, sizeof (ifr));
   2468     strlcpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name));
   2469     if (ioctl(sock6_fd, SIOCGIFINDEX, (caddr_t) &ifr) < 0) {
   2470 	error("sif6addr: ioctl(SIOCGIFINDEX): %m (line %d)", __LINE__);
   2471 	return 0;
   2472     }
   2473 
   2474     /* Local interface */
   2475     memset(&ifr6, 0, sizeof(ifr6));
   2476     IN6_LLADDR_FROM_EUI64(ifr6.ifr6_addr, our_eui64);
   2477     ifr6.ifr6_ifindex = ifr.ifr_ifindex;
   2478     ifr6.ifr6_prefixlen = 10;
   2479 
   2480     if (ioctl(sock6_fd, SIOCSIFADDR, &ifr6) < 0) {
   2481 	error("sif6addr: ioctl(SIOCSIFADDR): %m (line %d)", __LINE__);
   2482 	return 0;
   2483     }
   2484 
   2485     /* Route to remote host */
   2486     memset(&rt6, 0, sizeof(rt6));
   2487     IN6_LLADDR_FROM_EUI64(rt6.rtmsg_dst, his_eui64);
   2488     rt6.rtmsg_flags = RTF_UP;
   2489     rt6.rtmsg_dst_len = 10;
   2490     rt6.rtmsg_ifindex = ifr.ifr_ifindex;
   2491     rt6.rtmsg_metric = 1;
   2492 
   2493     if (ioctl(sock6_fd, SIOCADDRT, &rt6) < 0) {
   2494 	error("sif6addr: ioctl(SIOCADDRT): %m (line %d)", __LINE__);
   2495 	return 0;
   2496     }
   2497 
   2498     return 1;
   2499 }
   2500 
   2501 
   2502 /********************************************************************
   2503  *
   2504  * cif6addr - Remove IPv6 address from interface
   2505  */
   2506 int cif6addr (int unit, eui64_t our_eui64, eui64_t his_eui64)
   2507 {
   2508     struct ifreq ifr;
   2509     struct in6_ifreq ifr6;
   2510 
   2511     if (sock6_fd < 0) {
   2512 	errno = -sock6_fd;
   2513 	error("IPv6 socket creation failed: %m");
   2514 	return 0;
   2515     }
   2516     memset(&ifr, 0, sizeof(ifr));
   2517     strlcpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name));
   2518     if (ioctl(sock6_fd, SIOCGIFINDEX, (caddr_t) &ifr) < 0) {
   2519 	error("cif6addr: ioctl(SIOCGIFINDEX): %m (line %d)", __LINE__);
   2520 	return 0;
   2521     }
   2522 
   2523     memset(&ifr6, 0, sizeof(ifr6));
   2524     IN6_LLADDR_FROM_EUI64(ifr6.ifr6_addr, our_eui64);
   2525     ifr6.ifr6_ifindex = ifr.ifr_ifindex;
   2526     ifr6.ifr6_prefixlen = 10;
   2527 
   2528     if (ioctl(sock6_fd, SIOCDIFADDR, &ifr6) < 0) {
   2529 	if (errno != EADDRNOTAVAIL) {
   2530 	    if (! ok_error (errno))
   2531 		error("cif6addr: ioctl(SIOCDIFADDR): %m (line %d)", __LINE__);
   2532 	}
   2533 	else {
   2534 	    warn("cif6addr: ioctl(SIOCDIFADDR): No such address");
   2535 	}
   2536 	return (0);
   2537     }
   2538     return 1;
   2539 }
   2540 #endif /* INET6 */
   2541 
   2542 /*
   2543  * get_pty - get a pty master/slave pair and chown the slave side
   2544  * to the uid given.  Assumes slave_name points to >= 16 bytes of space.
   2545  */
   2546 int
   2547 get_pty(master_fdp, slave_fdp, slave_name, uid)
   2548     int *master_fdp;
   2549     int *slave_fdp;
   2550     char *slave_name;
   2551     int uid;
   2552 {
   2553     int i, mfd, sfd = -1;
   2554     char pty_name[16];
   2555     struct termios tios;
   2556 
   2557 #ifdef TIOCGPTN
   2558     /*
   2559      * Try the unix98 way first.
   2560      */
   2561     mfd = open("/dev/ptmx", O_RDWR);
   2562     if (mfd >= 0) {
   2563 	int ptn;
   2564 	if (ioctl(mfd, TIOCGPTN, &ptn) >= 0) {
   2565 	    slprintf(pty_name, sizeof(pty_name), "/dev/pts/%d", ptn);
   2566 	    chmod(pty_name, S_IRUSR | S_IWUSR);
   2567 #ifdef TIOCSPTLCK
   2568 	    ptn = 0;
   2569 	    if (ioctl(mfd, TIOCSPTLCK, &ptn) < 0)
   2570 		warn("Couldn't unlock pty slave %s: %m", pty_name);
   2571 #endif
   2572 	    if ((sfd = open(pty_name, O_RDWR | O_NOCTTY)) < 0)
   2573 		warn("Couldn't open pty slave %s: %m", pty_name);
   2574 	}
   2575     }
   2576 #endif /* TIOCGPTN */
   2577 
   2578     if (sfd < 0) {
   2579 	/* the old way - scan through the pty name space */
   2580 	for (i = 0; i < 64; ++i) {
   2581 	    slprintf(pty_name, sizeof(pty_name), "/dev/pty%c%x",
   2582 		     'p' + i / 16, i % 16);
   2583 	    mfd = open(pty_name, O_RDWR, 0);
   2584 	    if (mfd >= 0) {
   2585 		pty_name[5] = 't';
   2586 		sfd = open(pty_name, O_RDWR | O_NOCTTY, 0);
   2587 		if (sfd >= 0) {
   2588 		    fchown(sfd, uid, -1);
   2589 		    fchmod(sfd, S_IRUSR | S_IWUSR);
   2590 		    break;
   2591 		}
   2592 		close(mfd);
   2593 	    }
   2594 	}
   2595     }
   2596 
   2597     if (sfd < 0)
   2598 	return 0;
   2599 
   2600     strlcpy(slave_name, pty_name, 16);
   2601     *master_fdp = mfd;
   2602     *slave_fdp = sfd;
   2603     if (tcgetattr(sfd, &tios) == 0) {
   2604 	tios.c_cflag &= ~(CSIZE | CSTOPB | PARENB);
   2605 	tios.c_cflag |= CS8 | CREAD | CLOCAL;
   2606 	tios.c_iflag  = IGNPAR;
   2607 	tios.c_oflag  = 0;
   2608 	tios.c_lflag  = 0;
   2609 	if (tcsetattr(sfd, TCSAFLUSH, &tios) < 0)
   2610 	    warn("couldn't set attributes on pty: %m");
   2611     } else
   2612 	warn("couldn't get attributes on pty: %m");
   2613 
   2614     return 1;
   2615 }
   2616 
   2617 /********************************************************************
   2618  *
   2619  * open_loopback - open the device we use for getting packets
   2620  * in demand mode.  Under Linux, we use a pty master/slave pair.
   2621  */
   2622 int
   2623 open_ppp_loopback(void)
   2624 {
   2625     int flags;
   2626 
   2627     looped = 1;
   2628     if (new_style_driver) {
   2629 	/* allocate ourselves a ppp unit */
   2630 	if (make_ppp_unit() < 0)
   2631 	    die(1);
   2632 	modify_flags(ppp_dev_fd, 0, SC_LOOP_TRAFFIC);
   2633 	set_kdebugflag(kdebugflag);
   2634 	ppp_fd = -1;
   2635 	return ppp_dev_fd;
   2636     }
   2637 
   2638     if (!get_pty(&master_fd, &slave_fd, loop_name, 0))
   2639 	fatal("No free pty for loopback");
   2640 
   2641     set_ppp_fd(slave_fd);
   2642 
   2643     flags = fcntl(master_fd, F_GETFL);
   2644     if (flags == -1 ||
   2645 	fcntl(master_fd, F_SETFL, flags | O_NONBLOCK) == -1)
   2646 	warn("couldn't set master loopback to nonblock: %m");
   2647 
   2648     flags = fcntl(ppp_fd, F_GETFL);
   2649     if (flags == -1 ||
   2650 	fcntl(ppp_fd, F_SETFL, flags | O_NONBLOCK) == -1)
   2651 	warn("couldn't set slave loopback to nonblock: %m");
   2652 
   2653     if (ioctl(ppp_fd, TIOCSETD, &ppp_disc) < 0)
   2654 	fatal("ioctl(TIOCSETD): %m (line %d)", __LINE__);
   2655 /*
   2656  * Find out which interface we were given.
   2657  */
   2658     if (ioctl(ppp_fd, PPPIOCGUNIT, &ifunit) < 0)
   2659 	fatal("ioctl(PPPIOCGUNIT): %m (line %d)", __LINE__);
   2660 /*
   2661  * Enable debug in the driver if requested.
   2662  */
   2663     set_kdebugflag (kdebugflag);
   2664 
   2665     return master_fd;
   2666 }
   2667 
   2668 /********************************************************************
   2669  *
   2670  * sifnpmode - Set the mode for handling packets for a given NP.
   2671  */
   2672 
   2673 int
   2674 sifnpmode(u, proto, mode)
   2675     int u;
   2676     int proto;
   2677     enum NPmode mode;
   2678 {
   2679     struct npioctl npi;
   2680 
   2681     npi.protocol = proto;
   2682     npi.mode     = mode;
   2683     if (ioctl(ppp_dev_fd, PPPIOCSNPMODE, (caddr_t) &npi) < 0) {
   2684 	if (! ok_error (errno))
   2685 	    error("ioctl(PPPIOCSNPMODE, %d, %d): %m", proto, mode);
   2686 	return 0;
   2687     }
   2688     return 1;
   2689 }
   2690 
   2691 
   2692 /********************************************************************
   2694  *
   2695  * sipxfaddr - Config the interface IPX networknumber
   2696  */
   2697 
   2698 int sipxfaddr (int unit, unsigned long int network, unsigned char * node )
   2699 {
   2700     int    result = 1;
   2701 
   2702 #ifdef IPX_CHANGE
   2703     int    skfd;
   2704     struct ifreq         ifr;
   2705     struct sockaddr_ipx *sipx = (struct sockaddr_ipx *) &ifr.ifr_addr;
   2706 
   2707     skfd = socket (AF_IPX, SOCK_DGRAM, 0);
   2708     if (skfd < 0) {
   2709 	if (! ok_error (errno))
   2710 	    dbglog("socket(AF_IPX): %m (line %d)", __LINE__);
   2711 	result = 0;
   2712     }
   2713     else {
   2714 	memset (&ifr, '\0', sizeof (ifr));
   2715 	strlcpy (ifr.ifr_name, ifname, sizeof(ifr.ifr_name));
   2716 
   2717 	memcpy (sipx->sipx_node, node, IPX_NODE_LEN);
   2718 	sipx->sipx_family  = AF_IPX;
   2719 	sipx->sipx_port    = 0;
   2720 	sipx->sipx_network = htonl (network);
   2721 	sipx->sipx_type    = IPX_FRAME_ETHERII;
   2722 	sipx->sipx_action  = IPX_CRTITF;
   2723 /*
   2724  *  Set the IPX device
   2725  */
   2726 	if (ioctl(skfd, SIOCSIFADDR, (caddr_t) &ifr) < 0) {
   2727 	    result = 0;
   2728 	    if (errno != EEXIST) {
   2729 		if (! ok_error (errno))
   2730 		    dbglog("ioctl(SIOCSIFADDR, CRTITF): %m (line %d)", __LINE__);
   2731 	    }
   2732 	    else {
   2733 		warn("ioctl(SIOCSIFADDR, CRTITF): Address already exists");
   2734 	    }
   2735 	}
   2736 	close (skfd);
   2737     }
   2738 #endif
   2739     return result;
   2740 }
   2741 
   2742 /********************************************************************
   2743  *
   2744  * cipxfaddr - Clear the information for the IPX network. The IPX routes
   2745  *	       are removed and the device is no longer able to pass IPX
   2746  *	       frames.
   2747  */
   2748 
   2749 int cipxfaddr (int unit)
   2750 {
   2751     int    result = 1;
   2752 
   2753 #ifdef IPX_CHANGE
   2754     int    skfd;
   2755     struct ifreq         ifr;
   2756     struct sockaddr_ipx *sipx = (struct sockaddr_ipx *) &ifr.ifr_addr;
   2757 
   2758     skfd = socket (AF_IPX, SOCK_DGRAM, 0);
   2759     if (skfd < 0) {
   2760 	if (! ok_error (errno))
   2761 	    dbglog("socket(AF_IPX): %m (line %d)", __LINE__);
   2762 	result = 0;
   2763     }
   2764     else {
   2765 	memset (&ifr, '\0', sizeof (ifr));
   2766 	strlcpy (ifr.ifr_name, ifname, sizeof(ifr.ifr_name));
   2767 
   2768 	sipx->sipx_type    = IPX_FRAME_ETHERII;
   2769 	sipx->sipx_action  = IPX_DLTITF;
   2770 	sipx->sipx_family  = AF_IPX;
   2771 /*
   2772  *  Set the IPX device
   2773  */
   2774 	if (ioctl(skfd, SIOCSIFADDR, (caddr_t) &ifr) < 0) {
   2775 	    if (! ok_error (errno))
   2776 		info("ioctl(SIOCSIFADDR, IPX_DLTITF): %m (line %d)", __LINE__);
   2777 	    result = 0;
   2778 	}
   2779 	close (skfd);
   2780     }
   2781 #endif
   2782     return result;
   2783 }
   2784 
   2785 /*
   2786  * Use the hostname as part of the random number seed.
   2787  */
   2788 int
   2789 get_host_seed()
   2790 {
   2791     int h;
   2792     char *p = hostname;
   2793 
   2794     h = 407;
   2795     for (p = hostname; *p != 0; ++p)
   2796 	h = h * 37 + *p;
   2797     return h;
   2798 }
   2799 
   2800 /********************************************************************
   2801  *
   2802  * sys_check_options - check the options that the user specified
   2803  */
   2804 
   2805 int
   2806 sys_check_options(void)
   2807 {
   2808 #ifdef IPX_CHANGE
   2809 /*
   2810  * Disable the IPX protocol if the support is not present in the kernel.
   2811  */
   2812     char *path;
   2813 
   2814     if (ipxcp_protent.enabled_flag) {
   2815 	struct stat stat_buf;
   2816 	if ((path = path_to_procfs("/net/ipx/interface")) == 0
   2817 	    || (path = path_to_procfs("/net/ipx_interface")) == 0
   2818 	    || lstat(path, &stat_buf) < 0) {
   2819 	    error("IPX support is not present in the kernel\n");
   2820 	    ipxcp_protent.enabled_flag = 0;
   2821 	}
   2822     }
   2823 #endif
   2824     if (demand && driver_is_old) {
   2825 	option_error("demand dialling is not supported by kernel driver "
   2826 		     "version %d.%d.%d", driver_version, driver_modification,
   2827 		     driver_patch);
   2828 	return 0;
   2829     }
   2830     if (multilink && !new_style_driver) {
   2831 	warn("Warning: multilink is not supported by the kernel driver");
   2832 	multilink = 0;
   2833     }
   2834     return 1;
   2835 }
   2836 
   2837 #ifdef INET6
   2838 /*
   2839  * ether_to_eui64 - Convert 48-bit Ethernet address into 64-bit EUI
   2840  *
   2841  * convert the 48-bit MAC address of eth0 into EUI 64. caller also assumes
   2842  * that the system has a properly configured Ethernet interface for this
   2843  * function to return non-zero.
   2844  */
   2845 int
   2846 ether_to_eui64(eui64_t *p_eui64)
   2847 {
   2848     struct ifreq ifr;
   2849     int skfd;
   2850     const unsigned char *ptr;
   2851 
   2852     skfd = socket(PF_INET6, SOCK_DGRAM, 0);
   2853     if(skfd == -1)
   2854     {
   2855         warn("could not open IPv6 socket");
   2856         return 0;
   2857     }
   2858 
   2859     strcpy(ifr.ifr_name, "eth0");
   2860     if(ioctl(skfd, SIOCGIFHWADDR, &ifr) < 0)
   2861     {
   2862         close(skfd);
   2863         warn("could not obtain hardware address for eth0");
   2864         return 0;
   2865     }
   2866     close(skfd);
   2867 
   2868     /*
   2869      * And convert the EUI-48 into EUI-64, per RFC 2472 [sec 4.1]
   2870      */
   2871     ptr = ifr.ifr_hwaddr.sa_data;
   2872     p_eui64->e8[0] = ptr[0] | 0x02;
   2873     p_eui64->e8[1] = ptr[1];
   2874     p_eui64->e8[2] = ptr[2];
   2875     p_eui64->e8[3] = 0xFF;
   2876     p_eui64->e8[4] = 0xFE;
   2877     p_eui64->e8[5] = ptr[3];
   2878     p_eui64->e8[6] = ptr[4];
   2879     p_eui64->e8[7] = ptr[5];
   2880 
   2881     return 1;
   2882 }
   2883 #endif
   2884