X-Git-Url: http://git.ozlabs.org/?p=ppp.git;a=blobdiff_plain;f=pppd%2Ftty.c;h=d6026981613a67e736062e4f30a7cd50ed52e822;hp=efc92ec0fd34cbf8da3304c02db6ae70f8aa20e1;hb=c85f525a3b84b2c65c3c74885997c3b7f9f411d1;hpb=fc8efe940e9364ffd8d05023f0d96747f854388b diff --git a/pppd/tty.c b/pppd/tty.c index efc92ec..d602698 100644 --- a/pppd/tty.c +++ b/pppd/tty.c @@ -73,7 +73,7 @@ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -#define RCSID "$Id: tty.c,v 1.9 2002/12/06 12:06:45 paulus Exp $" +#define RCSID "$Id: tty.c,v 1.13 2004/01/13 04:17:59 paulus Exp $" #include #include @@ -580,6 +580,11 @@ int connect_tty() || fcntl(ttyfd, F_SETFL, fdflags & ~O_NONBLOCK) < 0) warn("Couldn't reset non-blocking mode on device: %m"); +#ifndef __linux__ + /* + * Linux 2.4 and above blocks normal writes to the tty + * when it is in PPP line discipline, so this isn't needed. + */ /* * Do the equivalent of `mesg n' to stop broadcast messages. */ @@ -588,6 +593,7 @@ int connect_tty() warn("Couldn't restrict write permissions to %s: %m", devnam); } else tty_mode = statbuf.st_mode; +#endif /* __linux__ */ /* * Set line speed, flow control, etc. @@ -614,6 +620,11 @@ int connect_tty() if (pipe(ipipe) < 0 || pipe(opipe) < 0) fatal("Couldn't create pipes for record option: %m"); + + /* don't leak these to the ptycommand */ + (void) fcntl(ipipe[0], F_SETFD, FD_CLOEXEC); + (void) fcntl(opipe[1], F_SETFD, FD_CLOEXEC); + ok = device_script(ptycommand, opipe[0], ipipe[1], 1) == 0 && start_charshunt(ipipe[0], opipe[1]); close(ipipe[0]); @@ -795,12 +806,14 @@ finish_tty() restore_tty(real_ttyfd); +#ifndef __linux__ if (tty_mode != (mode_t) -1) { if (fchmod(real_ttyfd, tty_mode) != 0) { /* XXX if devnam is a symlink, this will change the link */ chmod(devnam, tty_mode); } } +#endif /* __linux__ */ close(real_ttyfd); real_ttyfd = -1; @@ -882,7 +895,7 @@ start_charshunt(ifd, ofd) { int cpid; - cpid = fork(); + cpid = safe_fork(); if (cpid == -1) { error("Can't fork process for character shunt: %m"); return 0; @@ -894,7 +907,6 @@ start_charshunt(ifd, ofd) if (getuid() != uid) fatal("setuid failed"); setgid(getgid()); - sys_close(); if (!nodetach) log_to_fd = -1; charshunt(ifd, ofd, record_file);