Provided by: manpages-ru-dev_4.19.0-7_all
ИМЯ
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⟩.