Запустить скрипт на устройстве
#include <sys/modem.h>int modem_script( int fd,struct modem_script *table,speed_t *baud,void (*io)( char *progress,char *in,char *out ),int (*cancel)( void ) );
speed_t, куда функция может сохранить скорость передачи (если в сценарии указано, что необходимо это сделать).NULL, или функция-обработчик, которая вызывается при истечении периода времени newquiet (указано в скрипте) во время ожидания ввода.libc
Функция modem_script() запускает скрипт table на устройстве, связанном с файловым дескриптором fd. Сценарий реализует простой конечный автомат, который генерирует строки и ожидает ответы.
Каждая отправленная или полученная строка передаётся функции io() следующим образом:
| Вызов | Описание |
|---|---|
| (*io)( str, 0, 0 ) | Отправленная строка прогресса |
| (*io)( 0, str, 0 ) | Полученная строка |
| (*io)( 0, 0, str ) | Отправленная строка ответа |
Это позволяет программе настроить функцию, которая будет показывать работу скрипта в окне статуса.
Если была задана функция cancel, она вызывается каждые newquiet 1/10 секунд, пока ожидает ввод. Если функция возвращает ненулевое значение, чтение устройства вернёт немедленно значение -1 и установит для errno значение ETIMEDOUT. Можно использовать функцию cancel в качестве обработчика в графическом номеронабирателе, который должен поддерживать кнопку отмены для остановки сценария.
table - это массив структур struct modem_script.
Когда скрипт передаётся в modem_script(), для текущего состояния устанавливается значение 1, а в вывод записывается ATZ (первый элемент массива response).
При нахождении в любом состоянии, modem_script() ожидает ввод, при получении сопоставляет его с шаблоном текущего состояния или шаблоном состояния 0.
State 1
| Ввод | Действие |
|---|---|
| *ok* | Переход в состояние 2 и отправка ATDT1-591-0934. Флаги, которые будут использоваться в новом состоянии, получают значение 0, значению времени ожидания в новом состоянии установлено значение 0.5 секунд, а таймаут в новом состоянии получает значение 30 секунд. |
| *no carrier* | Переход к состоянию 0 (состояние прекращения), возврат содержимого retvalue (1). |
| *no answer* | Переход к состоянию 0 (состояние прекращения), возврат содержимого retvalue (2). |
| *no dialtone* | Переход к состоянию 0 (состояние прекращения), возврат содержимого retvalue (3). |
| *busy* | Переход к состоянию 0 (состояние прекращения), возврат с содержимого retvalue (4). |
State 2
| Ввод | Действие |
|---|---|
| *connect* | Переход в состояние 3 без отправки на устройство. Флаги, используемые в данном состоянии, получают значение MODEM_LASTLINE, времени ожидания в новом состоянии установлено значение 0.5 секунд, а таймаут в новом состоянии получает значение 10 секунд. Поскольку текущие флаги равны MODEM_BAUD, скорость передачи извлекается из сообщения соединения. |
| *no carrier* | То же самое, что в предыдущей таблице |
| *no answer* | То же самое, что в предыдущей таблице |
| *no dialtone* | То же самое, что в предыдущей таблице |
| *busy* | То же самое, что в предыдущей таблице |
State 3
| Ввод | Действие |
|---|---|
| *login* | Перейти в состояние 4 и отправить имя гостя. Флаги, используемые в данном состоянии, получают значение 0, времени ожидания в новом состоянии установлено значение 0.5 секунд, а таймаут в новом состоянии получает значение 8 секунд. |
| *no carrier* | То же самое, что в предыдущей таблице |
| *no answer* | То же самое, что в предыдущей таблице |
| *no dialtone* | То же самое, что в предыдущей таблице |
| *busy* | То же самое, что в предыдущей таблице |
State 4
| Ввод | Действие |
|---|---|
| *password* | Перейти в состояние 5 и отправить пароль "xxxx". Флаги, используемые в данном состоянии, получают значение 0, времени ожидания в новом состоянии установлено значение 0.5 секунд, а таймаут в новом состоянии получает значение 15 секунд. Поскольку текущее значение флагов равно MODEM_NOECHO, пароль не отправляется в обработчик io(). |
| *no carrier* | То же самое, что в предыдущей таблице |
| *no answer* | То же самое, что в предыдущей таблице |
| *no dialtone* | То же самое, что в предыдущей таблице |
| *busy* | То же самое, что в предыдущей таблице |
State 5
| Ввод | Действие |
|---|---|
| *$ * | Перейти в состояние 0 (прекращение), возврат со значением retvalue (0). |
| *no carrier* | То же самое, что в предыдущей таблице |
| *no answer* | То же самое, что в предыдущей таблице |
| *no dialtone* | То же самое, что в предыдущей таблице |
| *busy* | То же самое, что в предыдущей таблице |
При установке флага MODEM_BAUD для состояния, любое число, находящееся в сообщении, извлекается, полученное значение записывается в baud.
Если не установить для состояния флаг MODEM_NOECHO, все отправленные строки будут передаваться в функцию io в качестве 3-го параметра (*io)( 0, 0, response ).
O_NONBLOCK для файлового дескриптора процесс будет заблокирован при операции записи. SIGPIPE. ЗОСРВ «Нейтрино»
В зависимости от того, что происходит в функции cancel, вызов функции modem_script() из обработчика сигнала или из потока может быть или не быть безопасным.
struct modem_script, modem_open(), modem_read(), modem_write()
Предыдущий раздел: Описание API системной библиотеки