aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrsc <devnull@localhost>2004-04-16 15:28:09 +0000
committerrsc <devnull@localhost>2004-04-16 15:28:09 +0000
commitebb4c247727c67b57f692effe97db72ae6f50425 (patch)
treee6ce1d98ff463c2cbd7de3b7d12d520ee7d0344a
parenta2705f207ff006c07c72081897ec4a6ca22ef269 (diff)
downloadplan9port-ebb4c247727c67b57f692effe97db72ae6f50425.tar.gz
plan9port-ebb4c247727c67b57f692effe97db72ae6f50425.tar.bz2
plan9port-ebb4c247727c67b57f692effe97db72ae6f50425.zip
add this
-rw-r--r--src/cmd/9term/bsdpty.c109
1 files changed, 109 insertions, 0 deletions
diff --git a/src/cmd/9term/bsdpty.c b/src/cmd/9term/bsdpty.c
new file mode 100644
index 00000000..ebcf2ef0
--- /dev/null
+++ b/src/cmd/9term/bsdpty.c
@@ -0,0 +1,109 @@
+#include <u.h>
+#include <errno.h>
+#include <grp.h>
+#include <termios.h>
+#include <sys/termios.h>
+#include <pty.h>
+#include <fcntl.h>
+#include <libc.h>
+#include "term.h"
+
+#define debug 0
+
+static char *abc =
+ "abcdefghijklmnopqrstuvwxyz"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+ "0123456789";
+static char *_123 =
+ "0123456789"
+ "abcdefghijklmnopqrstuvwxyz"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
+
+int
+getpts(int fd[], char *slave)
+{
+ char *a, *z;
+ char pty[] = "/dev/ptyXX";
+
+ for(a=abc; *a; a++)
+ for(z=_123; *z; z++){
+ pty[8] = *a;
+ pty[9] = *z;
+ if((fd[1] = open(pty, ORDWR)) < 0){
+fprint(2, "try %s: %r\n", pty);
+ if(errno == ENOENT)
+ break;
+ }else{
+ fchmod(fd[1], 0620);
+ strcpy(slave, pty);
+ slave[5] = 't';
+ if((fd[0] = open(slave, ORDWR)) >= 0)
+ return 0;
+ close(fd[1]);
+ }
+ }
+ sysfatal("no ptys");
+ return 0;
+}
+
+int
+childpty(int fd[], char *slave)
+{
+ int sfd;
+
+ close(fd[1]); /* drop master */
+ setsid();
+ sfd = open(slave, ORDWR);
+ if(sfd < 0)
+ sysfatal("child open %s: %r\n", slave);
+ if(ioctl(sfd, TIOCSCTTY, 0) < 0)
+ fprint(2, "ioctl TIOCSCTTY: %r\n");
+ return sfd;
+}
+
+struct winsize ows;
+
+void
+updatewinsize(int row, int col, int dx, int dy)
+{
+ struct winsize ws;
+
+ ws.ws_row = row;
+ ws.ws_col = col;
+ ws.ws_xpixel = dx;
+ ws.ws_ypixel = dy;
+ if(ws.ws_row != ows.ws_row || ws.ws_col != ows.ws_col)
+ if(ioctl(rcfd, TIOCSWINSZ, &ws) < 0)
+ fprint(2, "ioctl: %r\n");
+ ows = ws;
+}
+
+static struct termios ttmode;
+
+int
+isecho(int fd)
+{
+ if(tcgetattr(fd, &ttmode) < 0)
+ fprint(2, "tcgetattr: %r\n");
+ if(debug) fprint(2, "israw %c%c\n",
+ ttmode.c_lflag&ICANON ? 'c' : '-',
+ ttmode.c_lflag&ECHO ? 'e' : '-');
+ return ttmode.c_lflag&ECHO;
+}
+
+int
+setecho(int fd, int newe)
+{
+ int old;
+
+ if(tcgetattr(fd, &ttmode) < 0)
+ fprint(2, "tcgetattr: %r\n");
+ old = ttmode.c_lflag & ECHO;
+ if(old != newe){
+ ttmode.c_lflag &= ~ECHO;
+ ttmode.c_lflag |= newe;
+ if(tcsetattr(fd, TCSADRAIN, &ttmode) < 0)
+ fprint(2, "tcsetattr: %r\n");
+ }
+ return old;
+}