getutent, getutid, getutline, pututline, setutent, endutent, utmpname - осуществляют доступ к записям файла utmp
НАЗВАНИЕgetutent, getutid, getutline, pututline, setutent, endu-
tent, utmpname - осуществляют доступ к записям файла utmp
СИНТАКСИС
#include
struct utmp *getutent(void);
struct utmp *getutid(struct utmp *ut);
struct utmp *getutline(struct utmp *ut);
struct utmp *pututline(struct utmp *ut);
void setutent(void);
void endutent(void);
void utmpname(const char *file);
ОПИСАНИЕ
utmpname() задает имя файла в формате utmp для других
функций utmp. Если utmpname() не используется для
указания имени файла перед работой с другими функциями, то
они будут использовать имя _PATH_UTMP, определенное в
.
setutent() переносит указатель начало файла utmp. Вообще
оптимальным вариантом считается вызывать эту функцию перед
вызовом остальных.
endutent() закрывает файл utmp. Она должна быть вызвана,
когда будет завершена работа с файлом посредством других
функций.
getutent() считывает строку, начиная с текущей позиции
файла в файле utmp. Возвращает указатель на структуру,
содержащую поля этой строки.
getutid() производит прямой поиск, начиная с текущей
позиции файла в файле utmp, основываясь на данных ut.
Если ut->ut_type равно RUN_LVL, BOOT_TIME, NEW_TIME или
OLD_TIME, getutid() найдет первую запись, поле ut_type
которой совпадает с ut->ut_type. Если ut->ut_type равно
INIT_PROCESS, LOGIN_PROCESS, USER_PROCESS или DEAD_PRO-
CESS, то getutid() найдет первую запись, поле ut_id
которой совпадает с ut->ut_id.
getutline() производит прямой поиск, начиная с текущей
позиции файла в файле utmp. Она просматривает записи,
поле ut_type которых совпадает с USER_PROCESS или
LOGIN_PROCESS, и возвращает первую запись, поле ut_line
которой совпадает с ut->ut_line.
pututline() записывает структуру utmp ut в файл utmp. Для
поиска места в файле, необходимого для вставки новой
записи, используется getutid() . Если такое место не
найдено, то pututline() добавит запись к концу файла.
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Функции getutent(), getutid(), getutline() и pututline()
возвращают указатель на static struct utmp при успешном
завершении и NULL при ошибке.
ПРИМЕР
Hижеследующий пример добавляет и удаляет запись utmp на
основании того, что программа запущена с псевдотерминала.
Для использования его в реальном приложении необходимо
проверить значения, возвращаемые getpwuid() и ttyname().
int main(int argc, char *argv[])
{
struct utmp entry;
system("echo перед добавлением записи:;who");
entry.ut_type=USER_PROCESS;
entry.ut_pid=getpid();
strcpy(entry.ut_line,ttyname(0)+strlen("/dev/"));
/* справедливо только для ptys с именами /dev/tty[pqr][0-9a-z] */
strcpy(entry.ut_id,ttyname(0)+strlen("/dev/tty"));
time(&entry.ut_time);
strcpy(entry.ut_user,getpwuid(getuid())->pw_name);
memset(entry.ut_host,0,UT_HOSTSIZE);
entry.ut_addr=0;
setutent();
pututline(&entry);
system("echo после добавления записи:;who");
entry.ut_type=DEAD_PROCESS;
memset(entry.ut_line,0,UT_LINESIZE);
entry.ut_time=0;
memset(entry.ut_user,0,UT_NAMESIZE);
setutent();
pututline(&entry);
system("echo после удаления записи:;who");
endutent();
return 0;
}
ФАЙЛЫ
/var/run/utmp (база данных пользователей, находящихся в
системе в данный момент);
/var/log/wtmp (база данных о последних входах
пользователей в систему).
СООТВЕТСТВИЕ СТАНДАРТАМ
XPG 2, SVID 2, Linux FSSTND 1.2
В системах XPG2 и SVID2 функция pututline() возвращает
тип void (такое поведение можно встретить и в системах
AIX, HPUX, Linux libc5). В HPUX описана новая функция
_pututline() с прототипом приведенным выше для pututline()
(также она есть и в Linux libc5).
Эти функции являются устаревшими в не-Linux системах.
POSIX 1003.1-2001, в соответствие с XPG4.2, не содержит
эти функции, вместо них он использует
#include
struct utmpx *getutxent(void);
struct utmpx *getutxid(const struct utmpx *);
struct utmpx *getutxline(const struct utmpx *);
struct utmpx *pututxline(const struct utmpx *);
void setutxent(void);
void endutxent(void);
Структура utmpx это набор структур utmp с дополнительными
полями и более широкими существующими полями.
Соответствующие файлы /var/*/utmpx и /var/*/wtmpx.
Linux glibc не использует utmpx, так как структура utmp и
так очень большая. Функции getutxent и т.д. являются
псевдонимами getutent.