add this
diff --git a/src/cmd/9term/bsdpty.c b/src/cmd/9term/bsdpty.c
new file mode 100644
index 0000000..ebcf2ef
--- /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;
+}