]> git.ozlabs.org Git - ppp.git/blobdiff - pppd/sys-solaris.c
pppd: Add option "stop-bits" to set number of serial port stop bits.
[ppp.git] / pppd / sys-solaris.c
index d3675f6296ea7e34aa209e0d01a24042dba0d01a..93d90332e0d4f2116b17800970e082cf193640dd 100644 (file)
  * 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(s) of the authors of this software must not be used to
+ * 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.
  *
- * 4. Redistributions of any form whatsoever must retain the following
+ * 3. Redistributions of any form whatsoever must retain the following
  *    acknowledgment:
  *    "This product includes software developed by Paul Mackerras
  *     <paulus@samba.org>".
@@ -90,7 +85,7 @@
  * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */
 
-#define RCSID  "$Id: sys-solaris.c,v 1.10 2003/03/03 05:11:46 paulus Exp $"
+#define RCSID  "$Id: sys-solaris.c,v 1.16 2008/01/30 14:26:53 carlsonj Exp $"
 
 #include <limits.h>
 #include <stdio.h>
 #endif
 #include <signal.h>
 #include <utmpx.h>
+#include <stropts.h>
 #include <sys/types.h>
 #include <sys/ioccom.h>
 #include <sys/stream.h>
@@ -198,7 +194,7 @@ 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)
 
@@ -1229,6 +1225,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;
@@ -1539,38 +1538,33 @@ netif_set_mtu(unit, mtu)
  * tty_send_config - configure the transmit characteristics of
  * the ppp interface.
  */
-int
+void
 tty_send_config(mtu, asyncmap, pcomp, accomp)
     int mtu;
     u_int32_t asyncmap;
     int pcomp, accomp;
 {
     int cf[2];
-    int ret = 0;
 
     link_mtu = mtu;
     if (strioctl(pppfd, PPPIO_MTU, &mtu, sizeof(mtu), 0) < 0) {
-       if (hungup && errno == ENXIO)
-           return -1;
+       if (hungup && errno == ENXIO) {
+           ++error_count;
+           return;
+       }
        error("Couldn't set MTU: %m");
-       ret = -1;
     }
     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");
-               ret = -1;
-           }
        }
        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");
-           ret = -1;
-       }
     }
-    return ret;
 }
 
 /*
@@ -1594,38 +1588,33 @@ tty_set_xaccm(accm)
  * tty_recv_config - configure the receive-side characteristics of
  * the ppp interface.
  */
-int
+void
 tty_recv_config(mru, asyncmap, pcomp, accomp)
     int mru;
     u_int32_t asyncmap;
     int pcomp, accomp;
 {
     int cf[2];
-    int ret = 0;
 
     link_mru = mru;
     if (strioctl(pppfd, PPPIO_MRU, &mru, sizeof(mru), 0) < 0) {
-       if (hungup && errno == ENXIO)
-           return -1;
+       if (hungup && errno == ENXIO) {
+           ++error_count;
+           return;
+       }
        error("Couldn't set MRU: %m");
-       ret = -1;
     }
     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");
-               ret = -1;
-           }
        }
        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");
-           ret = -1;
-       }
     }
-    return ret;
 }
 
 /*
@@ -2234,7 +2223,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];
@@ -2479,8 +2468,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 {
@@ -2753,7 +2747,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) {