getipnodebyname

title: getipnodebyname(3)

summary: возвращают сетевые имена и

text:
# getipnodebyname(3)

## ИМЯ
getipnodebyname, getipnodebyaddr, freehostent - возвращают сетевые имена и адреса машины

## ОБЗОР

```
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
```

```
struct hostent *getipnodebyname(const char *name, int af,
                                int flags, int *error_num);
```

```
struct hostent *getipnodebyaddr(const void *addr, size_t len,
                                int af, int *error_num);
```

```
void freehostent(struct hostent *ip);
```

## ОПИСАНИЕ
Эти функции устарели (и недоступны в glibc). Используйте вместо них функции getaddrinfo(3) и getnameinfo(3).

Функции getipnodebyname() и getipnodebyaddr() возвращают имена и адреса машины в сети. Эти функции возвращают указатель на следующую структуру:

```
struct hostent {

    char  *h_name;

    char **h_aliases;

    int    h_addrtype;

    int    h_length;

    char **h_addr_list;
};
```

Эти функции заменяют функции gethostbyname(3) и gethostbyaddr(3), которые могут возвращать только сетевые адреса семейства IPv4. Функции getipnodebyname() и getipnodebyaddr() могут осуществлять доступ к нескольким семействам сетевых адресов.

В отличие от функций gethostby эти функции возвращают указатели на динамически выделяемую память. Функция freehostent() используется для освобождения динамически выделенной памяти после того, как надобность в структуре hostent отпадёт.

### Параметры getipnodebyname()
Функция getipnodebyname() ищет сетевой адрес узла, указанного в параметре name. В параметре af указывается одно из следующих значений:

AF_INET

Параметр name указывает на адрес IPv4 в точечной нотации или на имя сетевого узла IPv4.

AF_INET6

Параметр name указывает на шестнадцатеричный адрес IPv6 или на имя сетевого узла IPv6.

В аргументе flags указываются дополнительные параметры. Возможно указать более одного параметра с помощью логического сложения (OR). Если параметры не требуются, то значение flags должно быть равно нулю.

AI_V4MAPPED

Этот флаг используется с AF_INET6 для запроса адресов IPv4 вместо адресов IPv6; адрес IPv4 будет отображён в адрес IPv6.

AI_ALL

Это флаг используется с AI_V4MAPPED для запроса одновременно адресов IPv4 и IPv6. Любой найденный адрес IPv4 будет отображён в адрес IPv6.

AI_ADDRCONFIG

Этот флаг используется с AF_INET6 и указывает, что запросы адресов IPv6 не должны производиться, если система не имеет хотя бы одного адреса IPv6, присвоенного сетевому интерфейсу, а также, что запросы адресов IPv4 не должны производиться, если система не имеет хотя бы одного адреса IPv4, присвоенного сетевому интерфейсу. Флаг может быть использован сам по себе или вместе с флагом AI_V4MAPPED.

AI_DEFAULT

Этот флаг эквивалентен (AI_ADDRCONFIG | AI_V4MAPPED).

### Параметры getipnodebyaddr()
Функция getipnodebyaddr() ищет имя узла, чей сетевой адрес указан в параметре addr. В параметре af указывается одно из следующих значений:

AF_INET

Параметр addr указывает на структуру struct in_addr и значение len должно быть равно sizeof(struct in_addr).

AF_INET6

Параметр addr указывает на структуру struct in6_addr и значение len должно быть равно sizeof(struct in6_addr).

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При ошибке возвращается NULL, а в error_num будет содержаться код ошибки из следующего списка:

HOST_NOT_FOUND

Имя узла или сетевой адрес не найдены.

NO_ADDRESS

Сервер доменных имён распознал сетевой адрес или имя, но не ответил. Это может произойти, если сетевой узел имеет только адреса IPv4, а запрашивалась информация об IPv6, или наоборот.

NO_RECOVERY

Сервер доменных имён возвратил сообщение о постоянной ошибке.

TRY_AGAIN

Сервер доменных имён возвратил сообщение о временной ошибке. Возможно, ответ может быть получен при повторной попытке.

При выполненном запросе возвращается указатель на структуру hostent, содержащую следующие поля:

h_name

Официальное имя данного сетевого узла.

h_aliases

Массив указателей на неофициальные псевдонимы этого же узла. Массив оканчивается указателем null.

h_addrtype

Копия параметра af вызова getipnodebyname() или getipnodebyaddr(). Значение h_addrtype всегда равно AF_INET, если значение af равно AF_INET. Значение h_addrtype всегда равно AF_INET6, если значение af равно AF_INET6.

h_length

Это поле равно sizeof(struct in_addr), если h_addrtype равно AF_INET, и sizeof(struct in6_addr), если h_addrtype равно AF_INET6.

h_addr_list

Массив из одного или нескольких указателей на структуры сетевого адреса для сетевого узла. Массив оканчивается указателем null.

## СООТВЕТСТВИЕ СТАНДАРТАМ
RFC 2553.

## ЗАМЕЧАНИЯ
Эти функции существовали в glibc 2.1.91-95, но были удалены. Некоторые UNIX-подобные системы поддерживают их, но все эти вызовы устарели.

## СМОТРИТЕ ТАКЖЕ
getaddrinfo(3), getnameinfo(3), inet_ntop(3), inet_pton(3)


getline

package: man-pages-ru

title: getline(3)

summary: разделяет входные данные на строки

text:
# getline(3)

## ИМЯ
getline, getdelim - разделяет входные данные на строки

## ОБЗОР

```
#include <stdio.h>
```

```
ssize_t getline(char **lineptr, size_t *n, FILE *stream);
```

```
ssize_t getdelim(char **lineptr, size_t *n, int delim, FILE *stream);
```

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

getline(), getdelim():

Начиная с glibc 2.10:

_POSIX_C_SOURCE >= 200809L

До glibc 2.10:

_GNU_SOURCE

## ОПИСАНИЕ
Функция getline() считывает целую строку из stream, сохраняет адрес буфера с текстом в *lineptr. Буфер завершается null и включает символ новой строки, если был найден разделитель для новой строки.

Если *lineptr равно NULL и *n равно 0 перед вызовом, то getline() выделит буфер для хранения строки. Этот буфер должен быть высвобожден программой пользователя, даже если getline() завершилась с ошибкой.

Как альтернатива, перед вызовом getline(), *lineptr может содержать указатель на буфер, выделенный с помощью malloc(3) размером *n байтов. Если буфер недостаточно велик для размещения строки, то getline() изменяет размер буфера с помощью realloc(3), обновляя *lineptr и *n при необходимости.

В любом случае при успешном выполнении вызова *lineptr и *n будут содержать правильный адрес буфера и его размер, соответственно.

Функция getdelim() работает аналогично getline(), за исключением того, что в аргументе delimiter можно задать разделитель строки, отличный от символа новой строки. Как и с getline(), символ-разделитель не добавляется, если его было в входных данных до конца файла.

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При успешном выполнении getline() и getdelim() возвращают количество считанных символов, включая символ разделителя, но не включая завершающий байт null ('\0'). Это значение может использоваться для обработки встроенных байтов null при чтении строки.

Обе функции возвращают -1 при ошибках чтения строки (включая условие достижения конца файла). При возникновении ошибки в errno сохраняется её значение.

## ОШИБКИ
EINVAL

Некорректные параметры (n или lineptr равно NULL или неправильное значение stream).

ENOMEM

Не удалось выделить или переместить строчный буфер.

## АТРИБУТЫ
Описание терминов данного раздела смотрите в attributes(7).

Интерфейс

Атрибут

Значение

getline(), getdelim()

Безвредность в нитях

MT-Safe

## СООТВЕТСТВИЕ СТАНДАРТАМ
Изначально, функции getline() и getdelim() были расширениями GNU. Позднее они были стандартизированы в POSIX.1-2008.

## ПРИМЕР

```
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
int
main(int argc, char *argv[])
{

    FILE *stream;

    char *line = NULL;

    size_t len = 0;

    ssize_t nread;

    if (argc != 2) {

        fprintf(stderr, "Использование: %s <файл>\n", argv[0]);

        exit(EXIT_FAILURE);

    }

    stream = fopen(argv[1], "r");

    if (stream == NULL) {

        perror("fopen");

        exit(EXIT_FAILURE);

    }

    while ((nread = getline(&line, &len, stream)) != -1) {

        printf("Retrieved line of length %zu:\n", nread);

        fwrite(line, nread, 1, stdout);

    }

    free(line);

    fclose(stream);

    exit(EXIT_SUCCESS);
}
```

## СМОТРИТЕ ТАКЖЕ
read(2), fgets(3), fopen(3), fread(3), scanf(3)


getloadavg

title: getloadavg(3)

text:
# getloadavg(3)

## ИМЯ
getloadavg - возвращает среднее значение загруженности системы

## ОБЗОР

```
#include <stdlib.h>
```

```
int getloadavg(double loadavg[], int nelem);
```

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

getloadavg():

```
    начиная с glibc 2.19:

        _DEFAULT_SOURCE

    в glibc до версии 2.19 включительно:

        _BSD_SOURCE
```

## ОПИСАНИЕ
Функция getloadavg() возвращает количество процессов в системной очереди выполнения, усреднённое в разных периодах времени. Воспринимается до nelem образцов и они последовательно назначаются в элементы loadavg[]. Система максимально выводит 3 образца, представляющие средние данные за последние 1, 5 и 15 минут, соответственно.

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Если невозможно получить данные о средней загруженности системы, то возвращается -1; иначе возвращается количество полученных образов.

## ВЕРСИИ
Эта функция доступна в glibc начиная с версии 2.2.

## АТРИБУТЫ
Описание терминов данного раздела смотрите в attributes(7).

Интерфейс

Атрибут

Значение

getloadavg()

Безвредность в нитях

MT-Safe

## СООТВЕТСТВИЕ СТАНДАРТАМ
Не является частью POSIX.1. Имеется в BSD и Solaris.

## СМОТРИТЕ ТАКЖЕ
uptime(1), proc(5)


getlogin

title: getlogin(3)

summary: возвращает имя пользователя

text:
# getlogin(3)

## ИМЯ
getlogin, getlogin_r, 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(): _POSIX_C_SOURCE >= 199506L

cuserid():

```
    Начиная с glibc 2.24:

        (_XOPEN_SOURCE && ! (_POSIX_C_SOURCE >= 200112L)

        || _GNU_SOURCE

    До glibc 2.23 включительно:

        _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().

## СМОТРИТЕ ТАКЖЕ
logname(1), geteuid(2), getuid(2), utmp(5)


getmntent

title: getmntent(3)

text:
# getmntent(3)

## ИМЯ
getmntent, setmntent, addmntent, endmntent, hasmntopt, getmntent_r - возвращают запись из файла описания файловых систем

## ОБЗОР

```
#include <stdio.h>
#include <mntent.h>
```

```
FILE *setmntent(const char *filename, const char *type);
```

```
struct mntent *getmntent(FILE *stream);
```

```
int addmntent(FILE *stream, const struct mntent *mnt);
```

```
int endmntent(FILE *streamp);
```

```
char *hasmntopt(const struct mntent *mnt, const char *opt);
/* Расширение GNU */
#include <mntent.h>
```

```
struct mntent *getmntent_r(FILE *streamp, struct mntent *mntbuf,
                           char *buf, int buflen);
```

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

getmntent_r(),

начиная с glibc 2.19:

_DEFAULT_SOURCE

в glibc 2.19 и старее:

_BSD_SOURCE || _SVID_SOURCE

## ОПИСАНИЕ
Эти функции используются для доступа к файлу описаний файловых систем /etc/fstab и к файлу описаний смонтированных файловых систем /etc/mtab.

Функция setmntent() открывает файл описаний файловых систем filename и возвращает указатель на файл, который может быть использован getmntent(). В аргументе type указывается требуемый тип доступа и и могут задаваться те же значения, что и в аргументе mode функции fclose(3). Возвращаемый поток должен закрываться с помощью endmntent(), а не fclose(3).

Функция getmntent() считывает следующую строку из файла описаний файловых систем stream и возвращает указатель на структуру, содержащую поля строки файла. Указатель ссылается на статическую область памяти, которая перезаписывается последующими вызовами getmntent().

Функция addmntent() добавляет структуру mnt типа mntent к концу открытого stream.

Функция endmntent() закрывает stream, связанный с файл описаний файловых систем.

Функция hashmntopt() ищет в полях mnt_opts (смотрите ниже) структуры mnt типа mntent подстроку, совпадающую с opt. Список возможных параметров монтирования приведён в <mntent.h> и mount(8).

Реентерабельная функция getmntent_r() подобна getmntent(), но сохраняет struct mount в предоставляемом *mntbuf, а строки элементов этой структуры — в предоставляемый массив buf размера buflen.

Структура mntent определена в <mntent.h> следующим образом:

```
struct mntent {

    char *mnt_fsname;   /* название смонтированной файловой системы */

    char *mnt_dir;      /* префикс пути к файловой системе */

    char *mnt_type;     /* тип монтирования (смотрите mntent.h) */

    char *mnt_opts;     /* параметры монтирования (смотрите mntent.h) */

    int   mnt_freq;     /* периодичность запуска dump, в днях */

    int   mnt_passno;   /* номер прохода при параллельном fsck */
};
```

Так как поля в файлах mtab и fstab разделяются пробельными символами, то для их записи в одной из четырёх строках структуры mntent используются их экранированные последовательности в восьмеричном коде: пробел (\040), табуляция (\011), новая строка (\012) и обратная косая черта (\\). Функции addmntent() и getmntent() выполнят преобразование экранированных строк и обратно. При преобразовании из экранированного представления, последовательность \134 также преобразуется в символ обратной косой черты.

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Функции getmntent() и getmntent_r() возвращают указатель на структуру типа mntent или NULL при ошибке.

Функция addmntent() возвращает 0 при успешном выполнении и 1 при ошибке.

Функция endmntent() всегда возвращает 1.

Функция hasmntopt() возвращает адрес подстроки, если она была найдена, в противном случае NULL.

## ФАЙЛЫ
/etc/fstab

файл описаний файловых систем

/etc/mtab

файл описаний смонтированных файловых систем

## АТРИБУТЫ
Описание терминов данного раздела смотрите в attributes(7).

Интерфейс

Атрибут

Значение

setmntent(), endmntent(), hasmntopt()

Безвредность в нитях

MT-Safe

getmntent()

Безвредность в нитях

MT-Unsafe race:mntentbuf locale

addmntent()

Безвредность в нитях

MT-Safe race:stream locale

getmntent_r()

Безвредность в нитях

MT-Safe locale

## СООТВЕТСТВИЕ СТАНДАРТАМ
Нереентерабельные функции появились из SunOS 4.1.3. Функция getmntent_r() появилась из HP-UX 10, но она возвращает int. Показанный здесь прототип есть только в glibc.

## ЗАМЕЧАНИЯ
В System V также имеется функция getmntent(), однако последовательность вызова и возвращаемая структура отличаются от остальных. В System V используется /etc/mnttab. В BSD 4.4 и Digital UNIX есть функция getmntinfo(), обёртка над системным вызовом getfsstat().

## СМОТРИТЕ ТАКЖЕ
fopen(3), fstab(5), mount(8)


getnameinfo

title: getnameinfo(3)

text:
# getnameinfo(3)

## ИМЯ
getnameinfo - перевод адреса в имя не зависящим от протокола способом

## ОБЗОР

```
#include <sys/socket.h>
#include <netdb.h>
```

```
int getnameinfo(const struct sockaddr *addr, socklen_t addrlen,
                char *host, socklen_t hostlen,
                char *serv, socklen_t servlen, int flags);
```

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

getnameinfo():

начиная с glibc 2.22: _POSIX_C_SOURCE >= 201112L

в glibc 2.21 и старее: _POSIX_C_SOURCE

## ОПИСАНИЕ
Функция getnameinfo() выполняет операцию, обратную getaddrinfo(3); она преобразует адрес сокета в соответствующие узел и службу, способом, который не зависит от протокола. Она сочетает в себе действия функций gethostbyaddr(3) и getservbyport(3), но в отличии от этих функций getnameinfo() реентерабельна и позволяет программам не зависеть от типа IPv4 и IPv6.

Аргумент addr — это указатель на обобщённую структуру адреса сокета (типа sockaddr_in или sockaddr_in6) размером addrlen, которая содержит IP-адрес и номер порта. Аргументы host и serv указывают на выделенные вызывающим буферы (размером hostlen и servlen, соответственно), в которые getnameinfo() помещает строки (заканчивающееся null), содержащие имя узла и службы, соответственно.

Вызывающий может указать, что имя узла (или службы) не требуется, указав в аргументе host (или serv) NULL или в hostlen (или servlen) значение 0. Однако, по крайней мере один параметр, имя узла или службы, должно быть запрошено.

Аргумент flags меняет поведение функции getnameinfo() следующим образом:

NI_NAMEREQD

Если этот флаг установлен, то возвращается ошибка, если имя машины не может быть определено.

NI_DGRAM

Если этот флаг установлен, то сначала используется имя службы на основе дейтаграмм (UDP), а не потоков (TCP). Это требуется для немногих портов (512–514), которые имеют различные службы для UDP и TCP.

NI_NOFQDN

Если этот флаг установлен, то возвращается только часть имени машины от полностью определённого доменного имени (FQDN) для локальных машин.

NI_NUMERICHOST

Если этот флаг установлен, то имя узла возвращается в числовой форме (если этот флаг не установлен, то это также произойдёт в случае, когда имя узла невозможно определить).

NI_NUMERICSERV

Если этот флаг установлен, тогда имя службы возвращается в числовой форме (если этот флаг не установлен, то это также произойдёт в случае, когда имя узла невозможно определить).

### Расширения getnameinfo() для интернациональных доменных имён
Начиная с glibc 2.3.4, getnameinfo() была расширена для выборочного прозрачного разрешения имён для формата интернациональных доменных имён (IDN) (смотрите RFC 3490, Internationalizing Domain Names in Applications (IDNA)). Было определено четыре новых флага:

NI_IDN

Если этот флаг установлен, то при необходимости искомое имя преобразуется из формата IDN в кодировку локали. Имена из только ASCI-символов не меняются при преобразовании, из-за чего данный флаг можно использовать в существующих программах и средах.

NI_IDN_ALLOW_UNASSIGNED, NI_IDN_USE_STD3_ASCII_RULES

Установка этих флагов включает IDNA_ALLOW_UNASSIGNED (разрешать не назначенные кодовые точки Юникода) и IDNA_USE_STD3_ASCII_RULES (проверять вывод на соответствие имени узла STD3) соответственно для возможности работы с IDNA.

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При успешном выполнении возвращается 0, а строки (оканчивающееся null) имени узла и службы (если запрашивались) записываются в соответствующий буфер заданной длины. При ошибке возвращается одно из следующих ненулевых значений ошибки:

EAI_AGAIN

Имя не может быть определено в настоящий момент. Попробуйте повторить попытку позже.

EAI_BADFLAGS

Параметр flags имеет неверное значение.

EAI_FAIL

Произошла неисправимая ошибка.

EAI_FAMILY

Не распознано семейство адресов, или для данного семейства была указана неверно длина адреса.

EAI_MEMORY

Не хватает памяти.

EAI_NONAME

Имя не может быть определено для указанных параметров. Установлен флаг NI_NAMEREQD и имя машины не может быть определено, или не было запрошено не имя машины и не имя службы.

EAI_OVERFLOW

Размер буфера, на который указывает host или serv слишком мал.

EAI_SYSTEM

Произошла системная ошибка. Код системной ошибки можно найти в переменной errno.

Функция gai_strerror(3) транслирует эти коды ошибок в читаемый формат, подходящий для сообщений об ошибке.

## ФАЙЛЫ
/etc/hosts

/etc/nsswitch.conf

/etc/resolv.conf

## ВЕРСИИ
Функция getnameinfo() появилась в glibc начиная с версии 2.1.

## АТРИБУТЫ
Описание терминов данного раздела смотрите в attributes(7).

Интерфейс

Атрибут

Значение

getnameinfo()

Безвредность в нитях

MT-Safe env locale

## СООТВЕТСТВИЕ СТАНДАРТАМ
POSIX.1-2001, POSIX.1-2008, RFC 2553.

## ЗАМЕЧАНИЯ
Чтобы помочь программисту выбрать нужный размер буферов в <netdb.h> определены константы

```
#define NI_MAXHOST      1025
#define NI_MAXSERV      32
```

Начиная с glibc 2.8, эти определения доступны только, если определён подходящий макрос тестирования свойств: _GNU_SOURCE, _DEFAULT_SOURCE (начиная с glibc 2.19) или (в версиях glibc с 2.19 включительно) _BSD_SOURCE или _SVID_SOURCE.

Первая — это константа MAXDNAME из новых версий заголовочного файла <arpa/nameser.h> BIND. Последняя — вычислена на основе служб, перечисленных в текущем RFC «Assigned Numbers».

В glibc до версии 2.2 аргументы hostlen и servlen имели тип size_t.

## ПРИМЕР
Следующий код пытается получить имя машины и службы в числовой форме для указанного адреса сокета. Обратите внимание, что здесь нет прямых упоминаний определённого семейства адресов.

```
struct sockaddr *addr;     /* входные */
socklen_t addrlen;         /* входные */
char hbuf[NI_MAXHOST], sbuf[NI_MAXSERV];
if (getnameinfo(addr, addrlen, hbuf, sizeof(hbuf), sbuf,

            sizeof(sbuf), NI_NUMERICHOST | NI_NUMERICSERV) == 0)

    printf("host=%s, serv=%s\n", hbuf, sbuf);
```

Следующая версия проверяет, имеет ли адрес сокета обратное отображение адреса.

```
struct sockaddr *addr;     /* входные */
socklen_t addrlen;         /* входные */
char hbuf[NI_MAXHOST];
if (getnameinfo(addr, addrlen, hbuf, sizeof(hbuf),

            NULL, 0, NI_NAMEREQD))

    printf("не удалось определить имя узла");
else

    printf("host=%s\n", hbuf);
```

Пример программы, использующей getnameinfo(), можно найти в getaddrinfo(3).

## СМОТРИТЕ ТАКЖЕ
accept(2), getpeername(2), getsockname(2), recvfrom(2), socket(2), getaddrinfo(3), gethostbyaddr(3), getservbyname(3), getservbyport(3), inet_ntop(3), hosts(5), services(5), hostname(7), named(8)

R. Gilligan, S. Thomson, J. Bound and W. Stevens, Basic Socket Interface Extensions for IPv6, RFC 2553, March 1999.

Tatsuya Jinmei and Atsushi Onoe, An Extension of Format for IPv6 Scoped Addresses, черновик ftp://ftp.ietf.org/internet-drafts/draft-ietf-ipngwg-scopedaddr-format-02.txt.

Craig Metz, Protocol Independence Using the Sockets API, Продолжение темы freenix: 2000 USENIX ежегодной технической конференции, июнь 2000 http://www.usenix.org/publications/library/proceedings/usenix2000/freenix/metzprotocol.html.


getnetent

title: getnetent(3)

summary: получить

text:
# getnetent(3)

## ИМЯ
getnetent, getnetbyname, getnetbyaddr, setnetent, endnetent - получить запись сети

## ОБЗОР

```
#include <netdb.h>
```

```
struct netent *getnetent(void);
```

```
struct netent *getnetbyname(const char *name);
```

```
struct netent *getnetbyaddr(uint32_t net, int type);
```

```
void setnetent(int stayopen);
```

```
void endnetent(void);
```

## ОПИСАНИЕ
Функция getnetent() считывает следующую запись из файла, содержащего базу сетей, и возвращает структуру netent, содержащую поля из этой записи. При необходимости будет открыто подключение к базе.

Функция getnetbyname() возвращает структуру netent для записи из базы, соответствующей сети name.

Функция getnetbyaddr() возвращает структуру netent для записи из базы, которая соответствует номеру сети net типа type. Аргумент net должен использовать порядок байтов, использующийся на машине.

Функция setnetent() открывает соединение к базе и устанавливает следующую запись к первой записи. Если stayopen не равен нулю, то подключение к базе между вызовами нескольких функций getnet*() не будет закрыто.

Функция endnetent() закрывает подключение к базе.

Структура netent определена в <netdb.h> таким образом:

```
struct netent {

    char      *n_name;     /* официальное имя сети */

    char     **n_aliases;  /* список псевдонимов */

    int        n_addrtype; /* тип сетевого адреса */

    uint32_t   n_net;      /* номер сети */
}
```

Члены структуры netent:

n_name

Официальное название сети.

n_aliases

Список альтернативных имён сети, завершающийся NULL.

n_addrtype

Тип номера сети, всегда равно AF_INET.

n_net

Номер сети в порядке байтов, использующемся на машине.

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Функции getnetent(), getnetbyname() и getnetbyaddr() возвращают указатель на статически выделенную структуру netent или указатель null при ошибке или достижении конца файла.

## ФАЙЛЫ
/etc/networks

файл, содержащий базу сетей

## АТРИБУТЫ
Описание терминов данного раздела смотрите в attributes(7).

Интерфейс

Атрибут

Значение

getnetent()

Безвредность в нитях

MT-Unsafe race:netent race:netentbuf env locale

getnetbyname()

Безвредность в нитях

MT-Unsafe race:netbyname env locale

getnetbyaddr()

Безвредность в нитях

MT-Unsafe race:netbyaddr locale

setnetent(), endnetent()

Безвредность в нитях

MT-Unsafe race:netent env locale

В приведённой выше таблице netent в race:netent означает, что если в нескольких нитях программы одновременно используются функции setnetent(), getnetent() или endnetent(), то может возникнуть состязательность по данным.

## СООТВЕТСТВИЕ СТАНДАРТАМ
POSIX.1-2001, POSIX.1-2008, 4.3BSD.

## ЗАМЕЧАНИЯ
В версия glibc ниже 2.2 аргумент net из getnetbyaddr() имел тип long.

## СМОТРИТЕ ТАКЖЕ
getnetent_r(3), getprotoent(3), getservent(3)

RFC 1101


title: getnetent_r(3)

summary: возвращают запись о сети

text:
# getnetent_r(3)

## ИМЯ
getnetent_r, getnetbyname_r, getnetbyaddr_r - возвращают запись о сети (реентерабельные версии)

## ОБЗОР

```
#include <netdb.h>
```

```
int getnetent_r(struct netent *result_buf, char *buf,
                size_t buflen, struct netent **result,
                int *h_errnop);
```

```
int getnetbyname_r(const char *name,
                struct netent *result_buf, char *buf,
                size_t buflen, struct netent **result,
                int *h_errnop);
```

```
int getnetbyaddr_r(uint32_t net, int type,
                struct netent *result_buf, char *buf,
                size_t buflen, struct netent **result,
                int *h_errnop);
```

```

```

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

getnetent_r(), getnetbyname_r(), getnetbyaddr_r():

начиная с glibc 2.19:

_DEFAULT_SOURCE

в glibc 2.19 и старее:

_BSD_SOURCE || _SVID_SOURCE

## ОПИСАНИЕ
Функции getnetent_r(), getnetbyname_r() и getnetbyaddr_r() являются реентерабельными эквивалентами getnetent(3), getnetbyname(3) и getnetbynumber(3), соответственно. Они отличаются способом возврата структуры netent и списком параметров и типом возвращаемого значения. В этой справочной странице описаны только различия с нереентерабельными функциями.

Вместо возврата указателя на статически выделенную структуру netent в качестве результата эти функции копируют структуру в расположение, указанное result_buf.

Массив buf используется для хранения строковых полей из возвращаемой структуры netent (нереентерабельные функции выделяют эти строки из статического хранилища). Размер данного массива задаётся в buflen. Если buf слишком мал, то вызов завершается с ошибкой ERANGE, вызывающий должен его повторить с большим буфером (для большинства приложений должно быть достаточно буфера длиной 1024 байт).

Если вызов получил запись о сети, то *result указывает на result_buf; в противном случае *result устанавливается в NULL.

Буфер, указанный h_errnop, используется для возврата значения, которое бы сохранилось в глобальной переменной h_errno нереентерабельными версиями этих функций.

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При успешном выполнении эти функции возвращают 0. При ошибке возвращается одно из положительных значений, перечисленных В разделе ОШИБКИ.

При ошибке, отсутствии записи (getnetbyname_r(), getnetbyaddr_r()) или конце данных (getnetent_r()) значение result равно NULL.

## ОШИБКИ
ENOENT

(getnetent_r()) Больше нет записей в базе данных.

ERANGE

Размер buf слишком мал. Попробуйте ещё раз с большим буфером (и увеличенным значением buflen).

## АТРИБУТЫ
Описание терминов данного раздела смотрите в attributes(7).

Интерфейс

Атрибут

Значение

getnetent_r(), getnetbyname_r(), getnetbyaddr_r()

Безвредность в нитях

MT-Safe locale

## СООТВЕТСТВИЕ СТАНДАРТАМ
Эти функции являются расширениями GNU. Функции с похожими именами есть и в других системах, хотя и с другим набором параметров.

## СМОТРИТЕ ТАКЖЕ
getnetent(3), networks(5)


getopt

title: getopt(3)

text:
# getopt(3)

## ИМЯ
getopt, getopt_long, getopt_long_only, optarg, optind, opterr, optopt - разбираю параметры командной строки

## ОБЗОР

```
#include <unistd.h>
```

```
int getopt(int argc, char * const argv[],
           const char *optstring);
```

```
extern char *optarg;
extern int optind, opterr, optopt;
```

```
#include <getopt.h>
```

```
int getopt_long(int argc, char * const argv[],
           const char *optstring,
           const struct option *longopts, int *longindex);
```

```
int getopt_long_only(int argc, char * const argv[],
           const char *optstring,
           const struct option *longopts, int *longindex);
```

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

getopt(): _POSIX_C_SOURCE >= 2 || _XOPEN_SOURCE

getopt_long(), getopt_long_only(): _GNU_SOURCE

## ОПИСАНИЕ
Функция getopt() разбирает аргументы командной строки. Её аргументы argc и argv являются счётчиком и массивом аргументов, которые передаются функции main() при запуске программы. Элемент argv, начинающийся с «-» (и не являющийся «-» или «--»), считается параметром. Символы этого элемента (не считая начального «-») являются символами параметра. При каждом повторном вызове getopt() возвращают следующий символ параметра и так для каждого следующего параметра.

Переменная optind — это индекс следующего обрабатываемого элемента argv. Система инициализирует это значение 1. Вызывающий может сбросить его в 1 для перезапуска сканирования того же argv, или при сканировании нового вектора аргументов.

Если getopt() встречает символ другого параметра, она возвращает этот символ, обновляя внешнюю переменную optind и статическую переменную nextchar, так что следующий вызов getopt() может продолжить проверку с символа следующего параметра или элемента argv.

Если символов параметров больше нет, то getopt() возвращает -1. При этом optind станет индексом первого элемента argv, не являющегося параметром.

Аргумент optstring является строкой, содержащей допустимые символы параметров. Если за таким символом стоит двоеточие, то параметр требует указания аргумента. При этом getopt() помещает указатель на следующий за символом параметра текст в тот же элемент argv, или на текст следующего элемента argv в optarg. Два двоеточия означают, что параметр имеет необязательный аргумент; если текущий элемент argv содержит текст (то есть в самом имени слова, например «-oarg»), то он возвращается в optarg, в противном случае optarg содержит ноль. Это является расширением GNU. Если optstring содержит W, за которой следует точка с запятой, то -W foo рассматривается как длинный параметр --foo (параметр -W зарезервирован POSIX.2 для реализации расширений). Такое поведение является расширением GNU и недоступно в библиотеках до glibc 2.

По умолчанию getopt() переставляет элементы содержимого argv в процессе поиска, так что в конечном счёте все аргументы, не являющиеся параметрами, оказываются в конце. Реализованы также два других режима. Если первым символом optstring является «+» или задана переменная окружения POSIXLY_CORRECT, то обработка параметров прерывается сразу, как только находится символ не параметра. Если первым символом optstring является «-», то каждый элемент argv, не являющийся параметром, обрабатывается так, как если бы он был аргументом параметра с символом, имеющим код 1 (это используется программами, которые требуют параметры и другие элементы argv в любом порядке и их порядок важен). Специальный аргумент «--» служит для обозначения конца параметров независимо от режима.

При обработке списка параметров getopt() может определить два типа ошибок: (1) — символ параметра, не заданный в optstring и (2) — отсутствующий аргумент параметра (т. е., параметра в конце командной строки без ожидаемого аргумента). Эти ошибки обрабатываются и о них сообщается следующем образом:

- По умолчанию, getopt() печатает сообщение об ошибке в стандартный поток ошибок, помещает ошибочный символ параметра в optopt и возвращает '?' как результат функции.

- Если вызывающий присвоил глобальной переменной opterr значение 0, то getopt() не печатает сообщение об ошибке. Вызывающий может определить, что произошла ошибка, сравнив возвращаемое значение функции с '?' (по умолчанию opterr имеет ненулевое значение).

- Если первый символ (после необязательных '+' или '-', описанных выше) optstring — двоеточие (':'), то getopt() также не печатает сообщение об ошибке. При этом возвращается ':' вместо '?', что показывает отсутствие аргумента параметра. Это позволяет вызывающему отличить один тип ошибок от другого.

### getopt_long() и getopt_long_only()
Функция getopt_long() работает так же, как getopt(), за исключением того, что она воспринимает и длинные параметры, начинающиеся с двух дефисов (если программа принимает только длинные параметры, то значение optstring должно быть равно пустой строке (""), не NULL). Длинные параметры можно сокращать, если сокращение сохраняет уникальность параметра или полностью совпадает с одним из определённых параметров. Длинный параметр может иметь значение вида --параметр=значение или --параметр значение.

Аргумент longopts является указателем на первый элемент массива структур struct option, объявленного в <getopt.h> следующим образом

```
struct option {

    const char *name;

    int         has_arg;

    int        *flag;

    int         val;
};
```

Значения различных полей:

name

имя длинного параметра

has_arg

может быть: no_argument (или 0), если параметр не требует значения; required_argument (или 1), если параметр требует значения; optional_argument (или 2), если параметр может иметь необязательное значение.

flag

способ возвращения результатов для длинного параметра. Если flag равен NULL, то getopt_long() возвращает val (например, вызывающая программа может назначить val эквивалентом символа короткого параметра). В противном случае getopt_long() возвращает 0, а flag указывает на переменную, устанавливаемое значение которой равно val, если параметр найден; и оставляемую без изменений, если параметр не найден.

val

значение, которое возвращается или загружается в переменную, на которую указывает flag.

Последний элемент массива должен быть заполнен нулями.

Если longindex не равен NULL, то он указывает на переменную, содержащую индекс длинного параметра в соответствии с longopts.

Функция getopt_long_only() работает так же, как getopt_long(), но в качестве указателя длинного параметра может служить не только «--», но и «-». Если параметр, начинающийся с «-» (не с «--»), не совпадает с длинным параметром, но совпадает с коротким, то он обрабатывается как короткий параметр.

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Если параметр найден, то getopt() возвращает символ параметра. Если все параметры командной строки обработаны, то getopt() возвращает -1. Если getopt() находит символ, которого нет в optstring, то возвращается «?». Если getopt() находит символ с отсутствующим аргументом, то возвращаемое значение зависит от первого символа optstring: если это «:», то возвращается «:», в противном случае возвращается «?».

Функции getopt_long() и getopt_long_only() также возвращают символ параметра, если распознан короткий параметр. Для длинного параметра они возвращают val, если flag равен NULL, и 0 в противном случае. Возвращаемые ошибки и -1 имеют то же значение, что и для getopt(), кроме того, «?» возвращается при двусмысленном толковании параметра.

## ОКРУЖЕНИЕ
POSIXLY_CORRECT

Если установлена эта переменная, то обработка параметров прерывается на первом аргументе, не являющемся параметром.

_<PID>_GNU_nonoption_argv_flags_

Эта переменная использовалась bash(1) 2.0 для связи с glibc, аргументы которой являются результатом раскрытия шаблонов и, таким образом, не должны рассматриваться как параметры. Такое поведение было удалено из bash(1) версии 2.01, но поддержка осталась в glibc.

## АТРИБУТЫ
Описание терминов данного раздела смотрите в attributes(7).

Интерфейс

Атрибут

Значение

getopt(), getopt_long(), getopt_long_only()

Безвредность в нитях

MT-Unsafe race:getopt env

## СООТВЕТСТВИЕ СТАНДАРТАМ
getopt():

В POSIX.1-2001, POSIX.1-2008 и POSIX.2 описана переменная окружения POSIXLY_CORRECT. В противном случае элементы argv на самом деле не являются const, потому что мы изменяем их порядок. Мы будем считать их const в прототипах для совместимости этих прототипов с другими операционными системами.

Использование «+» и «-» в optstring является расширением GNU.

В некоторых старых реализациях getopt() объявлялась в <stdio.h>. В SUSv1 разрешено её объявлять в <unistd.h> или <stdio.h>. В POSIX.1-1996 отмечено, что использование <stdio.h> УСТАРЕЛО. В POSIX.1-2001 не требуется объявлять эту функцию в <stdio.h>.

getopt_long() и getopt_long_only():

Эти функции являются расширениями GNU.

## ЗАМЕЧАНИЯ
В программе, где анализируется несколько векторов параметров, или разбирается один вектор более одного раза и нужно использовать расширения GNU «+» и «-» в начале optstring или изменять значение POSIXLY_CORRECT между разборами, должна повторно инициализировать getopt() сбрасывая optind в 0, а не в обычное значение 1 (сброс в 0 вызывает принудительный вызов внутренней процедуры, повторно проверяющей POSIXLY_CORRECT и расширения GNU в optstring).

## ПРИМЕР

### getopt()
В приведённом ниже пример программы getopt() используется два параметра программы: -n без значения и -t значение со значением.

```
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
int
main(int argc, char *argv[])
{

    int flags, opt;

    int nsecs, tfnd;

    nsecs = 0;

    tfnd = 0;

    flags = 0;

    while ((opt = getopt(argc, argv, "nt:")) != -1) {

        switch (opt) {

        case 'n':

            flags = 1;

            break;

        case 't':

            nsecs = atoi(optarg);

            tfnd = 1;

            break;

        default: /* '?' */

            fprintf(stderr, "Использование: %s [-t nsecs] [-n] имя\n",

                    argv[0]);

            exit(EXIT_FAILURE);

        }

    }

    printf("flags=%d; tfnd=%d; nsecs=%d; optind=%d\n",

            flags, tfnd, nsecs, optind);

    if (optind >= argc) {

        fprintf(stderr, "После параметра требуется значение\n");

        exit(EXIT_FAILURE);

    }

    printf("параметр = %s\n", argv[optind]);

    /* остальной код не показан */

    exit(EXIT_SUCCESS);
}
```

### getopt_long()
Приведённый ниже пример программы иллюстрирует использование большинства возможностей getopt_long().

```
#include <stdio.h>     /* для printf */
#include <stdlib.h>    /* для exit */
#include <getopt.h>
int
main(int argc, char **argv)
{

    int c;

    int digit_optind = 0;

    while (1) {

        int this_option_optind = optind ? optind : 1;

        int option_index = 0;

        static struct option long_options[] = {

            {"add",     required_argument, 0,  0 },

            {"append",  no_argument,       0,  0 },

            {"delete",  required_argument, 0,  0 },

            {"verbose", no_argument,       0,  0 },

            {"create",  required_argument, 0, 'c'},

            {"file",    required_argument, 0,  0 },

            {0,         0,                 0,  0 }

        };

        c = getopt_long(argc, argv, "abc:d:012",

                 long_options, &option_index);

        if (c == -1)

            break;

        switch (c) {

        case 0:

            printf("параметр %s", long_options[option_index].name);

            if (optarg)

                printf(" со значением %s", optarg);

            printf("\n");

            break;

        case '0':

        case '1':

        case '2':

            if (digit_optind != 0 && digit_optind != this_option_optind)

              printf("Встречена цифра в двух различных элементах argv.\n");

            digit_optind = this_option_optind;

            printf("параметр %c\n", c);

            break;

        case 'a':

            printf("параметр a\n");

            break;

        case 'b':

            printf("параметр b\n");

            break;

        case 'c':

            printf("параметр c со значением «%s»\n", optarg);

            break;

        case 'd':

            printf("параметр d со значением «%s»\n", optarg);

            break;

        case '?':

            break;

        default:

            printf("?? getopt вернула код символа 0%o ??\n", c);

        }

    }

    if (optind < argc) {

        printf("элементы ARGV не параметры: ");

        while (optind < argc)

            printf("%s ", argv[optind++]);

        printf("\n");

    }

    exit(EXIT_SUCCESS);
}
```

## СМОТРИТЕ ТАКЖЕ
getopt(1), getsubopt(3)


getpass

title: getpass(3)

summary: запрашивает пароль

text:
# getpass(3)

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

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

char *getpass(const char *prompt);

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

getpass():

Начиная с glibc 2.2.2:

```
_XOPEN_SOURCE && ! (_POSIX_C_SOURCE >= 200112L)

    || /* начиная с glibc 2.19: */ _DEFAULT_SOURCE

    || /* в версии glibc <= 2.19: */ _BSD_SOURCE
```

До glibc 2.2.2:

ни одного

## ОПИСАНИЕ
Эта функция устарела. Не используйте её. Если вы хотите читать вводимые данные без вывода на терминал, смотрите описание флага ECHO в termios(3).

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

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

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

ENXIO

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

## ФАЙЛЫ
/dev/tty

## АТРИБУТЫ
Описание терминов данного раздела смотрите в attributes(7).

Интерфейс

Атрибут

Значение

getpass()

Безвредность в нитях

MT-Unsafe term

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

## ЗАМЕЧАНИЯ
В реализации библиотеки GNU C, если файл /dev/tty не может быть открыт, то строка приглашения выводится в поток ошибок stderr, а пароль читается из стандартного потока ввода stdin. Ограничения на длину пароля нет и строку можно редактировать.

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

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

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


getprotoent

title: getprotoent(3)

text:
# getprotoent(3)

## ИМЯ
getprotoent, getprotobyname, getprotobynumber, setprotoent, endprotoent - возвращают запись о протоколе

## ОБЗОР

```
#include <netdb.h>
```

```
struct protoent *getprotoent(void);
```

```
struct protoent *getprotobyname(const char *name);
```

```
struct protoent *getprotobynumber(int proto);
```

```
void setprotoent(int stayopen);
```

```
void endprotoent(void);
```

## ОПИСАНИЕ
Функция getprotoent() считывает следующую запись из файла, содержащего базу протоколов (смотрите protocols(5)), и возвращает структуру protoent, содержащую поля из этой записи. При необходимости будет открыто подключение к базе.

Функция getprotobyname() возвращает структуру protoent элемента из базы данных, который совпадает с именем протокола name. При необходимости будет открыто подключение к базе.

Функция getprotobynumber() возвращает структуру protoent элемента из базы данных, который совпадает с номером протокола number. При необходимости будет открыто подключение к базе.

Функция setprotoent() открывает соединение к базе и устанавливает следующую запись к первой записи. Если stayopen не равен нулю, то подключение к базе между вызовами нескольких функций getproto*() не будет закрыто.

Функция endprotoent() закрывает подключение к базе.

Структура protoent определена в <netdb.h> таким образом:

```
struct protoent {

    char  *p_name;       /* официальное имя протокола */

    char **p_aliases;    /* список псевдонимов */

    int    p_proto;      /* номер протокола */
}
```

Члены структуры protoent:

p_name

Официальное название протокола.

p_aliases

Список альтернативных имён протокола, завершающийся NULL.

p_proto

Номер протокола.

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Функции getprotoent(), getprotobyname() и getprotobynumber() возвращают указатель на статически выделенную структуру protoent или указатель null при ошибке или достижении конца файла.

## ФАЙЛЫ
/etc/protocols

файл, содержащий базу протоколов

## АТРИБУТЫ
Описание терминов данного раздела смотрите в attributes(7).

Интерфейс

Атрибут

Значение

getprotoent()

Безвредность в нитях

MT-Unsafe race:protoent race:protoentbuf locale

getprotobyname()

Безвредность в нитях

MT-Unsafe race:protobyname locale

getprotobynumber()

Безвредность в нитях

MT-Unsafe race:protobynumber locale

setprotoent(), endprotoent()

Безвредность в нитях

MT-Unsafe race:protoent locale

В приведённой выше таблице protoent в race:protoent означает, что если в нескольких нитях программы одновременно используются функции setprotoent(), getprotoent() или endprotoent(), то может возникнуть состязательность по данным.

## СООТВЕТСТВИЕ СТАНДАРТАМ
POSIX.1-2001, POSIX.1-2008, 4.3BSD.

## СМОТРИТЕ ТАКЖЕ
getnetent(3), getprotoent_r(3), getservent(3), protocols(5)


title: getprotoent_r(3)

summary: возвращают запись о

text:
# getprotoent_r(3)

## ИМЯ
getprotoent_r, getprotobyname_r, getprotobynumber_r - возвращают запись о протоколе (реентерабельные версии)

## ОБЗОР

```
#include <netdb.h>
```

```
int getprotoent_r(struct protoent *result_buf, char *buf,
                size_t buflen, struct protoent **result);
```

```
int getprotobyname_r(const char *name,
                struct protoent *result_buf, char *buf,
                size_t buflen, struct protoent **result);
```

```
int getprotobynumber_r(int proto,
                struct protoent *result_buf, char *buf,
                size_t buflen, struct protoent **result);
```

```

```

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

getprotoent_r(), getprotobyname_r(), getprotobynumber_r():

начиная с glibc 2.19:

_DEFAULT_SOURCE

в glibc 2.19 и старее:

_BSD_SOURCE || _SVID_SOURCE

## ОПИСАНИЕ
Функции getprotoent_r(), getprotobyname_r() и getprotobynumber_r() являются реентерабельными эквивалентами getprotoent(3), getprotobyname(3) и getprotobynumber(3), соответственно. Они отличаются способом возврата структуры protoent, списком параметров и типом возвращаемого значения. В этой справочной странице описаны только различия с нереентерабельными функциями.

Вместо возврата указателя на статически выделенную структуру protoent в качестве результата эти функции копируют структуру в расположение, указанное result_buf.

Массив buf используется для хранения строковых полей из возвращаемой структуры protoent (нереентерабельные функции выделяют эти строки из статического хранилища). Размер данного массива задаётся в buflen. Если buf слишком мал, то вызов завершается с ошибкой ERANGE, вызывающий должен его повторить с большим буфером (для большинства приложений должно быть достаточно буфера длиной 1024 байт).

Если вызов получил запись о протоколе, то *result указывает на result_buf; в противном случае *result устанавливается в NULL.

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При успешном выполнении эти функции возвращают 0. При ошибке возвращается одно из положительных значений, перечисленных В разделе ОШИБКИ.

При ошибке, отсутствии записи (getprotobyname_r(), getprotobynumber_r()) или конце данных (getprotoent_r()) значение result равно NULL.

## ОШИБКИ
ENOENT

(getprotoent_r()) Больше нет записей в базе данных.

ERANGE

Размер buf слишком мал. Попробуйте ещё раз с большим буфером (и увеличенным значением buflen).

## АТРИБУТЫ
Описание терминов данного раздела смотрите в attributes(7).

Интерфейс

Атрибут

Значение

getprotoent_r(), getprotobyname_r(), getprotobynumber_r()

Безвредность в нитях

MT-Safe locale

## СООТВЕТСТВИЕ СТАНДАРТАМ
Эти функции являются расширениями GNU. Функции с похожими именами есть и в других системах, хотя и с другим набором параметров.

## ПРИМЕР
Программа, представленная ниже, использует getprotobyname_r() для получения записи о протоколе с именем, указанным в командной строке. Если задан второй параметр (целое), то он используется как начальное значение buflen; если getprotobyname_r() завершается с ошибкой ERANGE, то программа повторяет попытки с большими значениями буфера. Пара примеров работы в сеансовой оболочке:

```
$ ./a.out tcp 1
ERANGE! Повтор с большим буфером
результат getprotobyname_r(): 0 (успешно)  (buflen=78)
p_name=tcp; p_proto=6; aliases=TCP
$ ./a.out xxx 1
ERANGE! Повтор с большим буфером
результат getprotobyname_r(): 0 (успешно)  (buflen=100)
Ошибка вызова/запись не найдена
```

### Исходный код программы

```
#define _GNU_SOURCE
#include <ctype.h>
#include <netdb.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#define MAX_BUF 10000
int
main(int argc, char *argv[])
{

    int buflen, erange_cnt, s;

    struct protoent result_buf;

    struct protoent *result;

    char buf[MAX_BUF];

    char **p;

    if (argc < 2) {

        printf("Использование: %s имя-протокола [длина-буф]\n", argv[0]);

        exit(EXIT_FAILURE);

    }

    buflen = 1024;

    if (argc > 2)

        buflen = atoi(argv[2]);

    if (buflen > MAX_BUF) {

        printf("Превышен размер буфера (%d)\n", MAX_BUF);

        exit(EXIT_FAILURE);

    }

    erange_cnt = 0;

    do {

        s = getprotobyname_r(argv[1], &result_buf,

                     buf, buflen, &result);

        if (s == ERANGE) {

            if (erange_cnt == 0)

                printf("ERANGE! Повтор с большим буфером\n");

            erange_cnt++;

            /* Увеличиваем по байту за раз для того, чтобы мы могли

               точно узнать какой размер буфера требуется */

            buflen++;

            if (buflen > MAX_BUF) {

                printf("Превышен размер буфера (%d)\n", MAX_BUF);

                exit(EXIT_FAILURE);

            }

        }

    } while (s == ERANGE);

    printf("результат getprotobyname_r(): %s  (buflen=%d)\n",

            (s == 0) ? "0 (успешно)" : (s == ENOENT) ? "ENOENT" :

            strerror(s), buflen);

    if (s != 0 || result == NULL) {

        printf("Ошибка вызова/запись не найдена\n");

        exit(EXIT_FAILURE);

    }

    printf("p_name=%s; p_proto=%d; aliases=",

                result_buf.p_name, result_buf.p_proto);

    for (p = result_buf.p_aliases; *p != NULL; p++)

        printf("%s ", *p);

    printf("\n");

    exit(EXIT_SUCCESS);
}
```

## СМОТРИТЕ ТАКЖЕ
getprotoent(3), protocols(5)


getpt

title: getpt(3)

summary: открывает основной псевдотерминал (PTM)

text:
# getpt(3)

## ИМЯ
getpt - открывает основной псевдотерминал (PTM)

## ОБЗОР

```
#define _GNU_SOURCE             /* смотрите feature_test_macros(7) */
#include <stdlib.h>
```

```
int getpt(void);
```

## ОПИСАНИЕ
Функция getpt() открывает основной псевдотерминал и возвращает его файловый дескриптор. Она эквивалентна

```
open("/dev/ptmx", O_RDWR | O_NOCTTY);
```

в системах Linux, хотя основной псевдотерминал в других системах, использующих библиотеку GNU Libc, может быть расположен в другом месте.

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При успешном выполнении функция getpt() возвращает открытый файловых дескриптор. В противном случае возвращается -1 и переменной errno присваивается код ошибки.

## ОШИБКИ
Функция getpt() может завершаться с ошибками, описанными в open(2).

## ВЕРСИИ
Функция getpt() появилась в glibc начиная с версии 2.1.

## АТРИБУТЫ
Описание терминов данного раздела смотрите в attributes(7).

Интерфейс

Атрибут

Значение

getpt()

Безвредность в нитях

MT-Safe

## СООТВЕТСТВИЕ СТАНДАРТАМ
Функция getpt() есть только в glibc; вместо неё используйте posix_openpt(3).

## СМОТРИТЕ ТАКЖЕ
grantpt(3), posix_openpt(3), ptsname(3), unlockpt(3), ptmx(4), pty(7)


getpw

title: getpw(3)

summary: восстанавливает строку пароля

text:
# getpw(3)

## ИМЯ
getpw - восстанавливает строку пароля

## ОБЗОР

```
#define _GNU_SOURCE             /* смотрите feature_test_macros(7) */
#include <sys/types.h>
#include <pwd.h>
```

```
int getpw(uid_t uid, char *buf);
```

## ОПИСАНИЕ
Функция getpw() заново создаёт в буфере строку пароля для пользователя с ID uid в буфере buf. Возвращаемый буфер содержит строку в формате

```
name:passwd:uid:gid:gecos:dir:shell
```

Структура 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).

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При успешном выполнении getpw() возвращается 0; при ошибке возвращается -1, а в errno содержится код ошибки.

Если uid не найден в базе данных паролей, то getpw() возвращает -1, присваивает errno значение 0 и buf не изменяется.

## ОШИБКИ
0 или ENOENT

Отсутствует пользователь с соответствующим uid.

EINVAL

Значение buf равно NULL.

ENOMEM

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

## ФАЙЛЫ
/etc/passwd

файл, содержащий базу паролей

## АТРИБУТЫ
Описание терминов данного раздела смотрите в attributes(7).

Интерфейс

Атрибут

Значение

getpw()

Безвредность в нитях

MT-Safe locale

## СООТВЕТСТВИЕ СТАНДАРТАМ
SVr2.

## ДЕФЕКТЫ
Функция getpw() является в каком-то смысле опасной, так как может переполнить предоставляемый ей буфер buf. Она заменена на getpwuid(3).

## СМОТРИТЕ ТАКЖЕ
endpwent(3), fgetpwent(3), getpwent(3), getpwnam(3), getpwuid(3), putpwent(3), setpwent(3), passwd(5)


getpwent

title: getpwent(3)

summary: получает запись из файла паролей

text:
# getpwent(3)

## ИМЯ
getpwent, setpwent, endpwent - получает запись из файла паролей

## ОБЗОР

```
#include <sys/types.h>
#include <pwd.h>
```

```
struct passwd *getpwent(void);
```

```
void setpwent(void);
```

```
void endpwent(void);
```

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

getpwent(), setpwent(), endpwent():

_XOPEN_SOURCE >= 500

|| /* начиная с glibc 2.19: */ _DEFAULT_SOURCE

|| /* версии gibc <= 2.19: */ _BSD_SOURCE || _SVID_SOURCE

## ОПИСАНИЕ
Функция getpwent() возвращает указатель на структуру, содержащую разделённую на поля запись базы данных паролей (например, локального файла паролей /etc/passwd, NIS и LDAP). При первом вызове getpwent() возвращает первую запись; при следующих последовательно возвращаются остальные записи.

Функция setpwent() возвращается к началу базы данных паролей.

Функция endpwent() используется для закрытия базы данных паролей при завершении процесса обработки.

Структура 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).

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Функция getpwent() возвращает указатель на структуру passwd или NULL, если подходящих записей не найдено или возникла ошибка. При ошибке errno устанавливается в соответствующее значение. Если нужно проверять переменную errno после вызова, то перед этим нужно присвоить ей нулевое значение.

Возвращаемое значение может указывать на статическую область и может быть перезаписано при последующих вызовах getpwent(), getpwnam(3) или getpwuid(3) (не передавайте полученный указатель free(3)).

## ОШИБКИ
EINTR

Поступил сигнал; смотрите signal(7).

EIO

Ошибка ввода-вывода.

EMFILE

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

ENFILE

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

ENOMEM

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

ERANGE

Недостаточно места в буфере.

## ФАЙЛЫ
/etc/passwd

файл, содержащий локальную базу паролей

## АТРИБУТЫ
Описание терминов данного раздела смотрите в attributes(7).

Интерфейс

Атрибут

Значение

getpwent()

Безвредность в нитях

MT-Unsafe race:pwent race:pwentbuf locale

setpwent(), endpwent()

Безвредность в нитях

MT-Unsafe race:pwent locale

В приведённой выше таблице pwent в race:pwgent означает, что если в нескольких нитях программы одновременно используются функции setpwent(), getpwent() или endpwent(), то может возникнуть состязательность по данным.

## СООТВЕТСТВИЕ СТАНДАРТАМ
POSIX.1-2001, POSIX.1-2008, SVr4, 4.3BSD. Поле pw_gecos не определено в стандарте POSIX, но присутствует в большинстве реализаций.

## СМОТРИТЕ ТАКЖЕ
fgetpwent(3), getpw(3), getpwent_r(3), getpwnam(3), getpwuid(3), putpwent(3), passwd(5)


title: getpwent_r(3)

text:
# getpwent_r(3)

## ИМЯ
getpwent_r, fgetpwent_r - получает запись из файла паролей (реентерабельные версии)

## ОБЗОР

```
#include <pwd.h>
```

```
int getpwent_r(struct passwd *pwbuf, char *buf,
               size_t buflen, struct passwd **pwbufp);
```

```
int fgetpwent_r(FILE *stream, struct passwd *pwbuf, char *buf,
                size_t buflen, struct passwd **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 <stdio.h>
#define BUFLEN 4096
int
main(void)
{

    struct passwd pw, *pwp;

    char buf[BUFLEN];

    int i;

    setpwent();

    while (1) {

        i = getpwent_r(&pw, buf, BUFLEN, &pwp);

        if (i)

            break;

        printf("%s (%d)\tHOME %s\tSHELL %s\n", pwp->pw_name,

               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)


getpwnam

title: getpwnam(3)

summary: получает записи из файла

text:
# getpwnam(3)

## ИМЯ
getpwnam, getpwnam_r, getpwuid, getpwuid_r - получает записи из файла паролей

## ОБЗОР

```
#include <sys/types.h>
#include <pwd.h>
```

```
struct passwd *getpwnam(const char *name);
```

```
struct passwd *getpwuid(uid_t uid);
```

```
int getpwnam_r(const char *name, struct passwd *pwd,
               char *buf, size_t buflen, struct passwd **result);
```

```
int getpwuid_r(uid_t uid, struct passwd *pwd,
               char *buf, size_t buflen, struct passwd **result);
```

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

getpwnam_r(), getpwuid_r():

_POSIX_C_SOURCE

|| /* версии glibc <= 2.19: */ _BSD_SOURCE || _SVID_SOURCE

## ОПИСАНИЕ
Функция getpwnam() возвращает указатель на структуру, содержащую разделённую на поля запись из базы данных паролей (например, из локального файла паролей /etc/passwd, NIS и LDAP), которая соответствует имени пользователя name.

Функция getpwuid() возвращает указатель на структуру, содержащую разделённую на поля запись из базы данных паролей, которая соответствует идентификатору пользователя uid.

Структура 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).

Функции getpwnam_r() и getpwuid_r() принимают ту же информацию что и getpwnam() и getpwuid(), но сохраняют полученную структуру passwd в пространство, указанное pwd. Строковые поля членов структуры passwd сохраняются в буфере buf размера buflen. Указатель на результат (при успешном выполнении) или NULL (если записи отсутствуют или произошла ошибка) сохраняется в *result.

Вызов

sysconf(_SC_GETPW_R_SIZE_MAX)

возвращает или -1 без изменения errno или начальный предполагаемый размер buf (если этот размер мал, то вызов завершается ERANGE; в этом случае вызывающий может повторить вызов с большим буфером).

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Функции getpwnam() и getpwuid() возвращают указатель на структуру passwd или NULL, если подходящих записей не найдено или возникла ошибка. При ошибке errno устанавливается в соответствующее значение. Если нужно проверять переменную errno после вызова, то перед этим нужно присвоить ей нулевое значение.

Возвращаемое значение может указывать на статическую область и может быть перезаписано при последующих вызовах getpwent(3), getpwnam() или getpwuid() (не передавайте полученный указатель free(3)).

При успешном выполнении getpwnam_r() и getpwuid_r() возвращают ноль, и устанавливают *result в pwd. Если совпадений не найдено, то эти функции возвращают 0 и сохраняют NULL в *result. При ошибке возвращается её номер и в *result сохраняется NULL.

## ОШИБКИ
0 или ENOENT или ESRCH или EBADF или EPERM или …

Указанное значение name или uid не найдено.

EINTR

Поступил сигнал; смотрите signal(7).

EIO

Ошибка ввода-вывода.

EMFILE

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

ENFILE

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

ENOMEM

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

ERANGE

Недостаточно места в буфере.

## ФАЙЛЫ
/etc/passwd

файл, содержащий локальную базу паролей

## АТРИБУТЫ
Описание терминов данного раздела смотрите в attributes(7).

Интерфейс

Атрибут

Значение

getpwnam()

Безвредность в нитях

MT-Unsafe race:pwnam locale

getpwuid()

Безвредность в нитях

MT-Unsafe race:pwuid locale

getpwnam_r(), getpwuid_r()

Безвредность в нитях

MT-Safe locale

## СООТВЕТСТВИЕ СТАНДАРТАМ
POSIX.1-2001, POSIX.1-2008, SVr4, 4.3BSD. Поле pw_gecos не определено в стандарте POSIX, но присутствует в большинстве реализаций.

## ЗАМЕЧАНИЯ
Описание «ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ», приведённого выше, взято из POSIX.1-2001. В нём «не найдено» не считается ошибкой и поэтому не указано, каким может быть значение errno в этом случае. Но это делает невозможным определить тип ошибки. Из описание POSIX можно посчитать, что errno не должно измениться, если запись не найдена. Эксперименты в различных UNIX-подобных системах показывают, что в этой ситуации возвращается много разных значений: 0, ENOENT, EBADF, ESRCH, EWOULDBLOCK, EPERM и, возможно, другие.

В поле pw_dir содержится имя первого рабочего каталога пользователя. Программы входа используют это значение для инициализации переменной окружения HOME для регистрационной оболочки. Приложение, которое хочет определить имя домашнего каталога пользователя должно проверять значение HOME (а не значение getpwuid(getuid())->pw_dir), так как это позволяет пользователю изменять их понятие о «домашнем каталоге» в течении сеанса. Для определения (начального) домашнего каталога другого пользователя необходимо использовать getpwnam("имя пользователя")->pw_dir или похожий вызов.

## ПРИМЕР
Представленная ниже программа использует getpwnam_r() при поиске полного имени пользователя и его ID согласно указанному имени в аргументе командной строки.

```
#include <pwd.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
int
main(int argc, char *argv[])
{

    struct passwd pwd;

    struct passwd *result;

    char *buf;

    size_t bufsize;

    int s;

    if (argc != 2) {

        fprintf(stderr, "Использование: %s имя\n", argv[0]);

        exit(EXIT_FAILURE);

    }

    bufsize = sysconf(_SC_GETPW_R_SIZE_MAX);

    if (bufsize == -1)          /* значение не указано */

        bufsize = 16384;        /* должно быть достаточно */

    buf = malloc(bufsize);

    if (buf == NULL) {

        perror("malloc");

        exit(EXIT_FAILURE);

    }

    s = getpwnam_r(argv[1], &pwd, buf, bufsize, &result);

    if (result == NULL) {

        if (s == 0)

            printf("Не найдено\n");

        else {

            errno = s;

            perror("getpwnam_r");

        }

        exit(EXIT_FAILURE);

    }

    printf("Имя: %s; UID: %ld\n", pwd.pw_gecos, (long) pwd.pw_uid);

    exit(EXIT_SUCCESS);
}
```

## СМОТРИТЕ ТАКЖЕ
endpwent(3), fgetpwent(3), getgrnam(3), getpw(3), getpwent(3), getspnam(3), putpwent(3), setpwent(3), passwd(5)


getrpcent

title: getrpcent(3)

summary: возвращают

text:
# getrpcent(3)

## ИМЯ
getrpcent, getrpcbyname, getrpcbynumber, setrpcent, endrpcent - возвращают запись RPC

## ОБЗОР

```
#include <netdb.h>
```

```
struct rpcent *getrpcent(void);
```

```
struct rpcent *getrpcbyname(const char *name);
```

```
struct rpcent *getrpcbynumber(int number);
```

```
void setrpcent(int stayopen);
```

```
void endrpcent(void);
```

## ОПИСАНИЕ
Функции getrpcent(), getrpcbyname() и getrpcbynumber() возвращают указатель на объект с описанной ниже структурой, содержащую разделённую на поля запись из базы данных номеров программы RPC.

```
struct rpcent {

    char  *r_name;     /* имя сервера для этой программы RPC */

    char **r_aliases;  /* список псевдонимов */

    long   r_number;   /* номер программы RPC */
};
```

Члены структуры:

r_name

Имя сервера для этой программы RPC.

r_aliases

Список альтернативных имён программы RPC, завершающийся NULL.

r_number

Номер программы RPC для этой службы.

Функция getrpcent() считывает следующую запись из базы данных. При необходимости будет открыто подключение к базе.

Функция setrpcent() открывает соединение к базе и устанавливает следующую запись к первой записи. Если stayopen не равен нулю, то подключение к базе между вызовами нескольких функций getrpc*() не будет закрыто.

Функция endrpcent() закрывает подключение к базе.

Функции getrpcbyname() и getrpcbynumber() выполняют последовательный поиск от начала файла до нахождения имени программы RPC, её номера или конца файла.

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При успешном выполнении getrpcent(), getrpcbyname() и getrpcbynumber() возвращают указатель на статически выделенную структуру rpcent. При ошибке или EOF возвращается NULL.

## ФАЙЛЫ
/etc/rpc

база данных программных номеров RPC

## АТРИБУТЫ
Описание терминов данного раздела смотрите в attributes(7).

Интерфейс

Атрибут

Значение

getrpcent(), getrpcbyname(), getrpcbynumber()

Безвредность в нитях

MT-Unsafe

setrpcent(), endrpcent()

Безвредность в нитях

MT-Safe locale

## СООТВЕТСТВИЕ СТАНДАРТАМ
Нет в POSIX.1. Присутствует в BSD, Solaris и многих других системах.

## ДЕФЕКТЫ
Вся информация располагается в статической области, поэтому для сохранения должна быть скопирована.

## СМОТРИТЕ ТАКЖЕ
getrpcent_r(3), rpc(5), rpcinfo(8), ypserv(8)


title: getrpcent_r(3)

summary: возвращают запись RPC

text:
# getrpcent_r(3)

## ИМЯ
getrpcent_r, getrpcbyname_r, getrpcbynumber_r - возвращают запись RPC (реентерабельные версии)

## ОБЗОР

```
#include <netdb.h>
```

```
int getrpcent_r(struct rpcent *result_buf, char *buf,
                size_t buflen, struct rpcent **result);
```

```
int getrpcbyname_r(const char *name,
                struct rpcent *result_buf, char *buf,
                size_t buflen, struct rpcent **result);
```

```
int getrpcbynumber_r(int number,
                struct rpcent *result_buf, char *buf,
                size_t buflen, struct rpcent **result);
```

```

```

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

getrpcent_r(), getrpcbyname_r(), getrpcbynumber_r():

начиная с glibc 2.19:

_DEFAULT_SOURCE

в glibc 2.19 и старее:

_BSD_SOURCE || _SVID_SOURCE

## ОПИСАНИЕ
Функции getrpcent_r(), getrpcbyname_r() и getrpcbynumber_r() являются реентерабельными эквивалентами getrpcent(3), getrpcbyname(3) и getrpcbynumber(3), соответственно. Они отличаются способом возврата структуры rpcent, списком параметров и типом возвращаемого значения. В этой справочной странице описаны только различия с нереентерабельными функциями.

Вместо возврата указателя на статически выделенную структуру rpcent в качестве результата эти функции копируют структуру в расположение, указанное result_buf.

Массив buf используется для хранения строковых полей из возвращаемой структуры rpcent (нереентерабельные функции выделяют эти строки из статического хранилища). Размер данного массива задаётся в buflen. Если buf слишком мал, то вызов завершается с ошибкой ERANGE, вызывающий должен его повторить с большим буфером (для большинства приложений должно быть достаточно буфера длиной 1024 байт).

Если вызов получил запись RPC, то *result указывает на result_buf; в противном случае *result устанавливается в NULL.

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При успешном выполнении эти функции возвращают 0. При ошибке возвращается одно из положительных значений, перечисленных В разделе ОШИБКИ.

При ошибке, отсутствии записи (getrpcbyname_r(), getrpcbynumber_r()) или конце данных (getrpcent_r()) значение result равно NULL.

## ОШИБКИ
ENOENT

(getrpcent_r()) Больше нет записей в базе данных.

ERANGE

Размер buf слишком мал. Попробуйте ещё раз с большим буфером (и увеличенным значением buflen).

## АТРИБУТЫ
Описание терминов данного раздела смотрите в attributes(7).

Интерфейс

Атрибут

Значение

getrpcent_r(), getrpcbyname_r(), getrpcbynumber_r()

Безвредность в нитях

MT-Safe locale

## СООТВЕТСТВИЕ СТАНДАРТАМ
Эти функции являются расширениями GNU. Функции с похожими именами есть и в других системах, хотя и с другим набором параметров.

## СМОТРИТЕ ТАКЖЕ
getrpcent(3), rpc(5)


getrpcport

title: getrpcport(3)

summary: получение номера порта RPC

text:
# getrpcport(3)

## ИМЯ
getrpcport - получение номера порта RPC

## ОБЗОР

```
#include <rpc/rpc.h>
```

```
int getrpcport(const char *host, unsigned long prognum,
               unsigned long versnum, unsigned proto);
```

## ОПИСАНИЕ
Функция getrpcport() возвращает номер порта для версии versnum RPC-программы prognum, работающей на host и использующей протокол proto. Она возвращает 0, если не может связаться с portmapper или если prognum не зарегистрирована. Если же prognum зарегистрирована, но не с версией versnum, она все равно будет возвращать номер порта (с версией программы), указывая на то, что программа действительно зарегистрирована. Несоответствие версий будет зарегистрировано при первой попытке вызвать службу.

## АТРИБУТЫ
Описание терминов данного раздела смотрите в attributes(7).

Интерфейс

Атрибут

Значение

getrpcport()

Безвредность в нитях

MT-Safe env locale

## СООТВЕТСТВИЕ СТАНДАРТАМ
Нет в POSIX.1. Присутствует в BSD, Solaris и многих других системах.


gets

title: gets(3)

text:
# gets(3)

## ИМЯ
gets - получает строку из стандартного потока ввода (УСТАРЕЛА)

## ОБЗОР

```
#include <stdio.h>
```

```
char *gets(char *s);
```

## ОПИСАНИЕ
Никогда не используйте эту функцию.

Функция gets() считывает строку из stdin и записывает её в буфер, на который указывает s, пока не встретится символ новой строки или EOF, которые заменяются байтом null ('\0'). Проверка на переполнение буфера не производится (смотрите ДЕФЕКТЫ далее).

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При успешном выполнении функция gets() возвращает s и NULL при ошибке или если достигнут конец файла, а символы остались несчитанными. Тем не менее, из-за невозможности проверить переполнение буфера, нет гарантии, что функция вообще что-нибудь сможет вернуть.

## АТРИБУТЫ
Описание терминов данного раздела смотрите в attributes(7).

Интерфейс

Атрибут

Значение

gets()

Безвредность в нитях

MT-Safe

## СООТВЕТСТВИЕ СТАНДАРТАМ
C89, C99, POSIX.1-2001.

В LSB функция gets() указана как устаревшая. В POSIX.1-2008 функция gets() как вышедшая из употребления. В ISO C11 описание gets() удалено из языка Си, и начиная с версии 2.16, заголовочные файлы glibc не объявляют эту функцию, если не определён макрос тестирования свойств _ISOC11_SOURCE.

## ДЕФЕКТЫ
Никогда не используйте gets(), потому что без предварительного знакомства с данными невозможно узнать, какое количество символов считает gets(), а также потому, что gets() будет продолжать заносить символы в буфер даже по достижении его конца, что представляет собой большую опасность. Эта функция использовалась для взлома систем безопасности компьютера. Вместо этой функции используйте fgets().

Подробное описание смотрите в CWE-242 (или «Use of Inherently Dangerous Function») на http://cwe.mitre.org/data/definitions/242.html

## СМОТРИТЕ ТАКЖЕ
read(2), write(2), ferror(3), fgetc(3), fgets(3), fgetwc(3), fgetws(3), fopen(3), fread(3), fseek(3), getline(3), getwchar(3), puts(3), scanf(3), ungetwc(3), unlocked_stdio(3), feature_test_macros(7)


getservent

title: getservent(3)

text:
# getservent(3)

## ИМЯ
getservent, getservbyname, getservbyport, setservent, endservent - возвращают запись о службе

## ОБЗОР

```
#include <netdb.h>
```

```
struct servent *getservent(void);
```

```
struct servent *getservbyname(const char *name, const char *proto);
```

```
struct servent *getservbyport(int port, const char *proto);
```

```
void setservent(int stayopen);
```

```
void endservent(void);
```

## ОПИСАНИЕ
Функция getservent() считывает следующую запись из файла, содержащего базу служб (смотрите services(5)), и возвращает структуру servent, содержащую поля из этой записи. При необходимости будет открыто подключение к базе.

Функция getservbyname() возвращает структуру servent элемента из базы данных, который совпадает со службой name и использующей протокол proto. Если значение proto равно NULL, то подойдёт любой протокол. При необходимости будет открыто подключение к базе.

Функция getservbyport() возвращает структуру servent элемента из базы данных, который совпадает с портом port (значение имеет сетевой порядок байт) и использующей протокол proto. Если значение proto равно NULL, то подойдёт любой протокол. При необходимости будет открыто подключение к базе.

Функция setservent() открывает соединение к базе и устанавливает следующую запись к первой записи. Если stayopen не равен нулю, то подключение к базе между вызовами нескольких функций getserv*() не будет закрыто.

Функция endservent() закрывает подключение к базе.

Структура servent определена в <netdb.h> таким образом:

```
struct servent {

    char  *s_name;       /* официальное имя службы */

    char **s_aliases;    /* список псевдонимов */

    int    s_port;       /* номер порта */

    char  *s_proto;      /* используемый протокол */
}
```

Члены структуры servent:

s_name

Официальное название службы.

s_aliases

Список альтернативных имён службы, завершающийся NULL.

s_port

Номер порта службы, задаваемый в сетевом порядке байт.

s_proto

Имя протокола, используемого с данной службой.

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Функции getservent(), getservbyname() и getservbyport() возвращают указатель на статически выделенную структуру servent или NULL при ошибке или достижении конца файла.

## ФАЙЛЫ
/etc/services

файл базы данных служб

## АТРИБУТЫ
Описание терминов данного раздела смотрите в attributes(7).

Интерфейс

Атрибут

Значение

getservent()

Безвредность в нитях

MT-Unsafe race:servent race:serventbuf locale

getservbyname()

Безвредность в нитях

MT-Unsafe race:servbyname locale

getservbyport()

Безвредность в нитях

MT-Unsafe race:servbyport locale

setservent(), endservent()

Безвредность в нитях

MT-Unsafe race:servent locale

В приведённой выше таблице servent в race:servent означает, что если в нескольких нитях программы одновременно используются функции setservent(), getservent() или endservent(), то может возникнуть состязательность по данным.

## СООТВЕТСТВИЕ СТАНДАРТАМ
POSIX.1-2001, POSIX.1-2008, 4.3BSD.

## СМОТРИТЕ ТАКЖЕ
getnetent(3), getprotoent(3), getservent_r(3), services(5)


title: getservent_r(3)

summary: возвращает запись о службе

text:
# getservent_r(3)

## ИМЯ
getservent_r, getservbyname_r, getservbyport_r - возвращает запись о службе (реентерабельные версии)

## ОБЗОР

```
#include <netdb.h>
```

```
int getservent_r(struct servent *result_buf, char *buf,
                size_t buflen, struct servent **result);
```

```
int getservbyname_r(const char *name, const char *proto,
                struct servent *result_buf, char *buf,
                size_t buflen, struct servent **result);
```

```
int getservbyport_r(int port, const char *proto,
                struct servent *result_buf, char *buf,
                size_t buflen, struct servent **result);
```

```

```

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

getservent_r(), getservbyname_r(), getservbyport_r():

начиная с glibc 2.19:

_DEFAULT_SOURCE

в glibc 2.19 и старее:

_BSD_SOURCE || _SVID_SOURCE

## ОПИСАНИЕ
Функции getservent_r(), getservbyname_r() и getservbyport_r() являются реентерабельными эквивалентами getservent(3), getservbyname(3) и getservbyport(3), соответственно. Они отличаются способом возврата структуры servent и списком параметров и типом возвращаемого значения. В этой справочной странице описаны только различия с нереентерабельными функциями.

Вместо возврата указателя на статически выделенную структуру servent в качестве результата эти функции копируют структуру в расположение, указанное result_buf.

Массив buf используется для хранения строковых полей из возвращаемой структуры servent (нереентерабельные функции выделяют эти строки из статического хранилища). Размер данного массива задаётся в buflen. Если buf слишком мал, то вызов завершается с ошибкой ERANGE, вызывающий должен его повторить с большим буфером (для большинства приложений должно быть достаточно буфера длиной 1024 байт).

Если вызов получил запись о службе, то *result указывает на result_buf; в противном случае *result устанавливается в NULL.

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При успешном выполнении эти функции возвращают 0. При ошибке возвращается одно из положительных значений ошибок.

При ошибке, отсутствии записи (getservbyname_r(), getservbyport_r()) или конце данных (getservent_r()) значение result равно NULL.

## ОШИБКИ
ENOENT

(getservent_r()) Больше нет записей в базе данных.

ERANGE

Размер buf слишком мал. Попробуйте ещё раз с большим буфером (и увеличенным значением buflen).

## АТРИБУТЫ
Описание терминов данного раздела смотрите в attributes(7).

Интерфейс

Атрибут

Значение

getservent_r(), getservbyname_r(), getservbyport_r()

Безвредность в нитях

MT-Safe locale

## СООТВЕТСТВИЕ СТАНДАРТАМ
Эти функции являются расширениями GNU. Функции с похожими именами есть и в других системах, хотя и с другим набором параметров.

## ПРИМЕР
Программа, представленная ниже, использует getservbyport_r() для получения записи о службе для заданного порта и протокола, указанных в командной строке. Если задан и третий параметр (целое), то он используется как начальное значение buflen; если getservbyport_r() завершается с ошибкой ERANGE, то программа повторяет попытки с большими значениями буфера. Пара примеров работы в сеансовой оболочке:

```
$ ./a.out 7 tcp 1
ERANGE! Повтор с большим буфером
getservbyport_r() returned: 0 (success)  (buflen=87)
s_name=echo; s_proto=tcp; s_port=7; aliases=
$ ./a.out 77777 tcp
getservbyport_r() returned: 0 (success)  (buflen=1024)
Ошибка вызова/запись не найдена
```

### Исходный код программы

```
#define _GNU_SOURCE
#include <ctype.h>
#include <netdb.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#define MAX_BUF 10000
int
main(int argc, char *argv[])
{

    int buflen, erange_cnt, port, s;

    struct servent result_buf;

    struct servent *result;

    char buf[MAX_BUF];

    char *protop;

    char **p;

    if (argc < 3) {

        printf("Использование: %s ном-порта имя-прото [длина-буф]\n", argv[0]);

        exit(EXIT_FAILURE);

    }

    port = htons(atoi(argv[1]));

    protop = (strcmp(argv[2], "null") == 0 ||

              strcmp(argv[2], "NULL") == 0) ?  NULL : argv[2];

    buflen = 1024;

    if (argc > 3)

        buflen = atoi(argv[3]);

    if (buflen > MAX_BUF) {

        printf("Превышен размер буфера (%d)\n", MAX_BUF);

        exit(EXIT_FAILURE);

    }

    erange_cnt = 0;

    do {

        s = getservbyport_r(port, protop, &result_buf,

                     buf, buflen, &result);

        if (s == ERANGE) {

            if (erange_cnt == 0)

                printf("ERANGE! Повтор с большим буфером\n");

            erange_cnt++;

            /* Увеличиваем по байту за раз для того, чтобы мы могли

               точно узнать какой размер буфера требуется */

            buflen++;

            if (buflen > MAX_BUF) {

                printf("Превышен размер буфера (%d)\n", MAX_BUF);

                exit(EXIT_FAILURE);

            }

        }

    } while (s == ERANGE);

    printf("getservbyport_r() returned: %s  (buflen=%d)\n",

            (s == 0) ? "0 (success)" : (s == ENOENT) ? "ENOENT" :

            strerror(s), buflen);

    if (s != 0 || result == NULL) {

        printf("Ошибка вызова/запись не найдена\n");

        exit(EXIT_FAILURE);

    }

    printf("s_name=%s; s_proto=%s; s_port=%d; aliases=",

                result_buf.s_name, result_buf.s_proto,

                ntohs(result_buf.s_port));

    for (p = result_buf.s_aliases; *p != NULL; p++)

        printf("%s ", *p);

    printf("\n");

    exit(EXIT_SUCCESS);
}
```

## СМОТРИТЕ ТАКЖЕ
getservent(3), services(5)


getspnam

title: getspnam(3)

summary: получение

text:
# getspnam(3)

## ИМЯ
getspnam, getspnam_r, getspent, getspent_r, setspent, endspent, fgetspent, fgetspent_r, sgetspent, sgetspent_r, putspent, lckpwdf, ulckpwdf - получение записи из теневого файла паролей

## ОБЗОР

```
/* Основной API теневого файла паролей */
#include <shadow.h>
```

```
struct spwd *getspnam(const char *name);
```

```
struct spwd *getspent(void);
```

```
void setspent(void);
```

```
void endspent(void);
```

```
struct spwd *fgetspent(FILE *stream);
```

```
struct spwd *sgetspent(const char *s);
```

```
int putspent(const struct spwd *p, FILE *stream);
```

```
int lckpwdf(void);
```

```
int ulckpwdf(void);
/* Расширение GNU */
#include <shadow.h>
```

```
int getspent_r(struct spwd *spbuf,
        char *buf, size_t buflen, struct spwd **spbufp);
```

```
int getspnam_r(const char *name, struct spwd *spbuf,
        char *buf, size_t buflen, struct spwd **spbufp);
```

```
int fgetspent_r(FILE *stream, struct spwd *spbuf,
        char *buf, size_t buflen, struct spwd **spbufp);
```

```
int sgetspent_r(const char *s, struct spwd *spbuf,
        char *buf, size_t buflen, struct spwd **spbufp);
```

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

getspent_r(), getspnam_r(), fgetspent_r(), sgetspent_r():

начиная с glibc 2.19:

_DEFAULT_SOURCE

в glibc 2.19 и старее:

_BSD_SOURCE || _SVID_SOURCE

## ОПИСАНИЕ
В давние времена считалось, что хранить зашифрованные пароли в открытом доступе достаточно безопасно. Со временем компьютеры стали быстрее, а люди - более обеспокоенными проблемами безопасности, и данный подход стал неприемлемым. Джулиан Франс Хог (Julianne Frances Haugh) реализовал набор программ для теневых паролей, который хранит зашифрованные пароли в базе данных теневых паролей (например в локальном файле теневых паролей /etc/shadow, NIS или LDAP), доступной для чтения только root.

Описанные ниже функции соответствуют аналогами для традиционной базы паролей (см. getpwnam(3) and getpwent(3)).

Функция getspnam() возвращает указатель на структуру, содержащую разделённую на поля запись из базы данных теневых паролей, которая соответствует имени пользователя name.

Функция getspent() возвращает указатель на следующую запись в базе данных теневых паролей. Положение во входном потоке инициализируется с помощью setspent(). После выполнения чтения программа может вызвать endspent() для освобождения ресурсов.

Функция fgetspent() подобна getspent() но использует заданный поток вместо неявного открытия с помощью setspent().

Функция sgetspent() разбирает передаваемую строку s в структуру spwd.

Функция putspent() записывает в stream содержимое передаваемой структуры spwd *p в виде текстовой строки в формате файла теневых паролей. Строковые записи со значением NULL и числовые записи со значением -1 записываются как пустые строки.

Функция lckpwdf() предназначена для защиты базы данных теневых паролей при одновременном многочисленном доступе. Она пытается захватить блокировку и возвращает 0 при успешном выполнении и -1 при ошибке (блокировка не получена в течении 15 секунд). Функция ulckpwdf() освобождает блокировку. Заметим, что это не защищает при прямом доступе к файлу теневых паролей. О блокировке будут уведомлены только программы, использующие lckpwdf().

Эти функции возникли в исходном программном интерфейсе. Они широко используются.

### Реентерабельные версии
По аналогии с реентерабельными функциями для базы данных паролей, в glibc также есть реентерабельные функции для базы данных теневых паролей. Функция getspnam_r() подобна getspnam(), но хранит выбранную структуру теневого пароля в пространстве, на которое указывает spbuf. Данная структура теневого пароля содержит указатели на строки и эти строки хранятся в буфере buf размером buflen. Указатель на результат (при успешном выполнении) или NULL (в случае отсутствия записи или ошибки) сохраняется в *spbufp.

Функции getspent_r(), fgetspent_r() и sgetspent_r() подобны их нереентерабельным аналогам.

Некоторые не-glibc системы также содержат функции с такими именами, но, чаще всего, с другими прототипами.

### Структура
Структура теневого пароля определена в <shadow.h>:

```
struct spwd {

    char *sp_namp;     /* имя пользователя */

    char *sp_pwdp;     /* зашифрованный пароль */

    long  sp_lstchg;   /* дата последнего изменения

                      в днях начиная с 1970-01-01 00:00:00 +0000 (UTC)) */

    long  sp_min;      /* мин. кол-во дней между сменой */

    long  sp_max;      /* макс. кол-во дней между сменой */

    long  sp_warn;     /* кол-во дней до истечения срока действия пароля

                          для предупреждения пользователя */

    long  sp_inact;    /* кол-во дней до истечения срока действия пароля,

                          после запись блокируется */

    long  sp_expire;   /* дата устаревания учётной записи

                      в днях начиная с 1970-01-01 00:00:00 +0000 (UTC)) */

    unsigned long sp_flag;  /* зарезервировано */
};
```

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Функции, которые возвращают указатель, возвращают NULL, если элементы закончились или произошла ошибка во время обработки. Функции, которые возвращают значение с типом int, возвращают 0 при успешном выполнении и -1 при ошибке, записывая в errno причину ошибки.

У нереентерабельных функций возвращаемое значение может указывать на статическую область и может быть перезаписано последующими вызовами этих функций.

При успешном выполнении реентерабельные функции возвращают 0. В случае ошибки возвращается номер ошибки.

## ОШИБКИ
EACCES

Вызывающий не имеет прав доступа к файлу теневых паролей.

ERANGE

Указанный буфер слишком мал.

## ФАЙЛЫ
/etc/shadow

файл, содержащий базу локальных теневых паролей

/etc/.pwd.lock

файл блокировки

При включении файла <paths.h> определяется константа _PATH_SHADOW, в которой хранится путь к файлу теневых паролей.

## АТРИБУТЫ
Описание терминов данного раздела смотрите в attributes(7).

Интерфейс

Атрибут

Значение

getspnam()

Безвредность в нитях

MT-Unsafe race:getspnam locale

getspent()

Безвредность в нитях

MT-Unsafe race:getspent race:spentbuf locale

setspent(), endspent(), getspent_r()

Безвредность в нитях

MT-Unsafe race:getspent locale

fgetspent()

Безвредность в нитях

MT-Unsafe race:fgetspent

sgetspent()

Безвредность в нитях

MT-Unsafe race:sgetspent

putspent(), getspnam_r(), sgetspent_r()

Безвредность в нитях

MT-Safe locale

lckpwdf(), ulckpwdf(), fgetspent_r()

Безвредность в нитях

MT-Safe

В приведённой выше таблице getspent в race:getspent означает, что если в нескольких нитях программы одновременно используются функции setspent(), getspent(), getspent_r() или endspent(), то может возникнуть состязательность по данным.

## СООТВЕТСТВИЕ СТАНДАРТАМ
База данных теневых паролей и её программный интерфейс не описаны в POSIX.1. Однако, во многих системах есть похожий программный интерфейс.

## СМОТРИТЕ ТАКЖЕ
getgrnam(3), getpwnam(3), getpwnam_r(3), shadow(5)