Linux Man на русском

  User    Syst    Libr    Device    Files    Other    Admin  



   getlogin_r - возвращает имя пользователя

getlogin_r(3) возвращает имя пользователя

Other Alias

getlogin, cuserid


ОБЗОР

#include <unistd.h>

char *getlogin(void);
int getlogin_r(char *buf, size_t bufsize);

#include <stdio.h>

char *cuserid(char *string);

Требования макроса тестирования свойств для glibc (см. feature_test_macros(7)):

getlogin_r(): _REENTRANT || _POSIX_C_SOURCE >= 199506L
cuserid(): _XOPEN_SOURCE


ОПИСАНИЕ

Функция getlogin() возвращает указатель на строку, содержащую имя пользователя, вошедшего в систему c терминала, который является управляющим для процесса, или указатель null, если эта информация не может быть получена. Строка выделяется статически и может быть перезаписана при последующих вызовах этой функции или cuserid().

Функция getlogin_r() возвращает то же имя пользователя, но в массиве buf размером bufsize.

Функция cuserid() возвращает указатель на строку, содержащую имя пользователя, связанное с идентификатором эффективного пользователя процесса. Если string не равно указателю null, то значение должно быть массивом, который способен вместить как минимум L_cuserid символов; строка возвращается в этом массиве. В противном случае возвращается указатель на строку в фиксированной области. Эта строка выделена статически и может быть перезаписана при последующих вызовах этой функции или функции getlogin().

Макрос L_cuserid является целочисленной константой, показывающей длину массива, который может понадобиться для хранения имени пользователя. L_cuserid описан в <stdio.h>.

Эти функции позволяют программе точно определить работающего пользователя (cuserid()) или пользователя этого сеанса (getlogin()) (значения могут различаться, если у программы установлен бит set-user-ID).

В большинстве случаев для определения пользователя полезнее использовать переменную окружения LOGNAME, потому что пользователь может установить LOGNAME каким угодно.


ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

При успешном выполнении функция getlogin() возвращает указатель на имя пользователя и NULL при ошибке, устанавливая в errno значение ошибки. При успешном выполнении getlogin_r() возвращается 0 и не ноль при ошибке.


ОШИБКИ

В POSIX определены

EMFILE Было достигнуто ограничение по количеству открытых файловых дескрипторов на процесс.

ENFILE Достигнуто максимальное количество открытых файлов в системе.

ENXIO У вызывающего процесса нет управляющего терминала.

ERANGE (getlogin_r) Длина имени пользователя, включая завершающий байт null ('\0'), больше чем bufsize.

В Linux/glibc также есть

ENOENT Нет соответствующей записи в файле utmp.

ENOMEM Недостаточно памяти для выделения под структуру passwd.

ENOTTY Стандартный ввод не ссылается на терминал (смотрите ДЕФЕКТЫ).

ФАЙЛЫ


/etc/passwd файл, содержащий базу паролей
/var/run/utmp (обычно, /etc/utmp; в некоторых версиях libc используется /var/adm/utmp)


АТРИБУТЫ

Описание терминов данного раздела смотрите в attributes(7).

Интерфейс Атрибут Значение
getlogin() безвредность в потоках: MT-Unsafe race:getlogin race:utent
sig:ALRM timer locale
getlogin_r() безвредность в потоках: MT-Unsafe race:utent sig:ALRM timer
locale
cuserid() безвредность в потоках: небезопасно (MT-Unsafe race:cuserid/!string locale)

В приведённой выше таблице utent в race:utent означает, что если любая из функций setutent(3), getutent(3) или endutent(3) используется одновременно в нескольких нитях программы, то может возникнуть состязательность по данным. Эти функции вызываются из getlogin() и getlogin_r() поэтому мы используем race:utent для напоминания.


СООТВЕТСТВИЕ СТАНДАРТАМ

getlogin() и getlogin_r(): POSIX.1-2001, POSIX.1-2008.

В System V имеется функция cuserid(), использующая идентификатор реального пользователя вместо идентификатора эффективного пользователя. Функция cuserid() была включена в версию POSIX 1988 года, но удалена из версии 1990 года. Она имеется в SUSv2, но удалена из POSIX.1-2001.

В OpenBSD имеются getlogin() и setlogin(), а имя пользователя связывается с сеансом даже если не имеется управляющего терминала.

ДЕФЕКТЫ

К сожалению, зачастую довольно просто «обмануть» getlogin(). Иногда она вообще не работает из-за того, что какая-то программа испортила содержимое файла utmp. Часто функция возвращает только первые 8 символов имени. Пользователь, вошедший в систему с терминала, который является управляющим для нашей программы, необязательно будет пользователем, запустившим программу. Избегайте использования getlogin() из соображений безопасности.

Заметим, что glibc не следует спецификации POSIX и использует stdin вместо /dev/tty. Дефект ( в других современных системах, например SunOS 5.8, HP-UX 11.11 и FreeBSD 4.8, также возвращают имя пользователя если было перенаправление stdin).

Никто точно не знает что делает cuserid(), поэтому не используйте её в переносимых программах. Вместо неё используйте getpwuid(geteuid()), если это необходимо. Не используйте cuserid().