KasperskyOS Community Edition 1.2

IDL-описание

IDL-описания помещаются в отдельные файлы *.idl и содержат декларации на языке IDL (Interface Definition Language):

  1. Имя пакета. Используется декларация:
    package <имя пакета>
  2. [Опционально] Пакеты, из которых импортируются типы данных для параметров интерфейсных методов. Используется декларация:
    import <имя пакета>
  3. [Опционально] Определения типов данных для параметров интерфейсных методов.
  4. [Опционально] Сигнатуры интерфейсных методов. Используется декларация:
    interface { <имя интерфейсного метода([параметры])>; [...] }

    Каждая сигнатура метода указывается отдельной строкой. Имя метода не может содержать символов подчеркивания _. Каждый метод в списке имеет уникальное имя. Параметры методов разделяются на входные (in), выходные (out) и параметры для передачи сведений об ошибках (error). Порядок описания параметров важен: сначала указываются входные, затем выходные и, далее, error-параметры. Методы интерфейса безопасности не могут иметь выходные и error-параметры.

    Входные и выходные параметры передаются в IPC-запросах и IPC-ответах соответственно. Error-параметры передаются в IPC-ответах, если сервер не может корректно обработать соответствующие IPC-запросы.

    Сервер может информировать клиента об ошибках обработки IPC-запросов как через error-параметры, так и через выходные параметры интерфейсных методов. Если при возникновении ошибки сервер устанавливает флаг ошибки в IPC-ответе, то этот IPC-ответ содержит error-параметры и не содержит выходных параметров. В противном случае этот IPC-ответ содержит выходные параметры так же, как и при корректной обработке запросов. (Для установки флага ошибки в IPC-ответах используется макрос nk_err_reset(), определенный в заголовочном файле nk/types.h из состава KasperskyOS SDK.)

    Отправка IPC-ответа с установленным флагом ошибки и отправка IPC-ответа со снятым флагом ошибки являются разными видами событий для модуля безопасности Kaspersky Security Module. При описании политики безопасности решения это позволяет удобно разделять обработку событий, которые связаны с корректным и некорректным выполнением IPC-запросов. Если сервер не устанавливает флаг ошибки в IPC-ответах, то для обработки событий, связанных с некорректным выполнением IPC-запросов, модулю безопасности требуется проверять значения выходных параметров, которые сигнализируют об ошибках. (Клиент может проверить состояние флага ошибки в IPC-ответе, даже если соответствующий интерфейсный метод не содержит error-параметров. Для этого клиент использует макрос nk_msg_check_err(), определенный в заголовочном файле nk/types.h из состава KasperskyOS SDK.)

    Сигнатуры интерфейсных методов не могут импортироваться из других IDL-файлов.

Язык IDL чувствителен к регистру символов.

В IDL-описании могут использоваться однострочные и многострочные комментарии.

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

Некоторые IDL-файлы из состава KasperskyOS SDK не описывают интерфейсные методы, а только содержат определения типов данных. Такие IDL-файлы используются только как экспортеры типов данных.

Если пакет содержит описание интерфейсных методов, то имя интерфейса соответствует имени пакета.

Примеры IDL-файлов

Env.idl

package kl.Env // Определения типов данных для параметров интерфейсного метода typedef string<128> Name; typedef string<256> Arg; typedef sequence<Arg,256> Args; // Интерфейс включает один метод. interface { Read(in Name name, out Args args, out Args envs); }

Kpm.idl

package kl.Kpm // Импорт типов данных для параметров интерфейсных методов import kl.core.Types // Определение типа данных для параметров интерфейсных методов typedef string<64> String; /* Интерфейс включает несколько методов. * Часть методов не имеет параметров. */ interface { Shutdown(); Reboot(); PowerButtonPressedWait(); TerminationSignalWait(in UInt32 entityId, in String entityName); EntityTerminated(in UInt32 entityId); Terminate(in UInt32 callingEntityId); }

MessageBusSubs.idl

package kl.MessageBusSubs // Импорт типов данных для параметров интерфейсного метода import kl.MessageBusTypes /* Интерфейс включает метод, который имеет * входной и выходные параметры, а также * error-параметр.*/ interface { Wait(in ClientId id, out Message topic, out BundleId dataId, error ResultCode result); }

WaylandTypes.idl

// Пакет содержит только определения типов данных. package kl.WaylandTypes typedef UInt32 ClientId; typedef bytes<8192> Buffer; typedef string<4096> ConnectionId; typedef SInt32 SsizeT; typedef UInt32 SizeT; typedef SInt32 ShmFd; typedef SInt32 ShmId; typedef bytes<16384000> ShmBuffer;

В этом разделе

Типы данных в языке IDL

Целочисленные выражения в языке IDL