+ return try_catch([&] {
+
+ //put request into buffer
+ Serialization::Serialize(send, static_cast<int>(SecurityModuleCall::POLICY_UPDATE));
+ Serialization::Serialize(send, p_req->units);
+
+ //send it to server
+ int retval = sendToServer(SERVICE_SOCKET, send.Pop(), recv);
+ if (retval != SECURITY_MANAGER_API_SUCCESS) {
+ LogError("Error in sendToServer. Error code: " << retval);
+ return SECURITY_MANAGER_ERROR_UNKNOWN;
+ }
+
+ //receive response from server
+ Deserialization::Deserialize(recv, retval);
+ switch(retval) {
+ case SECURITY_MANAGER_API_SUCCESS:
+ return SECURITY_MANAGER_SUCCESS;
+ case SECURITY_MANAGER_API_ERROR_AUTHENTICATION_FAILED:
+ return SECURITY_MANAGER_ERROR_AUTHENTICATION_FAILED;
+ default:
+ return SECURITY_MANAGER_ERROR_UNKNOWN;
+ }
+ });
+}
+
+static inline int security_manager_get_policy_internal(
+ SecurityManager::SecurityModuleCall call_type,
+ policy_entry *p_filter,
+ policy_entry **pp_privs_policy,
+ size_t *p_size)
+{
+ using namespace SecurityManager;
+ MessageBuffer send, recv;
+
+ if (pp_privs_policy == nullptr || p_size == nullptr)
+ return SECURITY_MANAGER_ERROR_INPUT_PARAM;
+
+ return try_catch([&] {
+ //put request into buffer
+ Serialization::Serialize(send, static_cast<int>(call_type));
+ Serialization::Serialize(send, *p_filter);
+ //send it to server
+ int retval = sendToServer(SERVICE_SOCKET, send.Pop(), recv);
+ if (retval != SECURITY_MANAGER_API_SUCCESS) {
+ LogError("Error in sendToServer. Error code: " << retval);
+ return SECURITY_MANAGER_ERROR_UNKNOWN;
+ }
+ //receive response from server
+ Deserialization::Deserialize(recv, retval);
+ switch(retval) {
+ case SECURITY_MANAGER_API_SUCCESS: {
+ //extract and allocate buffers for privs policy entries
+ size_t entriesCnt = 0;
+ policy_entry **entries = nullptr;
+ Deserialization::Deserialize(recv, entriesCnt);
+ try {
+ entries = new policy_entry*[entriesCnt]();
+ for (size_t i = 0; i < entriesCnt; ++i)
+ Deserialization::Deserialize(recv, entries[i]);
+ } catch (...) {
+ LogError("Error while parsing server response");
+ for (size_t i = 0; i < entriesCnt; ++i)
+ delete(entries[i]);
+ delete entries;
+ return SECURITY_MANAGER_ERROR_UNKNOWN;
+ }
+ *p_size = entriesCnt;
+ pp_privs_policy = entries;
+ return SECURITY_MANAGER_SUCCESS;
+ }
+ case SECURITY_MANAGER_API_ERROR_AUTHENTICATION_FAILED:
+ return SECURITY_MANAGER_ERROR_AUTHENTICATION_FAILED;
+
+ default:
+ return SECURITY_MANAGER_ERROR_UNKNOWN;
+ }
+ });