xref: /haiku/src/tests/add-ons/kernel/drivers/tty/posix_openpt_test.cpp (revision 5b189b0e1e2f51f367bfcb126b2f00a3702f352d)
1 
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include <stdarg.h>
5 #include <fcntl.h>
6 #include <unistd.h>
7 #include <string.h>
8 #include <errno.h>
9 #include <sys/ioctl.h>
10 #include <termios.h>
11 #include <signal.h>
12 
13 void die(const char *ptr, ...)
14 {
15 	va_list vlist;
16 	va_start(vlist, ptr);
17 	char ch;
18 
19 	while ((ch = *ptr++) != '\0') {
20 		if (ch == '%' && *ptr != '\0') {
21 			ch = *ptr++;
22 			switch(ch) {
23 			case 'd': printf("%d", va_arg(vlist, int)); break;
24 			case 'e': printf("%e", va_arg(vlist, double)); break;
25 			case 'c': printf("%c", va_arg(vlist, int)); break;
26 			case 's': printf("%s", va_arg(vlist, char *)); break;
27 			default: va_end(vlist);exit(1);
28 
29 			}
30 
31 		} else
32 			printf("%c", ch);
33 
34 
35 	}
36 
37 	va_end(vlist);
38 	exit(1);
39 }
40 
41 
42 int main()
43 {
44 	int pid;
45 	int ptm;
46 	int pts;
47 	char *ptr;
48 	char *program_name[2] = { (char*)"/bin/uname", NULL};
49 	char buf[512];
50 	int n;
51 
52 	if ((ptm = posix_openpt(O_RDWR)) == -1) {
53 		die("posix_openpt error: %s\n", strerror(errno));
54 	}
55 	if (grantpt(ptm) == -1) {
56 		die("grantpt error: %s\n", strerror(errno));
57 	}
58 	if (unlockpt(ptm) == -1) {
59 		die("unlockpt error: %s\n", strerror(errno));
60 	}
61 
62 	pid = fork();
63 	if (pid < 0) {
64 		die("fork error: %s\n", strerror(errno));
65 	} else if (pid == 0) { // child
66 		if (setsid() == (pid_t)-1) {
67 			die("setsid() error: %s\n", strerror(errno));
68 		}
69 		if ((ptr = (char *) ptsname(ptm)) == NULL) {
70 			die("ptsname error: %s\n", strerror(errno));
71 		}
72 		if ((pts = open(ptr, O_RDWR)) < 0) {
73 			die("open of slave failed: %a\n", strerror(errno));
74 		}
75 		close(ptm);
76 
77 		if (dup2(pts, STDIN_FILENO) != STDIN_FILENO
78 			|| dup2(pts, STDOUT_FILENO) != STDOUT_FILENO
79 			|| dup2(pts, STDERR_FILENO) != STDERR_FILENO) {
80 			die("error doing dup's : %s\n", strerror(errno));
81 		}
82 
83 		if (execve(*program_name, program_name , NULL) == -1) {
84 			die("execve error: %s\n", strerror(errno));
85 		}
86 		exit(1);
87 	} else { // parent
88 		if (dup2(ptm, STDIN_FILENO) != STDIN_FILENO) {
89 			die("dup2 of parent failed");
90 		}
91 		while (1) {
92 			n = read(ptm, buf, 511);
93 			if (n <= 0) {
94 				break;
95 			}
96 			write(STDOUT_FILENO, buf, n);
97 		}
98 	}
99 	return 0;
100 }
101 
102