Исходный код программы
klog_storage/src/klog_storage_entity.c
#include <klog_storage/server.h>
#include <ping/KlogStorageEntity.edl.h>
#include <stdio.h>
/* Определение типа данных для фиктивного контекста.
* Требуется для определения функций, реализующих
* интерфейсные методы, и настройки диспетчера. */
struct Context
{
int some_data;
};
/* Определение функции, направляющей данные аудита в стандартный
* вывод ошибок. (Параметр ctx не требуется использовать, но параметр
* типа void* должен быть первым параметром в сигнатуре функции, чтобы
* соответствовать типу указателя, который используется диспетчером
* для вызова этой функции.) */
static int _write(struct Context *ctx, const struct kl_KlogStorage_Entry *entry)
{
fprintf(stderr, "%s\n", entry->msg);
return 0;
}
/* Определение фиктивной функции чтения данных аудита.
* (Требуется для настройки диспетчера, чтобы избежать ошибки,
* если будет вызван интерфейсный метод чтения данных аудита.) */
static int _read_range(struct Context *ctx, nk_uint64_t first_id,
nk_uint64_t last_id, struct kl_KlogStorage_Entry *entries)
{
return 0;
}
/* Определение фиктивной функции чтения данных аудита.
* (Требуется для настройки диспетчера, чтобы избежать ошибки,
* если будет вызван интерфейсный метод чтения данных аудита.) */
static int _read(struct Context *ctx, nk_uint32_t num_entries,
struct kl_KlogStorage_Entry *entries)
{
return 0;
}
int main(int argc, char *argv[])
{
/* Объявление фиктивного контекста */
static struct Context ctx;
/* Настройка диспетчера, чтобы при получении от программы Klog
* IPC-запросов с данными аудита была вызвана функция, направляющая
* эти данные в стандартный вывод ошибок. (Функции чтения данных аудита
* и контекст являются фиктивными. Однако можно создать собственные
* реализации функций _write(), _read() и _read_range() для работы с
* хранилищем данных аудита. В этом случае контекст может быть
* использован для хранения состояния хранилища.) */
struct kl_KlogStorage *iface =
klog_storage_IKlog_storage_dispatcher(&ctx,
(kl_KlogStorage_write_func)_write,
(kl_KlogStorage_read_func)_read,
(kl_KlogStorage_read_range_func)_read_range);
struct kl_KlogStorage_component *comp =klog_storage_storage_component(iface);
/* В результате вызова этой функции будет запущен цикл обработки IPC-запросов.
* (Константы ping_KlogStorageEntity_klogStorage_iidOffset и
* ping_KlogStorageEntity_klogStorage_storage_iid определены в заголовочном файле
* KlogStorageEntity.edl.h, который содержит автоматически сгенерированный
* транспортный код.) */
return klog_storage_run(KLOG_STORAGE_SERVER_CONNECTION_ID,
ping_KlogStorageEntity_klogStorage_iidOffset,
ping_KlogStorageEntity_klogStorage_storage_iid,
comp);
}
Сборка программы
klog_storage/CMakeLists.txt
# Импорт библиотек KlogStorage из состава
# KasperskyOS SDK
find_package (klog_storage REQUIRED)
include_directories (${klog_storage_INCLUDE})
# Генерация транспортного кода на основе формальной спецификации
# программы KlogStorage
nk_build_edl_files (klog_storage_edl_files
NK_MODULE "ping"
# Файл KlogStorageEntity.edl и другие файлы
# формальной спецификации программы KlogStorage
# поставляются в составе KasperskyOS SDK.
EDL "${RESOURCES}/edl/KlogStorageEntity.edl")
# Создание исполняемого файла программы KlogStorage
add_executable (KlogStorageEntity "src/klog_storage_entity.c")
target_link_libraries (KlogStorageEntity ${klog_storage_SERVER_LIB})
add_dependencies (KlogStorageEntity klog_edl_files klog_storage_edl_files)
Словарь процесса программы в шаблоне init-описания
einit/src/init.yaml.in
...
- name: ping.KlogStorageEntity
...
Описание политики для программы
einit/src/security.psl.in
...
use nk.base._
...
use EDL kl.core.Core
...
use EDL ping.KlogEntity
use EDL ping.KlogStorageEntity
...
use audit_profile._
use core._
...
/* Взаимодействие с программой Klog */
request dst=ping.KlogStorageEntity {
match endpoint=klogStorage.storage {
match method=write {
match src=ping.KlogEntity { grant () }
}
}
}
response src=ping.KlogStorageEntity {
match endpoint=klogStorage.storage {
match method=write {
match dst=ping.KlogEntity { grant () }
}
}
}
error src=ping.KlogStorageEntity {
match endpoint=klogStorage.storage {
match method=write {
match dst=ping.KlogEntity { grant () }
}
}
}
...
einit/src/core.psl
...
/* Взаимодействие с ядром */
request dst=kl.core.Core {
match endpoint=sync.Sync {
match method=Wake {
...
match src=ping.KlogStorageEntity { grant () }
...
}
match method=Wait {
...
match src=ping.KlogStorageEntity { grant () }
...
}
}
match endpoint=task.Task {
match method=FreeSelfEnv {
...
match src=ping.KlogStorageEntity { grant () }
...
}
match method=GetPath {
...
match src=ping.KlogStorageEntity { grant () }
...
}
match method=GetName {
...
match src=ping.KlogStorageEntity { grant () }
...
}
match method=Exit {
...
match src=ping.KlogStorageEntity { grant () }
...
}
}
match endpoint=vmm.VMM {
match method=Allocate {
...
match src=ping.KlogStorageEntity { grant () }
...
}
match method=Commit {
...
match src=ping.KlogStorageEntity { grant () }
...
}
match method=Protect {
...
match src=ping.KlogStorageEntity { grant () }
...
}
match method=Free {
...
match src=ping.KlogStorageEntity { grant () }
...
}
}
match endpoint=thread.Thread {
match method=SetTls {
...
match src=ping.KlogStorageEntity { grant () }
...
}
match method=Create {
...
match src=ping.KlogStorageEntity { grant () }
...
}
match method=Resume {
...
match src=ping.KlogStorageEntity { grant () }
...
}
}
match endpoint=hal.HAL {
match method=GetEntropy {
...
match src=ping.KlogStorageEntity { grant () }
...
}
match method=DebugWrite {
...
match src=ping.KlogStorageEntity { grant () }
...
}
match method=GetEnv {
...
match src=ping.KlogStorageEntity { grant () }
...
}
}
match endpoint=handle.Handle {
match method=Close {
...
match src=ping.KlogStorageEntity { grant () }
...
}
}
}
response src=kl.core.Core {
...
match dst=ping.KlogStorageEntity { grant () }
...
}
error src=kl.core.Core {
...
match dst=ping.KlogStorageEntity { grant () }
...
}
...
В начало