KasperskyOS Community Edition 1.0

Соединение сущности-клиента с одной и двумя сущностями 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

#include <env/env.h>

#include <stdlib.h>

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.