FreeCalypso > hg > freecalypso-sw
comparison loadtools/ttypassthru.c @ 7:aa1f6fe16fef
loadtools building blocks started
| author | Michael Spacefalcon <msokolov@ivan.Harhan.ORG> |
|---|---|
| date | Tue, 30 Apr 2013 07:19:48 +0000 |
| parents | |
| children | e2e80a09338e |
comparison
equal
deleted
inserted
replaced
| 6:5eaafa83be60 | 7:aa1f6fe16fef |
|---|---|
| 1 /* | |
| 2 * This module implements the pass-thru operation mode, in which | |
| 3 * the Unix host tty is cross-connected directly to the target | |
| 4 * running some code we have just loaded. | |
| 5 */ | |
| 6 | |
| 7 #include <sys/types.h> | |
| 8 #include <sys/ioctl.h> | |
| 9 #include <sys/errno.h> | |
| 10 #include <termios.h> | |
| 11 #include <stdio.h> | |
| 12 #include <stdlib.h> | |
| 13 #include <unistd.h> | |
| 14 #include <strings.h> | |
| 15 | |
| 16 extern int errno; | |
| 17 | |
| 18 extern int target_fd; | |
| 19 | |
| 20 static struct termios saved_termios, my_termios; | |
| 21 | |
| 22 static void | |
| 23 loop() | |
| 24 { | |
| 25 char buf[BUFSIZ]; | |
| 26 fd_set fds, fds1; | |
| 27 register int i, cc, max; | |
| 28 | |
| 29 FD_ZERO(&fds); | |
| 30 FD_SET(0, &fds); | |
| 31 FD_SET(target_fd, &fds); | |
| 32 max = target_fd + 1; | |
| 33 for (;;) { | |
| 34 bcopy(&fds, &fds1, sizeof(fd_set)); | |
| 35 i = select(max, &fds1, NULL, NULL, NULL); | |
| 36 if (i < 0) { | |
| 37 if (errno == EINTR) | |
| 38 continue; | |
| 39 tcsetattr(0, TCSAFLUSH, &saved_termios); | |
| 40 perror("select"); | |
| 41 exit(1); | |
| 42 } | |
| 43 if (FD_ISSET(0, &fds1)) { | |
| 44 cc = read(0, buf, sizeof buf); | |
| 45 if (cc <= 0) | |
| 46 return; | |
| 47 if (cc == 1 && buf[0] == 0x1C) | |
| 48 return; | |
| 49 write(target_fd, buf, cc); | |
| 50 } | |
| 51 if (FD_ISSET(target_fd, &fds1)) { | |
| 52 cc = read(target_fd, buf, sizeof buf); | |
| 53 if (cc <= 0) { | |
| 54 tcsetattr(0, TCSAFLUSH, &saved_termios); | |
| 55 fprintf(stderr, "EOF/error on target tty\n"); | |
| 56 exit(1); | |
| 57 } | |
| 58 write(1, buf, cc); | |
| 59 } | |
| 60 } | |
| 61 } | |
| 62 | |
| 63 tty_passthru() | |
| 64 { | |
| 65 static int zero = 0; | |
| 66 | |
| 67 ioctl(target_fd, FIONBIO, &zero); | |
| 68 | |
| 69 tcgetattr(0, &saved_termios); | |
| 70 bcopy(&saved_termios, &my_termios, sizeof(struct termios)); | |
| 71 cfmakeraw(&my_termios); | |
| 72 my_termios.c_cc[VMIN] = 1; | |
| 73 my_termios.c_cc[VTIME] = 0; | |
| 74 tcsetattr(0, TCSAFLUSH, &my_termios); | |
| 75 | |
| 76 printf("Entering tty pass-thru; type ^\\ to exit\r\n"); | |
| 77 loop(); | |
| 78 tcsetattr(0, TCSAFLUSH, &saved_termios); | |
| 79 return 0; | |
| 80 } |
