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 ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩ или более позднюю, чтобы
       узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.

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