Соединение сущности-клиента с одной и двумя сущностями VFS
Вызовы сетевых и файловых POSIX-функций можно перенаправить в два отдельных компонента VFS, соединив сущность-клиент с двумя разными сущностями VFS. Если такое разделение информационных потоков не требуется (например, если клиент работает только с сетью), достаточно соединить сущность-клиент с одной сущностью VFS.
Соединение с одной сущностью VFS
Имя IPC-канала между сущностью-клиентом и сущностью VFS должно задаваться макросом _VFS_CONNECTION_ID
, объявленным в файле vfs/defs.h
. При этом как "сетевые", так и "файловые" вызовы будут направляться в эту сущность VFS.
Пример:
init.yaml
- name: ClientEntity
connections:
- target: VfsEntity
id: {var: _VFS_CONNECTION_ID, include: vfs/defs.h}
- name: VfsEntity
Соединение с двумя сущностями VFS
Пусть сущность-клиент соединена с двумя разными сущностями VFS – назовем их "сетевая" VFS и "файловая" VFS.
Чтобы "сетевые" вызовы из сущности-клиента направлялись только в "сетевую" VFS, используется переменная окружения _VFS_NETWORK_BACKEND
:
- Для "сетевой" сущности VFS:
_VFS_NETWORK_BACKEND=server:<имя IPC-канала до "сетевой" VFS>
- Для сущности-клиента:
_VFS_NETWORK_BACKEND=client: <имя IPC-канала до "сетевой" VFS>
Для направления "файловых" вызовов используется аналогичная переменная окружения _VFS_FILESYSTEM_BACKEND
:
- Для "файловой" сущности VFS:
_VFS_FILESYSTEM_BACKEND=server:<имя IPC-канала до "файловой" VFS>
- Для сущности-клиента:
_VFS_FILESYSTEM_BACKEND=client: <имя IPC-канала до "файловой" VFS>
В результате функции для работы с сетью и файлами будут направляться в две разные сущности VFS.
В следующем примере сущность Client
соединена с двумя сущностями VFS – "сетевой" VfsFirst
и "файловой" VfsSecond
:
init.yaml
entities:
- name: Env
- name: Client
connections:
- target: Env
id: {var: ENV_SERVICE_NAME, include: env/env.h}
- target: VfsFirst
id: VFS1
- target: VfsSecond
id: VFS2
- name: VfsFirst
connections:
- target: Env
id: {var: ENV_SERVICE_NAME, include: env/env.h}
- name: VfsSecond
connections:
- target: Env
id: {var: ENV_SERVICE_NAME, include: env/env.h}
Код сущности Env:
env.c
int main(void)
{
const char* vfs_first_args[] = { "_VFS_NETWORK_BACKEND=server:VFS1" };
ENV_REGISTER_VARS("VfsFirst", vfs_first_args);
const char* vfs_second_args[] = { "_VFS_FILESYSTEM_BACKEND=server:VFS2" };
ENV_REGISTER_VARS("VfsSecond", vfs_second_args);
const char* client_envs[] = { "_VFS_NETWORK_BACKEND=client:VFS1", "_VFS_FILESYSTEM_BACKEND=client:VFS2" };
ENV_REGISTER_VARS("Client", client_envs);
envServerRun();
return EXIT_SUCCESS;
}
См. также примеры multi_vfs_dhcpcd, multi_vfs_dns_client и multi_vfs_ntpd в составе KasperskyOS Community Edition.