1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
#include <unistd.h>
#include <pty.h>
#include <fcntl.h>
#include <termios.h>
#include <sys/ioctl.h>
#include <errno.h>
#include <string.h>
extern int __ltostr(char *s, int size, unsigned long i, int base, char UpCase);
int openpty(int *amaster, int *aslave, char *name, struct termios
*termp, struct winsize *winp) {
int fd;
char buf[20];
#if 0
This is what glibc does:
open("/dev/ptmx", O_RDWR) = 4
statfs("/dev/pts", {f_type=0x1cd1, f_bsize=1024, f_blocks=0, f_bfree=0, f_files=0, f_ffree=0, f_namelen=255}) = 0
ioctl(4, TCGETS, {B38400 opost isig icanon echo ...}) = 0
ioctl(4, 0x80045430, [0]) = 0
stat("/dev/pts/0", {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0
statfs("/dev/pts/0", {f_type=0x1cd1, f_bsize=1024, f_blocks=0, f_bfree=0, f_files=0, f_ffree=0, f_namelen=255}) = 0
ioctl(4, 0x40045431, [0]) = 0
ioctl(4, TCGETS, {B38400 opost isig icanon echo ...}) = 0
ioctl(4, 0x80045430, [0]) = 0
stat("/dev/pts/0", {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0
open("/dev/pts/0", O_RDWR|O_NOCTTY) = 5
#endif
if ((fd=open("/dev/ptmx",O_RDWR))<0) return -1;
#if 0
if (ioctl(fd,TCGETS,&ts)<0) goto kaputt;
#endif
{
int unlock=0;
while (ioctl(fd,TIOCSPTLCK, &unlock)<0) if (errno!=EINTR) goto kaputt;
}
{
int ptyno;
while (ioctl(fd,TIOCGPTN,&ptyno)<0) if (errno!=EINTR) goto kaputt;
strcpy(buf,"/dev/pts/");
__ltostr(buf+9,10,ptyno,10,0);
}
*aslave=open(buf,O_RDWR|O_NOCTTY);
if (*aslave<0) goto kaputt;
*amaster=fd;
if (name) strcpy(name,buf);
if (termp)
while (tcsetattr(*aslave,TCSAFLUSH,termp) && errno==EINTR);
if (winp) while (ioctl(*aslave, TIOCSWINSZ, winp) && errno==EINTR);
return 0;
kaputt:
close(fd);
return -1;
}
|