summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Mackerras <paulus@samba.org>1999-04-01 07:20:11 +0000
committerPaul Mackerras <paulus@samba.org>1999-04-01 07:20:11 +0000
commit093489a1ce40a2075b1c5c9feb03c7ab1659d884 (patch)
tree6a1bdb3d4dfd1476462be523d2cfc8ad405987d8
parentf941c11e2e2de87900a20cf38f2d2d53d772c10e (diff)
downloadppp-093489a1ce40a2075b1c5c9feb03c7ab1659d884.tar.gz
couple more get_pty's
-rw-r--r--pppd/sys-bsd.c34
-rw-r--r--pppd/sys-osf.c52
-rw-r--r--pppd/sys-sunos4.c52
3 files changed, 135 insertions, 3 deletions
diff --git a/pppd/sys-bsd.c b/pppd/sys-bsd.c
index 27c5689..60a7927 100644
--- a/pppd/sys-bsd.c
+++ b/pppd/sys-bsd.c
@@ -21,7 +21,7 @@
*/
#ifndef lint
-static char rcsid[] = "$Id: sys-bsd.c,v 1.41 1999/03/22 05:55:36 paulus Exp $";
+static char rcsid[] = "$Id: sys-bsd.c,v 1.42 1999/04/01 07:20:10 paulus Exp $";
/* $NetBSD: sys-bsd.c,v 1.1.1.3 1997/09/26 18:53:04 christos Exp $ */
#endif
@@ -460,6 +460,38 @@ int fd, on;
ioctl(fd, (on? TIOCMBIS: TIOCMBIC), &modembits);
}
+/*
+ * get_pty - get a pty master/slave pair and chown the slave side
+ * to the uid given. Assumes slave_name points to >= 12 bytes of space.
+ */
+int
+get_pty(master_fdp, slave_fdp, slave_name, uid)
+ int *master_fdp;
+ int *slave_fdp;
+ char *slave_name;
+ int uid;
+{
+ struct termios tios;
+
+ if (openpty(master_fdp, slave_fdp, slave_name, NULL, NULL) < 0)
+ return 0;
+
+ fchown(*slave_fdp, uid, -1);
+ fchmod(*slave_fdp, S_IRUSR | S_IWUSR);
+ if (tcgetattr(*slave_fdp, &tios) == 0) {
+ tios.c_cflag &= ~(CSIZE | CSTOPB | PARENB);
+ tios.c_cflag |= CS8 | CREAD;
+ tios.c_iflag = IGNPAR | CLOCAL;
+ tios.c_oflag = 0;
+ tios.c_lflag = 0;
+ if (tcsetattr(*slave_fdp, TCSAFLUSH, &tios) < 0)
+ warn("couldn't set attributes on pty: %m");
+ } else
+ warn("couldn't get attributes on pty: %m");
+
+ return 1;
+}
+
/*
* open_ppp_loopback - open the device we use for getting
diff --git a/pppd/sys-osf.c b/pppd/sys-osf.c
index 94b3dd2..45e176f 100644
--- a/pppd/sys-osf.c
+++ b/pppd/sys-osf.c
@@ -26,7 +26,7 @@
*/
#ifndef lint
-static char rcsid[] = "$Id: sys-osf.c,v 1.23 1999/03/22 05:55:38 paulus Exp $";
+static char rcsid[] = "$Id: sys-osf.c,v 1.24 1999/04/01 07:20:10 paulus Exp $";
#endif
#include <stdio.h>
@@ -1609,6 +1609,56 @@ get_host_seed()
}
/*
+ * get_pty - get a pty master/slave pair and chown the slave side
+ * to the uid given. Assumes slave_name points to >= 12 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 i, mfd, sfd;
+ char pty_name[12];
+ struct termios tios;
+
+ sfd = -1;
+ for (i = 0; i < 64; ++i) {
+ slprintf(pty_name, sizeof(pty_name), "/dev/pty%c%x",
+ 'p' + i / 16, i % 16);
+ mfd = open(pty_name, O_RDWR, 0);
+ if (mfd >= 0) {
+ pty_name[5] = 't';
+ sfd = open(pty_name, O_RDWR | O_NOCTTY, 0);
+ if (sfd >= 0)
+ break;
+ close(mfd);
+ }
+ }
+ if (sfd < 0)
+ return 0;
+
+ strlcpy(slave_name, pty_name, 12);
+ *master_fdp = mfd;
+ *slave_fdp = sfd;
+ fchown(sfd, uid, -1);
+ fchmod(sfd, S_IRUSR | S_IWUSR);
+ if (tcgetattr(sfd, &tios) == 0) {
+ tios.c_cflag &= ~(CSIZE | CSTOPB | PARENB);
+ tios.c_cflag |= CS8 | CREAD;
+ tios.c_iflag = IGNPAR | CLOCAL;
+ tios.c_oflag = 0;
+ tios.c_lflag = 0;
+ if (tcsetattr(sfd, TCSAFLUSH, &tios) < 0)
+ warn("couldn't set attributes on pty: %m");
+ } else
+ warn("couldn't get attributes on pty: %m");
+
+ return 1;
+}
+
+/*
* Code for locking/unlocking the serial device.
* This code is derived from chat.c.
*/
diff --git a/pppd/sys-sunos4.c b/pppd/sys-sunos4.c
index d0b1ac0..ea3deeb 100644
--- a/pppd/sys-sunos4.c
+++ b/pppd/sys-sunos4.c
@@ -26,7 +26,7 @@
*/
#ifndef lint
-static char rcsid[] = "$Id: sys-sunos4.c,v 1.18 1999/03/22 05:55:39 paulus Exp $";
+static char rcsid[] = "$Id: sys-sunos4.c,v 1.19 1999/04/01 07:20:11 paulus Exp $";
#endif
#include <stdio.h>
@@ -1481,6 +1481,56 @@ unlock()
}
/*
+ * get_pty - get a pty master/slave pair and chown the slave side
+ * to the uid given. Assumes slave_name points to >= 12 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 i, mfd, sfd;
+ char pty_name[12];
+ struct termios tios;
+
+ sfd = -1;
+ for (i = 0; i < 64; ++i) {
+ slprintf(pty_name, sizeof(pty_name), "/dev/pty%c%x",
+ 'p' + i / 16, i % 16);
+ mfd = open(pty_name, O_RDWR, 0);
+ if (mfd >= 0) {
+ pty_name[5] = 't';
+ sfd = open(pty_name, O_RDWR | O_NOCTTY, 0);
+ if (sfd >= 0)
+ break;
+ close(mfd);
+ }
+ }
+ if (sfd < 0)
+ return 0;
+
+ strlcpy(slave_name, pty_name, 12);
+ *master_fdp = mfd;
+ *slave_fdp = sfd;
+ fchown(sfd, uid, -1);
+ fchmod(sfd, S_IRUSR | S_IWUSR);
+ if (tcgetattr(sfd, &tios) == 0) {
+ tios.c_cflag &= ~(CSIZE | CSTOPB | PARENB);
+ tios.c_cflag |= CS8 | CREAD;
+ tios.c_iflag = IGNPAR | CLOCAL;
+ tios.c_oflag = 0;
+ tios.c_lflag = 0;
+ if (tcsetattr(sfd, TCSAFLUSH, &tios) < 0)
+ warn("couldn't set attributes on pty: %m");
+ } else
+ warn("couldn't get attributes on pty: %m");
+
+ return 1;
+}
+
+/*
* SunOS doesn't have strtoul :-(
*/
unsigned long