summaryrefslogtreecommitdiffstats
path: root/mdk-stage1/dietlibc/libugly/openpty.c
diff options
context:
space:
mode:
Diffstat (limited to 'mdk-stage1/dietlibc/libugly/openpty.c')
-rw-r--r--mdk-stage1/dietlibc/libugly/openpty.c54
1 files changed, 54 insertions, 0 deletions
diff --git a/mdk-stage1/dietlibc/libugly/openpty.c b/mdk-stage1/dietlibc/libugly/openpty.c
new file mode 100644
index 000000000..8d06f329c
--- /dev/null
+++ b/mdk-stage1/dietlibc/libugly/openpty.c
@@ -0,0 +1,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;
+}