* 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.16 2004/10/28 00:16:37 paulus Exp $"
#include <stdio.h>
#include <ctype.h>
if (*cp == 0)
return 0;
- if (strncmp("/dev/", cp, 5) != 0) {
+ if (*cp != '/') {
strlcpy(dev, "/dev/", sizeof(dev));
strlcat(dev, cp, sizeof(dev));
cp = dev;
{
char *connector;
int fdflags;
+#ifndef __linux__
struct stat statbuf;
+#endif
char numbuf[16];
/*
|| 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.
*/
warn("Couldn't restrict write permissions to %s: %m", devnam);
} else
tty_mode = statbuf.st_mode;
+#endif /* __linux__ */
/*
* Set line speed, flow control, etc.
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]);
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);
- }
+ if (fchmod(real_ttyfd, tty_mode) != 0)
+ error("Couldn't restore tty permissions");
}
+#endif /* __linux__ */
close(real_ttyfd);
real_ttyfd = -1;
{
int cpid;
- cpid = fork();
+ cpid = safe_fork();
if (cpid == -1) {
error("Can't fork process for character shunt: %m");
return 0;
if (getuid() != uid)
fatal("setuid failed");
setgid(getgid());
- sys_close();
if (!nodetach)
log_to_fd = -1;
charshunt(ifd, ofd, record_file);