X-Git-Url: https://git.ozlabs.org/?a=blobdiff_plain;f=pppd%2Fsys-solaris.c;h=1d6f012c90f2fc9113461dc5d9f051fce31babc6;hb=388597eee99beac6e5b7430d24c377169f51bd57;hp=dc2fe2bc20aab2c6ea72ea63a0194b941afbf7c7;hpb=c30d204fe82b18fb9668a05afb587a37f981696c;p=ppp.git diff --git a/pppd/sys-solaris.c b/pppd/sys-solaris.c index dc2fe2b..1d6f012 100644 --- a/pppd/sys-solaris.c +++ b/pppd/sys-solaris.c @@ -18,36 +18,80 @@ * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES * - * Copyright (c) 1994 The Australian National University. - * All rights reserved. + * Copyright (c) 1995-2002 Paul Mackerras. All rights reserved. * - * Permission to use, copy, modify, and distribute this software and its - * documentation is hereby granted, provided that the above copyright - * notice appears in all copies. This software is provided without any - * warranty, express or implied. The Australian National University - * makes no representations about the suitability of this software for - * any purpose. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. The name(s) of the authors of this software must not be used to + * endorse or promote products derived from this software without + * prior written permission. + * + * 3. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by Paul Mackerras + * ". + * + * THE AUTHORS OF THIS SOFTWARE DISCLAIM ALL WARRANTIES WITH REGARD TO + * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS, IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN + * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING + * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Derived from main.c and pppd.h, which are: * - * IN NO EVENT SHALL THE AUSTRALIAN NATIONAL UNIVERSITY BE LIABLE TO ANY - * PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES - * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF - * THE AUSTRALIAN NATIONAL UNIVERSITY HAVE BEEN ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. + * Copyright (c) 1984-2000 Carnegie Mellon University. All rights reserved. * - * THE AUSTRALIAN NATIONAL UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY - * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS - * ON AN "AS IS" BASIS, AND THE AUSTRALIAN NATIONAL UNIVERSITY HAS NO - * OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, - * OR MODIFICATIONS. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The name "Carnegie Mellon University" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For permission or any legal + * details, please contact + * Office of Technology Transfer + * Carnegie Mellon University + * 5000 Forbes Avenue + * Pittsburgh, PA 15213-3890 + * (412) 268-4387, fax: (412) 268-7395 + * tech-transfer@andrew.cmu.edu + * + * 4. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by Computing Services + * at Carnegie Mellon University (http://www.cmu.edu/computing/)." + * + * CARNEGIE MELLON UNIVERSITY DISCLAIMS ALL WARRANTIES WITH REGARD TO + * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS, IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY BE LIABLE + * FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN + * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING + * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -#define RCSID "$Id: sys-solaris.c,v 1.7 2002/02/12 20:07:09 dfs Exp $" +#define RCSID "$Id: sys-solaris.c,v 1.16 2008/01/30 14:26:53 carlsonj Exp $" #include #include #include #include +#include #include #include #include @@ -58,6 +102,7 @@ #endif #include #include +#include #include #include #include @@ -121,7 +166,6 @@ #define UDP6_DEV_NAME "/dev/udp6" #endif /* !defined(UDP6_DEV_NAME) && defined(SOL2) */ -static const char rcsid[] = RCSID; #if defined(SOL2) /* @@ -149,16 +193,24 @@ static int if6_is_up = 0; /* IPv6 interface has been marked up */ eui64_copy(eui64, s->sin6_addr.s6_addr32[2]); \ s->sin6_family = AF_INET6; \ l.lifr_addr.ss_family = AF_INET6; \ - l.lifr_addrlen = 10; \ + l.lifr_addrlen = 64; \ l.lifr_addr = laddr; \ } while (0) +#define _IN6A_LLX_FROM_EUI64(s, eui64, as) do { \ + s->s6_addr32[0] = htonl(as); \ + eui64_copy(eui64, s->s6_addr32[2]); \ + } while (0) + #define IN6_LLADDR_FROM_EUI64(l, s, eui64) \ _IN6_LLX_FROM_EUI64(l, s, eui64, 0xfe800000) #define IN6_LLTOKEN_FROM_EUI64(l, s, eui64) \ _IN6_LLX_FROM_EUI64(l, s, eui64, 0) +#define IN6A_LLADDR_FROM_EUI64(s, eui64) \ + _IN6A_LLX_FROM_EUI64(s, eui64, 0xfe800000) + #endif /* defined(INET6) && defined(SOL2) */ #if defined(INET6) && defined(SOL2) @@ -193,6 +245,7 @@ static int tty_npushed; static int if_is_up; /* Interface has been marked up */ static u_int32_t remote_addr; /* IP address of peer */ static u_int32_t default_route_gateway; /* Gateway for default route added */ +static eui64_t default_route_gateway6; /* Gateway for default IPv6 route added */ static u_int32_t proxy_arp_addr; /* Addr for proxy arp entry added */ /* Prototypes for procedures local to this file. */ @@ -742,6 +795,8 @@ sys_cleanup() sifdown(0); if (default_route_gateway) cifdefaultroute(0, default_route_gateway, default_route_gateway); + if (default_route_gateway6) + cif6defaultroute(0, default_route_gateway6, default_route_gateway6); if (proxy_arp_addr) cifproxyarp(0, proxy_arp_addr); #if defined(SOL2) @@ -1180,6 +1235,9 @@ set_up_tty(fd, local) } #endif + if (stop_bits >= 2) + tios.c_cflag |= CSTOPB; + tios.c_cflag |= CS8 | CREAD | HUPCL; if (local || !modem) tios.c_cflag |= CLOCAL; @@ -1500,22 +1558,22 @@ tty_send_config(mtu, asyncmap, pcomp, accomp) link_mtu = mtu; if (strioctl(pppfd, PPPIO_MTU, &mtu, sizeof(mtu), 0) < 0) { - if (hungup && errno == ENXIO) + if (hungup && errno == ENXIO) { + ++error_count; return; + } error("Couldn't set MTU: %m"); } if (fdmuxid >= 0) { if (!sync_serial) { - if (strioctl(pppfd, PPPIO_XACCM, &asyncmap, sizeof(asyncmap), 0) < 0) { + if (strioctl(pppfd, PPPIO_XACCM, &asyncmap, sizeof(asyncmap), 0) < 0) error("Couldn't set transmit ACCM: %m"); - } } cf[0] = (pcomp? COMP_PROT: 0) + (accomp? COMP_AC: 0); cf[1] = COMP_PROT | COMP_AC; if (any_compressions() && - strioctl(pppfd, PPPIO_CFLAGS, cf, sizeof(cf), sizeof(int)) < 0) { + strioctl(pppfd, PPPIO_CFLAGS, cf, sizeof(cf), sizeof(int)) < 0) error("Couldn't set prot/AC compression: %m"); - } } } @@ -1550,22 +1608,22 @@ tty_recv_config(mru, asyncmap, pcomp, accomp) link_mru = mru; if (strioctl(pppfd, PPPIO_MRU, &mru, sizeof(mru), 0) < 0) { - if (hungup && errno == ENXIO) + if (hungup && errno == ENXIO) { + ++error_count; return; + } error("Couldn't set MRU: %m"); } if (fdmuxid >= 0) { if (!sync_serial) { - if (strioctl(pppfd, PPPIO_RACCM, &asyncmap, sizeof(asyncmap), 0) < 0) { + if (strioctl(pppfd, PPPIO_RACCM, &asyncmap, sizeof(asyncmap), 0) < 0) error("Couldn't set receive ACCM: %m"); - } } cf[0] = (pcomp? DECOMP_PROT: 0) + (accomp? DECOMP_AC: 0); cf[1] = DECOMP_PROT | DECOMP_AC; if (any_compressions() && - strioctl(pppfd, PPPIO_CFLAGS, cf, sizeof(cf), sizeof(int)) < 0) { + strioctl(pppfd, PPPIO_CFLAGS, cf, sizeof(cf), sizeof(int)) < 0) error("Couldn't set prot/AC decompression: %m"); - } } } @@ -1909,6 +1967,62 @@ cif6addr(u, o, h) return 1; } +/* + * sif6defaultroute - assign a default route through the address given. + */ +int +sif6defaultroute(u, l, g) + int u; + eui64_t l, g; +{ + struct rtentry rt; + +#if defined(__USLC__) + g = l; /* use the local address as gateway */ +#endif + memset(&rt, 0, sizeof(rt)); + memset(&rt.rtmsg_dst, 0, sizeof(rt.rtmsg_dst)); + rt.rtmsg_dst_len = 0; + IN6A_LLADDR_FROM_EUI64(&rt.rtmsg_gateway, g); + rt.rtmsg_flags = RTF_GATEWAY; + + if (ioctl(ip6fd, SIOCADDRT, &rt) < 0) { + error("Can't add default route: %m"); + return 0; + } + + default_route_gateway6 = g; + return 1; +} + +/* + * cif6defaultroute - delete a default route through the address given. + */ +int +cif6defaultroute(u, l, g) + int u; + eui64_t l, g; +{ + struct rtentry rt; + +#if defined(__USLC__) + g = l; /* use the local address as gateway */ +#endif + memset(&rt, 0, sizeof(rt)); + memset(&rt.rtmsg_dst, 0, sizeof(rt.rtmsg_dst)); + rt.rtmsg_dst_len = 0; + IN6A_LLADDR_FROM_EUI64(&rt.rtmsg_gateway, g); + rt.rtmsg_flags = RTF_GATEWAY; + + if (ioctl(ip6fd, SIOCDELRT, &rt) < 0) { + error("Can't delete default route: %m"); + return 0; + } + + default_route_gateway6 = 0; + return 1; +} + #endif /* defined(SOL2) && defined(INET6) */ @@ -2175,7 +2289,7 @@ get_hw_addr_dlpi(name, hwaddr) char *name; struct sockaddr *hwaddr; { - char *p, *q; + char *q; int unit, iffd, adrlen; unsigned char *adrp; char ifdev[24]; @@ -2420,8 +2534,13 @@ logwtmp(line, name, host) if (name[0] != 0) { /* logging in */ strncpy(utmpx.ut_user, name, sizeof(utmpx.ut_user)); - strncpy(utmpx.ut_id, ifname, sizeof(utmpx.ut_id)); strncpy(utmpx.ut_line, line, sizeof(utmpx.ut_line)); + strncpy(utmpx.ut_host, host, sizeof(utmpx.ut_host)); + if (*host != '\0') { + utmpx.ut_syslen = strlen(host) + 1; + if (utmpx.ut_syslen > sizeof(utmpx.ut_host)) + utmpx.ut_syslen = sizeof(utmpx.ut_host); + } utmpx.ut_pid = getpid(); utmpx.ut_type = USER_PROCESS; } else { @@ -2694,7 +2813,6 @@ get_pty(master_fdp, slave_fdp, slave_name, uid) { int mfd, sfd; char *pty_name; - struct termios tios; mfd = open("/dev/ptmx", O_RDWR); if (mfd < 0) {