tadd this - plan9port - [fork] Plan 9 from user space
 (HTM) git clone git://src.adamsgaard.dk/plan9port
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit ebb4c247727c67b57f692effe97db72ae6f50425
 (DIR) parent a2705f207ff006c07c72081897ec4a6ca22ef269
 (HTM) Author: rsc <devnull@localhost>
       Date:   Fri, 16 Apr 2004 15:28:09 +0000
       
       add this
       
       Diffstat:
         A src/cmd/9term/bsdpty.c              |     109 +++++++++++++++++++++++++++++++
       
       1 file changed, 109 insertions(+), 0 deletions(-)
       ---
 (DIR) diff --git a/src/cmd/9term/bsdpty.c b/src/cmd/9term/bsdpty.c
       t@@ -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;
       +}