struct tmonitor_interest {
int resource_type;
u_int64_t attrs;
- struct tmonitor_interest *next;
};
struct tmonitor_client {
int (*func)(void *data, void *user_data);
void *user_data;
int socket_fd;
- struct tmonitor_interest *interest;
+ //struct tmonitor_interest *interest;
+ GList *g_interest_head;
};
-static struct tmonitor_client *client_head;
static GList *g_tmonitor_client_head;
void add_client_to_list(struct tmonitor_client *client)
client->period = period;
client->func = func;
client->user_data = user_data;
- client->interest = NULL;
+ client->g_interest_head = NULL;
/* open socket to server */
client->socket_fd = socket(AF_INET, SOCK_STREAM, 0);
}
buffer[buffer_len] = '\0';
-
tok = strtok(buffer, ":");
+
response_type = atoi(tok);
if (response_type != REQUEST_INIT) {
_E("[libpass] invalid response");
return -EINVAL;
}
+
tok = strtok(NULL, ":");
client->id = atoi(tok);
add_client_to_list(client);
return client->id;
}
-static void release_interest_list(struct tmonitor_interest *interest)
+static void add_interest_to_list(struct tmonitor_interest *interest, GList **list)
+{
+ if (!interest || !list)
+ return;
+
+ *list = g_list_append(*list, (gpointer)interest);
+}
+
+static void remove_interest_from_list(struct tmonitor_interest *interest, GList **list)
+{
+ if (!interest || !list)
+ return;
+
+ *list = g_list_remove(*list, (gpointer)interest);
+}
+
+static void release_interest_list(GList **interest_head)
{
- struct tmonitor_interest *next;
+ struct tmonitor_interest *interest;
+ GList *node;
+ GList *next;
- while (interest) {
- next = interest->next;
+ if (!interest_head || !*interest_head)
+ return;
+
+ node = *interest_head;
+ while (node != NULL) {
+ next = node->next;
+ interest = node->data;
+ remove_interest_from_list(interest, interest_head);
free(interest);
- interest = next;
+ node = next;
}
}
char buffer[100];
int buffer_len;
struct tmonitor_client *client;
+ char *tok;
+ int response_id;
+ int response_req;
client = find_client_by_id(id);
if (!client) {
}
/* finalize interest list */
- if (client->interest)
- release_interest_list(client->interest);
+ if (client->g_interest_head)
+ release_interest_list(&client->g_interest_head);
buffer_len = sprintf(buffer, "%d:%d", REQUEST_EXIT, id);
if (send(client->socket_fd, buffer, buffer_len, 0) < 0) {
_I("[libpass] tmonitor_exit called for client-%d", id);
+ /* 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_EXIT) {
+ _E("wrong response");
+ return -1;
+ }
+
+ if (response_id != id) {
+ _E("wrong id");
+ return -1;
+ }
+
close(client->socket_fd);
remove_client_from_list(client);
free(client);
EXPORT
int tmonitor_set_attrs(int id, int resource_type, u_int64_t attr_mask)
{
- /* TODO */
+ char buffer[100];
+ int buffer_len;
+ struct tmonitor_client *client;
+ struct tmonitor_interest *interest;
+ char *tok;
+ int response_id;
+ int response_req;
+
+ client = find_client_by_id(id);
+ if (!client) {
+ _E("[libpass] cannot find client-%d", id);
+ return -EINVAL;
+ }
+
+ interest = malloc(sizeof(struct tmonitor_interest));
+ interest->resource_type = resource_type;
+ interest->attrs = attr_mask;
+ add_interest_to_list(interest, &client->g_interest_head);
+
+ buffer_len = sprintf(buffer, "%d:%d:%d:%lx", REQUEST_SET_ATTRS, id, resource_type, attr_mask);
+ if (send(client->socket_fd, buffer, buffer_len, 0) < 0) {
+ _E("[libpass] error occurred while sending buffer");
+ return -EIO;
+ }
+
+ _I("[libpass] send \"%s\" to server", buffer);
+
+ /* wait for response */
+
+ buffer_len = recv(client->socket_fd, buffer, 100, 0);
+ if (buffer_len <= 0) {
+ _E("[libpass] socket disconnected");
+ return -EIO;
+ }
+
+ buffer[buffer_len] = '\0';
+ tok = strtok(buffer, ":");
+ response_req = atoi(tok);
+ tok = strtok(NULL, ":");
+ response_id = atoi(tok);
+
+ if (response_req != REQUEST_SET_ATTRS) {
+ _E("wrong response");
+ return -1;
+ }
+
+ if (response_id != id) {
+ _E("wrong id");
+ return -1;
+ }
+
+ _I("[libpass] tmonitor_set_attrs called for client-%d", id);
return 0;
}
int tmonitor_start(int id)
{
/* TODO */
+ char buffer[100];
+ int buffer_len;
+ struct tmonitor_client *client;
+ struct tmonitor_interest *interest;
+
+ client = find_client_by_id(id);
+ if (!client) {
+ _E("[libpass] cannot find client-%d", id);
+ return -EINVAL;
+ }
+
+ buffer_len = sprintf(buffer, "%d:%d", REQUEST_START, id);
+ if (send(client->socket_fd, buffer, buffer_len, 0) < 0) {
+ _E("[libpass] error occurred while sending buffer");
+ return -EIO;
+ }
+
return 0;
}