]> rtime.felk.cvut.cz Git - linux-lin.git/blob - misc/ptytest/ptytest.c
Add pty testing program
[linux-lin.git] / misc / ptytest / ptytest.c
1 #define _XOPEN_SOURCE 600
2 #include <stdlib.h>
3 #include <fcntl.h>
4 #include <error.h>
5 #include <errno.h>
6 #include <stdio.h>
7 #include <poll.h>
8 #include <unistd.h>
9
10 /*
11  * How I use this program:
12  * - on terminal 1: ./ptytest | hexdump -C
13  * - on root terminal: rmmod slcan; insmod ./slcan.ko; ( sleep 1; ip l set up dev slcan0) & slcan_attach -w /dev/pts/12
14  */
15
16 int main()
17 {
18         int master_fd;
19         master_fd = posix_openpt(O_RDWR | O_NOCTTY);
20         if (master_fd == -1)
21                 error(1, errno, "posix_openpt");
22         if (grantpt(master_fd) == -1)
23                 error(1, errno, "grantpt");
24         if (unlockpt(master_fd) == -1)
25                 error(1, errno, "unlockpt");
26         fprintf(stderr, "%s\n", ptsname(master_fd));
27
28         struct pollfd fds[2] = {
29                 { .fd = 0, .events = POLLIN },
30                 { .fd = master_fd, .events = POLLIN },
31         };
32
33         while (1) {
34                 int ret = poll(fds, 2, -1);
35                 char buffer[100];
36                 if (ret == -1)
37                         error(1, errno, "poll");
38                 if (fds[0].revents) {
39                         ret = read(fds[0].fd, buffer, sizeof(buffer));
40                         if (ret == -1) error(1, errno, "read(stdin)");
41                         ret = write(fds[1].fd, buffer, ret);
42                         if (ret == -1) error(1, errno, "write(tty)");
43                 }
44                 if (fds[1].revents) {
45                         ret = read(fds[1].fd, buffer, sizeof(buffer));
46                         if (ret == -1) error(1, errno, "read(tty)");
47                         ret = write(1, buffer, ret);
48                         if (ret == -1) error(1, errno, "write(stdout)");
49                 }
50         }
51         return 0;
52 }