RESMGR_OCB_T *ocb)
Классификация: Функция ввода/вывода
Обработчик по умолчанию: iofunc_pathconf_default()
Вспомогательные функции: iofunc_pathconf()
Клиентская функция: fpathconf(), pathconf()
Сообщения: IO_PATHCONF
Структура данных:
struct _io_pathconf {
uint16_t type;
uint16_t combine_len;
short name;
uint16_t zero;
};
typedef union {
struct _io_pathconf i;
] io_pathconf_t;
Описание: Обработчик этого сообщения отвечает за возврат значения настраиваемого параметра name для ресурса, связанного с данным OCB. Используйте функцию по умолчанию и расширьте ее дополнительными вариантами элемента name, соответствующими вашему устройству.
Возвращает: Код завершения, при помощи вспомогательного макроса _IO_SET_PATHCONF_VALUE; флаги возвращаются в ответном сообщении.
int io_read(resmgr_context_t *ctp, io_read_t *msg,
RESMGR_OCB_T *ocb)
Классификация: Функция ввода/вывода
Обработчик по умолчанию: iofunc_read_default()
Вспомогательные функции: iofunc_read(), iofunc_read_verify()
Клиентская функция: read(), readdir()
Сообщение: IO_READ
Структура данных:
struct _io_read {
uint16_t type;
uint16_t combine_len;
int32_t nbytes;
uint32_t xtype;
};
typedef union {
struct _io_read i;
} io_read_t;
Описание: Отвечает за чтение данных из ресурса. Клиент задает число байт, которое он готов прочитать, в элементе nbytes. Вы возвращаете данные, увеличиваете смещение в OCB и обновляете соответствующие поля с информацией о временах доступа.
Отметим, что элемент xtype может устанавливать для отдельных сообщений флаг переопределения, поэтому его надо проверять. Если вы не поддерживаете никаких расширенных флагов переопределения, вы должны возвратить EINVAL. Далее, в примерах функций io_read() и io_write(), мы рассмотрим обработку одного очень важного (и очень непростого!) флага переопределения, называемого _IO_XTYPE_OFFSET.
Отметим также, что сообщение _IO_READ приходит не только для обычных файлов, но также и для чтения содержимого каталогов. В варианте с каталогом вы должны гарантированно обеспечить возврат целого (integral) числа элементов struct dirent
. За дополнительной информацией по возврату элементов каталога см. пример в параграфе «Возврат элементов каталога» раздела «Дополнительно».
Чтобы удостовериться, что файл был открыт в режиме, совместимом с операцией чтения, надо вызвать вспомогательную функцию iofunc_read_verify(). Также, следует вызвать функцию iofunc_sync_verify(), чтобы проверить, надо ли синхронизировать данные с носителем.
Возвращает: Число считанных байтов или код завершения, при помощи вспомогательного макроса _IO_SET_READ_NBYTES, а также собственно данные — ответным сообщением.
В качестве примера с возвратом только данных см. ниже раздел «Простой пример функции io_read()». Более сложный пример с одновременным возвратом как данных, так и элементов каталогов, см. в параграфе «Возврат элементов каталога» раздела «Дополнительно».
int io_readlink(resmgr_context_t *ctp, io_readlink_t *msg,
RESMGR_HANDLE_T *handle, void* reserved)
Классификация: Функция установления соединения
Обработчик по умолчанию: Нет
Вспомогательные функции: iofunc_readlink()
Клиентская функция: readlink()
Сообщения: IO_CONNECT, подтип IO_CONNECT_READLINK
Структура данных:
struct _io_connect {
// Внутренние поля (как описано выше)
uint16_t path_len;
uint8_t extra_type;
uint16_t extra_len;
char path[1];
};
struct _io_connect_link_reply {
uint32_t reserved1[2];
uint8_t eflag;
uint8_t reserved2[3];
uint32_t umask;
uint16_t nentries;
uint16_t path_len;
};
typedef union {
struct _io_connect connect;
struct _io_connect_link_reply link_reply;
} io_open_t;
Описание: Отвечает за чтение содержимого символьной связи (линка), как определено полем path входной структуры. Возвращаемые байты представляют собой содержимое символьной связи; возвращаемый код состояния представляет собой число байт в ответе. Допустимый возврат должен быть сделано только для символьной связи. Все другие доступы должны возвратить код ошибки.
Возвращает: Код завершения, при помощи вспомогательного макроса _RESMGR_STATUS, и данные в ответном сообщении.
int io_rename(resmgr_context_t *ctp, io_rename_t *msg,
RESMGR_HANDLE_T *handle, io_rename_extra_t* extra)
Классификация: Функция установления соединения
Обработчик по умолчанию: Нет
Вспомогательные функции: iofunc_rename()
Клиентская функция: rename()
Сообщение: _IO_CONNECT, подтип _IO_CONNECT_RENAME
Структура данных:
struct _io_connect {
// internal fields (as described above)
uint16_t path_len;
uint8_t extra_type;
uint16_t extra_len;