title: ioctl_console(2)

summary: управление вводом\-выводом (ioctl) консольного терминала и

text:
# ioctl_console(2)

## ИМЯ
ioctl_console - управление вводом-выводом (ioctl) консольного терминала и виртуальных консолей

## ОПИСАНИЕ
Для терминалов и виртуальных консолей поддерживаются Linux-ориентированные запросы ioctl(2), перечисленные далее. Для каждого запроса требуется третий аргумент argp.

KDGETLED

Получить состояние индикаторов. argp указывает ячейку типа char. В младших трёх битах *argp хранится состояние индикаторов: LED_CAP

0x04

индикатор caps lock

LED_NUM

0x02

индикатор num lock

LED_SCR

0x01

индикатор scroll lock

KDSETLED

Установить состояние индикаторов. Состояние индикаторов устанавливается в соответствии с тремя младшими битами беззнакового длинного целого argp. Однако, если установлен старший бит, индикаторы возвращаются в исходное состояние: отображают состояние функций клавиатуры caps lock, num lock и scroll lock.

До Linux 1.1.54 индикаторы состояния отражались только соответствующими флагами клавиатуры и KDGETLED/KDSETLED и также могли изменять флаги клавиатуры. Начиная с Linux 1.1.54 индикаторы могут отображать произвольную информацию, но по умолчанию показывают флаги клавиатуры. Следующие два ioctl используются для доступа к флагам клавиатуры.

KDGKBLED

Получить флаги клавиатуры: CapsLock, NumLock, ScrollLock (не индикаторы). argp указывает на ячейку типа char, в которой сохраняется состояния флагов. Младшие три бита (маска 0x7) содержат текущее состояние флагов, следующие три бита (маска 0x70) содержат устанавливаемое состояние флагам по умолчанию (начиная с Linux 1.1.54).

KDSKBLED

Установить флаги клавиатуры: CapsLock, NumLock, ScrollLock (не индикаторы). Беззнаковое длинное целое argp содержит требуемые состояния флагов. Три младших бита (маска 0x7) содержат состояния флагов, следующие три бита (маска 0x70) содержат состояния флагов по умолчанию (начиная с Linux 1.1.54).

KDGKBTYPE

Получить тип клавиатуры. Возвращается значение KB_101 равное 0x02.

KDADDIO

Добавить порт ввода/вывода (I/O) как допустимый. Эквивалентно вызову ioperm(arg,1,1).

KDDELIO

Удалить порт ввода/вывода (I/O) как недопустимый. Эквивалентно вызову ioperm(arg,1,0).

KDENABIO

Включить ввод/вывод на видеокарту. Эквивалентно вызову ioperm(0x3b4, 0x3df-0x3b4+1, 1).

KDDISABIO

Выключить ввод/вывод на видеокарту. Эквивалентно вызову ioperm(0x3b4, 0x3df-0x3b4+1, 0).

KDSETMODE

Установить текстовый/графический режим. Беззнаковое целое argp содержит одно из двух значений: KD_TEXT

0x00

KD_GRAPHICS

0x01

KDGETMODE

Получить тип режима (текстовый/графический). Значение argp указывает на int, равное одному из представленных чуть ранее в KDSETMODE.

KDMKTONE

Генерировать тон заданной длительности. Младшие 16 битов беззнакового длинного целого argp задают частоту тона (период в тактах), старшие 16 битов устанавливают его длительность в мсек. Если длительность равна нулю, звук выключается. Управление возвращается немедленно. Например, argp = (125<<16) + 0x637 определяет звук, обычно связанный с ctrl-G (работает начиная с Linux 0.99pl1; не работает в Linux 2.1.49-50).

KIOCSOUND

Запустить и остановить генерацию звука. Младшие 16 битов argp определяют период в тактах (то есть argp = 1193180/частота). Значение argp = 0 выключает звук. В обоих случаях управление возвращается немедленно.

GIO_CMAP

Получить из ядра текущую цветовую карту по умолчанию. argp указывает на массив из 48 байтов (начиная с Linux 1.3.3).

PIO_CMAP

Изменить цветовую карту по умолчанию для текстового режима. argp указывает на массив из 48 байтов, который содержит, по порядку, значения красного, зеленого и синего для 16-и доступных экранных цветов: 0 — составляющая выключена, 255 — полная интенсивность. Цвета по умолчанию, по порядку: чёрный, тёмно-красный, тёмно-зелёный, коричневый, тёмно-синий, тёмно-сиреневый, тёмно-голубой, светло-серый, тёмно-серый, ярко-красный, ярко-зелёный, жёлтый, ярко-синий, ярко-сиреневый, ярко-голубой и белый (начиная с Linux 1.3.3).

GIO_FONT

Получить экранный шрифт (256 символов) в расширенном виде. argp указывает на массив из 8192 байтов. Возвращает код ошибки EINVAL, если текущий загруженный шрифт содержит 512 символов или консоль находится не в текстовом режиме.

GIO_FONTX

Получить экранный шрифт и связанную с ним информацию. argp указывает на struct consolefontdesc (см. PIO_FONTX). При вызове значение поля charcount должно быть равно максимальному числу символов, которое помещается в буфер, указываемый chardata. При возврате charcount и charheight содержат информацию о текущем загруженном шрифте, а массив chardata содержит данные шрифта, если согласно начальному значению charcount для этого достаточно места; в противном случае буфер остаётся неизменным и errno присваивается значение ENOMEM (начиная с Linux 1.3.1).

PIO_FONT

Установить экранный шрифт из 256 символов. Шрифт загружается в знакогенератор EGA/VGA. argp указывает на карту размером 8192 байта (32 байта на символ). Только первые N из них используются для шрифта 8xN (0 < N <= 32). Этот вызов также отменяет перекодировку в Юникод.

PIO_FONTX

Установить экранный шрифт и соответствующую информацию для изображения. argp указывает на структуру:

```
struct consolefontdesc {

    unsigned short charcount;  /* число символов в шрифте

                                  (256 или 512) */

    unsigned short charheight; /* число линий сканирования на

                                  символ (1-32) */

    char          *chardata;   /* данные шрифта в

                                  расширенном формате */
};

```

Если требуется, соответственно изменяются размеры экрана и соответствующим процессам посылается сигнал SIGWINCH. Этот вызов также отменяет перекодировку в Юникод (начиная с Linux 1.3.1).

PIO_FONTRESET

Сбросить экранный шрифт, размер и перекодировку в Юникод в начальные значения, использованные при загрузке. Аргумент argp не используется, но его значение должно быть NULL, чтобы эта версия была совместима с будущими версиями Linux. (Начиная с Linux 1.3.28).

GIO_SCRNMAP

Получить разметку экрана из ядра. argp указывает на область размером E_TABSZ, которая заполняется позициями символов шрифта, используемыми при отображении. Вызов возвращает бесполезную информацию, если текущий загруженный шрифт содержит более 256 символов.

GIO_UNISCRNMAP

Получить полную экранную перекодировку в Юникод из ядра. argp указывает на область размером E_TABSZ*sizeof(unsigned short), которая заполняется представлением в Юникоде каждого символа. Специальный набор Юникода, начинающийся с U+F000, используется для перекодировки «напрямую в шрифт» (начиная с Linux 1.3.1).

PIO_SCRNMAP

Загрузить «определяемую пользователем» (четвёртую) таблицу в ядро, по которой перекодируются байты в символы экрана консоли. argp указывает на область размером E_TABSZ.

PIO_UNISCRNMAP

Загрузить «определяемую пользователем» (четвёртую) таблицу в ядро, перекодирующую байты в значения Юникода, которые затем транслируются в экранные символы согласно текущей загруженной карте соответствия символов Юникода и шрифта. Специальные коды Юникода, начинающиеся с U+F000, могут использоваться для непосредственного перевода байтов в символы шрифта (начиная с Linux 1.3.1).

GIO_UNIMAP

Получить соответствие символов Юникода шрифту из ядра. argp указывает на структуру

```
struct unimapdesc {

    unsigned short  entry_ct;

    struct unipair *entries;
};

```

где entries указывает на массив структур

```
struct unipair {

    unsigned short unicode;

    unsigned short fontpos;
};

```

(начиная с Linux 1.1.92)

PIO_UNIMAP

Поместить соответствие символов Юникода и экранного шрифта в ядро. argp указывает на struct unimapdesc (начиная с Linux 1.1.92).

PIO_UNIMAPCLR

Очистить таблицу, возможно с помощью алгоритма хэширования. argp указывает на структуру

```
struct unimapinit {

    unsigned short advised_hashsize;  /* 0, если не использовать */

    unsigned short advised_hashstep;  /* 0, если не использовать */

    unsigned short advised_hashlevel; /* 0, если не использовать */
};

```

(начиная с Linux 1.1.92)

KDGKBMODE

Получить текущий режим клавиатуры. Значение argp указывает на ячейку типа long, в которой может быть одно из значений: K_RAW

0x00 /* режим без обработки (скан-коды) */

K_XLATE

0x01 /* транслированные с помощью keymap коды клавиш */

K_MEDIUMRAW

0x02 /* режим средней обработки (скан-коды) */

K_UNICODE

0x03 /* режим Юникода */

K_OFF

0x04 /* режим выключен; начиная с Linux 2.6.39 */

KDSKBMODE

Установить текущий режим клавиатуры. Значение argp указывает на ячейку типа long, значением которой может быть любое из представленных чуть ранее в KDGKBMODE.

KDGKBMETA

Получить режим обработки метаклавиш. argp указывает на ячейку типа long, в которой может быть одно из значений: K_METABIT

0x03

установлен старший бит

K_ESCPREFIX

0x04

экранирующий префикс

KDSKBMETA

Установить режим обработки клавиши мета. Значение argp указывает на ячейку типа long, значением которой может быть любое из представленных чуть ранее в KDGKBMETA.

KDGKBENT

Получить один элемент из таблицы трансляции клавиш (код клавиши для кода действия). argp указывает на структуру

```
struct kbentry {

    unsigned char  kb_table;

    unsigned char  kb_index;

    unsigned short kb_value;
};

```

значения двух первых полей представляют собой: kb_table — выбранную таблицу клавиш (0 <= kb_table < MAX_NR_KEYMAPS) и kb_index — код клавиши (0 <= kb_index < NR_KEYS). kb_value присваивается соответствующий код действия или K_HOLE, если нет такой клавиши, или K_NOSUCHMAP, если значение kb_table неверно.

KDSKBENT

Создать элемент в таблице трансляции клавиш. argp указывает на struct kbentry.

KDGKBSENT

Получить значение строки функциональной клавиши. argp указывает на структуру

```
struct kbsentry {

    unsigned char kb_func;

    unsigned char kb_string[512];
};

```

kb_string равна (заканчивающейся null) строке, соответствующей коду действия функциональной клавиши kb_func.

KDSKBSENT

Создать элемент строки функциональной клавиши. argp указывает на struct kbsentry.

KDGKBDIACR

Получить таблицу акцентов из ядра. argp указывает на структуру

```
struct kbdiacrs {

    unsigned int   kb_cnt;

    struct kbdiacr kbdiacr[256];
};

```

где kb_cnt — число элементов массива, каждый из которых является структурой

```
struct kbdiacr {

    unsigned char diacr;

    unsigned char base;

    unsigned char result;
};

```

KDGETKEYCODE

Получить элемент таблицы кодов клавиш ядра (сканкод в код клавиши). argp указывает на структуру

```
struct kbkeycode {

    unsigned int scancode;

    unsigned int keycode;
};

```

keycode устанавливается в соответствии с заданным scancode (только 89 <= scancode <= 255. Для 1 <= scancode <= 88, keycode==scancode; начиная с Linux 1.1.63).

KDSETKEYCODE

Записать элемент таблицы кодов клавиш ядра. argp указывает на struct kbkeycode (начиная с Linux 1.1.63).

KDSIGACCEPT

Вызывающий процесс показывает свою готовность к приёму сигнала argp, если он генерируется нажатием соответствующей комбинации клавиш (1 <= argp <= NSIG). Смотрите функцию spawn_console() в linux/drivers/char/keyboard.c.

VT_OPENQRY

Получить первую доступную (не открытую) консоль. argp указывает ячейку типа int, устанавливаемое значение которой равно номеру vt (1 <= *argp <= MAX_NR_CONSOLES).

VT_GETMODE

Считывает режим активного vt. argp указывает на структуру

```
struct vt_mode {

    char  mode;    /* режим vt */

    char  waitv;   /* при установленном; остановка при записи, если терминал неактивен */

    short relsig;  /* послать сигнал при освобождении req */

    short acqsig;  /* послать сигнал при захвате */

    short frsig;   /* не используется (устанавливается в 0) */
};

```

которая задаёт режим активного vt. mode имеет одно из значений: VT_AUTO

автоматическое переключение vt

VT_PROCESS

обрабатывать управление переключением

VT_ACKACQ

подтверждающий переключатель

VT_SETMODE

Установить режим активного vt. argp указывает на struct vt_mode.

VT_GETSTATE

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

```
struct vt_stat {

    unsigned short v_active;  /* активный vt */

    unsigned short v_signal;  /* посылаемый сигнал */

    unsigned short v_state;   /* битовая маска vt */
};

```

Для каждого используемого vt устанавливается соответствующий бит в поле v_state. (В версиях с 1.0 до 1.1.92).

VT_RELDISP

Освободить дисплей.

VT_ACTIVATE

Переключиться на виртуальный терминал argp (1 <= argp <= MAX_NR_CONSOLES).

VT_WAITACTIVE

Подождать, пока виртуальный терминал argp не станет активным.

VT_DISALLOCATE

Освободить память, выделенную виртуальному терминалу argp (начиная с Linux 1.1.54).

VT_RESIZE

Установить представление о размере экрана в ядре. argp указывает на структуру

```
struct vt_sizes {

    unsigned short v_rows;       /* количество строк */

    unsigned short v_cols;       /* количество столбцов */

    unsigned short v_scrollsize; /* не используется */
};

```

Заметим, что этот вызов не изменяет видеорежим. Смотрите resizecons(8) (начиная с Linux 1.1.54).

VT_RESIZEX

Установить значение различных параметров экрана в ядре. argp указывает на структуру

```
struct vt_consize {

    unsigned short v_rows;  /* количество строк */

    unsigned short v_cols;  /* количество столбцов */

    unsigned short v_vlin;  /* количество строк на экране

                               в пикселях */

    unsigned short v_clin;  /* количество строк в символе

                               в пикселях */

    unsigned short v_vcol;  /* количество столбцов на экране

                               в пикселях */

    unsigned short v_ccol;  /* количество столбцов в символе

                               в пикселях */
};

```

Любому параметру может быть присвоено нулевое значение, указывающее "оставить без изменений", но, если задано несколько параметров, то они должны быть согласованы. Этот вызов не изменяет видеорежим. Смотрите resizecons(8) (начиная с Linux 1.3.3).

Действие следующих ioctl зависит от первого байта структуры, указываемой argp, далее называемой subcode. Доступны только суперпользователю или владельцу текущего терминала.

TIOCLINUX, subcode=0

Сделать дамп экрана. Удалено в Linux 1.1.92 (c ядром 1.1.92 и более поздним используйте чтение из /dev/vcsN или /dev/vcsaN).

TIOCLINUX, subcode=1

Получить информацию о задании. Удалено в Linux 1.1.92.

TIOCLINUX, subcode=2

Произвести выделение. Значение argp указывает на структуру

```
struct {

    char  subcode;

    short xs, ys, xe, ye;

    short sel_mode;
};

```

xs и ys — начальные столбец и строка. xe и ye — конечные столбец и строка (у левого верхнего угла строка=столбец=1). Значение sel_mode равно 0 для выделения «символ за символом», 1 для выделения «слово за словом» или 2 для выделения «строки за строкой». Выделенные символы подсвечиваются и сохраняются в статическом массиве sel_buffer из devices/char/console.c.

TIOCLINUX, subcode=3

Вставить выделение. Символы буфера выделения записываются в fd.

TIOCLINUX, subcode=4

Убрать заставку (blank screen)

TIOCLINUX, subcode=5

Установить содержимое 256-битной таблицы поиска определения символов в «word» для выделения «слово за словом» (начиная с Linux 1.1.32).

TIOCLINUX, subcode=6

Значение argp указывает ячейку типа char, которая устанавливает значение переменной ядра shift_state (начиная с Linux 1.1.32).

TIOCLINUX, subcode=7

Значение argp указывает ячейку типа char, которая устанавливает значение переменной ядра report_mouse (начиная с Linux 1.1.33).

TIOCLINUX, subcode=8

Сделать дамп значений ширины и высоты экрана, позиции курсора и всех пар символ-атрибут (только в версиях с 1.1.67 по 1.1.91. С ядром 1.1.92 и более поздних версий используйте чтение /dev/vcsa*).

TIOCLINUX, subcode=9

Восстановить ширину и высоту экрана, позицию курсора и все пары символ-атрибут (только в версиях с 1.1.67 по 1.1.91. С ядром 1.1.92 и более поздних версий используйте запись в /dev/vcsa*).

TIOCLINUX, subcode=10

Обработчик функций энергосбережения для нового поколения мониторов. Режим гашения (blanking) экрана VESA устанавливается равным argp[1], который определяет тип гашения:

0:

Гашение экрана выключено.

1:

Текущие установки регистров видеоадаптера сохраняются, затем контроллер программируется на отключение вертикальной синхронизации. Происходит перевод монитора в режим «ожидания» (standby). Если в мониторе есть таймер Off_Mode, то он может в итоге сам выключить питание.

2:

Текущие настройки сохраняются, а затем вертикальная и горизонтальная синхронизации отключаются. Происходит перевод в режим «выключен» (off). Если в мониторе нет таймера Off_Mode или вы хотите отключить питание сразу же по истечении времени blank_timer, то можете выбрать это значение. Внимание: частое выключение питания может повредить монитор (начиная с Linux 1.1.76).

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

## ОШИБКИ
Переменная errno может принимать следующие значения:

EBADF

Неправильный файловый дескриптор.

EINVAL

Неправильный файловый дескриптор или argp.

ENOTTY

Файловый дескриптор не связан со специальным символьным устройством, или указанный запрос к нему неприменим.

EPERM

Недостаточно прав.

## ЗАМЕЧАНИЯ
Предупреждение: не рассматривайте эту справочную страницу как документацию о ioctl консоли Linux Она предназначена только для любознательных, как альтернатива исходному коду. Ioctl — это внутренние недокументированные возможности Linux, которые могут изменяться без предупреждения. (И на самом деле, эта страница более или менее полно описывает параметры ядра версии 1.1.94; они несколько отличаются от параметров ядра более ранних версий.)

Очень часто ioctl вводятся для обмена между ядром и какой-то определённой известной программой (fdisk, hdparm, setserial, tunelp, loadkeys, selection, setfont и т.д.), и их поведение изменяется по требованию этой программы.

Программы, использующие такие ioctl, не могут быть перенесены в другие версии UNIX, не будут работать в старых версиях Linux и могут не работать в будущих версия Linux.

Используйте функции POSIX.

## СМОТРИТЕ ТАКЖЕ
dumpkeys(1), kbd_mode(1), loadkeys(1), mknod(1), setleds(1), setmetamode(1), execve(2), fcntl(2), ioctl_tty(2), ioperm(2), termios(3), console_codes(4), mt(4), sd(4), tty(4), ttyS(4), vcs(4), vcsa(4), charsets(7), mapscrn(8), resizecons(8), setfont(8)

/usr/include/linux/kd.h, /usr/include/linux/vt.h


package: man-pages-ru

title: ioctl_fat(2)

summary: управление файловой системой FAT

text:
# ioctl_fat(2)

## ИМЯ
ioctl_fat - управление файловой системой FAT

## ОБЗОР

```
#include <linux/msdos_fs.h>
#include <sys/ioctl.h>
```

```
int ioctl(int fd, FAT_IOCTL_GET_ATTRIBUTES, uint32_t *attr);
int ioctl(int fd, FAT_IOCTL_SET_ATTRIBUTES, uint32_t *attr);
int ioctl(int fd, FAT_IOCTL_GET_VOLUME_ID, uint32_t *id);
int ioctl(int fd, VFAT_IOCTL_READDIR_BOTH,
          struct __fat_dirent[2] entry);
int ioctl(int fd, VFAT_IOCTL_READDIR_SHORT,
          struct __fat_dirent[2] entry);
```

## ОПИСАНИЕ
Системный вызов ioctl(2) можно использовать для чтения и записи метаданных файловых систем FAT, которые недоступны через другие системные вызовы.

### Чтение и установка файловых атрибутов
У файлов и каталогов и в файловой системе FAT есть битовая маска атрибутов, которую можно прочитать с помощью FAT_IOCTL_GET_ATTRIBUTES и записать с FAT_IOCTL_SET_ATTRIBUTES.

Аргумент fd содержит файловый дескриптор файла или каталога. Для создания файлового дескриптора достаточно вызвать open(2) с флагом O_RDONLY.

Аргумент attr содержит указатель на битовую маску. Назначение битов в маске:

ATTR_RO

Данный бит означает, что файл или каталог доступен только для чтения.

ATTR_HIDDEN

Данный бит означает, что файл или каталог скрыт.

ATTR_SYS

Данный бит означает, что файл является системным.

ATTR_VOLUME

Данный бит означает, что файл является меткой тома. Данный атрибут доступен только для чтения.

ATTR_DIR

Данный бит означает, что это каталог. Данный атрибут доступен только для чтения.

ATTR_ARCH

Данный бит означает, что файл или каталог должны архивироваться. Он устанавливается при создании или изменении файла. Он сбрасывается системой архивирования.

Нулевое значение ATTR_NONE можно использовать для указания, что все биты атрибутов не установлены.

### Чтение идентификатора тома
Файловые системы FAT маркируются идентификатором тома. Идентификатор тома может быть прочитан с помощью FAT_IOCTL_GET_VOLUME_ID.

Аргумент fd может быть файловым дескриптором файла или каталога файловой системы. Для создания файлового дескриптора достаточно вызвать open(2) с флагом O_RDONLY.

Аргумент id — это указатель на поле, которое будет заполнено ID тома. Обычно, идентификатор тома выдаётся пользователю как группа из двух 16-битных полей:

```
printf("Volume ID %04x-%04x\n", id >> 16, id & 0xFFFF);
```

### Чтение коротких имён файлов каталога
Файл или каталог файловой системы FAT всегда имеет короткое имя файла, состоящее из не более чем 8 заглавных букв, необязательной точки и до 3 заглавных букв расширения файла. Если реальное имя файла не следует такой схеме, то оно сохраняется как длинное имя файла — до 255 символов UTF-16.

Короткие имена файлов в каталоге можно прочитать с помощью VFAT_IOCTL_READDIR_SHORT. С помощью VFAT_IOCTL_READDIR_BOTH можно прочитать как короткие так и длинные имена файлов.

Аргумент fd должен содержать файловый дескриптор каталога. Для создания файлового дескриптора достаточно вызвать open(2) с флагом O_RDONLY. Файловый дескриптор можно использовать только однажды для обхода всех элементов каталога повторными вызовами ioctl(2).

Параметр info представляет собой двухэлементный массив структур следующего вида:

```
struct __fat_dirent {

    long            d_ino;

    __kernel_off_t  d_off;

    uint32_t short  d_reclen;

    char            d_name[256];
};
```

Первый элемент массива содержит короткое имя файла. Во втором содержится длинное имя файла.

Поля d_ino и d_off заполняются только для длинных имён. Поле d_ino содержит номер inode каталога. Поле d_off содержит смещение записи файла в каталоге. Так как эти поля недоступны для коротких имён, пользовательский код должен просто игнорировать их.

В поле d_reclen содержится длина имени файла из поля d_name. Для сохранения обратной совместимости длина 0 для короткого имени указывает на достижение конца каталога. Однако предпочтительным методом определения конца каталога является проверка возвращаемого ioctl(2) значения. Если длинное имя не существует, то поле d_reclen устанавливается в 0 и d_name — строка символов длиной 0 для длинного имени файла.

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
В случае ошибки возвращается -1, а errno устанавливается в значение ошибки.

При использовании VFAT_IOCTL_READDIR_BOTH и VFAT_IOCTL_READDIR_SHORT возвращается значение 1, означающее, что был прочитан новый элемент каталога и 0, когда достигнут конец каталога.

## ОШИБКИ
ENOENT

Данная ошибка может возвращаться при VFAT_IOCTL_READDIR_BOTH и VFAT_IOCTL_READDIR_SHORT, если файловый дескриптор fd указывает на на удалённый, но ещё открытый каталог.

ENOTDIR

Данная ошибка может возвращаться при VFAT_IOCTL_READDIR_BOTH и VFAT_IOCTL_READDIR_SHORT, если файловый дескриптор fd не указывает на каталог.

ENOTTY

Файловый дескриптор fd указывает не на объект в файловой системе FAT.

Дополнительные значения ошибок смотрите в ioctl(2).

## ВЕРСИИ
VFAT_IOCTL_READDIR_BOTH и VFAT_IOCTL_READDIR_SHORT впервые появились в Linux 2.0.

FAT_IOCTL_GET_ATTRIBUTES и FAT_IOCTL_SET_ATTRIBUTES впервые появились в Linux 2.6.12.

FAT_IOCTL_GET_VOLUME_ID появился в версии 3.11 ядра Linux.

## СООТВЕТСТВИЕ СТАНДАРТАМ
Данный программный интерфейс существует только в Linux.

## ПРИМЕР

### Переключение флага архивирования
В следующей программе показано использование ioctl(2) для изменения атрибутов файлов. Программа читает и показывает атрибут архивирования файла. После изменения значения атрибута на противоположный, программа читает и показывает атрибут ещё раз.

Пример сеанса работы программы с файлом /mnt/user/foo:

```
# ./toggle_fat_archive_flag /mnt/user/foo
Флаг архивирования установлен
Переключение флага архивирования
Флаг архивирования сброшен
```

### Исходный код программы (toggle_fat_archive_flag.c)

```
#include <fcntl.h>
#include <linux/msdos_fs.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/ioctl.h>
#include <unistd.h>
/*

 * Читает атрибуты файла в файловой системе FAT.

 * Выводит состояние флага архивирования.

 */
static uint32_t
readattr(int fd)
{

    uint32_t attr;

    int ret;

    ret = ioctl(fd, FAT_IOCTL_GET_ATTRIBUTES, &attr);

    if (ret == -1) {

        perror("ioctl");

        exit(EXIT_FAILURE);

    }

    if (attr & ATTR_ARCH)

        printf("Флаг архивирования установлен\n");

    else

        printf("Флаг архивирования сброшен\n");

    return attr;
}
int
main(int argc, char *argv[])
{

    uint32_t attr;

    int fd;

    int ret;

    if (argc != 2) {

        printf("Использование: %s ИМЯ_ФАЙЛА\n", argv[0]);

        exit(EXIT_FAILURE);

    }

    fd = open(argv[1], O_RDONLY);

    if (fd == -1) {

        perror("open");

        exit(EXIT_FAILURE);

    }

    /*

     * Читает и показывает атрибуты файлов в FAT.

     */

    attr = readattr(fd);

    /*

     * Инвертирует атрибут архивирования.

     */

    printf("Переключение флага архивирования\n");

    attr ^= ATTR_ARCH;

    /*

     * Записывает изменённые атрибуты файлов в FAT.

     */

    ret = ioctl(fd, FAT_IOCTL_SET_ATTRIBUTES, &attr);

    if (ret == -1) {

        perror("ioctl");

        exit(EXIT_FAILURE);

    }

    /*

     * Читает и показывает атрибуты файлов в FAT.

     */

    readattr(fd);

    close(fd);

    exit(EXIT_SUCCESS);
}
```

### Чтение идентификатора тома
Следующий пример кода демонстрирует использование ioctl(2) для вывода идентификатора тома файловой системы FAT.

Пример сеанса работы программы с файлом /mnt/user:

```
$ ./display_fat_volume_id /mnt/user
Volume ID 6443-6241
```

### Исходный код программы (display_fat_volume_id.c)

```
#include <fcntl.h>
#include <linux/msdos_fs.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/ioctl.h>
#include <unistd.h>
int
main(int argc, char *argv[])
{

    uint32_t id;

    int fd;

    int ret;

    if (argc != 2) {

        printf("Использование: %s ИМЯ_ФАЙЛА\n", argv[0]);

        exit(EXIT_FAILURE);

    }

    fd = open(argv[1], O_RDONLY);

    if (fd == -1) {

        perror("open");

        exit(EXIT_FAILURE);

    }

    /*

     * Читает ID тома.

     */

    ret = ioctl(fd, FAT_IOCTL_GET_VOLUME_ID, &id);

    if (ret == -1) {

        perror("ioctl");

        exit(EXIT_FAILURE);

    }

    /*

     * Форматирует вывод в виде двух групп по 16 бит каждая.

     */

    printf("Volume ID %04x-%04x\n", id >> 16, id & 0xFFFF);

    close(fd);

    exit(EXIT_SUCCESS);
}
```

### Вывод содержимого каталога
Следующий пример кода демонстрирует использование ioctl(2) для вывода содержимого каталога.

Пример сеанса работы программы с файлом /mnt/user:

```
$ ./fat_dir /mnt/user
. -> ”
.. -> ”
ALONGF~1.TXT -> 'a long filename.txt'
UPPER.TXT -> ”
LOWER.TXT -> 'lower.txt'
```

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

```
#include <fcntl.h>
#include <linux/msdos_fs.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/ioctl.h>
#include <unistd.h>
int
main(int argc, char *argv[])
{

    struct __fat_dirent entry[2];

    int fd;

    int ret;

    if (argc != 2) {

        printf("Использование: %s КАТАЛОГ\n", argv[0]);

        exit(EXIT_FAILURE);

    }

    /*

     * Открывает файловый дескриптор каталога.

     */

    fd = open(argv[1], O_RDONLY | O_DIRECTORY);

    if (fd == -1) {

        perror("open");

        exit(EXIT_FAILURE);

    }

    for (;;) {

        /*

         * Читает следующий элемент из каталога.

         */

        ret = ioctl( fd, VFAT_IOCTL_READDIR_BOTH, entry);

        /*

         * Если произошла ошибка, то возвращает -1.

         * Если достигнут конец каталога, то

         * возвращает 0.

         * Для обратной совместимости при достижении конца каталога

         * также d_reclen == 0.

         */

        if (ret < 1)

            break;

        /*

         * Выводит короткое и длинное имя.

         */

        printf("%s -> '%s'\n", entry[0].d_name, entry[1].d_name);

    }

    if (ret == -1) {

        perror("VFAT_IOCTL_READDIR_BOTH");

        exit(EXIT_FAILURE);

    }

    /*

     * Закрывает файловый дескриптор.

     */

    close(fd);

    exit(EXIT_SUCCESS);
}
```

## СМОТРИТЕ ТАКЖЕ
ioctl(2)


title: ioctl_ficlonerange(2)

summary: сделать некоторые данные одного файла

text:
# ioctl_ficlonerange(2)

## ИМЯ
ioctl_ficlonerange, ioctl_ficlone - сделать некоторые данные одного файла общими с другим файлом

## ОБЗОР
\#include <sys/ioctl.h>

\#include <linux/fs.h>

int ioctl(int dest_fd, FICLONERANGE, struct file_clone_range *arg);

int ioctl(int dest_fd, FICLONE, int src_fd);

## ОПИСАНИЕ
Если файловая система поддерживает общее файловое физическое хранилище для файлов («reflink»), то эту операцию ioctl(2) можно использовать для того, чтобы часть данных файла src_fd появилась в файле dest_fd в виде общего пространства на носителе, что быстрее по сравнению с созданием отдельной физической копии данных. Оба файла должны располагаться в одной файловой системе. Если выполняется запись в эту общую область, то файловая система должна гарантировать, что изменения будут видны только в файле, в который производится запись. Такое поведение часто называют как «копирование при записи» (copy on write).

Данный ioctl создаёт ссылку (reflink) на не более src_length байт из файлового дескриптора src_fd по смещению src_offset в файл dest_fd по смещению dest_offset, предоставляя её обоим файлам. Если src_length равно нулю, то ioctl делает ссылку на конец файла-источника. Данная информация передаётся в структуре следующего вида:

```
struct file_clone_range {

    __s64 src_fd;

    __u64 src_offset;

    __u64 src_length;

    __u64 dest_offset;
};
```

Клоны атомарны для одновременной записи, поэтому для получения корректной копии не нужно получать блокировки.

Операция FICLONE ioctl клонирует файлы полностью.

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
В случае ошибки возвращается -1, а errno устанавливается в значение ошибки.

## ОШИБКИ
Возможные коды ошибок (помимо прочих):

EBADF

Дескриптор src_fd не открыт на чтение; dest_fd не открыт на запись или открыт только для добавления; файловая система, в которой находится src_fd, не поддерживает reflink.

EINVAL

Файловая система не поддерживает создание ссылок диапазонов в заданных файлах. Эта ошибка также может возникнуть, если файловый дескриптор представляет устройство, FIFO или сокет. Обычно, для дисковых файловых систем требуются, чтобы аргументы смещения и длины были выровнены по основному размеру блока. В XFS и Btrfs нет поддержки ссылок перекрывающихся диапазонов в одном и том же файле.

EISDIR

Один из файлов является каталогом и файловая система не поддерживает диапазоны для каталогов.

EOPNOTSUPP

Может возникать, если файловая система не поддерживает ссылки для файловых дескрипторов или когда файловый дескриптор ссылается на специальные иноды.

EPERM

Дескриптор dest_fd является неизменным.

ETXTBSY

Один из файлов является файлом подкачки. Файлы подкачки не могут содержаться в совместных хранилищах.

EXDEV

Дескрипторы dest_fd и src_fd находятся на разных смонтированных файловых системах.

## ВЕРСИИ
Данные операции ioctl появились в Linux 4.5. Раньше они назывались BTRFS_IOC_CLONE и BTRFS_IOC_CLONE_RANGE и работали только в Btrfs.

## СООТВЕТСТВИЕ СТАНДАРТАМ
Данный программный интерфейс существует только в Linux.

## ЗАМЕЧАНИЯ
Так как для операции копирования-при-записи требуется выделение нового пространства в хранилище, операция fallocate(2) может отменить совместное использование общих блоков для гарантии того, что последующие операции записи не завершатся ошибкой из-за нехватки места на диске.

## СМОТРИТЕ ТАКЖЕ
ioctl(2)


title: ioctl_fideduperange(2)

text:
# ioctl_fideduperange(2)

## ИМЯ
ioctl_ficlonerange - сделать некоторые данные одного файла общими с другим файлом

## ОБЗОР
\#include <sys/ioctl.h>

\#include <linux/fs.h>

int ioctl(int src_fd, FIDEDUPERANGE, struct file_dedupe_range *arg);

## ОПИСАНИЕ
Если файловая система поддерживает общее файловое физическое хранилище между несколькими файлами, то эту операцию ioctl(2) можно использовать для того, чтобы часть данных файла src_fd появилась в файле dest_fd в виде общего пространства на носителе, если данные файлов одинаковы («дедупликация», deduplication). Оба файла должны располагаться в одной файловой системе. Это сокращает затраты на место, позволяя хранить в файловой системе только одну копию данных.Если выполняется запись в эту общую область, то файловая система должна гарантировать, что изменения будут видны только в файле, в который производится запись. Такое поведение часто называют как «копирование при записи» (copy on write).

Данный ioctl выполняет операцию «сравнения и создания общей области при совпадении» с не более src_length байт из файлового дескриптора src_fd по смещению src_offset. Данная информация передаётся в структуре следующего вида:

```
struct file_dedupe_range {

    __u64 src_offset;

    __u64 src_length;

    __u16 dest_count;

    __u16 reserved1;

    __u32 reserved2;

    struct file_dedupe_range_info info[0];
};
```

Дедупликация атомарна для одновременной записи, поэтому для получения корректной дедуплицированной копии не нужно получать блокировки.

Поля reserved1 и reserved2 должны быть равны нулю.

Назначения для операции дедупликации передаются в массиве в конце структуры. Количество назначений задаётся в dest_count, а информация о назначении задаётся в следующем виде:

```
struct file_dedupe_range_info {

    __s64 dest_fd;

    __u64 dest_offset;

    __u64 bytes_deduped;

    __s32 status;

    __u32 reserved;
};
```

Целью каждой операции дедупликации является src_length байт в файловом дескрипторе dest_fd со смещением logical_offset. Поле reserved должно быть равно нулю.На момент вызова src_fd должен быть открыт на чтение и, dest_fd должен быть открыт на запись. Сумма размеров структуры file_dedupe_range и массива структур file_dedupe_range_info не должна превышать системный размер страницы. Максимальный размер src_length зависит от файловой системы и, обычно равен 16 МиБ. Это ограничение будет невидимо соблюдаться файловой системой. По соглашению, хранилище, используемое src_fd, отображается в dest_fd, а предыдущее содержимое в dest_fd освобождается.

При успешном выполнении ioctl в bytes_deduped возвращается количество дедуплицированных байт, а в status — код состояния операции дедупликации. Если не совпадает даже один байт из диапазона, то запрос дедупликации будет проигнорирован и status будет присвоено FILE_DEDUPE_RANGE_DIFFERS. При успешном выполнении код status изменяется на FILE_DEDUPE_RANGE_SAME, при ошибке — отрицательное значение кода, или FILE_DEDUPE_RANGE_DIFFERS, если данные не совпадают.

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
В случае ошибки возвращается -1, а errno устанавливается в значение ошибки.

## ОШИБКИ
Возможные коды ошибок (помимо прочих):

EBADF

Дескриптор src_fd не открыт на чтение; dest_fd не открыт на запись или открыт только для добавления; файловая система, в которой находится src_fd, не поддерживает дедупликацию.

EINVAL

Файловая система не поддерживает дедупликацию диапазонов в заданных файлах. Эта ошибка также может возникнуть, если файловый дескриптор представляет устройство, FIFO или сокет. Обычно, для дисковых файловых систем требуются, чтобы аргументы смещения и длины были выровнены по основному размеру блока. В XFS и Btrfs нет поддержки дедупликации перекрывающихся диапазонов в одном и том же файле.

EISDIR

Один из файлов является каталогом и файловая система не поддерживает диапазоны для каталогов.

ENOMEM

Ядро не смогло выделить достаточно памяти для выполнения операции или размер dest_count слишком большой из-за того, что описание входного аргумента занимает больше одной страницы в памяти.

EOPNOTSUPP

Может возникать, если файловая система не поддерживает дедупликацию для файловых дескрипторов или когда файловый дескриптор ссылается на специальные иноды.

EPERM

Дескриптор dest_fd является неизменным.

ETXTBSY

Один из файлов является файлом подкачки. Файлы подкачки не могут содержаться в совместных хранилищах.

EXDEV

Дескрипторы dest_fd и src_fd находятся на разных смонтированных файловых системах.

## ВЕРСИИ
Данная операция ioctl появилась в Linux 4.5. Раньше она называлась BTRFS_IOC_FILE_EXTENT_SAME и работала только в Btrfs.

## СООТВЕТСТВИЕ СТАНДАРТАМ
Данный программный интерфейс существует только в Linux.

## ЗАМЕЧАНИЯ
Так как для операции копирования-при-записи требуется выделение нового пространства в хранилище, операция fallocate(2) может отменить совместное использование общих блоков для гарантии того, что последующие операции записи не завершатся ошибкой из-за нехватки места на диске.

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

## СМОТРИТЕ ТАКЖЕ
ioctl(2)


title: ioctl_getfsmap(2)

text:
# ioctl_getfsmap(2)

## ИМЯ
ioctl_getfsmap - возвращает физическую планировку файловой системы

## ОБЗОР
\#include <sys/ioctl.h>

\#include <linux/fs.h>

\#include <linux/fsmap.h>

int ioctl(int fd, FS_IOC_GETFSMAP, struct fsmap_head * arg);

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

Основным аргументом данной операции является указатель на единственную структуру struct fsmap_head:

```
struct fsmap {

    __u32 fmr_device;      /* идентификатор устройства */

    __u32 fmr_flags;       /* флаги отображения */

    __u64 fmr_physical;    /* смещение сегмента на устройстве */

    __u64 fmr_owner;       /* идентификатор владельца */

    __u64 fmr_offset;      /* смещение сегмента в файле */

    __u64 fmr_length;      /* длина сегмента */

    __u64 fmr_reserved[3]; /* должно быть равно нулю */
};
struct fsmap_head {

    __u32 fmh_iflags;       /* управляющие флаги */

    __u32 fmh_oflags;       /* флаги результата */

    __u32 fmh_count;        /* кол-во элементов в массиве включая входные */

    __u32 fmh_entries;      /* кол-во заполненных элементов (результат) */

    __u64 fmh_reserved[6];  /* должно быть равно нулю */

    struct fsmap fmh_keys[2];  /* низший и высший ключи

                                  для поиска отображения */

    struct fsmap fmh_recs[];   /* возвращаемые записи */
};
```

В двух массивах элементов fmh_keys задаются низший и высший обратные отображающие ключи, по которым приложение хотело бы получить информацию о физическом отображении. Обратный отображающий ключ состоит из кортежа (устройство, блок, владелец, смещение). Поля владельца и смещения являются частью ключа, так как в реализации некоторых файловых систем используются общие физические блоки для нескольких файлов и поэтому может возвращаться несколько отображений для заданного физического блока.

Отображения файловых систем копируются в массив fmh_recs, следующий сразу за данными заголовка.

### Поля struct fsmap_head
Поле fmh_iflags представляет собой битовую маску, передаваемую ядру для изменения результата. В настоящее время ни одного флага не определено, поэтому вызывающий должен присвоить этому значению ноль.

Поле fmh_oflags представляет собой битовую маску, устанавливаемую ядром в соответствии с возвращаемыми отображениями. Если установлен FMH_OF_DEV_T, то поле fmr_device представляет структуру dev_t, содержащую основной и вспомогательный номера блочного устройства.

Поле fmh_count содержит количество элементов массива, передаваемого ядру. Если поле равно нулю, то fmh_entries будет присвоено количество записей, которые были бы возвращены, если бы массив был бы достаточного размера; информация об отображении не возвращается.

В поле fmh_entries содержится количество элементов в массиве fmh_recs, содержащем полезную информацию.

Поля fmh_reserved должны быть равны нулю.

### Ключи
Две записи ключей в fsmap_head.fmh_keys задают низший и высший записи зон в пространстве ключе, которые вызывающий хочет получить. Для файловой системы, использующей общие блоки между файлами, вероятно, потребуется кортеж (устройство, физический_блок, владелец, смещение, флаги) в качестве уникального индекса отображающей записи файловой системы. Для классических файловых систем без общих блоков для указания записи может быть достаточно только (устройство, физический_блок, флаги). Например, если низший ключ равен (8:0, 36864, 0, 0, 0), то файловая система вернёт только записи для зон, начинающихся диске с 36 КиБ или выше. Если высший ключ равен (8:0, 1048576, 0, 0, 0), то возвратятся только записи до 1 МиБ. Формат fmr_device в ключах должен совпадать с форматом того же поля в возвращаемых записях (описано далее). По соглашению при запросе поле fsmap_head.fmh_keys[0] должно содержать низший ключ, а fsmap_head.fmh_keys[1] должно содержать высший ключ.

По соглашению, если fmr_length задано в низшем ключе, то, при необходимости, оно будет добавлено к fmr_block или fmr_offset. Вызывающий может использовать эту тонкость для настройки последующих вызовов копируя fsmap_head.fmh_recs[fsmap_head.fmh_entries - 1] в низший ключ. Эту возможность предоставляет функция fsmap_advance (определена в linux/fsmap.h).

### Поля struct fsmap
Поле fmr_device уникально определяет нижележащее устройство хранения. Если в заголовке поля fmh_oflags установлен флаг FMH_OF_DEV_T, то это поле содержит dev_t, из которого можно извлечь основной и вспомогательный номера. Если флаг не установлен, то это поле содержит значение, которое должно быть уникально для каждого уникального устройства хранения.

Поле fmr_physical содержит дисковый адрес зоны в байтах.

Поле fmr_owner содержит владельца зоны (extent). Оно равно номеру иноды, если в поле fmr_flags не установлен флаг FMR_OF_SPECIAL_OWNER, иначе значение определяется файловой системой. Подробней о значениях владельца смотрите в разделе ниже.

Поле fmr_offset содержит логический адрес (в байтах) в записи отображения. Оно не имеет смысла, если в fmr_flags указан FMR_OF_SPECIAL_OWNER или FMR_OF_EXTENT_MAP.

Поле fmr_length содержит длину зоны в байтах.

Поле fmr_flags является битовой маской флагов состояния зоны. Описание бит:

FMR_OF_PREALLOC

Зона выделена, но пока не записана.

FMR_OF_ATTR_FORK

Зона содержит расширенные атрибуты данных.

FMR_OF_EXTENT_MAP

Зона содержит карту отображения зоны владельца.

FMR_OF_SHARED

Части зоны можно использовать совместно.

FMR_OF_SPECIAL_OWNER

Поле fmr_owner содержит специальное значение, а не номер иноды.

FMR_OF_LAST

Это последняя запись в наборе данных.

Полю fmr_reserved будет присвоен ноль.

### Значения владельца
В принципе, значение поля fmr_owner для зона не метаданных должно быть равно номеру иноды. Однако файловые системы не обязаны сообщать номера инод; вместо них они могут выдавать FMR_OWN_UNKNOWN, если: номер иноды нельзя получить простым образом, вызывающий не имеет достаточно прав, файловая система не поддерживает стабильные номера инод или по другим причинам. Если файловая система хочет ограничить выдачу номеров инод определёнными мандатами процесса, то для этой цели настоятельно рекомендуется использовать мандат CAP_SYS_ADMIN.

Для всех файловых систем имеются следующие специальные значения владельца:

FMR_OWN_FREE

Свободное место.

FMR_OWN_UNKNOWN

Данная зона используется, но её владелец не известен или его нельзя легко возвратить.

FMR_OWN_METADATA

Данная зона является метаданными файловой системы.

У XFS имеются следующие специальные значения владельца:

XFS_FMR_OWN_FREE

Свободное место.

XFS_FMR_OWN_UNKNOWN

Данная зона используется, но её владелец не известен или его нельзя легко возвратить.

XFS_FMR_OWN_FS

Статические метаданные файловой системы, находящиеся по постоянному адресу. К ним относятся: суперблок AG, заголовки AGF, AGFL и AGI.

XFS_FMR_OWN_LOG

Журнал файловой системы.

XFS_FMR_OWN_AG

Выделение группы метаданных, например B-деревья свободного места и B-деревья отображения.

XFS_FMR_OWN_INOBT

B-деревья инод и свободных инод.

XFS_FMR_OWN_INODES

Записи инод.

XFS_FMR_OWN_REFC

Информация о счётчике ссылок.

XFS_FMR_OWN_COW

Эта зона используется для организации копирования при записи.

XFS_FMR_OWN_DEFECTIVE:

Данная зона помечена как испорченная или файловой системой или самим устройством.

У ext4 имеются следующие специальные значения владельца:

EXT4_FMR_OWN_FREE

Свободное место.

EXT4_FMR_OWN_UNKNOWN

Данная зона используется, но её владелец не известен или его нельзя легко возвратить.

EXT4_FMR_OWN_FS

Статические метаданные файловой системы, находящиеся по постоянному адресу. К ним относятся суперблок и групповые дескрипторы.

EXT4_FMR_OWN_LOG

Журнал файловой системы.

EXT4_FMR_OWN_INODES

Записи инод.

EXT4_FMR_OWN_BLKBM

Битовая карта блоков.

EXT4_FMR_OWN_INOBM

Битовая карта инод.

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
В случае ошибки возвращается -1, а errno устанавливается в значение ошибки.

## ОШИБКИ
Значениями errno могут быть (и не только эти):

EBADF

Дескриптор fd не открыт на чтение.

EBADMSG

Файловая система обнаружила ошибку контрольной суммы в метаданных.

EFAULT

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

EINVAL

Недостаточный размер массива, ключи не указывают на корректную часть файловой системы, низший ключ указывает на более высокое место в адресном пространстве физического хранилища файловой системы чем высший ключ или передано ненулевое значение в одном из полей, где должен быть ноль.

ENOMEM

Недостаточно памяти для выполнения запроса.

EOPNOTSUPP

Файловая система не поддерживает данную команду.

EUCLEAN

Метаданные файловой системы повреждены и требуют починки.

## ВЕРСИИ
Операция FS_IOC_GETFSMAP впервые появилась в Linux 4.12.

## СООТВЕТСТВИЕ СТАНДАРТАМ
Данный программный интерфейс существует только в Linux. Его поддерживают не все файловые системы.

## ПРИМЕР
Пример программы смотрите в io/fsmap.c из дистрибутива xfsprogs.

## СМОТРИТЕ ТАКЖЕ
ioctl(2)


title: ioctl_iflags(2)

summary: операции ioctl() для флагов иноды

text:
# ioctl_iflags(2)

## ИМЯ
ioctl_iflags - операции ioctl() для флагов иноды

## ОПИСАНИЕ
Различные файловые системы Linux поддерживают флаги иноды — атрибуты, которые изменяют смысл файлов и каталогов. Эти флаги можно запросить и изменить с помощью двух операций ioctl(2):

```
int attr;
fd = open("pathname", ...);
ioctl(fd, FS_IOC_GETFLAGS, &attr);  /* помещает текущие флаги

                                       в 'attr' */
attr |= FS_NOATIME_FL;              /* изменяет полученную битовую маску */
ioctl(fd, FS_IOC_SETFLAGS, &attr);  /* обновляет флаги иноды,

                                       на которую указывает 'fd' */
```

Команды оболочки lsattr(1) и chattr(1) предоставляют интерфейс к этим двум операциям, позволяя пользователю просматривать и изменять флаги иноды, связанной с файлом.

Поддерживаются следующие флаги (показаны вместе с соответствующей буквой, которой обозначается флаг в lsattr(1) и chattr(1)):

FS_APPEND_FL 'a'

Файл можно открыть только с флагом O_APPEND (это ограничение не обойти даже суперпользователю). Только привилегированный процесс (CAP_LINUX_IMMUTABLE) может установить или сбросить этот атрибут.

FS_COMPR_FL 'c'

Хранить файл на диске в сжатом виде. Этот флаг не поддерживается реализациями большинства основных файловых систем; исключением является btrfs(5).

FS_DIRSYNC_FL 'D' (начиная с Linux 2.6.0)

Синхронно записывать изменения каталога на диск. Этот флаг предоставляет эквивалент параметра MS_DIRSYNC вызова mount(2), но для каталога. Этот флаг применим только для каталогов.

FS_IMMUTABLE_FL 'i'

Файл постоянный (immutable): не допускает изменение содержимого и метаданных (прав, меток времени, владельцев, счётчика ссылок и т. п.) (это ограничение не обойти даже суперпользователю). Только привилегированный процесс (CAP_LINUX_IMMUTABLE) может установить или сбросить этот атрибут.

FS_JOURNAL_DATA_FL 'j'

Включение журналирования данных файла в файловых системах ext3(5) и ext4(5). В файловой системе с журналиванием в режиме ordered или writeback привилегированный (CAP_SYS_RESOURCE) процесс может установить этот флаг для включения журналирования изменения данных пофайлово.

FS_NOATIME_FL 'A'

Не изменять время последнего доступа к файлу при доступе. Это может увеличить произвольность ввода-вывода в приложениях, которым не нужна точность этой метки времени. Данный флаг предоставляет функциональность флага MS_NOATIME вызова mount(2), но пофайлово.

FS_NOCOW_FL 'C' (начиная с Linux 2.6.39)

Файл не будет подвергаться обновлениям копирования-при-записи. Этот флаг работает только в файловых системах с поддержкой копирования-при-записи, таких как Btrfs. Смотрите chattr(1) и btrfs(5).

FS_NODUMP_FL 'd'

Не включать этот файл в резервную копию, создаваемую dump(8).

FS_NOTAIL_FL 't'

Этот флаг поддерживается только в Reiserfs. Он отключает свойство Reiserfs упаковки хвостов, которая пытается упаковывать маленькие файлы (и конечные фрагменты больших файлов) в в дисковые блоки метаданных файла.

FS_PROJINHERIT_FL 'P' (начиная с Linux 4.5)

Наследовать ID квоты проекта. Файлы и подкаталоги будут наследовать ID проекта каталога. Этот флаг можно применять только для каталогов.

FS_SECRM_FL 's'

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

FS_SYNC_FL 'S'

Выполнять обновления файла синхронно. Для файлов, это приводит к выполнению синхронной записи (как если бы все файлы открывались с флагом O_SYNC). Для каталогов, это приводит к тому эффекту что и флаг FS_DIRSYNC_FL.

FS_TOPDIR_FL 'T'

Пометить каталог для специальной обработки по стратегии выделения блоков Орлова. Подробности смотрите в chattr(1). Этот флаг можно применять только к каталогам и он действует только в ext2, ext3 и ext4.

FS_UNRM_FL 'u'

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

В большинстве случаев, когда какой-либо из флагов установлен на каталоге, этот флаг наследуется файлами и подкаталогами, созданными внутри каталога. Исключением является FS_TOPDIR_FL, который не наследуется и FS_DIRSYNC_FL, который наследуется только подкаталогами.

## СООТВЕТСТВИЕ СТАНДАРТАМ
Флаги иноды являются нестандартным расширением Linux.

## ЗАМЕЧАНИЯ
Для изменения флагов иноды файла используется операция FS_IOC_SETFLAGS; эффективный идентификатор пользователя вызывающего должен совпадать с владельцем файла или вызывающий должен иметь мандат CAP_FOWNER.

## СМОТРИТЕ ТАКЖЕ
chattr(1), lsattr(1), mount(2), btrfs(5), ext4(5), xfs(5), xattr(7), mount(8)


title: ioctl_list(2)

summary: список вызовов ioctl ядра Linux/i386

text:
# ioctl_list(2)

## ИМЯ
ioctl_list - список вызовов ioctl ядра Linux/i386

## ОПИСАНИЕ
В данной странице представлен список ioctl вызовов ядра Linux/i386 версии 1.3.27. Он содержит 421 вызов из </usr/include/{asm,linux}/*.h>.Для каждого вызова указано числовое значение, имя и передаваемые аргументы.

Тип аргумента const struct foo * означает, что аргумент для ядра является входным. struct foo * означает, что аргумент для ядра является выходным. Если ядро использует аргумент как входной и выходной, то он помечается как // I-O.

Некоторые ioctl вызовы используют больше аргументов или возвращают больше значений, чем одна структура. Такие вызовы отмечаются как // MORE и документируются далее в отдельном параграфе.

Данный список очень неполон.

### Структура ioctl
Значения команд ioctl являются 32-битными константами. В принципе, эти константы являются полностью случайными, но некоторые люди пытаются увидеть в них определённую закономерность.

В старом Linux, в основном, были 16-битные константы, в которых последний байт является серийным номером, а предшествующим байт(ами) указывался драйвер. Иногда использовался старший номер устройства: 0x03 для ioctl вызовов HDIO_*, 0x06 для ioctl вызовов LP*. Иногда использовались одна или несколько букв ASCII. Например, TCGETS имеет значение 0x00005401, с буквой 0x54 = 'T', указывающей на драйвер терминала и CYGETTIMEOUT имеет значение 0x00435906, с буквами 0x43 0x59 = 'C' 'Y', указывающими на драйвер cyclades.

Позже (0.98p5) в номер была встроена дополнительная информация. Появилось 2 бита направления (00: нет, 01: запись, 10: чтение, 11: чтение/запись), за которыми следовали 14 бит размера (указывают размер аргумента), за которыми следовали 8 бит типа (собирающих вызовы ioctl в группы по назначению или общему драйверу) и, наконец, 8 бит серийного номера.

Макросы, описывающие эту структуру, расположены в <asm/ioctl.h>, _IO(type,nr) и {_IOR,_IOW,_IOWR}(type,nr,size). Они используют sizeof(size), так что говорить о размере здесь является неправильным — это третий параметр типа данных.

Заметим, что биты размера очень ненадёжны: во многих случаях они ошибочны или потому что ошибочный макрос использует sizeof(sizeof(struct)) или потому что таковы унаследованные значение.

Таким образом, мы видим, что новая структура имеет только недостатки: она не помогает в проверке, и приводит к различным значениям у разных архитектур.

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Хорошие ioctl вызовы возвращают 0 при успешном выполнении и -1 при ошибке, а любые выходные значения сохраняются в аргументе. Однако, некоторые ioctl вызовы возвращают выходное значение. Далее это пока никак не отмечено.

// Основная таблица.

// <include/asm-i386/socket.h>

0x00008901

FIOSETOWN

const int *

0x00008902

SIOCSPGRP

const int *

0x00008903

FIOGETOWN

int *

0x00008904

SIOCGPGRP

int *

0x00008905

SIOCATMAR

int *

0x00008906

SIOCGSTAMP

timeval *

// <include/asm-i386/termios.h>

0x00005401

TCGETS

struct termios *

0x00005402

TCSETS

const struct termios *

0x00005403

TCSETSW

const struct termios *

0x00005404

TCSETSF

const struct termios *

0x00005405

TCGETA

struct termio *

0x00005406

TCSETA

const struct termio *

0x00005407

TCSETAW

const struct termio *

0x00005408

TCSETAF

const struct termio *

0x00005409

TCSBRK

int

0x0000540A

TCXONC

int

0x0000540B

TCFLSH

int

0x0000540C

TIOCEXCL

void

0x0000540D

TIOCNXCL

void

0x0000540E

TIOCSCTTY

int

0x0000540F

TIOCGPGRP

pid_t *

0x00005410

TIOCSPGRP

const pid_t *

0x00005411

TIOCOUTQ

int *

0x00005412

TIOCSTI

const char *

0x00005413

TIOCGWINSZ

struct winsize *

0x00005414

TIOCSWINSZ

const struct winsize *

0x00005415

TIOCMGET

int *

0x00005416

const int *

0x00005417

TIOCMBIC

const int *

0x00005418

TIOCMSET

const int *

0x00005419

TIOCGSOFTCAR

int *

0x0000541A

TIOCSSOFTCAR

const int *

0x0000541B

FIONREAD

int *

0x0000541B

TIOCINQ

int *

0x0000541C

TIOCLINUX

const char *

// ЕЩЁ

0x0000541D

TIOCCONS

void

0x0000541E

TIOCGSERIAL

struct serial_struct *

0x0000541F

TIOCSSERIAL

const struct serial_struct *

0x00005420

TIOCPKT

const int *

0x00005421

FIONBIO

const int *

0x00005422

TIOCNOTTY

void

0x00005423

TIOCSETD

const int *

0x00005424

TIOCGETD

int *

0x00005425

TCSBRKP

int

0x00005426

TIOCTTYGSTRUCT

struct tty_struct *

0x00005450

FIONCLEX

void

0x00005451

FIOCLEX

void

0x00005452

FIOASYNC

const int *

0x00005453

TIOCSERCONFIG

void

0x00005454

TIOCSERGWILD

int *

0x00005455

TIOCSERSWILD

const int *

0x00005456

TIOCGLCKTRMIOS

struct termios *

0x00005457

TIOCSLCKTRMIOS

const struct termios *

0x00005458

TIOCSERGSTRUCT

struct async_struct *

0x00005459

TIOCSERGETLSR

int *

0x0000545A

TIOCSERGETMULTI

struct serial_multiport_struct *

0x0000545B

TIOCSERSETMULTI

const struct serial_multiport_struct *

// <include/linux/ax25.h>

0x000089E0

SIOCAX25GETUID

const struct sockaddr_ax25 *

0x000089E1

SIOCAX25ADDUID

const struct sockaddr_ax25 *

0x000089E2

SIOCAX25DELUID

const struct sockaddr_ax25 *

0x000089E3

SIOCAX25NOUID

const int *

0x000089E4

SIOCAX25DIGCTL

const int *

0x000089E5

SIOCAX25GETPARMS

struct ax25_parms_struct *

// ВВОД-ВЫВОД

0x000089E6

SIOCAX25SETPARMS

const struct ax25_parms_struct *

// <include/linux/cdk.h>

0x00007314

STL_BINTR

void

0x00007315

STL_BSTART

void

0x00007316

STL_BSTOP

void

0x00007317

STL_BRESET

void

// <include/linux/cdrom.h>

0x00005301

CDROMPAUSE

void

0x00005302

CDROMRESUME

void

0x00005303

CDROMPLAYMSF

const struct cdrom_msf *

0x00005304

CDROMPLAYTRKIND

const struct cdrom_ti *

0x00005305

CDROMREADTOCHDR

struct cdrom_tochdr *

0x00005306

CDROMREADTOCENTRY

struct cdrom_tocentry *

// ВВОД-ВЫВОД

0x00005307

CDROMSTOP

void

0x00005308

CDROMSTART

void

0x00005309

CDROMEJECT

void

0x0000530A

CDROMVOLCTRL

const struct cdrom_volctrl *

0x0000530B

CDROMSUBCHNL

struct cdrom_subchnl *

// ВВОД-ВЫВОД

0x0000530C

CDROMREADMODE2

const struct cdrom_msf *

// ЕЩЁ

0x0000530D

CDROMREADMODE1

const struct cdrom_msf *

// ЕЩЁ

0x0000530E

CDROMREADAUDIO

const struct cdrom_read_audio *

// ЕЩЁ

0x0000530F

CDROMEJECT_SW

int

0x00005310

CDROMMULTISESSION

struct cdrom_multisession *

// ВВОД-ВЫВОД

0x00005311

CDROM_GET_UPC

struct { char [8]; } *

0x00005312

CDROMRESET

void

0x00005313

CDROMVOLREAD

struct cdrom_volctrl *

0x00005314

CDROMREADRAW

const struct cdrom_msf *

// ЕЩЁ

0x00005315

CDROMREADCOOKED

const struct cdrom_msf *

// ЕЩЁ

0x00005316

CDROMSEEK

const struct cdrom_msf *

// <include/linux/cm206.h>

0x00002000

CM206CTL_GET_STAT

int

0x00002001

CM206CTL_GET_LAST_STAT

int

// <include/linux/cyclades.h>

0x00435901

CYGETMON

struct cyclades_monitor *

0x00435902

CYGETTHRESH

int *

0x00435903

CYSETTHRESH

int

0x00435904

CYGETDEFTHRESH

int *

0x00435905

CYSETDEFTHRESH

int

0x00435906

CYGETTIMEOUT

int *

0x00435907

CYSETTIMEOUT

int

0x00435908

CYGETDEFTIMEOUT

int *

0x00435909

CYSETDEFTIMEOUT

int

// <include/linux/fd.h>

0x00000000

FDCLRPRM

void

0x00000001

FDSETPRM

const struct floppy_struct *

0x00000002

FDDEFPRM

const struct floppy_struct *

0x00000003

FDGETPRM

struct floppy_struct *

0x00000004

FDMSGON

void

0x00000005

FDMSGOFF

void

0x00000006

FDFMTBEG

void

0x00000007

FDFMTTRK

const struct format_descr *

0x00000008

FDFMTEND

void

0x0000000A

FDSETEMSGTRESH

int

0x0000000B

FDFLUSH

void

0x0000000C

FDSETMAXERRS

const struct floppy_max_errors *

0x0000000E

FDGETMAXERRS

struct floppy_max_errors *

0x00000010

FDGETDRVTYP

struct { char [16]; } *

0x00000014

FDSETDRVPRM

const struct floppy_drive_params *

0x00000015

FDGETDRVPRM

struct floppy_drive_params *

0x00000016

FDGETDRVSTAT

struct floppy_drive_struct *

0x00000017

FDPOLLDRVSTAT

struct floppy_drive_struct *

0x00000018

FDRESET

int

0x00000019

FDGETFDCSTAT

struct floppy_fdc_state *

0x0000001B

FDWERRORCLR

void

0x0000001C

FDWERRORGET

struct floppy_write_errors *

0x0000001E

FDRAWCMD

struct floppy_raw_cmd *

// ЕЩЁ // ВВОД-ВЫВОД

0x00000028

FDTWADDLE

void

// <include/linux/fs.h>

0x0000125D

BLKROSET

const int *

0x0000125E

BLKROGET

int *

0x0000125F

BLKRRPART

void

0x00001260

BLKGETSIZE

unsigned long *

0x00001261

BLKFLSBUF

void

0x00001262

BLKRASET

unsigned long

0x00001263

BLKRAGET

unsigned long *

0x00000001

FIBMAP

int *

// ВВОД-ВЫВОД

0x00000002

FIGETBSZ

int *

0x80086601

FS_IOC_GETFLAGS

int *

0x40086602

FS_IOC_SETFLAGS

int *

0x80087601

FS_IOC_GETVERSION

int *

0x40087602

FS_IOC_SETVERSION

int *

0xC020660B

FS_IOC_FIEMAP

struct fiemap *

0x40086602

FS_IOC32_SETFLAGS

int *

0x40086602

FS_IOC32_SETFLAGS

int *

0x80047601

FS_IOC32_GETVERSION

int *

0x40047602

FS_IOC32_SETVERSION

int *

// <include/linux/hdreg.h>

0x00000301

HDIO_GETGEO

struct hd_geometry *

0x00000302

HDIO_GET_UNMASKINTR

int *

0x00000304

HDIO_GET_MULTCOUNT

int *

0x00000307

HDIO_GET_IDENTITY

struct hd_driveid *

0x00000308

HDIO_GET_KEEPSETTINGS

int *

0x00000309

HDIO_GET_CHIPSET

int *

0x0000030A

HDIO_GET_NOWERR

int *

0x0000030B

HDIO_GET_DMA

int *

0x0000031F

HDIO_DRIVE_CMD

int *

// ВВОД-ВЫВОД

0x00000321

HDIO_SET_MULTCOUNT

int

0x00000322

HDIO_SET_UNMASKINTR

int

0x00000323

HDIO_SET_KEEPSETTINGS

int

0x00000324

HDIO_SET_CHIPSET

int

0x00000325

HDIO_SET_NOWERR

int

0x00000326

HDIO_SET_DMA

int

// <include/linux/if_eql.h>

0x000089F0

EQL_ENSLAVE

struct ifreq *

// ЕЩЁ // ВВОД-ВЫВОД

0x000089F1

EQL_EMANCIPATE

struct ifreq *

// ЕЩЁ // ВВОД-ВЫВОД

0x000089F2

EQL_GETSLAVECFG

struct ifreq *

// ЕЩЁ // ВВОД-ВЫВОД

0x000089F3

EQL_SETSLAVECFG

struct ifreq *

// ЕЩЁ // ВВОД-ВЫВОД

0x000089F4

EQL_GETMASTRCFG

struct ifreq *

// ЕЩЁ // ВВОД-ВЫВОД

0x000089F5

EQL_SETMASTRCFG

struct ifreq *

// ЕЩЁ // ВВОД-ВЫВОД

// <include/linux/if_plip.h>

0x000089F0

SIOCDEVPLIP

struct ifreq *

// ВВОД-ВЫВОД

// <include/linux/if_ppp.h>

0x00005490

PPPIOCGFLAGS

int *

0x00005491

PPPIOCSFLAGS

const int *

0x00005492

PPPIOCGASYNCMAP

int *

0x00005493

PPPIOCSASYNCMAP

const int *

0x00005494

PPPIOCGUNIT

int *

0x00005495

PPPIOCSINPSIG

const int *

0x00005497

PPPIOCSDEBUG

const int *

0x00005498

PPPIOCGDEBUG

int *

0x00005499

PPPIOCGSTAT

struct ppp_stats *

0x0000549A

PPPIOCGTIME

struct ppp_ddinfo *

0x0000549B

PPPIOCGXASYNCMAP

struct { int [8]; } *

0x0000549C

PPPIOCSXASYNCMAP

const struct { int [8]; } *

0x0000549D

PPPIOCSMRU

const int *

0x0000549E

PPPIOCRASYNCMAP

const int *

0x0000549F

PPPIOCSMAXCID

const int *

// <include/linux/ipx.h>

0x000089E0

SIOCAIPXITFCRT

const char *

0x000089E1

SIOCAIPXPRISLT

const char *

0x000089E2

SIOCIPXCFGDATA

struct ipx_config_data *

// <include/linux/kd.h>

0x00004B60

GIO_FONT

struct { char [8192]; } *

0x00004B61

PIO_FONT

const struct { char [8192]; } *

0x00004B6B

GIO_FONTX

struct console_font_desc *

// ЕЩЁ // ВВОД-ВЫВОД

0x00004B6C

PIO_FONTX

const struct console_font_desc *

// ЕЩЁ

0x00004B70

GIO_CMAP

struct { char [48]; } *

0x00004B71

PIO_CMAP

const struct { char [48]; }

0x00004B2F

KIOCSOUND

int

0x00004B30

KDMKTONE

int

0x00004B31

KDGETLED

char *

0x00004B32

KDSETLED

int

0x00004B33

KDGKBTYPE

char *

0x00004B34

KDADDIO

int

// ЕЩЁ

0x00004B35

KDDELIO

int

// ЕЩЁ

0x00004B36

KDENABIO

void

// ЕЩЁ

0x00004B37

KDDISABIO

void

// ЕЩЁ

0x00004B3A

KDSETMODE

int

0x00004B3B

KDGETMODE

int *

0x00004B3C

KDMAPDISP

void

// ЕЩЁ

0x00004B3D

KDUNMAPDISP

void

// ЕЩЁ

0x00004B40

GIO_SCRNMAP

struct { char [E_TABSZ]; } *

0x00004B41

PIO_SCRNMAP

const struct { char [E_TABSZ]; } *

0x00004B69

GIO_UNISCRNMAP

struct { short [E_TABSZ]; } *

0x00004B6A

PIO_UNISCRNMAP

const struct { short [E_TABSZ]; } *

0x00004B66

GIO_UNIMAP

struct unimapdesc *

// ЕЩЁ // ВВОД-ВЫВОД

0x00004B67

PIO_UNIMAP

const struct unimapdesc *

// ЕЩЁ

0x00004B68

PIO_UNIMAPCLR

const struct unimapinit *

0x00004B44

KDGKBMODE

int *

0x00004B45

KDSKBMODE

int

0x00004B62

KDGKBMETA

int *

0x00004B63

KDSKBMETA

int

0x00004B64

KDGKBLED

int *

0x00004B65

KDSKBLED

int

0x00004B46

KDGKBENT

struct kbentry *

// ВВОД-ВЫВОД

0x00004B47

KDSKBENT

const struct kbentry *

0x00004B48

KDGKBSENT

struct kbsentry *

// ВВОД-ВЫВОД

0x00004B49

KDSKBSENT

const struct kbsentry *

0x00004B4A

KDGKBDIACR

struct kbdiacrs *

0x00004B4B

KDSKBDIACR

const struct kbdiacrs *

0x00004B4C

KDGETKEYCODE

struct kbkeycode *

// ВВОД-ВЫВОД

0x00004B4D

KDSETKEYCODE

const struct kbkeycode *

0x00004B4E

KDSIGACCEPT

int

// <include/linux/lp.h>

0x00000601

LPCHAR

int

0x00000602

LPTIME

int

0x00000604

LPABORT

int

0x00000605

LPSETIRQ

int

0x00000606

LPGETIRQ

int *

0x00000608

LPWAIT

int

0x00000609

LPCAREFUL

int

0x0000060A

LPABORTOPEN

int

0x0000060B

LPGETSTATUS

int *

0x0000060C

LPRESET

void

0x0000060D

LPGETSTATS

struct lp_stats *

// <include/linux/mroute.h>

0x000089E0

SIOCGETVIFCNT

struct sioc_vif_req *

// ВВОД-ВЫВОД

0x000089E1

SIOCGETSGCNT

struct sioc_sg_req *

// ВВОД-ВЫВОД

// <include/linux/msdos_fs.h> смотрите ioctl_fat(2)

0x82307201

VFAT_IOCTL_READDIR_BOTH

struct dirent [2]

0x82307202

VFAT_IOCTL_READDIR_SHORT

struct dirent [2]

0x80047210

FAT_IOCTL_GET_ATTRIBUTES

__u32 *

0x40047211

FAT_IOCTL_SET_ATTRIBUTES

const __u32 *

0x80047213

FAT_IOCTL_GET_VOLUME_ID

__u32 *

// <include/linux/mtio.h>

0x40086D01

MTIOCTOP

const struct mtop *

0x801C6D02

MTIOCGET

struct mtget *

0x80046D03

MTIOCPOS

struct mtpos *

0x80206D04

MTIOCGETCONFIG

struct mtconfiginfo *

0x40206D05

MTIOCSETCONFIG

const struct mtconfiginfo *

// <include/linux/netrom.h>

0x000089E0

SIOCNRGETPARMS

struct nr_parms_struct *

// ВВОД-ВЫВОД

0x000089E1

SIOCNRSETPARMS

const struct nr_parms_struct *

0x000089E2

SIOCNRDECOBS

void

0x000089E3

SIOCNRRTCTL

const int *

// <include/uapi/linux/wireless.h>

// Данный программный интерфейс устарел.

// Он заменён на nl80211 и cfg80211. Смотрите

// https://wireless.wiki.kernel.org/en/developers/documentation/nl80211

x00008b00

SIOCSIWCOMMIT

struct iwreq *

x00008b01

SIOCGIWNAME

struct iwreq *

x00008b02

SIOCSIWNWID

struct iwreq *

x00008b03

SIOCGIWNWID

struct iwreq *

x00008b04

SIOCSIWFREQ

struct iwreq *

x00008b05

SIOCGIWFREQ

struct iwreq *

x00008b06

SIOCSIWMODE

struct iwreq *

x00008b07

SIOCGIWMODE

struct iwreq *

x00008b08

SIOCSIWSENS

struct iwreq *

x00008b09

SIOCGIWSENS

struct iwreq *

x00008b0a

SIOCSIWRANGE

struct iwreq *

x00008b0b

SIOCGIWRANGE

struct iwreq *

x00008b0c

SIOCSIWPRIV

struct iwreq *

x00008b0d

SIOCGIWPRIV

struct iwreq *

x00008b0e

SIOCSIWSTATS

struct iwreq *

x00008b0f

SIOCGIWSTATS

struct iwreq *

x00008b10

SIOCSIWSPY

struct iwreq *

x00008b11

SIOCGIWSPY

struct iwreq *

x00008b12

SIOCSIWTHRSPY

struct iwreq *

x00008b13

SIOCGIWTHRSPY

struct iwreq *

x00008b14

SIOCSIWAP

struct iwreq *

x00008b15

SIOCGIWAP

struct iwreq *

x00008b17

SIOCGIWAPLIST

struct iwreq *

x00008b18

SIOCSIWSCAN

struct iwreq *

x00008b19

SIOCGIWSCAN

struct iwreq *

x00008b1a

SIOCSIWESSID

struct iwreq *

x00008b1b

SIOCGIWESSID

struct iwreq *

x00008b1c

SIOCSIWNICKN

struct iwreq *

x00008b1d

SIOCGIWNICKN

struct iwreq *

x00008b20

SIOCSIWRATE

struct iwreq *

x00008b21

SIOCGIWRATE

struct iwreq *

x00008b22

SIOCSIWRTS

struct iwreq *

x00008b23

SIOCGIWRTS

struct iwreq *

x00008b24

SIOCSIWFRAG

struct iwreq *

x00008b25

SIOCGIWFRAG

struct iwreq *

x00008b26

SIOCSIWTXPOW

struct iwreq *

x00008b27

SIOCGIWTXPOW

struct iwreq *

x00008b28

SIOCSIWRETRY

struct iwreq *

x00008b29

SIOCGIWRETRY

struct iwreq *

x00008b2a

SIOCSIWENCODE

struct iwreq *

x00008b2b

SIOCGIWENCODE

struct iwreq *

x00008b2c

SIOCSIWPOWER

struct iwreq *

x00008b2d

SIOCGIWPOWER

struct iwreq *

x00008b30

SIOCSIWGENIE

struct iwreq *

x00008b31

SIOCGIWGENIE

struct iwreq *

x00008b16

SIOCSIWMLME

struct iwreq *

x00008b32

SIOCSIWAUTH

struct iwreq *

x00008b33

SIOCGIWAUTH

struct iwreq *

x00008b34

SIOCSIWENCODEEXT

struct iwreq *

x00008b35

SIOCGIWENCODEEXT

struct iwreq *

x00008b36

SIOCSIWPMKSA

struct iwreq *

// <include/linux/sbpcd.h>

0x00009000

DDIOCSDBG

const int *

0x00005382

CDROMAUDIOBUFSIZ

int

// <include/linux/scc.h>

0x00005470

TIOCSCCINI

void

0x00005471

TIOCCHANINI

const struct scc_modem *

0x00005472

TIOCGKISS

struct ioctl_command *

// ВВОД-ВЫВОД

0x00005473

TIOCSKISS

const struct ioctl_command *

0x00005474

TIOCSCCSTAT

struct scc_stat *

// <include/linux/scsi.h>

0x00005382

SCSI_IOCTL_GET_IDLUN struct { int [2]; } *

0x00005383

SCSI_IOCTL_TAGGED_ENABLE void

0x00005384

SCSI_IOCTL_TAGGED_DISABLE void

0x00005385

SCSI_IOCTL_PROBE_HOST

const int *

// ЕЩЁ

// <include/linux/smb_fs.h>

0x80027501

SMB_IOC_GETMOUNTUID

uid_t *

// <include/uapi/linux/sockios.h> смотрите netdevice(7)

0x0000890B

SIOCADDRT

const struct rtentry *

// ЕЩЁ

0x0000890C

SIOCDELRT

const struct rtentry *

// ЕЩЁ

0x00008910

SIOCGIFNAME

char []

0x00008911

SIOCSIFLINK

void

0x00008912

SIOCGIFCONF

struct ifconf *

// ЕЩЁ // ВВОД-ВЫВОД

0x00008913

SIOCGIFFLAGS

struct ifreq *

// ВВОД-ВЫВОД

0x00008914

SIOCSIFFLAGS

const struct ifreq *

0x00008915

SIOCGIFADDR

struct ifreq *

// ВВОД-ВЫВОД

0x00008916

SIOCSIFADDR

const struct ifreq *

0x00008917

SIOCGIFDSTADDR

struct ifreq *

// ВВОД-ВЫВОД

0x00008918

SIOCSIFDSTADDR

const struct ifreq *

0x00008919

SIOCGIFBRDADDR

struct ifreq *

// ВВОД-ВЫВОД

0x0000891A

SIOCSIFBRDADDR

const struct ifreq *

0x0000891B

SIOCGIFNETMASK

struct ifreq *

// ВВОД-ВЫВОД

0x0000891C

SIOCSIFNETMASK

const struct ifreq *

0x0000891D

SIOCGIFMETRIC

struct ifreq *

// ВВОД-ВЫВОД

0x0000891E

SIOCSIFMETRIC

const struct ifreq *

0x0000891F

SIOCGIFMEM

struct ifreq *

// ВВОД-ВЫВОД

0x00008920

SIOCSIFMEM

const struct ifreq *

0x00008921

SIOCGIFMTU

struct ifreq *

// ВВОД-ВЫВОД

0x00008922

SIOCSIFMTU

const struct ifreq *

0x00008923

OLD_SIOCGIFHWADDR

struct ifreq *

// ВВОД-ВЫВОД

0x00008924

SIOCSIFHWADDR

const struct ifreq *

// ЕЩЁ

0x00008925

SIOCGIFENCAP

int *

0x00008926

SIOCSIFENCAP

const int *

0x00008927

SIOCGIFHWADDR

struct ifreq *

// ВВОД-ВЫВОД

0x00008929

SIOCGIFSLAVE

void

0x00008930

SIOCSIFSLAVE

void

0x00008931

SIOCADDMULTI

const struct ifreq *

0x00008932

SIOCDELMULTI

const struct ifreq *

0x00008940

SIOCADDRTOLD

void

0x00008941

SIOCDELRTOLD

void

0x00008950

SIOCDARP

const struct arpreq *

0x00008951

SIOCGARP

struct arpreq *

// ВВОД-ВЫВОД

0x00008952

SIOCSARP

const struct arpreq *

0x00008960

SIOCDRARP

const struct arpreq *

0x00008961

SIOCGRARP

struct arpreq *

// ВВОД-ВЫВОД

0x00008962

SIOCSRARP

const struct arpreq *

0x00008970

SIOCGIFMAP

struct ifreq *

// ВВОД-ВЫВОД

0x00008971

SIOCSIFMAP

const struct ifreq *

// <include/linux/soundcard.h>

0x00005100

SNDCTL_SEQ_RESET

void

0x00005101

SNDCTL_SEQ_SYNC

void

0xC08C5102

SNDCTL_SYNTH_INFO

struct synth_info *

// ВВОД-ВЫВОД

0xC0045103

SNDCTL_SEQ_CTRLRATE

int *

// ВВОД-ВЫВОД

0x80045104

SNDCTL_SEQ_GETOUTCOUNT

int *

0x80045105

SNDCTL_SEQ_GETINCOUNT

int *

0x40045106

SNDCTL_SEQ_PERCMODE

void

0x40285107

SNDCTL_FM_LOAD_INSTR

const struct sbi_instrument *

0x40045108

SNDCTL_SEQ_TESTMIDI

const int *

0x40045109

SNDCTL_SEQ_RESETSAMPLES

const int *

0x8004510A

SNDCTL_SEQ_NRSYNTHS

int *

0x8004510B

SNDCTL_SEQ_NRMIDIS

int *

0xC074510C

SNDCTL_MIDI_INFO

struct midi_info *

// ВВОД-ВЫВОД

0x4004510D

SNDCTL_SEQ_THRESHOLD

const int *

0xC004510E

SNDCTL_SYNTH_MEMAVL

int *

// ВВОД-ВЫВОД

0x4004510F

SNDCTL_FM_4OP_ENABLE

const int *

0xCFB85110

SNDCTL_PMGR_ACCESS

struct patmgr_info *

// ВВОД-ВЫВОД

0x00005111

SNDCTL_SEQ_PANIC

void

0x40085112

SNDCTL_SEQ_OUTOFBAND

const struct seq_event_rec *

0xC0045401

SNDCTL_TMR_TIMEBASE

int *

// ВВОД-ВЫВОД

0x00005402

SNDCTL_TMR_START

void

0x00005403

SNDCTL_TMR_STOP

void

0x00005404

SNDCTL_TMR_CONTINUE

void

0xC0045405

SNDCTL_TMR_TEMPO

int *

// ВВОД-ВЫВОД

0xC0045406

SNDCTL_TMR_SOURCE

int *

// ВВОД-ВЫВОД

0x40045407

SNDCTL_TMR_METRONOME

const int *

0x40045408

SNDCTL_TMR_SELECT

int *

// ВВОД-ВЫВОД

0xCFB85001

SNDCTL_PMGR_IFACE

struct patmgr_info *

// ВВОД-ВЫВОД

0xC0046D00

SNDCTL_MIDI_PRETIME

int *

// ВВОД-ВЫВОД

0xC0046D01

SNDCTL_MIDI_MPUMODE

const int *

0xC0216D02

SNDCTL_MIDI_MPUCMD

struct mpu_command_rec *

// ВВОД-ВЫВОД

0x00005000

SNDCTL_DSP_RESET

void

0x00005001

SNDCTL_DSP_SYNC

void

0xC0045002

SNDCTL_DSP_SPEED

int *

// ВВОД-ВЫВОД

0xC0045003

SNDCTL_DSP_STEREO

int *

// ВВОД-ВЫВОД

0xC0045004

SNDCTL_DSP_GETBLKSIZE

int *

// ВВОД-ВЫВОД

0xC0045006

SOUND_PCM_WRITE_CHANNELS

int *

// ВВОД-ВЫВОД

0xC0045007

SOUND_PCM_WRITE_FILTER

int *

// ВВОД-ВЫВОД

0x00005008

SNDCTL_DSP_POST

void

0xC0045009

SNDCTL_DSP_SUBDIVIDE

int *

// ВВОД-ВЫВОД

0xC004500A

SNDCTL_DSP_SETFRAGMENT

int *

// ВВОД-ВЫВОД

0x8004500B

SNDCTL_DSP_GETFMTS

int *

0xC0045005

SNDCTL_DSP_SETFMT

int *

// ВВОД-ВЫВОД

0x800C500C

SNDCTL_DSP_GETOSPACE

struct audio_buf_info *

0x800C500D

SNDCTL_DSP_GETISPACE

struct audio_buf_info *

0x0000500E

SNDCTL_DSP_NONBLOCK

void

0x80045002

SOUND_PCM_READ_RATE

int *

0x80045006

SOUND_PCM_READ_CHANNELS

int *

0x80045005

SOUND_PCM_READ_BITS

int *

0x80045007

SOUND_PCM_READ_FILTER

int *

0x00004300

SNDCTL_COPR_RESET

void

0xCFB04301

SNDCTL_COPR_LOAD

const struct copr_buffer *

0xC0144302

SNDCTL_COPR_RDATA

struct copr_debug_buf *

// ВВОД-ВЫВОД

0xC0144303

SNDCTL_COPR_RCODE

struct copr_debug_buf *

// ВВОД-ВЫВОД

0x40144304

SNDCTL_COPR_WDATA

const struct copr_debug_buf *

0x40144305

SNDCTL_COPR_WCODE

const struct copr_debug_buf *

0xC0144306

SNDCTL_COPR_RUN

struct copr_debug_buf *

// ВВОД-ВЫВОД

0xC0144307

SNDCTL_COPR_HALT

struct copr_debug_buf *

// ВВОД-ВЫВОД

0x4FA44308

SNDCTL_COPR_SENDMSG

const struct copr_msg *

0x8FA44309

SNDCTL_COPR_RCVMSG

struct copr_msg *

0x80044D00

SOUND_MIXER_READ_VOLUME

int *

0x80044D01

SOUND_MIXER_READ_BASS

int *

0x80044D02

SOUND_MIXER_READ_TREBLE

int *

0x80044D03

SOUND_MIXER_READ_SYNTH

int *

0x80044D04

SOUND_MIXER_READ_PCM

int *

0x80044D05

SOUND_MIXER_READ_SPEAKER

int *

0x80044D06

SOUND_MIXER_READ_LINE

int *

0x80044D07

SOUND_MIXER_READ_MIC

int *

0x80044D08

SOUND_MIXER_READ_CD

int *

0x80044D09

SOUND_MIXER_READ_IMIX

int *

0x80044D0A

SOUND_MIXER_READ_ALTPCM

int *

0x80044D0B

SOUND_MIXER_READ_RECLEV

int *

0x80044D0C

SOUND_MIXER_READ_IGAIN

int *

0x80044D0D

SOUND_MIXER_READ_OGAIN

int *

0x80044D0E

SOUND_MIXER_READ_LINE1

int *

0x80044D0F

SOUND_MIXER_READ_LINE2

int *

0x80044D10

SOUND_MIXER_READ_LINE3

int *

0x80044D1C

SOUND_MIXER_READ_MUTE

int *

0x80044D1D

SOUND_MIXER_READ_ENHANCE

int *

0x80044D1E

SOUND_MIXER_READ_LOUD

int *

0x80044DFF

SOUND_MIXER_READ_RECSRC

int *

0x80044DFE

SOUND_MIXER_READ_DEVMASK

int *

0x80044DFD

SOUND_MIXER_READ_RECMASK

int *

0x80044DFB

SOUND_MIXER_READ_STEREODEVS

int *

0x80044DFC

SOUND_MIXER_READ_CAPS

int *

0xC0044D00

SOUND_MIXER_WRITE_VOLUME

int *

// ВВОД-ВЫВОД

0xC0044D01

SOUND_MIXER_WRITE_BASS

int *

// ВВОД-ВЫВОД

0xC0044D02

SOUND_MIXER_WRITE_TREBLE

int *

// ВВОД-ВЫВОД

0xC0044D03

SOUND_MIXER_WRITE_SYNTH

int *

// ВВОД-ВЫВОД

0xC0044D04

SOUND_MIXER_WRITE_PCM

int *

// ВВОД-ВЫВОД

0xC0044D05

SOUND_MIXER_WRITE_SPEAKER

int *

// ВВОД-ВЫВОД

0xC0044D06

SOUND_MIXER_WRITE_LINE

int *

// ВВОД-ВЫВОД

0xC0044D07

SOUND_MIXER_WRITE_MIC

int *

// ВВОД-ВЫВОД

0xC0044D08

SOUND_MIXER_WRITE_CD

int *

// ВВОД-ВЫВОД

0xC0044D09

SOUND_MIXER_WRITE_IMIX

int *

// ВВОД-ВЫВОД

0xC0044D0A

SOUND_MIXER_WRITE_ALTPCM

int *

// ВВОД-ВЫВОД

0xC0044D0B

SOUND_MIXER_WRITE_RECLEV

int *

// ВВОД-ВЫВОД

0xC0044D0C

SOUND_MIXER_WRITE_IGAIN

int *

// ВВОД-ВЫВОД

0xC0044D0D

SOUND_MIXER_WRITE_OGAIN

int *

// ВВОД-ВЫВОД

0xC0044D0E

SOUND_MIXER_WRITE_LINE1

int *

// ВВОД-ВЫВОД

0xC0044D0F

SOUND_MIXER_WRITE_LINE2

int *

// ВВОД-ВЫВОД

0xC0044D10

SOUND_MIXER_WRITE_LINE3

int *

// ВВОД-ВЫВОД

0xC0044D1C

SOUND_MIXER_WRITE_MUTE

int *

// ВВОД-ВЫВОД

0xC0044D1D

SOUND_MIXER_WRITE_ENHANCE

int *

// ВВОД-ВЫВОД

0xC0044D1E

SOUND_MIXER_WRITE_LOUD

int *

// ВВОД-ВЫВОД

0xC0044DFF

SOUND_MIXER_WRITE_RECSRC

int *

// ВВОД-ВЫВОД

// <include/linux/timerfd.h> смотрите timerfd_create(2)

0x40085400

TFD_IOC_SET_TICKS

uint64_t *

// <include/linux/umsdos_fs.h>

0x000004D2

UMSDOS_READDIR_DOS

struct umsdos_ioctl *

// ВВОД-ВЫВОД

0x000004D3

UMSDOS_UNLINK_DOS

const struct umsdos_ioctl *

0x000004D4

UMSDOS_RMDIR_DOS

const struct umsdos_ioctl *

0x000004D5

UMSDOS_STAT_DOS

struct umsdos_ioctl *

// ВВОД-ВЫВОД

0x000004D6

UMSDOS_CREAT_EMD

const struct umsdos_ioctl *

0x000004D7

UMSDOS_UNLINK_EMD

const struct umsdos_ioctl *

0x000004D8

UMSDOS_READDIR_EMD

struct umsdos_ioctl *

// ВВОД-ВЫВОД

0x000004D9

UMSDOS_GETVERSION

struct umsdos_ioctl *

0x000004DA

UMSDOS_INIT_EMD

void

0x000004DB

UMSDOS_DOS_SETUP

const struct umsdos_ioctl *

0x000004DC

UMSDOS_RENAME_DOS

const struct umsdos_ioctl *

// <include/linux/vt.h>

0x00005600

VT_OPENQRY

int *

0x00005601

VT_GETMODE

struct vt_mode *

0x00005602

VT_SETMODE

const struct vt_mode *

0x00005603

VT_GETSTATE

struct vt_stat *

0x00005604

VT_SENDSIG

void

0x00005605

VT_RELDISP

int

0x00005606

VT_ACTIVATE

int

0x00005607

VT_WAITACTIVE

int

0x00005608

VT_DISALLOCATE

int

0x00005609

VT_RESIZE

const struct vt_sizes *

0x0000560A

VT_RESIZEX

const struct vt_consize *

// Дополнительные аргументы (MORE). Некоторые ioctl вызовы в качестве аргумента ожидают указатель на структуру, которая содержит дополнительные указатели. Такие вызовы описаны здесь в алфавитном порядке.

CDROMREADAUDIO берёт входной указатель const struct cdrom_read_audio *. Поле buf указывает на выходной буфер длиной nframes * CD_FRAMESIZE_RAW.

CDROMREADCOOKED, CDROMREADMODE1, CDROMREADMODE2 и CDROMREADRAW берут входной указатель const struct cdrom_msf *. Они используют такой же указатель в качестве выходного указателя на char []. Длина определяется запросом. Для CDROMREADMODE1 большинство драйверов использует CD_FRAMESIZE, но драйвер Optics Storage использует OPT_BLOCKSIZE (оба имеют числовое значение 2048).

```
    CDROMREADCOOKED    char [CD_FRAMESIZE]

    CDROMREADMODE1     char [CD_FRAMESIZE или OPT_BLOCKSIZE]

    CDROMREADMODE2     char [CD_FRAMESIZE_RAW0]

    CDROMREADRAW       char [CD_FRAMESIZE_RAW]
```

EQL_ENSLAVE, EQL_EMANCIPATE, EQL_GETSLAVECFG, EQL_SETSLAVECFG, EQL_GETMASTERCFG и EQL_SETMASTERCFG берут struct ifreq *. Поле ifr_data является указателем на другую структуру:

```
    EQL_ENSLAVE         const struct slaving_request *

    EQL_EMANCIPATE      const struct slaving_request *

    EQL_GETSLAVECFG     struct slave_config *           // I-O

    EQL_SETSLAVECFG     const struct slave_config *

    EQL_GETMASTERCFG    struct master_config *

    EQL_SETMASTERCFG    const struct master_config *
```

FDRAWCMD берёт struct floppy raw_cmd *. Если flags & FD_RAW_WRITE не ноль, то data указывает на входной буфер длиной length. Если flags & FD_RAW_READ не ноль, то data указывает на выходной буфер длиной length.

GIO_FONTX и PIO_FONTX берут struct console_font_desc * или const struct console_font_desc *, соответственно. chardata указывает на буфер char [charcount]. Это выходной буфер для GIO_FONTX и входной буфер для PIO_FONTX.

GIO_UNIMAP и PIO_UNIMAP берут struct unimapdesc * или const struct unimapdesc *, соответственно. entries указывает на буфер struct unipair [entry_ct]. Это выходной буфер для GIO_UNIMAP и входной буфер для PIO_UNIMAP.

KDADDIO, KDDELIO, KDDISABIO и KDENABIO разрешают или запрещают доступ к портам ввода/вывода. Они являются необходимыми альтернативными интерфейсами к «ioperm».

KDMAPDISP и KDUNMAPDISP разрешают или запрещают отображение памяти или доступ к порту ввода/вывода. Они не реализованы в ядре.

SCSI_IOCTL_PROBE_HOST берёт входной указатель const int *, который является длиной. Он использует такой же указатель как выходной указатель на буфер char [] этой длины.

SIOCADDRT и SIOCDELRT берут входной указатель, чей тип зависит от протокола:

```
    Большинство протоколов  const struct rtentry *

    AX.25                   const struct ax25_route *

    NET/ROM                 const struct nr_route_struct *

    INET6                   const struct in6_rtmsg *
```

SIOCGIFCONF берёт struct ifconf *. Поле ifc_buf указывает на буфер длиной ifc_len байт, в который ядро пишет список типов type struct ifreq [].

SIOCSIFHWADDR берёт входной указатель, чей тип зависит от протокола:

```
    большинство протоколов      const struct ifreq *

    AX.25                       const char [AX25_ADDR_LEN]
```

TIOCLINUX берёт const char *. Он использует его для того, чтобы разделить некоторые независимые подоперации. В таблице ниже, N + foo означает foo после N начальных байт. struct selection неявно определена в drivers/char/selection.c

```
    TIOCLINUX-2         1 + const struct selection *

    TIOCLINUX-3         void

    TIOCLINUX-4         void

    TIOCLINUX-5         4 + const struct { long [8]; } *

    TIOCLINUX-6         char *

    TIOCLINUX-7         char *

    TIOCLINUX-10        1 + const char *
```

// Дублирующие вызовы ioctls

Этот список не включает ioctl вызовы в диапазоне SIOCDEVPRIVATE и SIOCPROTOPRIVATE.

0x00000001

FDSETPRM

FIBMAP

0x00000002

FDDEFPRM

FIGETBSZ

0x00005382

CDROMAUDIOBUFSIZ

SCSI_IOCTL_GET_IDLUN

0x00005402

SNDCTL_TMR_START

TCSETS

0x00005403

SNDCTL_TMR_STOP

TCSETSW

0x00005404

SNDCTL_TMR_CONTINUE

TCSETSF

## СМОТРИТЕ ТАКЖЕ
ioctl(2), ioctl_fat(2), netdevice(7)


title: ioctl_ns(2)

text:
# ioctl_ns(2)

## ИМЯ
ioctl_ns - операции ioctl() для пространств имён Linux

## ОПИСАНИЕ

### Определение отношений между пространствами имён
Следующие операции ioctl(2) позволяют определить порядок отношений между пространствами имён (смотрите user_namespaces(7) и pid_namespaces(7)). Форма вызовов:

```
new_fd = ioctl(fd, request);
```

Здесь в каждом случае fd ссылается на файл /proc/[pid]/ns/*. При успешном выполнении обе операции возвращают новый файловый дескриптор.

NS_GET_USERNS (начиная с Linux 4.9)

Возвращает файловый дескриптор, ссылающийся на пространство имён пользователя, которое владеет пространством имён, на которое ссылается fd.

NS_GET_PARENT (начиная с Linux 4.9)

Возвращает файловый дескриптор, который ссылается на родительское пространство имён для пространства имён, на которое ссылается fd. Эта операция допускается только, для иерархических пространств имён (т. е., PID и пространства имён пользователя). Для пространств имён пользователя NS_GET_PARENT является синонимом NS_GET_USERNS.

Новый файловый дескриптор, возвращаемый этими операциями, открывается с флагами O_RDONLY и O_CLOEXEC (close-on-exec; смотрите fcntl(2)).

Применив fstat(2) к возвращаемому файловому дескриптору, можно получить структуру stat, в которой поля st_dev (подлежащее устройство) и st_ino (номер иноды) вместе отождествляют владельческое/родительское пространство имён. Этот номер иноды можно сравнить с номером иноды другого файла /proc/[pid]/ns/{pid,user}, чтобы определить то же ли это владельческое/родительское пространство имён.

Эти операции ioctl(2) могут завершаться со следующими ошибками:

EPERM

Запрошенное пространство имён лежит вне области пространств имён вызывающего. Эта ошибка может случиться, если, например, владельческое пространство имён является предком текущего пространства имён пользователя вызывающего. Также она может возникнуть при попытке получить родителя первоначального пространства имён пользователя или PID.

ENOTTY

Операция не поддерживается в этой версии ядра.

Также, операция NS_GET_PARENT может завершиться со следующей ошибкой:

EINVAL

Значение fd ссылается на не иерархическое пространство имён.

Использование этих операций смотрите в разделе ПРИМЕРЫ.

### Определение типа пространства имён
Операция NS_GET_NSTYPE (доступна, начиная с Linux 4.11) позволяет определять тип пространства имён, на которое ссылается файловый дескриптор fd:

```
nstype = ioctl(fd, NS_GET_NSTYPE);
```

Значение fd ссылается на файл /proc/[pid]/ns/*.

Возвращаемым значением является одно из CLONE_NEW*, которое может указываться clone(2) или unshare(2) для создания пространства имён.

### Определение владельца пространства имён пользователя
Операция NS_GET_OWNER_UID (доступна, начиная с Linux 4.11) позволяет определять пользовательский ID владельца пространства имён пользователя (т. е., эффективный пользовательский ID процесса, который создал пространство имён пользователя). Формат вызова:

```
uid_t uid;
ioctl(fd, NS_GET_OWNER_UID, &uid);
```

Значение fd ссылается на файл /proc/[pid]/ns/user.

Возвращаемый пользовательский ID владельца находится в третьем аргументе с типом uid_t.

Данная операция может завершиться со следующей ошибкой:

EINVAL

Значение fd не ссылается на пространство имён пользователя.

## ОШИБКИ
Любая из этих операций ioctl() может завершаться со следующими ошибками:

ENOTTY

Значение fd не ссылается на файл /proc/[pid]/ns/*.

## СООТВЕТСТВИЕ СТАНДАРТАМ
Пространства имён и операции, описанные здесь, есть только в Linux.

## ПРИМЕР
В примере, показанном ниже, используются описанные выше операции ioctl(2), с помощью которых определяются отношения между пространствами имён. Далее показаны сценарии запуска этой программы.

Попытка определить родителя изначального пространства имён пользователя завершается ошибкой, так как родителя нет:

```
$ ./ns_show /proc/self/ns/user p
Родительское пространство имён находится вне области вашего пространства имён
```

Создаётся процесс, выполняющий sleep(1), который располагается в новом пространстве имён пользователя и UTS, и показывается, что новое пространство имён UTS связано с новым пространством имён пользователя:

```
$ unshare -Uu sleep 1000 &
[1] 23235
$ ./ns_show /proc/23235/ns/uts u
Устройство/инода, владеющая пространством имён пользователя: [0,3] / 4026532448
$ readlink /proc/23235/ns/user
user:[4026532448]
```

Теперь покажем, что родителем нового пространства имён пользователя из предыдущего примера является начальное пространство имён пользователя:

```
$ readlink /proc/self/ns/user
user:[4026531837]
$ ./ns_show /proc/23235/ns/user p
Устройство/инода родительского пространства имён: [0,3] / 4026531837
```

Запустим оболочку в новом пространстве имён пользователя и покажем, что внутри оболочки родительское пространство имён пользователя невозможно определить. Также невозможно определить пространство имён UTS (которое связано с изначальным пространством имён пользователя).

```
$ PS1="sh2$ " unshare -U bash
sh2$ ./ns_show /proc/self/ns/user p
Родительское пространство имён находится вне области вашего пространства имён
sh2$ ./ns_show /proc/self/ns/uts u
Владеющее пространство имён пользователя находится вне области вашего пространства имён
```

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

```
/* ns_show.c

   Лицензируется под GNU General Public License v2 или новее.
*/
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <errno.h>
#include <sys/sysmacros.h>
#ifndef NS_GET_USERNS
#define NSIO    0xb7
#define NS_GET_USERNS   _IO(NSIO, 0x1)
#define NS_GET_PARENT   _IO(NSIO, 0x2)
#endif
int
main(int argc, char *argv[])
{

    int fd, userns_fd, parent_fd;

    struct stat sb;

    if (argc < 2) {

        fprintf(stderr, "Использование: %s /proc/[pid]/ns/[файл] [p|u]\n",

                argv[0]);

        fprintf(stderr, "\nПоказывает результат одной или обеих"

                "операций NS_GET_USERNS (u) и NS_GET_PARENT (p)\n"

                "для заданного /proc/[pid]/ns/[файла]. Если не указано"

                "'p' или 'u', то\n"

                "используется NS_GET_USERNS.\n");

        exit(EXIT_FAILURE);

    }

    /* получаем файловый дескриптор для файла 'ns', указанного

       в argv[1] */

    fd = open(argv[1], O_RDONLY);

    if (fd == -1) {

        perror("open");

        exit(EXIT_FAILURE);

    }

    /* получаем файловый дескриптор владельческого пространства

       имён пользователя и затем показываем номер иноды

       этого пространства имён */

    if (argc < 3 || strchr(argv[2], 'u')) {

        userns_fd = ioctl(fd, NS_GET_USERNS);

        if (userns_fd == -1) {

            if (errno == EPERM)

                printf("Родительское пространство имён находится "

                        "вне области вашего пространства имён\n");

            else

               perror("ioctl-NS_GET_USERNS");

            exit(EXIT_FAILURE);

         }

        if (fstat(userns_fd, &sb) == -1) {

            perror("fstat-userns");

            exit(EXIT_FAILURE);

        }

        printf("Устройство/инода, владеющая пространством имён пользователя: "

                "[%lx,%lx] / %ld\n",

                (long) major(sb.st_dev), (long) minor(sb.st_dev),

                (long) sb.st_ino);

        close(userns_fd);

    }

    /* получаем файловый дескриптор родительского пространства

       имён пользователя и затем показываем номер иноды

       этого пространства имён */

    if (argc > 2 && strchr(argv[2], 'p')) {

        parent_fd = ioctl(fd, NS_GET_PARENT);

        if (parent_fd == -1) {

            if (errno == EINVAL)

                printf("Невозможно получить родительское пространство имён"

                        "не иерархического пространства имён\n");

            else if (errno == EPERM)

                printf("Родительское пространство имён находится"

                        "вне области вашего пространства имён\n");

            else

                perror("ioctl-NS_GET_PARENT");

            exit(EXIT_FAILURE);

        }

        if (fstat(parent_fd, &sb) == -1) {

            perror("fstat-parentns");

            exit(EXIT_FAILURE);

        }

        printf("Устройство/инода родительского пространства имён: [%lx,%lx] / %ld\n",

                (long) major(sb.st_dev), (long) minor(sb.st_dev),

                (long) sb.st_ino);

        close(parent_fd);

    }

    exit(EXIT_SUCCESS);
}
```

## СМОТРИТЕ ТАКЖЕ
fstat(2), ioctl(2), proc(5), namespaces(7)