X-Git-Url: https://git.ozlabs.org/?a=blobdiff_plain;f=pppd%2Fsys-svr4.c;h=02643182995039fb27d7a25516e9995b738eca03;hb=a3630de20e34796f434a728bfd9cf1a961380c82;hp=461e53640979373dbe328928a5c591fec4da4784;hpb=ab7cff041f1b8054ae5691df236fe18c1d23bfe6;p=ppp.git diff --git a/pppd/sys-svr4.c b/pppd/sys-svr4.c index 461e536..0264318 100644 --- a/pppd/sys-svr4.c +++ b/pppd/sys-svr4.c @@ -25,9 +25,7 @@ * OR MODIFICATIONS. */ -#ifndef lint -static char rcsid[] = "$Id: sys-svr4.c,v 1.28 1999/03/19 04:23:52 paulus Exp $"; -#endif +#define RCSID "$Id: sys-svr4.c,v 1.33 1999/08/13 06:46:20 paulus Exp $" #include #include @@ -60,13 +58,17 @@ static char rcsid[] = "$Id: sys-svr4.c,v 1.28 1999/03/19 04:23:52 paulus Exp $"; #include #include #include +#ifdef SOL2 #include #include #include #include +#endif #include "pppd.h" +static const char rcsid[] = RCSID; + static int pppfd; static int fdmuxid = -1; static int ipfd; @@ -92,6 +94,7 @@ static int link_mtu, link_mru; #define NMODULES 32 static int tty_nmodules; static char tty_modules[NMODULES][FMNAMESZ+1]; +static int tty_npushed; static int if_is_up; /* Interface has been marked up */ static u_int32_t remote_addr; /* IP address of peer */ @@ -128,7 +131,7 @@ sys_init() if (ipfd < 0) fatal("Couldn't open IP device: %m"); - if (default_device) + if (default_device && !notty) tty_sid = getsid((pid_t)0); pppfd = open("/dev/ppp", O_RDWR | O_NONBLOCK, 0); @@ -221,7 +224,7 @@ sys_check_options() return 1; } - +#if 0 /* * daemon - Detach us from controlling terminal session. */ @@ -245,6 +248,7 @@ daemon(nochdir, noclose) } return 0; } +#endif /* * ppp_available - check whether the system has any ppp interfaces @@ -269,27 +273,39 @@ establish_ppp(fd) /* Pop any existing modules off the tty stream. */ for (i = 0;; ++i) if (ioctl(fd, I_LOOK, tty_modules[i]) < 0 + || strcmp(tty_modules[i], "ptem") == 0 || ioctl(fd, I_POP, 0) < 0) break; tty_nmodules = i; /* Push the async hdlc module and the compressor module. */ - if (ioctl(fd, I_PUSH, "ppp_ahdl") < 0) - fatal("Couldn't push PPP Async HDLC module: %m"); + tty_npushed = 0; + + if(!sync_serial) { + if (ioctl(fd, I_PUSH, "ppp_ahdl") < 0) { + error("Couldn't push PPP Async HDLC module: %m"); + return -1; + } + ++tty_npushed; + } if (kdebugflag & 4) { i = PPPDBG_LOG + PPPDBG_AHDLC; strioctl(pppfd, PPPIO_DEBUG, &i, sizeof(int), 0); } if (ioctl(fd, I_PUSH, "ppp_comp") < 0) error("Couldn't push PPP compression module: %m"); + else + ++tty_npushed; if (kdebugflag & 2) { i = PPPDBG_LOG + PPPDBG_COMP; strioctl(pppfd, PPPIO_DEBUG, &i, sizeof(int), 0); } /* Link the serial port under the PPP multiplexor. */ - if ((fdmuxid = ioctl(pppfd, I_LINK, fd)) < 0) - fatal("Can't link tty to PPP mux: %m"); + if ((fdmuxid = ioctl(pppfd, I_LINK, fd)) < 0) { + error("Can't link tty to PPP mux: %m"); + return -1; + } return pppfd; } @@ -322,8 +338,8 @@ disestablish_ppp(fd) fdmuxid = -1; if (!hungup) { - while (ioctl(fd, I_POP, 0) >= 0) - ; + while (tty_npushed > 0 && ioctl(fd, I_POP, 0) >= 0) + --tty_npushed; for (i = tty_nmodules - 1; i >= 0; --i) if (ioctl(fd, I_PUSH, tty_modules[i]) < 0) error("Couldn't restore tty module %s: %m", @@ -443,6 +459,9 @@ struct speed { #ifdef B57600 { 57600, B57600 }, #endif +#ifdef B76800 + { 76800, B76800 }, +#endif #ifdef B115200 { 115200, B115200 }, #endif @@ -499,7 +518,7 @@ set_up_tty(fd, local) struct termiox tiox; #endif - if (tcgetattr(fd, &tios) < 0) + if (!sync_serial && tcgetattr(fd, &tios) < 0) fatal("tcgetattr: %m"); #ifndef CRTSCTS @@ -564,7 +583,7 @@ set_up_tty(fd, local) fatal("Baud rate for %s is 0; need explicit baud rate", devnam); } - if (tcsetattr(fd, TCSAFLUSH, &tios) < 0) + if (!sync_serial && tcsetattr(fd, TCSAFLUSH, &tios) < 0) fatal("tcsetattr: %m"); #ifndef CRTSCTS @@ -938,12 +957,16 @@ get_idle_time(u, ip) int get_ppp_stats(u, stats) int u; - struct ppp_stats *stats; + struct pppd_stats *stats; { - if (strioctl(pppfd, PPPIO_GETSTAT, stats, 0, sizeof(*stats)) < 0) { + struct ppp_stats s; + + if (strioctl(pppfd, PPPIO_GETSTAT, &s, 0, sizeof(s)) < 0) { error("Couldn't get link statistics: %m"); return 0; } + stats->bytes_in = s.p.ppp_ibytes; + stats->bytes_out = s.p.ppp_obytes; return 1; } @@ -1596,9 +1619,9 @@ logwtmp(line, name, host) if (name[0] != 0) { /* logging in */ - strlcpy(utmpx.ut_user, name, sizeof(utmpx.ut_user)); - strlcpy(utmpx.ut_id, ifname, sizeof(utmpx.ut_id)); - strlcpy(utmpx.ut_line, line, sizeof(utmpx.ut_line)); + 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)); utmpx.ut_pid = getpid(); utmpx.ut_type = USER_PROCESS; } else { @@ -1642,6 +1665,7 @@ strioctl(fd, cmd, ptr, ilen, olen) return 0; } +#if 0 /* * lock - create a lock file for the named lock device */ @@ -1719,7 +1743,7 @@ unlock() lock_file[0] = 0; } } - +#endif /* * cifroute - delete a route through the addresses given. @@ -1761,6 +1785,7 @@ int have_route_to(addr) u_int32_t addr; { +#ifdef SOL2 int fd, r, flags, i; struct { struct T_optmgmt_req req; @@ -1851,4 +1876,58 @@ have_route_to(addr) } close(fd); return 0; +#else + return -1; +#endif /* SOL2 */ +} + +/* + * get_pty - get a pty master/slave pair and chown the slave side to + * the uid given. Assumes slave_name points to MAXPATHLEN bytes of space. + */ +int +get_pty(master_fdp, slave_fdp, slave_name, uid) + int *master_fdp; + int *slave_fdp; + char *slave_name; + int uid; +{ + int mfd, sfd; + char *pty_name; + struct termios tios; + + mfd = open("/dev/ptmx", O_RDWR); + if (mfd < 0) { + error("Couldn't open pty master: %m"); + return 0; + } + + pty_name = ptsname(mfd); + if (pty_name == NULL) { + error("Couldn't get name of pty slave"); + close(mfd); + return 0; + } + if (chown(pty_name, uid, -1) < 0) + warn("Couldn't change owner of pty slave: %m"); + if (chmod(pty_name, S_IRUSR | S_IWUSR) < 0) + warn("Couldn't change permissions on pty slave: %m"); + if (unlockpt(mfd) < 0) + warn("Couldn't unlock pty slave: %m"); + + sfd = open(pty_name, O_RDWR); + if (sfd < 0) { + error("Couldn't open pty slave %s: %m", pty_name); + close(mfd); + return 0; + } + if (ioctl(sfd, I_PUSH, "ptem") < 0) + warn("Couldn't push ptem module on pty slave: %m"); + + dbglog("Using %s", pty_name); + strlcpy(slave_name, pty_name, MAXPATHLEN); + *master_fdp = mfd; + *slave_fdp = sfd; + + return 1; }