tmonitor, request-server: implement update and get_value_int
authorSung-hun Kim <sfoon.kim@samsung.com>
Mon, 21 Feb 2022 06:51:43 +0000 (15:51 +0900)
committerSung-hun Kim <sfoon.kim@samsung.com>
Mon, 21 Feb 2022 06:51:43 +0000 (15:51 +0900)
Change-Id: Ie6008b6702236a1aff33fece5deb36ca5c86526e

lib/tmonitor/tmonitor.c
src/monitor/request-server.c

index 1f6b3b685856f45cec9b4c3d585c2c320b9eae0a..ec0b933e863c6d055edc67c79a50eb109aaf3908 100644 (file)
@@ -545,10 +545,13 @@ void tmonitor_stop(int id)
 EXPORT
 int tmonitor_update(int id, int resource_type)
 {
-       /* TODO */
        char buffer[100];
+       char *tok;
        int buffer_len;
+       int response_id;
+       int response_req;
        struct tmonitor_client *client;
+
        client = find_client_by_id(id);
        if (!client) {
                _E("[libpass] cannot find client-%d", id);
@@ -561,21 +564,82 @@ int tmonitor_update(int id, int resource_type)
                return -EIO;
        }
 
+       /* wait for response */
+       buffer_len = recv(client->socket_fd, buffer, 100, 0);
+       if (buffer_len <= 0) {
+               _E("[libpass] socket disconnected");
+               return;
+       }
+
+       buffer[buffer_len] = '\0';
+       tok = strtok(buffer, ":");
+       response_req = atoi(tok);
+       tok = strtok(NULL, ":");
+       response_id = atoi(tok);
+
+       if (response_req != REQUEST_UPDATE) {
+               _E("[libpass] wrong response");
+               return -EINVAL;
+       }
+
+       if (response_id != id) {
+               _E("[libpass] wrong id");
+               return -EINVAL;
+       }
        return 0;
 }
 
 EXPORT
 int tmonitor_get_value_int(int id, int resource_type, u_int64_t attr)
 {
-       /* TODO */
+       char buffer[100];
+       char *tok;
+       int buffer_len;
+       int response_id;
+       int response_req;
+       int response_val;
        struct tmonitor_client *client;
+
        client = find_client_by_id(id);
        if (!client) {
                _E("[libpass] cannot find client-%d", id);
                return -EINVAL;
        }
 
-       return 0;
+       buffer_len = sprintf(buffer, "%d:%d:%d:%lx", REQUEST_GET_VALUE_INT, id, resource_type, attr);
+       if (send(client->socket_fd, buffer, buffer_len, 0) < 0) {
+               _E("[libpass] error occurred while sending buffer");
+               return -EIO;
+       }
+
+       /* wait for response */
+       buffer_len = recv(client->socket_fd, buffer, 100, 0);
+       if (buffer_len <= 0) {
+               _E("[libpass] socket disconnected");
+               return;
+       }
+
+       buffer[buffer_len] = '\0';
+       tok = strtok(buffer, ":");
+       response_req = atoi(tok);
+       tok = strtok(NULL, ":");
+       response_id = atoi(tok);
+       tok = strtok(NULL, ":");
+       response_val = atoi(tok);
+
+       if (response_req != REQUEST_GET_VALUE_INT) {
+               _E("[libpass] wrong response");
+               return -EINVAL;
+       }
+
+       if (response_id != id) {
+               _E("[libpass] wrong id");
+               return -EINVAL;
+       }
+
+       _I("value: %d", response_val);
+
+       return response_val;
 }
 
 EXPORT
index eea9e14927ac8ddb58c0895373435a6db68a4e2c..775eada80d9d493f529834ad89ae5dddc03b00ae 100644 (file)
@@ -231,17 +231,117 @@ static void handle_request_in_stopped(struct request_client *client, char *buffe
 
 }
 
+static struct resource *find_resource_by_type(struct request_client *client, int resource_type)
+{
+       int i;
+       struct resource *res;
+
+       if (!client)
+               return NULL;
+
+       for (i = 0; i < client->nr_resources; i++) {
+               res = client->res[i];
+               if (res->type == resource_type)
+                       return res;
+       }
+       return NULL;
+}
+
 static void handle_request_update(struct request_client *client, int resource_type)
 {
+       char response[10];
+       int response_len;
+       struct resource *resource;
+
+       if (!client)
+               return NULL;
+
+       resource = find_resource_by_type(client, resource_type);
+       if (!resource) {
+               _E("there is no resource for type (%d)", resource_type);
+               return;
+       }
+
+       update_resource_attrs(resource);
+
+       /**
+        * Format of response
+        *  - <REQUEST_TYPE:ID>
+        */
+       response_len = sprintf(response, "%d:%d", REQUEST_UPDATE, client->id);
+       if (send(client->socket_fd, response, response_len, 0) < 0) {
+               _E("failed to send respones, error: %s", strerror(errno));
+               return;
+       }
 
+       _I("send response \"%s\" to client-%d", response, client->id);
 }
 
 static void handle_request_get_value_int(struct request_client *client,
                                int resource_type, u_int64_t attr)
 {
+       char response[100];
+       int response_len;
+       struct resource *resource;
+       int val;
+
+       resource = find_resource_by_type(client, resource_type);
+       if (!resource) {
+               _E("there is no resource for type (%d)", resource_type);
+               return;
+       }
+
+       get_resource_attr_integer(resource, attr, &val);
+       /**
+        * Format of response
+        *  - <REQUEST_TYPE:ID>
+        */
+       response_len = sprintf(response, "%d:%d:%d", REQUEST_GET_VALUE_INT, client->id, val);
+       if (send(client->socket_fd, response, response_len, 0) < 0) {
+               _E("failed to send respones, error: %s", strerror(errno));
+               return;
+       }
+
+       _I("send response \"%s\" to client-%d", response, client->id);
 
 }
 
+static void handle_request_stop(struct request_client *client)
+{
+       int i;
+       char response[10];
+       int response_len;
+
+       /**
+        * Format of REQUEST_EXIT:
+        *  - <REQUEST_TYPE:ID>
+        */
+       if (client->g_request_resource_head) {
+               _I("client-%d: before release resource list", client->id);
+               release_resource_list(&client->g_request_resource_head);
+               _I("client-%d: release resource list", client->id);
+       }
+
+       /*
+        * client->res should be freed in this step?
+        */
+       for (i = 0; i < client->nr_resources; i++)
+               free(client->res[i]);
+
+       client->state = CLIENT_STOPPED;
+       /**
+        * Format of response
+        *  - <REQUEST_TYPE:ID>
+        */
+       response_len = sprintf(response, "%d:%d", REQUEST_STOP, client->id);
+       if (send(client->socket_fd, response, response_len, 0) < 0) {
+               _E("failed to send respones, error: %s", strerror(errno));
+               return;
+       }
+
+       _I("send response \"%s\" to client-%d", response, client->id);
+}
+
 static void handle_request_in_running(struct request_client *client, char *buffer)
 {
        char response[10];
@@ -290,31 +390,9 @@ static void handle_request_in_running(struct request_client *client, char *buffe
                handle_request_get_value_int(client, resource_type, attr);
                break;
        case REQUEST_STOP:
-               /**
-                * Format of REQUEST_EXIT:
-                *  - <REQUEST_TYPE:ID>
-                */
-               if (client->g_request_resource_head) {
-                       _I("client-%d: before release resource list", client->id);
-                       release_resource_list(&client->g_request_resource_head);
-                       _I("client-%d: release resource list", client->id);
-               }
-               client->state = CLIENT_STOPPED;
-
+               handle_request_stop(client);
                break;
        }
-
-       /**
-        * Format of response
-        *  - <REQUEST_TYPE:ID>
-        */
-       response_len = sprintf(response, "%d:%d", request_type, client->id);
-       if (send(client->socket_fd, response, response_len, 0) < 0) {
-               _E("failed to send respones, error: %s", strerror(errno));
-               return;
-       }
-
-       _I("send response \"%s\" to client-%d", response, client->id);
 }
 
 static void handle_request_in_thread(struct request_client *client, char *buffer)
@@ -335,7 +413,7 @@ static int request_handler_func(void *data, void **result)
        fd_set read_fds;
        fd_set active_fds;
        char buffer[REQUEST_MAX];
-       struct timeval wait;    
+       struct timeval wait;
        struct request_client *client = (struct request_client *)data;
 
        wait.tv_sec = 1;
@@ -371,7 +449,7 @@ static int request_handler_func(void *data, void **result)
                }
        }
 
-       return THREAD_RETURN_DONE;              
+       return THREAD_RETURN_DONE;
 
 error_out:
        client->state = CLIENT_FINALIZED;
@@ -398,7 +476,7 @@ static void request_handler_setup(struct request_client *client)
        }
        _I("fork worker thread for client-%d", client->id);
 
-       create_worker_thread(&client->worker, request_handler_func, client);    
+       create_worker_thread(&client->worker, request_handler_func, client);
        client->worker_running = 1;
        resume_thread(client->worker);
 }