From: Sung-hun Kim Date: Mon, 21 Feb 2022 06:51:43 +0000 (+0900) Subject: tmonitor, request-server: implement update and get_value_int X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=588d30bb7facec0bf93b77d593a61c697f29d2b6;p=platform%2Fcore%2Fsystem%2Fpass.git tmonitor, request-server: implement update and get_value_int Change-Id: Ie6008b6702236a1aff33fece5deb36ca5c86526e --- diff --git a/lib/tmonitor/tmonitor.c b/lib/tmonitor/tmonitor.c index 1f6b3b6..ec0b933 100644 --- a/lib/tmonitor/tmonitor.c +++ b/lib/tmonitor/tmonitor.c @@ -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 diff --git a/src/monitor/request-server.c b/src/monitor/request-server.c index eea9e14..775eada 100644 --- a/src/monitor/request-server.c +++ b/src/monitor/request-server.c @@ -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 + * - + */ + 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 + * - + */ + 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: + * - + */ + 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 + * - + */ + 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: - * - - */ - 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 - * - - */ - 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); }