GETPASS(3)

ИМЯ
getpass - запрашивает пароль

ОБЗОР
#include <unistd.h>

char *getpass( const char *prompt);

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

getpass():
    Начиная с glibc 2.2.2:
        _BSD_SOURCE ||
            (_XOPEN_SOURCE >= 500 ||
                _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED) &&
            !(_POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600)
    До glibc 2.2.2: не было

ОПИСАНИЕ
Эта функция устарела. Не используйте её.

Функция getpass() открывает /dev/tty (управляющий терминал процесса), выводит строку prompt, выключает показ выводимых символов, читает одну строку («пароль»), восстанавливает состояние терминала и закрывает /dev/tty.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Функция getpass() возвращает указатель на статический буфер, содержащий (первые PASS_MAX байтов) пароль без символа новой строки, оканчивающийся нулевым байтом («\0»). Этот буфер может быть перезаписан следующим вызовом. При ошибке, состояние терминала восстанавливается, значение errno устанавливается соответствующим образом и возвращается NULL.

ОШИБКИ
Эта функция может завершаться с ошибками:

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

ФАЙЛЫ
/dev/tty

СООТВЕТСТВИЕ СТАНДАРТАМ
Есть в SUSv2, но помечена как УСТАРЕВШАЯ. Удалена из POSIX.1-2001.

ЗАМЕЧАНИЯ
В libc4 и libc5 строка приглашения (prompt) не записывается в /dev/tty, а отправляется в поток stderr. Кроме того, если файл /dev/tty не может быть открыт, то пароль читается из потока stdin. Статический буфер имеет длину 128 байт, т.о. возвращаются только первые 127 символов пароля. Во время чтения пароля генерация сигналов (SIGINT, SIGQUIT, SIGSTOP, SIGTSTP) отключена и соответствующие символы (обычно control-C, control-\, control-Z и control-Y) передаются как часть пароля. Начиная с libc 5.4.19 также отключена возможность редактирования, т.е. символ backspace и подобные ему считаются частью пароля.

В glibc2, если файл /dev/tty не может быть открыт, то строка приглашения выводится в поток ошибок stderr, а пароль читается из стандартного потока ввода stdin. Ограничения на длину пароля нет и строку можно редактировать.

Согласно SUSv2 значение PASS_MAX должно быть определено в <limits.h>, если оно меньше 8, и в любом случае может быть получено с помощью sysconf(_SC_PASS_MAX). Однако, из стандарта POSIX.2 константы PASS_MAX, _SC_PASS_MAX и функция getpass() убраны. В libc4 и libc5 PASS_MAX и _SC_PASS_MAX никогда не поддерживались. В glibc2 учитывается _SC_PASS_MAX и возвращается BUFSIZ (например 8192).

ДЕФЕКТЫ
Вызывающий процесс должен как можно скорее обнулить пароль во избежание возможности просмотра незашифрованного пароля в адресном пространстве процесса.

СМОТРИТЕ ТАКЖЕ
crypt(3)