">
НАЗВАНИЕ
getutent, getutid, getutline, pututline, setutent,
endutent, utmpname - доступ к utmp-файлу
СИНТАКСИС
#include <sys/types.h> #include <utmp.h> struct utmp *getutent ( ) struct utmp *getutid (id) struct utmp *id; struct utmp *getutline (line) struct utmp *line; void pututline (utmp) struct utmp *utmp; void setutent ( ) void endutent ( ) void utmpname (file) char *file;
ОПИСАНИЕ
Результатом функций getutent, getutid и getutline является указатель на структуру следующего типа:
struct utmp { char ut_user[8]; /* Входное имя пользователя */ char ut_id[4]; /* Идентификатор из файла /etc/inittab (обычно номер линии) */ char ut_line[12]; /* Имя устройства (console, tty xx) */ short ut_pid; /* Идентификатор процесса */ short ut_type; /* Тип элемента */ struct exit_status { short e_termination; /* Системный код завершения процесса */ short e_exit; /* Пользовательский код завер- шения */ } ut_exit; /* Код завершения процесса, поме- ченного как DEAD_PROCESS */ time_t ut_time; /* Время создания элемента */ };
Функция getutent читает следующий элемент из файла типа utmp. Если файл еще не открыт, он открывается. При достижении конца файла выполнение функции завершается неудачей.
Функция getutid, начиная с текущей позиции, разыскивает элемент utmp-файла, в котором поле ut_type соответствует значению id->ut_type. Если компонент id->ut_type равен RUN_LVL, BOOT_TIME, OLD_TIME, или NEW_TIME, то требуется точное равенство типов. Если же компонент id->ut_type равен INIT_PROCESS, LOGIN_PROCESS, USER_PROCESS, или DEAD_PROCESS, то функция getutid вернет указатель на первый элемент, тип которого равен одному из четырех перечисленных, и поле ut_id соответствует значению id->ut_id. Функция getutid завершается неудачей, если ничего не находит до конца файла.
Функция getutline, начиная с текущей позиции, разыскивает элемент utmp-файла, тип которого равен LOGIN_PROCESS или USER_PROCESS, а поле ut_line соответствует значению line->ut_line. Функция getutline завершается неудачей, если ничего не находит до конца файла.
Функция pututline записывает указанную utmp-структуру в utmp-файл. При этом для поиска нужного места используется функция getutid, если обнаруживается, что текущая позиция не является подходящей. Предполагается, что пользователь, перед тем как обратиться к pututline, установил нужную текущую позицию с помощью одной из функций getut. Если это сделано, pututline не будет производить поиск. Если pututline не обнаружит подходящего места для нового элемента, элемент будет добавлен в конец файла.
Функция setutent устанавливает указатель текущей позиции на начало файла. Это должно быть сделано перед поиском нового элемента, если предполагается, что поиск должен проводиться во всем файле.
Функция endutent закрывает открытый файл.
Функция utmpname позволяет изменить имя обрабатываемого файла с /etc/utmp на любое другое. Предполагается, что чаще всего этим другим именем будет /etc/wtmp. Если файл не существует, он не будет создаваться до первого обращения к нему. Функция utmpname не отрывает файл, она только закрывает открытый файл и запоминает имя нового файла.
ФАЙЛЫ
/etc/utmp /etc/wtmp
СМ. ТАКЖЕ
ttyslot(3C), utmp(4).
ДИАГНОСТИКА
При ошибке ввода/вывода возвращается пустой указатель
(NULL). Ошибка чтения может быть вызвана отсутствием
прав доступа или достижением конца файла.
ПРИМЕЧАНИЯ
Элемент, к которому было последнее обращение, сохраняется в статической структуре, поэтому доступ к нескольким элементам требует копирования структур. При каждом
обращении к getutid или getutline вначале анализируется
статическая структура. Если она оказывается подходящей,
никакого поиска не производится. Чтобы использовать
getutline для поиска нескольких вхождений, необходимо
очищать статическую структуру после успешного поиска,
иначе getutline будет возвращать все время одно и то
же. Из правила очистки структуры перед последующим чтением есть одно исключение. Если неявное чтение при
pututline обнаруживает, что оно находится на нужном
месте в файле, то содержимое статической структуры,
возвращаемой getutent, getutid или getutline, не нужно
очищать, если пользователь только поменял ее содержимое
и передал указатель функции pututline.
Все функции пользуются стандартным буферизованным вводом/выводом, однако pututline использует нестандартный небуферизованный вывод, чтобы разрешить нескольким процессам модифицировать файлы utmp и wtmp.