DIAL(3C)

НАЗВАНИЕ
dial - установление связи через терминальную линию

СИНТАКСИС


	#include <dial.h>



	int dial (call)

	CALL *call;

	

	void undial (fd)

	int fd;

ОПИСАНИЕ
Функция dial возвращает дескриптор файла для терминальной линии, открытой на ввод/вывод. Аргументом функции dial является указатель на структуру типа CALL (тип определен во включаемом файле ).

После завершения работы с линией программа должна вызвать функцию undial, чтобы освободить семафор, установленный в момент захвата терминального устройства.

Тип структуры CALL определяется во включаемом файле следующим образом:


	typedef struct {

	  struct termio *attr; /* Указатель  на структуру атри-

	                          бутов termio */

	  int baud;            /* Скорость передачи */

	  int speed;           /* Модем 212A: 300 или 1200 */

	  char *line;          /* Имя устройства для терминаль-

	                          ной линии */

	  char *telno;         /* Указатель на цепочку -  номер

	                          телефона */

	  int modem;           /* Управление модемом для прямо-

	                          го соединения */

	  int *device;         /* Сюда  будет записано имя уст-

	                          ройства, через которое  уста-

	                          новлено соединение */

	  int dev_len;         /* Длина имени устройства */

	} CALL;

Элемент speed предназначен только для использования при установлении соединения по телефонной линии; в этом случае его значение должно равняться 300 или 1200 для модемов 113A или 212A. Отметим, что модем 113A, а также модем 212A, установленный в низкоскоростной режим, могут передавать на любой скорости от 0 до 300 бит в секунду. Однако модем 212A, установленный в высокоскоростной режим может передавать и принимать только на скорости 1200 бит в секунду.

Элемент baud задает желаемую скорость передачи. Например, можно установить baud равным 110, а speed равным 300. Однако если компонент speed равен 1200, baud также должен равняться 1200.

Если нужная терминальная линия является прямым соединением, то указатель на имя устройства должен быть помещен в элемент line. Допустимые значения для таких терминальных устройств содержатся в файле L-devices. В этом случае не требуется заполнять элемент baud, его значение определяется из файла L-devices.

Элемент telno является указателем на цепочку символов, представляющих телефонный номер, по которому должно произойти соединение. Терминирующий символ не нужно включать в цепочку, передаваемую dial, поскольку функция добавит его сама.

Элемент modem специфицирует управление модемом в случае прямого соединения. Если требуется управление модемом, этот элемент должен быть ненулевым.

Элемент attr является указателем на структуру типа termio, описанную во включаемом файле . Элемент attr может быть равен NULL, но если это не так, то все атрибуты, заданные компонентами структуры termio, будут установлены для терминальной линии перед попыткой выполнить соединение, что существенно для таких атрибутов, как четность и скорость передачи.

Элемент device используется для хранения имени устройства, через которое было установлено соединение.

Элемент devlen содержит длину имени устройства, записанного в массив device.

ФАЙЛЫ


	/usr/lib/uucp/L-devices

	/usr/spool/uucp/LCK..устройство

СМ. ТАКЖЕ
uucp(1C) в Справочнике пользователя.
alarm(2), read(2), write(2).
termio(7) в Справочнике администратора.

ДИАГНОСТИКА
В случае неудачного завершения возвращается отрицательное значение, об ясняющее причину неудачи. Мнемоники для этих отрицательных кодов завершения определены во включаемом файле <dial.h>:


	INTRPT (-1)   /* Случилось прерывание */

	D_HUNG (-2)   /*  Повешена  трубка  (чтобы прервать запись) */

	NO_ANS (-3)   /* В течение 10 секунд нет ответа */

	ILL_BD (-4)   /* Некорректная скорость обмена */

	A_PROB (-5)   /* Ошибка при наборе номера */

	L_PROB (-6)   /* Ошибка в линии связи */

	NO_Ldv (-7)   /* Не открывается файл L-devices */

	DV_NT_A (-8)  /* Требуемое устройство недоступно */

	DV_NT_K (-9)  /* Требуемое устройство неизвестно */

	NO_BD_A (-10) /* Нет доступных устройств для работы  на

        		 указанной скорости обмена */

	NO_BD_K (-11) /*  Нет известных устройств для работы на

        		  указанной скорости обмена */

ПРЕДОСТЕРЕЖЕНИЯ
Функция dial(3C) несовместима со стандартными сетевыми средствами (см. подраздел 1C) версии 5 ОС UNIX.

Включение файла <dial.h> автоматически приводит к включению файла <termio.h>.

Поскольку функция dial включает файл <stdio.h>, размер программ, не использующих стандартный ввод/вывод помимо dial, может оказаться больше ожидаемого.

СЮРПРИЗЫ
Функция dial выдает системный вызов alarm(2) на 3600 секунд и затем перехватывает сигнал SIGALRM, "массируя" файл-семафор LCK..устройство и поддерживая тем самым занятость линии. Без подобной меры uucp(1C) может удалить файл LCK..устройство во время своих сеансов чистки, повторяющихся каждые 90 минут. Если сигнал SIGALRM придет во время выполнения пользователем системных вызовов read(2) или write(2), они закончатся неудачей. Если программа пользователя должна выполняться более часа, в случае неудачи системных вызовов read следует проверять значение переменной errno (errno==EINTR), после чего read должен быть выдан повторно.