GETPWENT_R(3) Руководство программиста Linux GETPWENT_R(3)

ИМЯ

getpwent_r, fgetpwent_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(), начиная с glibc 2.19: _DEFAULT_SOURCE в glibc 2.19 и старее: _BSD_SOURCE || _SVID_SOURCE fgetpwent_r(): начиная с glibc 2.19: _DEFAULT_SOURCE в glibc 2.19 и старее: _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.

ОШИБКИ

Больше записей нет.
Недостаточно места в буфере. Попробуйте ещё раз с большим буфером.

АТРИБУТЫ

Описание терминов данного раздела смотрите в 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);
}

СМОТРИТЕ ТАКЖЕ

fgetpwent(3), getpw(3), getpwent(3), getpwnam(3), getpwuid(3), putpwent(3), passwd(5)

2017-09-15 GNU