summaryrefslogtreecommitdiff
path: root/share/hackvr/examples/hackvr_term/pty.c
diff options
context:
space:
mode:
Diffstat (limited to 'share/hackvr/examples/hackvr_term/pty.c')
-rw-r--r--share/hackvr/examples/hackvr_term/pty.c62
1 files changed, 62 insertions, 0 deletions
diff --git a/share/hackvr/examples/hackvr_term/pty.c b/share/hackvr/examples/hackvr_term/pty.c
new file mode 100644
index 0000000..1011e38
--- /dev/null
+++ b/share/hackvr/examples/hackvr_term/pty.c
@@ -0,0 +1,62 @@
+#include <stdio.h>
+#include <fcntl.h>
+#include <sys/wait.h>
+
+int main(int argc,char *argv[]) {
+ char *pts;
+ char in[256];//I dunno.
+ int r;
+ int pid;
+ int master,slave;
+ master=open("/dev/ptmx",O_RDWR);
+ if(master == -1) return 1;
+ pts=ptsname(master);
+// printf("%s\n",pts);
+// system("ls -l /dev/pts/*");
+ grantpt(master);
+ unlockpt(master);
+// system("ls -l /dev/pts/*");
+ if(pts == NULL) return 2;
+ slave=open(pts,O_RDWR);
+ if(slave == -1) {
+ perror("open");
+ return 3;
+ }
+ argv++;
+ fcntl(master,F_SETFL,O_NONBLOCK);
+// fcntl(slave,F_SETFL,O_NONBLOCK);
+ fcntl(0,F_SETFL,O_NONBLOCK);
+ fcntl(1,F_SETFL,O_NONBLOCK);
+ fcntl(2,F_SETFL,O_NONBLOCK);
+ switch(pid=fork()) {
+ case -1:
+ return 4;//fork failed
+ case 0://child
+ setsid();
+ close(master);
+ dup2(slave,0);
+ dup2(slave,1);
+ dup2(slave,2);
+ execv(argv[0],argv);//execute arguments.
+ return 5;//exec failed
+ default:
+ break;
+ }
+ for(;;) {
+ if(waitpid(-1,0,WNOHANG) > 0) {
+ return 0;//fuck if I know.
+ //we got a dead child. let's bail.
+ }
+ switch(r=read(0,&in,1)) {
+ case 0: return 6;//EOF
+ case -1: break;//EAGAIN probably.
+ default: write(master,in,r);
+ }
+ switch(r=read(master,&in,1)) {
+ case 0: return 7;//EOF
+ case -1: break;//EAGAIN probably
+ default: write(1,in,r);
+ }
+ usleep(100);//kek
+ }
+}