fcntl(fd, F_SETFL, fcntl(fd, F_GETFL, 0) & ~O_NONBLOCK);
Π§Π΅ΡΡΡΠ΅ ΡΠ»Π°Π³Π° termios ΠΊΠΎΠ½ΡΡΠΎΠ»ΠΈΡΡΡΡ ΡΠ΅ΡΡΡΠ΅ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΡ ΡΠ°ΡΡΠΈ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ Π²Π²ΠΎΠ΄ΠΎΠΌ ΠΈ Π²ΡΠ²ΠΎΠ΄ΠΎΠΌ. Π€Π»Π°Π³ Π²Ρ ΠΎΠ΄Π½ΡΡ Π΄Π°Π½Π½ΡΡ , Ρ_iflag, ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ, ΠΊΠ°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠΈΡΡΡΡΡΡ ΠΈ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡΡΡ ΠΏΡΠΈΠ½ΡΡΡΠ΅ ΡΠΈΠΌΠ²ΠΎΠ»Ρ. Π€Π»Π°Π³ Π²ΡΡ ΠΎΠ΄Π½ΡΡ Π΄Π°Π½Π½ΡΡ , c_oflag, ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ, ΠΊΠ°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠΈΡΡΡΡΡΡ ΠΈ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡΡΡ ΡΠΈΠΌΠ²ΠΎΠ»Ρ, Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅ΠΌΡΠ΅ Π²Π°ΡΠΈΠΌ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠΌ Π² tty. Π£ΠΏΡΠ°Π²Π»ΡΡΡΠΈΠΉ ΡΠ»Π°Π³, c_cflag, ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ Ρ Π°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΠ³ΠΎ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Π° ΡΡΡΡΠΎΠΉΡΡΠ²Π° ΠΈ ΠΏΠΎΠ»Π΅Π·Π΅Π½ Π»ΠΈΡΡ Π΄Π»Ρ ΡΠΈΠ·ΠΈΡΠ΅ΡΠΊΠΈΡ ΡΡΡΡΠΎΠΉΡΡΠ². ΠΠΎΠΊΠ°Π»ΡΠ½ΡΠΉ ΡΠ»Π°Π³, c_lflag, ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ, ΠΊΠ°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΡΠΈΠΌΠ²ΠΎΠ»Ρ ΡΠΎΠ±ΠΈΡΠ°ΡΡΡΡ ΠΈ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡΡΡ ΠΏΠ΅ΡΠ΅Π΄ ΠΎΡΠΏΡΠ°Π²ΠΊΠΎΠΉ Π½Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΡ Π²ΡΡ ΠΎΠ΄Π½ΡΡ Π΄Π°Π½Π½ΡΡ . ΠΠ° ΡΠΈΡ. 16.1 ΠΏΠΎΠΊΠ°Π·Π°Π½Π° ΡΠΏΡΠΎΡΠ΅Π½Π½Π°Ρ ΡΡ Π΅ΠΌΠ° ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊΠΎΠ΅ ΠΌΠ΅ΡΡΠΎ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ»Π°Π³ Π² ΠΎΠ±ΡΠ΅ΠΉ ΡΡ Π΅ΠΌΠ΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ².
Π ΠΈΡ. 16.1. Π£ΠΏΡΠΎΡΠ΅Π½Π½Π°Ρ ΡΡ Π΅ΠΌΠ° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ tty
Π‘Π½Π°ΡΠ°Π»Π° ΠΌΡ ΠΏΡΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΡΠ΅ΠΌ ΡΠΏΠΎΡΠΎΠ±Ρ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ termios, Π° Π·Π°ΡΠ΅ΠΌ ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΠΈΠΌ ΠΊΠΎΡΠΎΡΠΊΡΡ ΡΠΏΡΠ°Π²ΠΊΡ ΠΎ Π½Π΅ΠΌ.
16.3. ΠΡΠΈΠΌΠ΅ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ termios
16.3.1. ΠΠ°ΡΠΎΠ»ΠΈ
Π‘Π°ΠΌΠΎΠΉ ΡΠ°ΡΠΏΡΠΎΡΡΡΠ°Π½Π΅Π½Π½ΠΎΠΉ ΠΏΡΠΈΡΠΈΠ½ΠΎΠΉ ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ ΡΡΡΠ°Π½ΠΎΠ²ΠΎΠΊ termios ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΡΠ΅Π½ΠΈΠ΅ ΠΏΠ°ΡΠΎΠ»Ρ Π±Π΅Π· ΡΡ ΠΎ-ΠΊΠΎΠ½ΡΡΠΎΠ»Ρ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ². ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΎΡΠΊΠ»ΡΡΠΈΡΡ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠ΅ ΡΡ ΠΎ Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΡΡΠ΅Π½ΠΈΡ ΠΏΠ°ΡΠΎΠ»Ρ. ΠΠ°Ρ ΠΊΠΎΠ΄ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²ΡΠ³Π»ΡΠ΄Π΅ΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ:
struct termios ts, ots;
ΠΠ΅ΡΠ²Π°Ρ ΡΡΡΡΠΊΡΡΡΠ° Ρ ΡΠ°Π½ΠΈΡ ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»ΡΠ½ΡΠ΅ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ Π΄Π»Ρ Π²ΠΎΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ, Π° Π²ΡΠΎΡΠ°Ρ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΊΠΎΠΏΠΈΠ΅ΠΉ Π΄Π»Ρ ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ.
tcgetattr(STDIN_FILENO, &ts);
ΠΠ±ΡΡΠ½ΠΎ ΠΏΠ°ΡΠΎΠ»ΠΈ ΡΠΈΡΠ°ΡΡΡΡ ΡΠΎ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠ³ΠΎ ΡΡΡΡΠΎΠΉΡΡΠ²Π° Π²Π²ΠΎΠ΄Π°.
ots = ts;
Π‘ΠΎΡ ΡΠ°Π½ΠΈΡΠ΅ ΠΊΠΎΠΏΠΈΡ ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»ΡΠ½ΡΡ ΡΡΡΠ°Π½ΠΎΠ²ΠΎΠΊ termios, ΡΡΠΎΠ±Ρ ΠΏΠΎΠ·ΠΆΠ΅ Π²ΠΎΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΠΈΡ .
ts.c_lflag &= ~ECHO;
ts.c_lflag |= ECHONL;
tcsetattr(STDIN_FILENO, TCSAFLUSH, fits);
ΠΡΠΊΠ»ΡΡΠΈΡΠ΅ ΡΡ ΠΎ-ΠΊΠΎΠ½ΡΡΠΎΠ»Ρ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ² (ΠΊΡΠΎΠΌΠ΅ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ² Π½ΠΎΠ²ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ) ΠΏΠΎΡΠ»Π΅ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ Π²ΡΠ΅Ρ Π²ΡΡ ΠΎΠ΄Π½ΡΡ Π΄Π°Π½Π½ΡΡ . (ΠΠ΅ΡΠ²Π°Ρ l Π² c_lflag ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΡ (local) ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΡ.)
read_password();
Π’Π΅ΠΏΠ΅ΡΡ Π²Ρ ΡΠΈΡΠ°Π΅ΡΠ΅ ΠΏΠ°ΡΠΎΠ»Ρ. ΠΡΠΎ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΏΡΠΎΡΡΠΎΠΉ Π²ΡΠ·ΠΎΠ² fgets() ΠΈΠ»ΠΈ read(), Π»ΠΈΠ±ΠΎ ΠΆΠ΅ Π±ΠΎΠ»Π΅Π΅ ΡΠ»ΠΎΠΆΠ½Π°Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ°, Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ ΡΠ΅ΠΆΠΈΠΌΠ° tty (Π½Π΅ΡΠΎΡΠΌΠ°ΡΠΈΡΡΠ΅ΠΌΡΠΉ ΡΠ΅ΠΆΠΈΠΌ ΠΈΠ»ΠΈ ΡΠ΅ΠΆΠΈΠΌ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ) ΠΈ ΠΎΡ ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ.
tcsetattr(STDIN_FILENO, TCSANOW, &ots);
ΠΡΠΎ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ Π²ΠΎΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ ΠΈΡΡ ΠΎΠ΄Π½ΡΠ΅ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ termios. (ΠΡΡΠ°Π»ΡΠ½ΡΠ΅ ΠΎΠΏΡΠΈΠΈ ΠΎΠ±ΡΡΡΠ½ΡΡΡΡΡ ΠΏΠΎΠ·ΠΆΠ΅, Π² ΡΠΏΡΠ°Π²ΠΎΡΠ½ΠΎΠΌ ΡΠ°Π·Π΄Π΅Π»Π΅ Π΄Π°Π»Π΅Π΅ Π² Π³Π»Π°Π²Π΅.)
ΠΠΎΠ»Π½ΡΠΉ ΠΊΠΎΠ΄ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ-ΠΏΡΠΈΠΌΠ΅ΡΠ°, readpass, ΠΏΠΎΠΊΠ°Π·Π°Π½ Π½ΠΈΠΆΠ΅.
1: /* readpass.Ρ */
2:
3: #include <stdio.h>
4: #include <stdlib.h>
5: #include <termios.h>
6: #include <unistd.h>
7:
8: int main (void) {
9: struct termios ts, ots;
10: char passbuf[1024];
11:
12: /* ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΈ ΡΠΎΡ ΡΠ°Π½ΠΈΡΡ ΡΠ΅ΠΊΡΡΠΈΠ΅ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ termios */
13: tcgetattr(STDIN_FILENO, &ts);
14: ots = ts;
15:
16: /* ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ ΠΈ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ Π½ΠΎΠ²ΡΠ΅ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ termios */
17: ts.c_lflag & = ~ECHO;
18: ts.c_lflag |= ECHONL;
19: tcsetattr(STDIN_FILENO, TCSAFLUSH, &ts);
20:
21: /*Ρ ΠΎΡΡ ΡΡΠΎ ΠΈ ΠΏΠ°ΡΠ°Π½ΠΎΠΈΠ΄Π°Π»ΡΠ½ΠΎ, Π½ΠΎ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ, Π²ΠΎΠ·ΡΠΌΠ΅Π»ΠΈ Π»ΠΈ ΡΡΡΠ΅ΠΊΡ Π½ΠΎΠ²ΡΠ΅ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ*/
22: tcgetattr(STDIN_FILENO, &ts);
23: if (ts.c_lflag & ECHO) {
24: fprintf(stderr, "Π‘Π±ΠΎΠΉ ΠΏΡΠΈ ΠΎΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠΈ ΡΡ ΠΎ-ΠΊΠΎΠ½ΡΡΠΎΠ»Ρ\n");
25: tcsetattr(STDIN_FILENO, TCSANOW, &ots);
26: exit(1);
27: }
28:
29: /* ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΈ Π²ΡΠ²Π΅ΡΡΠΈ ΠΏΠ°ΡΠΎΠ»Ρ */
30: printf("Π²Π²Π΅Π΄ΠΈΡΠ΅ ΠΏΠ°ΡΠΎΠ»Ρ:");
31: fflush(stdout);
32: fgets(passbuf, 1024, stdin);
33: printf("ΠΏΡΠΎΡΠΈΡΠ°Π½ ΠΏΠ°ΡΠΎΠ»Ρ: %s", passbuf);
34: /* Π² passbuf Π±ΡΠ» Π·Π°Π²Π΅ΡΡΠ°ΡΡΠΈΠΉ ΡΠΈΠΌΠ²ΠΎΠ» \n */
35:
36: /* Π²ΠΎΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΡΡΠ°ΡΡΠ΅ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ termios */
37: tcsetattr(STDIN_FILENO, TCSANOW, &ots);
38:
39: exit(0);
40: }
16.3.2. ΠΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΡΠ΅ ΠΊΠΎΠΌΠΌΡΠ½ΠΈΠΊΠ°ΡΠΈΠΈ
Π ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΏΡΠΈΠΌΠ΅ΡΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΎΠ±ΠΎΠΈΡ ΠΊΠΎΠ½ΡΠΎΠ² tty ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ°ΡΡΡΡ ΡΠ΅ΠΊΡΡΠΈΠΉ ΡΠ΅ΡΠΌΠΈΠ½Π°Π» ΠΊ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΠΌΡ ΠΏΠΎΡΡΡ. ΠΠ° ΠΎΠ΄Π½ΠΎΠΌ tty ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΠΏΠΎΠ΄ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ robin ΡΠΎΠΎΠ±ΡΠ°Π΅ΡΡΡ Ρ Π²Π°ΠΌΠΈ Π²ΠΎ Π²ΡΠ΅ΠΌΡ Π½Π°Π±ΠΎΡΠ°. ΠΠ° Π΄ΡΡΠ³ΠΎΠΌ tty ΠΎΠ½Π° Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΡΠ΅Ρ Ρ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΡΠΌ ΠΏΠΎΡΡΠΎΠΌ. Π‘ ΡΠ΅Π»ΡΡ ΠΌΡΠ»ΡΡΠΈΠΏΠ»Π΅ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π²Π²ΠΎΠ΄Π½ΡΡ ΠΈ Π²ΡΡ ΠΎΠ΄Π½ΡΡ Π΄Π°Π½Π½ΡΡ Π½Π° Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠΌ tty ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΠΌ ΠΏΠΎΡΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΠΉ Π²ΡΠ·ΠΎΠ² poll(), ΠΎΠΏΠΈΡΠ°Π½Π½ΡΠΉ Π² Π³Π»Π°Π²Π΅ 13.
ΠΠΈΠΆΠ΅ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ ΠΏΠΎΠ»Π½ΡΠΉ ΠΊΠΎΠ΄ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ robin.Ρ, Π·Π° ΠΊΠΎΡΠΎΡΡΠΌ Π΄Π°Π½Ρ ΠΎΠ±ΡΡΡΠ½Π΅Π½ΠΈΡ.
1: /* robin.Ρ */
2:
3: #include <sys/poll.h>
4: #include <errno.h>
5: #include <fcntl.h>
6: #include <popt.h>
7: #include <stdio.h>
8: #include <stdlib.h>
9: #include <signal.h>
10: #include <string.h> /* Π΄Π»Ρ strerror() */
11: #include <termios.h>
12: #include <unistd.h>
13:
14: void die(int exitcode, const char *error, const char *addl) {
15: if (error) fprintf(stderr, "%s: %s\n", error, addl);
16: exit(exitcode);
17: }
18:
19: speed_t symbolic_speed(int speednum) {
20: if (speednum >= 460800) return B460800;
21: if (speednum >= 230400) return B230400;
22: if (speednum >= 115200) return B115200;
23: if (speednum >= 57600) return B57600;
24: if (speednum >= 38400) return B38400;
25: if (speednum >= 19200) return B19200;
26: if (speednum >= 9600) return B9600;
27: if (speednum >= 4800) return B4800;
28: if (speednum >= 2400) return B2400;
29: if (speednum >= 1800) return B1800;
30: if (speednum >= 1200) return B1200;
31: if (speednum >= 600) return B600;
32: if (speednum >= 300) return B300;
33: if (speednum >= 200) return B200;
34: if (speednum >= 150) return B150;
35: if (speednum >= 134) return B134;
36: if (speednum >= 110) return B110;
37: if (speednum >= 75) return B75;
38: return B50;
39: }
40:
41: /* ΠΡΠΎ Π½ΡΠΆΠ½ΠΎ Π΄Π»Ρ ΠΎΠ±Π»Π°ΡΡΠΈ Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡΠΈ Π² ΠΏΡΠ΅Π΄Π΅Π»Π°Ρ ΡΠ°ΠΉΠ»Π°, ΡΠ°ΠΊ ΡΡΠΎ
42: * ΠΈΡ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ΄Π΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π² ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°Ρ ΡΠΈΠ³Π½Π°Π»ΠΎΠ² */
43: /* ΡΡΠ°ΡΡΠ΅ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ ΠΏΠΎΡΡΠ° termios Π΄Π»Ρ Π²ΠΎΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ */
44: static struct termios pots;
45: /* ΡΡΠ°ΡΡΠ΅ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ stdout/stdin termios Π΄Π»Ρ Π²ΠΎΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ */
46: static struct termios sots;
47: /* ΡΠ°ΠΉΠ»ΠΎΠ²ΡΠΉ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ ΠΏΠΎΡΡΠ° */
48: int pf;
49:
50: /* Π²ΠΎΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΠΏΠ΅ΡΠ²ΠΎΠ½Π°ΡΠ°Π»ΡΠ½ΡΠ΅ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ ΡΠ΅ΡΠΌΠΈΠ½Π°Π»Π° ΠΏΡΠΈ Π²ΡΡ ΠΎΠ΄Π΅ */
51: void cleanup_termios(int signal) {
52: tcsetattr(pf, TCSANOW, &pots);
53: tcsetattr(STDIN_FILENO, TCSANOW, &sots);
54: exit(0);
55: }
56:
57: /* ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°ΡΡ ΠΎΠ΄ΠΈΠ½ΠΎΡΠ½ΡΠΉ ΡΠΏΡΠ°Π²Π»ΡΡΡΠΈΠΉ ΡΠΈΠΌΠ²ΠΎΠ» */
58: void send_escape(int fd, char c) {
59: switch (c) {
60: case 'q':
61: /* Π²ΠΎΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ termios ΠΈ Π²ΡΠΉΡΠΈ */
62: cleanup_termios(0);
63: break;
64: case 'b':
65: /* ΠΏΠΎΡΠ»Π°ΡΡ ΡΠΈΠΌΠ²ΠΎΠ» ΡΠ°Π·ΡΡΠ²Π°*/
66: tcsendbreak(fd, 0);
67: break;
68: default:
69: /* ΠΏΡΠΎΠΏΡΡΡΠΈΡΡ ΡΠΈΠΌΠ²ΠΎΠ» */
70: /* "C-\ C-\" sends "C-\" */
71: write(fd, &c, 1);
72: break;
73: }
74: return;
75: }
76:
77: /* ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°ΡΡ ΡΠΏΡΠ°Π²Π»ΡΡΡΠΈΠ΅ ΡΠΈΠΌΠ²ΠΎΠ»Ρ, Π·Π°ΠΏΠΈΡΡΠ²Π°Ρ ΠΈΡ Π² Π²ΡΠ²ΠΎΠ΄ */
78: void cook_buf(int fd, char * buf, int num) {
79: int current = 0;
80: static int in_escape = 0;
81:
82: if (in_escape) {
83: /* cook_buf ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠΉ ΡΠ°Π· Π²ΡΠ·ΡΠ²Π°Π»ΡΡ Ρ Π½Π΅Π·Π°Π²Π΅ΡΡΠ΅Π½Π½ΠΎΠΉ
84: ΡΠΏΡΠ°Π²Π»ΡΡΡΠ΅ΠΉ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΡΡ */
85: send_escape(fd, buf[0]);
86: num--;
87: buf++;
88: in_escape = 0;
89: }
90: while (current < num) {
91: # define CTRLCHAR(c) ((c)-0x40)
92: while ((current < num) && (buf[current] != CTRLCHAR('W')))
93: current++;
94: if (current) write (fd, buf, current);
95: if (current < num) {
96: /* Π½Π°ΠΉΠ΄Π΅Π½ ΡΠΏΡΠ°Π²Π»ΡΡΡΠΈΠΉ ΡΠΈΠΌΠ²ΠΎΠ» */
97: current++;
98: if (current >= num) {
99: /*ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠΈΡΠΎΠ²Π°ΡΡ ΠΏΠ΅ΡΠ²ΡΠΉ ΡΠΈΠΌΠ²ΠΎΠ» ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ*/
100: in_escape = 1;
101: return;
102: }
103: send_escape(fd, buf[current]);
104: }
105: num -= current;
106: buf += current;
107: current = 0;
108: }
109: return;
110: }
111:
112: int main(int argc, const char * argv[]) {
113: char Ρ; /* ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ ΡΠ°Π·Π±ΠΎΡΠ° Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ² */
114: struct termios pts; /* Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ termios Π΄Π»Ρ ΠΏΠΎΡΡΠ° */
115: struct termios sts; /* Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ termios Π΄Π»Ρ stdout/stdin */
116: const char *portname;
117: int speed = 0; /* ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΏΡΠΈ ΡΠ°Π·Π±ΠΎΡΠ΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ² Π΄Π»Ρ ΡΠΊΠΎΡΠΎΡΡΠΈ */
118: struct sigaction sact; /* ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° ΡΠΈΠ³Π½Π°Π»ΠΎΠ² */