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);
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
}
+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];
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)
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;
}
}
- return THREAD_RETURN_DONE;
+ return THREAD_RETURN_DONE;
error_out:
client->state = CLIENT_FINALIZED;
}
_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);
}