table of contents
GETHOSTNAME(2) | Руководство программиста Linux | GETHOSTNAME(2) |
ИМЯ¶
gethostname, sethostname - получить/установить имя узла
ОБЗОР¶
#include <unistd.h>
int gethostname(char *name, size_t
len);
int sethostname(const char *name, size_t
len);
Требования
макроса
тестирования
свойств
для glibc (см.
feature_test_macros(7)):
gethostname():
|| /* начиная с glibc 2.12: */ _POSIX_C_SOURCE >= 200112L
sethostname():
ОПИСАНИЕ¶
Эти системные вызовы используются для доступа или изменения имени узла текущего процессора.
Вызов sethostname() устанавливает имя узла равны значению, указанному в массиве символов name. Аргумент len определяет количество байт в name. (Таким образом, name не требует наличия завершающего байта с null.)
gethostname() возвращает имя узла с null на конце в массиве символов name длиной len байт. Если имя узла, оканчивающееся null, не помещается, то имя обрезается и ошибки не происходит (но см. ЗАМЕЧАНИЯ далее). В POSIX.1-2001 сказано, что если обрезание произошло, то неясно, будет ли буфер содержать завершающий байт с null.
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ¶
При успешном выполнении возвращается 0. В случае ошибки возвращается -1, а errno устанавливается в соответствующее значение.
ОШИБКИ¶
- EFAULT
- name является неправильным адресом.
- EINVAL
- len имеет отрицательное значение или для sethostname() длина len больше, чем максимально допустимое значение.
- ENAMETOOLONG
- (gethostname() из glibc) len меньше чем реальный размер. (До версии 2.1, glibc возвращала в этом случае EINVAL.)
- EPERM
- Для работы с sethostname() у вызывающего нет мандата CAP_SYS_ADMIN.
СООТВЕТСТВИЕ СТАНДАРТАМ¶
SVr4, 4.4BSD (данная функция впервые появилась в 4.2BSD). POSIX.1-2001 определяет gethostname(), но не sethostname().
ЗАМЕЧАНИЯ¶
SUSv2 гарантирует, что "Длина имени узла ограничивается 255-ми байтами". POSIX.1-2001 гарантирует, что "Длина имени узла (не включая завершающий нулевой символ) ограничивается HOST_NAME_MAX байтами". В Linux, значение HOST_NAME_MAX равно 64, которое было урезано начиная с Linux 1.0 (ранние версии имели предел в 8 байт).
Замечания по glibc¶
Библиотека GNU C library не использует системный вызов gethostname(); вместо этого gethostname() в ней реализован в виде библиотечной функции, которая вызывает uname(2) и копирует до len байт в name из возвращаемого поля nodename. Выполнив копирование, функция проверяет, что длина nodename не больше или равна len, и если это обнаруживается, то функция возвращает -1, устанавливая значение errno равным ENAMETOOLONG; в этом случае в возвращаемое значение name завершающий null не добавляется.
Версии glibc до 2.2 обрабатывали случай превышения длины nodename по другому: ничего не копировалось в name и функция возвращала -1, устанавливая errno равным ENAMETOOLONG.
СМОТРИТЕ ТАКЖЕ¶
2010-09-26 | Linux |