getpwent_r(3)

ИМЯ
getpwent_r, fgetpwent_r - получает запись из файла паролей (реентерабельные версии)

LIBRARY
Standard C library (libc, -lc)

СИНТАКСИС
#include <pwd.h>

int getpwent_r(struct passwd *restrict pwbuf,
               char buf[restrict .buflen], size_t buflen,
               struct passwd **restrict pwbufp);
int fgetpwent_r(FILE *restrict stream, struct passwd *restrict pwbuf,
               char buf[restrict .buflen], size_t buflen,
               struct passwd **restrict 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.

ОШИБКИ

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 <stdint.h>
    #include <stdio.h>
    #include <stdlib.h>

    #define BUFLEN 4096

    int
    main(void)
    {
        struct passwd pw;
        struct passwd *pwp;
        char buf[BUFLEN];
        int i;

        setpwent();
        while (1) {
            i = getpwent_r(&pw, buf, sizeof(buf), &pwp);
            if (i)
                break;
            printf("%s (%jd)\tHOME %s\tSHELL %s\n", pwp->pw_name,
                   (intmax_t) 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)

ПЕРЕВОД
Русский перевод этой страницы руководства был сделан Azamat Hackimov <azamat.hackimov@gmail.com>, Dmitry Bolkhovskikh <d20052005@yandex.ru>, Vladislav <ivladislavefimov@gmail.com>, Yuri Kozlov <yuray@komyakino.ru> и Иван Павлов <pavia00@gmail.com>

Этот перевод является бесплатной документацией; прочитайте Стандартную общественную лицензию GNU версии 3 (https://www.gnu.org/licenses/gpl-3.0.html) или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.

Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на man-pages-ru-talks@lists.sourceforge.net.