Чтение онлайн

на главную - закладки

Жанры

Разработка приложений в среде Linux. Второе издание

Троан Эрик В.

Шрифт:

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;

Поделиться:
Популярные книги

Идеальный мир для Лекаря 8

Сапфир Олег
8. Лекарь
Фантастика:
юмористическое фэнтези
аниме
7.00
рейтинг книги
Идеальный мир для Лекаря 8

Последняя Арена 6

Греков Сергей
6. Последняя Арена
Фантастика:
рпг
постапокалипсис
5.00
рейтинг книги
Последняя Арена 6

По воле короля

Леви Кира
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
По воле короля

Душелов. Том 4

Faded Emory
4. Внутренние демоны
Фантастика:
юмористическая фантастика
ранобэ
фэнтези
фантастика: прочее
хентай
эпическая фантастика
5.00
рейтинг книги
Душелов. Том 4

Темный Лекарь 2

Токсик Саша
2. Темный Лекарь
Фантастика:
фэнтези
аниме
5.00
рейтинг книги
Темный Лекарь 2

Эволюция мага

Лисина Александра
2. Гибрид
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Эволюция мага

(Не) моя ДНК

Рымарь Диана
6. Сапфировые истории
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
(Не) моя ДНК

Протокол "Наследник"

Лисина Александра
1. Гибрид
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Протокол Наследник

Измена. Наследник для дракона

Солт Елена
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Измена. Наследник для дракона

Неудержимый. Книга II

Боярский Андрей
2. Неудержимый
Фантастика:
городское фэнтези
попаданцы
5.00
рейтинг книги
Неудержимый. Книга II

Камень. Книга 4

Минин Станислав
4. Камень
Фантастика:
боевая фантастика
7.77
рейтинг книги
Камень. Книга 4

Измена. Право на сына

Арская Арина
4. Измены
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. Право на сына

Инквизитор Тьмы 4

Шмаков Алексей Семенович
4. Инквизитор Тьмы
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Инквизитор Тьмы 4

Кротовский, сколько можно?

Парсиев Дмитрий
5. РОС: Изнанка Империи
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Кротовский, сколько можно?