lib: resource-monitor: Extract common function for readability and remove duplicate... submit/tizen/20220809.025855
authorChanwoo Choi <cw00.choi@samsung.com>
Wed, 20 Jul 2022 08:52:13 +0000 (17:52 +0900)
committerChanwoo Choi <cw00.choi@samsung.com>
Tue, 9 Aug 2022 02:30:47 +0000 (11:30 +0900)
Almost resource-monitor functions are composed with the following steps
to communicate with resource-monitor daemon. It means that there are
the many similiar code to support resource-monitor feature.
1. send request
2. recv response
3. parse data from response
4. validate the data

In order to reduece the duplicate code and improve the readability,
extract the common functions as handle_request with struct request_data.

Change-Id: I413e3dd157093507d099892b0d3123bcf0641f4b
Signed-off-by: Chanwoo Choi <cw00.choi@samsung.com>
include/util/request.h
lib/resource-monitor/resource-monitor.c

index c640830..6f7bfa7 100644 (file)
@@ -49,4 +49,28 @@ enum {
        REQUEST_MAX,
 };
 
+static const char request_name[][128] = {
+       "REQUEST_CREATE_RESOURCE",
+       "REQUEST_DELETE_RESOURCE",
+       "REQUEST_UPDATE_RESOURCE",
+       "REQUEST_UPDATE_RESOURCE_ALL",
+       "REQUEST_GET_RESOURCE_COUNT",
+       "REQUEST_SET_RESOURCE_CTRL",
+       "REQUEST_SET_RESOURCE_ATTR",
+       "REQUEST_UNSET_RESOURCE_ATTR",
+       "REQUEST_IS_RESOURCE_ATTR_SUPPORTED",
+       "REQUEST_GET_RESOURCE_JSON",
+       "REQUEST_GET_VALUE_JSON",
+       "REQUEST_GET_VALUE_INT",
+       "REQUEST_GET_VALUE_INT64",
+       "REQUEST_GET_VALUE_UINT",
+       "REQUEST_GET_VALUE_UINT64",
+       "REQUEST_GET_VALUE_DOUBLE",
+       "REQUEST_GET_VALUE_STRING",
+       "REQUEST_GET_VALUE_ARRAY",
+       "REQUEST_GET_RESOURCE_TS",
+       "REQUEST_GET_RESOURCE_LIST_JSON",
+       "REQUEST_MAX",
+};
+
 #endif /* __REQUEST_H__ */
index 5951465..3d6a1a9 100644 (file)
@@ -39,8 +39,6 @@
 #define REQUEST_SERVER_IP "127.0.0.1"
 #define REQUEST_SERVER_PORT 10001
 
-extern char *program_invocation_name;
-
 #ifndef EXPORT
 #define EXPORT __attribute__ ((visibility("default")))
 #endif
@@ -93,37 +91,172 @@ static struct pass_resource_monitor_client *find_client_by_id(int id)
        return NULL;
 }
 
-static int handle_resource_attr(int request, int id, int resource_id, u_int64_t attr_mask)
+struct request_data {
+       int request;
+       int client_id;
+       int resource_id;
+       int resource_type;
+       u_int64_t ctrl_id;
+       int ctrl_value;
+       u_int64_t attr_mask;
+       u_int64_t attr_id;
+
+       int32_t value_int32;
+       u_int32_t value_uint32;
+       int64_t value_int64;
+       u_int64_t value_uint64;
+       double value_double;
+       char value_string[BUFF_MAX];
+       int64_t ts_start;
+       int64_t ts_end;
+};
+
+static inline int handle_request(struct request_data *data)
 {
        char buffer[GENERIC_BUFF_MAX + 1];
        int buffer_len;
        int response_req;
+       int response_ret;
        int ret;
 
-       buffer_len = sprintf(buffer, "%d$%d$%"PRIu64,
-                       request, resource_id, attr_mask);
-       if (send(id, buffer, buffer_len, 0) < 0) {
-               _E("[libpass] error occurred while sending buffer");
+       if (!data)
+               return -EINVAL;
+
+       /* Make buffer with struct request_data according to request */
+       switch (data->request) {
+       case REQUEST_UPDATE_RESOURCE_ALL:
+               buffer_len = sprintf(buffer, "%d", data->request);
+               break;
+       case REQUEST_GET_VALUE_INT:
+       case REQUEST_GET_VALUE_INT64:
+       case REQUEST_GET_VALUE_UINT:
+       case REQUEST_GET_VALUE_UINT64:
+       case REQUEST_GET_VALUE_DOUBLE:
+       case REQUEST_GET_VALUE_STRING:
+       case REQUEST_IS_RESOURCE_ATTR_SUPPORTED:
+               buffer_len = sprintf(buffer, "%d$%d$%"PRIu64,
+                               data->request, data->resource_id, data->attr_id);
+               break;
+       case REQUEST_UPDATE_RESOURCE:
+       case REQUEST_DELETE_RESOURCE:
+               buffer_len = sprintf(buffer, "%d$%d",
+                               data->request, data->resource_id);
+               break;
+       case REQUEST_CREATE_RESOURCE:
+       case REQUEST_GET_RESOURCE_COUNT:
+               buffer_len = sprintf(buffer, "%d$%d",
+                               data->request, data->resource_type);
+               break;
+       case REQUEST_SET_RESOURCE_CTRL:
+               buffer_len = sprintf(buffer, "%d$%d$%"PRIu64"$%d",
+                               data->request, data->resource_id,
+                               data->ctrl_id, data->ctrl_value);
+               break;
+       case REQUEST_SET_RESOURCE_ATTR:
+       case REQUEST_UNSET_RESOURCE_ATTR:
+               buffer_len = sprintf(buffer, "%d$%d$%"PRIu64,
+                               data->request, data->resource_id, data->attr_mask);
+               break;
+       case REQUEST_GET_RESOURCE_TS:
+               buffer_len = sprintf(buffer, "%d$%d",
+                               data->request, data->resource_id);
+               break;
+       default:
+               _E("[libpass] Unknown request type, client(%d) | request(%d)",
+                                       data->client_id, data->request);
+               return -EINVAL;
+       }
+
+       /* Send request to resource-moniotor */
+       if (send(data->client_id, buffer, buffer_len, 0) < 0) {
+               _E("[libpass] failed to send request, client(%d) | request(%35s) | res,id(%d)type(%d) | ctrl,id(%"PRId64")val(%d) ",
+                                       data->client_id, request_name[data->request],
+                                       data->resource_id, data->resource_type,
+                                       data->ctrl_id, data->ctrl_value);
                return -EIO;
        }
 
-       /* wait for response */
-       buffer_len = recv(id, buffer, GENERIC_BUFF_MAX, 0);
+       /* Receive response from resource-moniotor */
+       buffer_len = recv(data->client_id, buffer, GENERIC_BUFF_MAX, 0);
        if (buffer_len <= 0) {
-               _E("[libpass] socket disconnected");
+               _E("[libpass] failed to receive response, client(%d) | request(%35s) | res,id(%d)type(%d) | ctrl,id(%"PRId64")val(%d) ",
+                                       data->client_id, request_name[data->request],
+                                       data->resource_id, data->resource_type,
+                                       data->ctrl_id, data->ctrl_value);
                return -EIO;
        }
-
        buffer[buffer_len] = '\0';
-       if (sscanf(buffer, "%d$%d", &response_req, &ret) < 2)
-               return -EINVAL;
 
-       if (response_req != request) {
-               _E("[libpass] wrong response");
+       /* Parse received response from resource-monitor */
+       ret = 0;
+       switch (data->request) {
+       case REQUEST_GET_VALUE_INT:
+               if (sscanf(buffer, "%d$%d$%d", &response_req,
+                                       &data->value_int32, &response_ret) < 3)
+                       ret = EINVAL;
+               break;
+       case REQUEST_GET_VALUE_UINT:
+               if (sscanf(buffer, "%d$%u$%d", &response_req,
+                                       &data->value_uint32, &response_ret) < 3)
+                       ret = -EINVAL;
+               break;
+       case REQUEST_GET_VALUE_INT64:
+               if (sscanf(buffer, "%d$%"PRId64"$%d", &response_req,
+                                       &data->value_int64, &response_ret) < 3)
+                       return -EINVAL;
+               break;
+       case REQUEST_GET_VALUE_UINT64:
+               if (sscanf(buffer, "%d$%"PRIu64"$%d", &response_req,
+                                       &data->value_uint64, &response_ret) < 3)
+                       ret = -EINVAL;
+               break;
+       case REQUEST_GET_VALUE_DOUBLE:
+               if (sscanf(buffer, "%d$%lf$%d", &response_req,
+                                       &data->value_double, &response_ret) < 3)
+                       ret = -EINVAL;
+               break;
+       case REQUEST_GET_VALUE_STRING:
+               if (sscanf(buffer, "%d$%[^$]$%d", &response_req,
+                                       data->value_string, &response_ret) < 3)
+                       ret = -EINVAL;
+               break;
+       case REQUEST_GET_RESOURCE_TS:
+               if (sscanf(buffer, "%d$%"PRId64"$%"PRId64"$%d", &response_req,
+                                       &data->ts_start, &data->ts_end, &response_ret) < 4)
+                       ret =-EINVAL;
+               break;
+       default:
+               if (sscanf(buffer, "%d$%d", &response_req, &response_ret) < 2)
+                       ret = -EINVAL;
+               break;
+       }
+
+       if (ret < 0) {
+               _E("[libpass] failed to receive response, client(%d) | request(%35s) | res,id(%d)type(%d) | ctrl,id(%"PRId64")val(%d) ",
+                                       data->client_id, request_name[data->request],
+                                       data->resource_id, data->resource_type,
+                                       data->ctrl_id, data->ctrl_value);
+               return ret;
+       }
+
+       if (response_ret < 0) {
+               _E("[libpass] failed to receive response, client(%d) | request(%35s) | res,id(%d)type(%d) | ctrl,id(%"PRId64")val(%d) ",
+                                       data->client_id, request_name[data->request],
+                                       data->resource_id, data->resource_type,
+                                       data->ctrl_id, data->ctrl_value);
+               return response_ret;
+       }
+
+       /* Validate response request from resource-monitor */
+       if (response_req != data->request) {
+               _E("[libpass] failed to receive response, client(%d) | request(%35s) | res,id(%d)type(%d) | ctrl,id(%"PRId64")val(%d) ",
+                                       data->client_id, request_name[data->request],
+                                       data->resource_id, data->resource_type,
+                                       data->ctrl_id, data->ctrl_value);
                return -EINVAL;
        }
 
-       return ret;
+       return response_ret;
 }
 
 EXPORT
@@ -193,253 +326,117 @@ int pass_resource_monitor_exit(int id)
 EXPORT
 int pass_resource_monitor_get_resource_count(int id, int resource_type)
 {
-       char buffer[GENERIC_BUFF_MAX + 1];
-       int buffer_len;
-       int response_req;
-       int ret;
+       struct request_data request = {
+               .request        = REQUEST_GET_RESOURCE_COUNT,
+               .client_id      = id,
+               .resource_type  = resource_type,
+       };
 
-       buffer_len = sprintf(buffer, "%d$%d",
-                       REQUEST_GET_RESOURCE_COUNT, resource_type);
-       if (send(id, buffer, buffer_len, 0) < 0) {
-               _E("[libpass] error occurred while sending buffer");
-               return -EIO;
-       }
-
-       /* wait for response */
-       buffer_len = recv(id, buffer, GENERIC_BUFF_MAX, 0);
-       if (buffer_len <= 0) {
-               _E("[libpass] socket disconnected");
-               return -EIO;
-       }
-
-       buffer[buffer_len] = '\0';
-       if (sscanf(buffer, "%d$%d", &response_req, &ret) < 2)
-               return -EINVAL;
-
-       if (response_req != REQUEST_GET_RESOURCE_COUNT) {
-               _E("[libpass] wrong response");
-               return -EINVAL;
-       }
-
-       return ret;
+       return handle_request(&request);
 }
 
 EXPORT
 int pass_resource_monitor_create_resource(int id, int resource_type)
 {
-       char buffer[GENERIC_BUFF_MAX + 1];
-       int buffer_len;
-       int response_req;
-       int ret;
+       struct request_data request = {
+               .request        = REQUEST_CREATE_RESOURCE,
+               .client_id      = id,
+               .resource_type  = resource_type,
+       };
 
-       buffer_len = sprintf(buffer, "%d$%d", REQUEST_CREATE_RESOURCE, resource_type);
-       if (send(id, buffer, buffer_len, 0) < 0) {
-               _E("[libpass] error occurred while sending buffer for create resource");
-               return -EIO;
-       }
-
-       /* wait for response */
-       buffer_len = recv(id, buffer, GENERIC_BUFF_MAX, 0);
-       if (buffer_len <= 0) {
-               _E("[libpass] socket disconnected");
-               return -EIO;
-       }
-
-       buffer[buffer_len] = '\0';
-       if (sscanf(buffer, "%d$%d", &response_req, &ret) < 2)
-               return -EINVAL;
-
-       if (response_req != REQUEST_CREATE_RESOURCE) {
-               _E("wrong response");
-               return -EINVAL;
-       }
-
-       return ret;
+       return handle_request(&request);
 }
 
 EXPORT
 int pass_resource_monitor_delete_resource(int id, int resource_id)
 {
-       char buffer[GENERIC_BUFF_MAX + 1];
-       int buffer_len;
-       int response_req;
-       int ret;
-
-       buffer_len = sprintf(buffer, "%d$%d", REQUEST_DELETE_RESOURCE, resource_id);
-       if (send(id, buffer, buffer_len, 0) < 0) {
-               _E("[libpass] error occurred while sending buffer for create resource");
-               return -EIO;
-       }
-
-       /* wait for response */
-       buffer_len = recv(id, buffer, GENERIC_BUFF_MAX, 0);
-       if (buffer_len <= 0) {
-               _E("[libpass] socket disconnected");
-               return -EIO;
-       }
-
-       buffer[buffer_len] = '\0';
-       if (sscanf(buffer, "%d$%d", &response_req, &ret) < 2)
-               return -EINVAL;
+       struct request_data request = {
+               .request        = REQUEST_DELETE_RESOURCE,
+               .client_id      = id,
+               .resource_id    = resource_id,
+       };
 
-       if (response_req != REQUEST_DELETE_RESOURCE) {
-               _E("wrong response");
-               return -EINVAL;
-       }
-
-       return ret;
+       return handle_request(&request);
 }
 
 EXPORT
 int pass_resource_monitor_set_resource_ctrl(int id, int resource_id, u_int64_t ctrl_id, int value)
 {
-       char buffer[GENERIC_BUFF_MAX + 1];
-       int buffer_len;
-       int response_req;
-       int ret;
-
-       buffer_len = sprintf(buffer, "%d$%d$%"PRIu64"$%d",
-                       REQUEST_SET_RESOURCE_CTRL, resource_id, ctrl_id, value);
-       if (send(id, buffer, buffer_len, 0) < 0) {
-               _E("[libpass] error occurred while sending buffer");
-               return -EIO;
-       }
-
-       /* wait for response */
-       buffer_len = recv(id, buffer, GENERIC_BUFF_MAX, 0);
-       if (buffer_len <= 0) {
-               _E("[libpass] socket disconnected");
-               return -EIO;
-       }
-
-       buffer[buffer_len] = '\0';
-       if (sscanf(buffer, "%d$%d", &response_req, &ret) < 2)
-               return -EINVAL;
+       struct request_data request = {
+               .request        = REQUEST_SET_RESOURCE_CTRL,
+               .client_id      = id,
+               .resource_id    = resource_id,
+               .ctrl_id        = ctrl_id,
+               .ctrl_value     = value,
+       };
 
-       if (response_req != REQUEST_SET_RESOURCE_CTRL) {
-               _E("[libpass] wrong response");
-               return -EINVAL;
-       }
-
-       return ret;
+       return handle_request(&request);
 }
 
 EXPORT
 int pass_resource_monitor_set_resource_attr(int id, int resource_id, u_int64_t attr_mask)
 {
-       return handle_resource_attr(REQUEST_SET_RESOURCE_ATTR, id, resource_id, attr_mask);
+       struct request_data request = {
+               .request        = REQUEST_SET_RESOURCE_ATTR,
+               .client_id      = id,
+               .resource_id    = resource_id,
+               .attr_mask      = attr_mask,
+       };
+
+       return handle_request(&request);
 }
 
 EXPORT
 int pass_resource_monitor_unset_resource_attr(int id, int resource_id, u_int64_t attr_mask)
 {
-       return handle_resource_attr(REQUEST_UNSET_RESOURCE_ATTR, id, resource_id, attr_mask);
+       struct request_data request = {
+               .request        = REQUEST_UNSET_RESOURCE_ATTR,
+               .client_id      = id,
+               .resource_id    = resource_id,
+               .attr_mask      = attr_mask,
+       };
+
+       return handle_request(&request);
 }
 
 EXPORT
 bool pass_resource_monitor_is_resource_attr_supported(int id, int resource_id, u_int64_t attr_id)
 {
-       char buffer[GENERIC_BUFF_MAX + 1];
-       int buffer_len;
-       int response_req;
+       struct request_data request = {
+               .request        = REQUEST_IS_RESOURCE_ATTR_SUPPORTED,
+               .client_id      = id,
+               .resource_id    = resource_id,
+               .attr_id        = attr_id,
+       };
        int ret;
 
-       buffer_len = sprintf(buffer, "%d$%d$%"PRIu64"",
-                       REQUEST_IS_RESOURCE_ATTR_SUPPORTED, resource_id, attr_id);
-       if (send(id, buffer, buffer_len, 0) < 0) {
-               _E("[libpass] error occurred while sending buffer");
-               return false;
-       }
-
-       /* wait for response */
-       buffer_len = recv(id, buffer, GENERIC_BUFF_MAX, 0);
-       if (buffer_len <= 0) {
-               _E("[libpass] socket disconnected");
-               return false;
-       }
-
-       buffer[buffer_len] = '\0';
-       if (sscanf(buffer, "%d$%d", &response_req, &ret) < 2)
-               return false;
-
-       if (ret < 0)
-               return false;
-
-       if (response_req != REQUEST_IS_RESOURCE_ATTR_SUPPORTED) {
-               _E("[libpass] wrong response");
-               return false;
-       }
-
-       return (bool)ret;
+       ret = handle_request(&request);
+       return (ret < 0) ? false : (bool)ret;
 }
 
 EXPORT
 int pass_resource_monitor_update(int id)
 {
-       char buffer[GENERIC_BUFF_MAX + 1];
-       int buffer_len;
-       int response_req;
-       int ret;
-
-       buffer_len = sprintf(buffer, "%d", REQUEST_UPDATE_RESOURCE_ALL);
-       if (send(id, buffer, buffer_len, 0) < 0) {
-               _E("[libpass] error occurred while sending buffer");
-               return -EIO;
-       }
+       struct request_data request = {
+               .request        = REQUEST_UPDATE_RESOURCE_ALL,
+               .client_id      = id,
+       };
 
-       /* wait for response */
-       buffer_len = recv(id, buffer, GENERIC_BUFF_MAX, 0);
-       if (buffer_len <= 0) {
-               _E("[libpass] socket disconnected");
-               return -EIO;
-       }
-
-       buffer[buffer_len] = '\0';
-       if (sscanf(buffer, "%d$%d", &response_req, &ret) < 2)
-               return -EINVAL;
-
-       if (response_req != REQUEST_UPDATE_RESOURCE_ALL) {
-               _E("[libpass] wrong response");
-               return -EINVAL;
-       }
-
-       return ret;
+       return handle_request(&request);
 }
 
 EXPORT
 int pass_resource_monitor_update_resource(int id, int resource_id)
 {
-       char buffer[GENERIC_BUFF_MAX + 1];
-       int buffer_len;
-       int response_req;
-       int ret;
+       struct request_data request = {
+               .request        = REQUEST_UPDATE_RESOURCE,
+               .client_id      = id,
+               .resource_id    = resource_id,
+       };
 
-       buffer_len = sprintf(buffer, "%d$%d", REQUEST_UPDATE_RESOURCE, resource_id);
-       if (send(id, buffer, buffer_len, 0) < 0) {
-               _E("[libpass] error occurred while sending buffer");
-               return -EIO;
-       }
-
-       /* wait for response */
-       buffer_len = recv(id, buffer, GENERIC_BUFF_MAX, 0);
-       if (buffer_len <= 0) {
-               _E("[libpass] socket disconnected");
-               return -EIO;
-       }
-
-       buffer[buffer_len] = '\0';
-       if (sscanf(buffer, "%d$%d", &response_req, &ret) < 2)
-               return -EINVAL;
-
-       if (response_req != REQUEST_UPDATE_RESOURCE) {
-               _E("[libpass] wrong response");
-               return -EINVAL;
-       }
-
-       return ret;
+       return handle_request(&request);
 }
 
-
 static int pass_resource_monitor_get_json(int id, char *json_string, int request_type, ...)
 {
        int buffer_len, response_req, ret, resource_id;
@@ -526,211 +523,115 @@ int pass_resource_monitor_get_resource_list_json(int id, char *json_string)
 EXPORT
 int pass_resource_monitor_get_value_int(int id, int resource_id, u_int64_t attr_id, int32_t *value)
 {
-       char buffer[GENERIC_BUFF_MAX + 1];
-       int buffer_len;
-       int response_req;
+       struct request_data request = {
+               .request        = REQUEST_GET_VALUE_INT,
+               .client_id      = id,
+               .resource_id    = resource_id,
+               .attr_id        = attr_id,
+       };
        int ret;
 
-       buffer_len = sprintf(buffer, "%d$%d$%"PRIu64,
-                       REQUEST_GET_VALUE_INT, resource_id, attr_id);
-       if (send(id, buffer, buffer_len, 0) < 0) {
-               _E("[libpass] error occurred while sending buffer");
-               return -EIO;
-       }
-
-       /* wait for response */
-       buffer_len = recv(id, buffer, GENERIC_BUFF_MAX, 0);
-       if (buffer_len <= 0) {
-               _E("[libpass] socket disconnected");
-               return -EIO;
-       }
-
-       buffer[buffer_len] = '\0';
-       if (sscanf(buffer, "%d$%d$%d", &response_req, value, &ret) < 3)
-               return -EINVAL;
-
-       if (response_req != REQUEST_GET_VALUE_INT) {
-               _E("[libpass] wrong response");
-               return -EINVAL;
-       }
+       ret = handle_request(&request);
+       if (ret < 0)
+               return ret;
 
-       return ret;
+       *value = request.value_int32;
+       return 0;
 }
 
 EXPORT
 int pass_resource_monitor_get_value_int64(int id, int resource_id, u_int64_t attr_id, int64_t *value)
 {
-       char buffer[GENERIC_BUFF_MAX + 1];
-       int buffer_len;
-       int response_req;
+       struct request_data request = {
+               .request        = REQUEST_GET_VALUE_INT64,
+               .client_id      = id,
+               .resource_id    = resource_id,
+               .attr_id        = attr_id,
+       };
        int ret;
 
-       buffer_len = sprintf(buffer, "%d$%d$%"PRIu64,
-                       REQUEST_GET_VALUE_INT64, resource_id, attr_id);
-       if (send(id, buffer, buffer_len, 0) < 0) {
-               _E("[libpass] error occurred while sending buffer");
-               return -EIO;
-       }
-
-       /* wait for response */
-       buffer_len = recv(id, buffer, GENERIC_BUFF_MAX, 0);
-       if (buffer_len <= 0) {
-               _E("[libpass] socket disconnected");
-               return -EIO;
-       }
-
-       buffer[buffer_len] = '\0';
-       if (sscanf(buffer, "%d$%"PRId64"$%d", &response_req, value, &ret) < 3)
-               return -EINVAL;
-
-       if (response_req != REQUEST_GET_VALUE_INT64) {
-               _E("[libpass] wrong response");
-               return -EINVAL;
-       }
+       ret = handle_request(&request);
+       if (ret < 0)
+               return ret;
 
-       return ret;
+       *value = request.value_int64;
+       return 0;
 }
 
 EXPORT
 int pass_resource_monitor_get_value_uint(int id, int resource_id, u_int64_t attr_id, u_int32_t *value)
 {
-       char buffer[GENERIC_BUFF_MAX + 1];
-       int buffer_len;
-       int response_req;
+       struct request_data request = {
+               .request        = REQUEST_GET_VALUE_UINT,
+               .client_id      = id,
+               .resource_id    = resource_id,
+               .attr_id        = attr_id,
+       };
        int ret;
 
-       buffer_len = sprintf(buffer, "%d$%d$%"PRIu64,
-                       REQUEST_GET_VALUE_UINT, resource_id, attr_id);
-       if (send(id, buffer, buffer_len, 0) < 0) {
-               _E("[libpass] error occurred while sending buffer");
-               return -EIO;
-       }
-
-       /* wait for response */
-       buffer_len = recv(id, buffer, GENERIC_BUFF_MAX, 0);
-       if (buffer_len <= 0) {
-               _E("[libpass] socket disconnected");
-               return -EIO;
-       }
-
-       buffer[buffer_len] = '\0';
-       if (sscanf(buffer, "%d$%u$%d", &response_req, value, &ret) < 3)
-               return -EINVAL;
-
-       if (response_req != REQUEST_GET_VALUE_UINT) {
-               _E("[libpass] wrong response");
-               return -EINVAL;
-       }
+       ret = handle_request(&request);
+       if (ret < 0)
+               return ret;
 
-       return ret;
+       *value = request.value_uint32;
+       return 0;
 }
 
 EXPORT
 int pass_resource_monitor_get_value_uint64(int id, int resource_id, u_int64_t attr_id, u_int64_t *value)
 {
-       char buffer[GENERIC_BUFF_MAX + 1];
-       int buffer_len;
-       int response_req;
+       struct request_data request = {
+               .request        = REQUEST_GET_VALUE_UINT64,
+               .client_id      = id,
+               .resource_id    = resource_id,
+               .attr_id        = attr_id,
+       };
        int ret;
 
-       buffer_len = sprintf(buffer, "%d$%d$%"PRIu64,
-                       REQUEST_GET_VALUE_UINT64, resource_id, attr_id);
-       if (send(id, buffer, buffer_len, 0) < 0) {
-               _E("[libpass] error occurred while sending buffer");
-               return -EIO;
-       }
-
-       /* wait for response */
-       buffer_len = recv(id, buffer, GENERIC_BUFF_MAX, 0);
-       if (buffer_len <= 0) {
-               _E("[libpass] socket disconnected");
-               return -EIO;
-       }
-
-       buffer[buffer_len] = '\0';
-       if (sscanf(buffer, "%d$%"PRIu64"$%d", &response_req, value, &ret) < 3)
-               return -EINVAL;
-
-       if (response_req != REQUEST_GET_VALUE_UINT64) {
-               _E("[libpass] wrong response");
-               return -EINVAL;
-       }
+       ret = handle_request(&request);
+       if (ret < 0)
+               return ret;
 
-       return ret;
+       *value = request.value_uint64;
+       return 0;
 }
 
 EXPORT
 int pass_resource_monitor_get_value_double(int id, int resource_id, u_int64_t attr_id, double *value)
 {
-       char buffer[GENERIC_BUFF_MAX + 1];
-       int buffer_len;
-       int response_req;
+       struct request_data request = {
+               .request        = REQUEST_GET_VALUE_DOUBLE,
+               .client_id      = id,
+               .resource_id    = resource_id,
+               .attr_id        = attr_id,
+       };
        int ret;
 
-       buffer_len = sprintf(buffer, "%d$%d$%"PRIu64,
-                       REQUEST_GET_VALUE_DOUBLE, resource_id, attr_id);
-       if (send(id, buffer, buffer_len, 0) < 0) {
-               _E("[libpass] error occurred while sending buffer");
-               return -EIO;
-       }
-
-       /* wait for response */
-       buffer_len = recv(id, buffer, GENERIC_BUFF_MAX, 0);
-       if (buffer_len <= 0) {
-               _E("[libpass] socket disconnected");
-               return -EIO;
-       }
-
-       buffer[buffer_len] = '\0';
-       if (sscanf(buffer, "%d$%lf$%d", &response_req, value, &ret) < 3)
-               return -EINVAL;
-
-       if (response_req != REQUEST_GET_VALUE_DOUBLE) {
-               _E("[libpass] wrong response");
-               return -EINVAL;
-       }
+       ret = handle_request(&request);
+       if (ret < 0)
+               return ret;
 
-       return ret;
+       *value = request.value_double;
+       return 0;
 }
 
 EXPORT
 int pass_resource_monitor_get_value_string(int id, int resource_id, u_int64_t attr_id, char **value)
 {
-       char buffer[GENERIC_BUFF_MAX + 1];
-       char value_string[BUFF_MAX];
-       int buffer_len;
-       int response_req;
+       struct request_data request = {
+               .request        = REQUEST_GET_VALUE_STRING,
+               .client_id      = id,
+               .resource_id    = resource_id,
+               .attr_id        = attr_id,
+       };
        int ret;
 
-       if (!value)
-               return -EINVAL;
-
-       buffer_len = sprintf(buffer, "%d$%d$%"PRIu64,
-                       REQUEST_GET_VALUE_STRING, resource_id, attr_id);
-       if (send(id, buffer, buffer_len, 0) < 0) {
-               _E("[libpass] error occurred while sending buffer");
-               return -EIO;
-       }
-
-       /* wait for response */
-       buffer_len = recv(id, buffer, GENERIC_BUFF_MAX, 0);
-       if (buffer_len <= 0) {
-               _E("[libpass] socket disconnected");
-               return -EIO;
-       }
-
-       buffer[buffer_len] = '\0';
-       if (sscanf(buffer, "%d$%[^$]$%d", &response_req, value_string, &ret) < 3)
-               return -EINVAL;
-
-       if (response_req != REQUEST_GET_VALUE_STRING) {
-               _E("[libpass] wrong response");
-               return -EINVAL;
-       }
-
-       *value = g_strdup(value_string);
+       ret = handle_request(&request);
+       if (ret < 0)
+               return ret;
 
-       return ret;
+       *value = g_strdup(request.value_string);
+       return 0;
 }
 
 static int
@@ -945,32 +846,18 @@ int pass_resource_monitor_get_array_string(int id, int res_id, u_int64_t attr_id
 
 int pass_resource_monitor_get_resource_timestamp(int id, int res_id, int64_t *start, int64_t *end)
 {
-       char buffer[GENERIC_BUFF_MAX + 1];
-       int buffer_len;
-       int response_req;
+       struct request_data request = {
+               .request        = REQUEST_GET_RESOURCE_TS,
+               .client_id      = id,
+               .resource_id    = res_id,
+       };
        int ret;
 
-       buffer_len = sprintf(buffer, "%d$%d", REQUEST_GET_RESOURCE_TS, res_id);
-       if (send(id, buffer, buffer_len, 0) < 0) {
-               _E("[libpass] error occurred while sending buffer");
-               return -EIO;
-       }
-
-       /* wait for response */
-       buffer_len = recv(id, buffer, GENERIC_BUFF_MAX, 0);
-       if (buffer_len <= 0) {
-               _E("[libpass] socket disconnected");
-               return -EIO;
-       }
-       buffer[buffer_len] = '\0';
-
-       if (sscanf(buffer, "%d$%"PRId64"$%"PRId64"$%d", &response_req, start, end, &ret) < 4)
-               return -EINVAL;
-
-       if (response_req != REQUEST_GET_RESOURCE_TS) {
-               _E("[libpass] wrong response");
-               return -EINVAL;
-       }
+       ret = handle_request(&request);
+       if (ret < 0)
+               return ret;
 
-       return ret;
+       *start = request.ts_start;
+       *end = request.ts_end;
+       return 0;
 }