Provided by: manpages-ru-dev_4.21.0-2_all bug

ИМЯ

       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
       или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.

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

Linux man-pages 6.03                            5 февраля 2023 г.                                  getpwent_r(3)