fgetpwent_r - получает запись из файла паролей (реентерабельные
fgetpwent_r(3)
получает запись из файла паролей (реентерабельные
Other Alias
getpwent_r
ОБЗОР
#include <pwd.h>
int getpwent_r(struct passwd *pwbuf, char *buf,
size_t buflen, struct passwd **pwbufp);
int fgetpwent_r(FILE *stream, struct passwd *pwbuf, char *buf,
size_t buflen, struct passwd **pwbufp);
Требования макроса тестирования свойств для glibc
(см. feature_test_macros(7)):
getpwent_r(), _BSD_SOURCE || _SVID_SOURCE
fgetpwent_r(): _SVID_SOURCE
ОПИСАНИЕ
Функции
getpwent_r() и
fgetpwent_r() являются реентерабельными
версиями
getpwent(3) и
fgetpwent(3). Первая читает следующую запись
паролей из потока, инициализированного
setpwent(3). Последняя читает
следующую запись паролей из потока
stream.
Структура passwd определена в <pwd.h> следующим образом:
struct passwd {
char *pw_name; /* имя пользователя */
char *pw_passwd; /* пароль пользователя */
uid_t pw_uid; /* идентификатор пользователя */
gid_t pw_gid; /* идентификатор группы */
char *pw_gecos; /* информация о пользователе */
char *pw_dir; /* домашний каталог */
char *pw_shell; /* программная оболочка */
};
Подробней о полях этой структуры смотрите в passwd(5).
Нереентерабельные версии возвращают указатель на статическое хранилище, в
котором хранятся другие указатели на имя пользователя, пароль, поле gecos,
домашний каталог и оболочку. Реентерабельные функции, описанные здесь,
возвращают всю информацию в буферах, предоставленных вызывающим. Основным
буфером является pwbuf, в котором может храниться struct passwd. В
дополнительном буфере buf размера buflen могут храниться
дополнительные строки. Результат этих функций, прочитанная из потока
struct passwd, сохраняется в предоставляемый буфер *pwbuf, и указатель
на эту struct passwd возвращается в *pwbufp.
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При успешном выполнении эти функции возвращают 0 и
*pwbufp указывает на
struct passwd. При ошибке возвращается значение ошибки и
*pwbufp равен
NULL.
ОШИБКИ
ENOENT
Больше записей нет.
ERANGE
Недостаточно места в буфере. Попробуйте ещё раз с большим буфером.
АТРИБУТЫ
Описание терминов данного раздела смотрите в
attributes(7).
Интерфейс Атрибут Значение
getpwent_r()
безвредность в потоках: небезопасно (MT-Unsafe race:pwent locale)
fgetpwent_r()
безвредность в потоках: безвредно (MT-Safe)
В приведённой выше таблице pwent в race:pwent означает, что если в
нескольких нитях программы одновременно используются функции setpwent(),
getpwent(), endpwent() или getpwent_r(), то может возникнуть
состязательность по данным.
СООТВЕТСТВИЕ СТАНДАРТАМ
Эти функции являются расширениями GNU; они выполнены похожими на
POSIX-версию функции
getpwnam_r(3). В других системах используется
прототип
struct passwd *
getpwent_r(struct passwd *pwd, char *buf, int buflen);
или, лучше,
int
getpwent_r(struct passwd *pwd, char *buf, int buflen,
FILE **pw_fp);
ЗАМЕЧАНИЯ
Функция
getpwent_r() не совсем реентерабельна, так как она использует
общую позицию чтения в потоке с другими нитями.
ПРИМЕР
#define _GNU_SOURCE
#include <pwd.h>
#include <stdio.h>
#define BUFLEN 4096
int
main(void)
{
struct passwd pw, *pwp;
char buf[BUFLEN];
int i;
setpwent();
while (1) {
i = getpwent_r(&pw, buf, BUFLEN, &pwp);
if (i)
break;
printf("%s (%d)\tHOME %s\tSHELL %s\n", pwp->pw_name,
pwp->pw_uid, pwp->pw_dir, pwp->pw_shell);
}
endpwent();
exit(EXIT_SUCCESS);
}