return NULL;
}
+static int handle_resource_attr(int request, int id, int resource_id, u_int64_t attr_mask)
+{
+ char buffer[MAX_BUF_SIZE + 1];
+ int buffer_len;
+ int response_req;
+ 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");
+ return -EIO;
+ }
+
+ /* wait for response */
+ buffer_len = recv(id, buffer, MAX_BUF_SIZE, 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) {
+ _E("[libpass] wrong response");
+ return -EINVAL;
+ }
+
+ return ret;
+}
+
EXPORT
int tmonitor_init(void)
{
EXPORT
int tmonitor_get_resource_count(int id, int resource_type)
{
- return 0;
+ char buffer[MAX_BUF_SIZE + 1];
+ int buffer_len;
+ int response_req;
+ int ret;
+
+ 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, MAX_BUF_SIZE, 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;
}
EXPORT
EXPORT
int tmonitor_delete_resource(int id, int resource_id)
{
- return 0;
+ char buffer[MAX_BUF_SIZE + 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, MAX_BUF_SIZE, 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_DELETE_RESOURCE) {
+ _E("wrong response");
+ return -EINVAL;
+ }
+
+ return ret;
}
EXPORT
EXPORT
int tmonitor_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);
+}
+
+EXPORT
+int tmonitor_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);
+}
+
+EXPORT
+bool tmonitor_is_resource_attr_supported(int id, int resource_id, u_int64_t attr_id)
+{
char buffer[MAX_BUF_SIZE + 1];
int buffer_len;
int response_req;
int ret;
- buffer_len = sprintf(buffer, "%d:%d:%"PRIu64,
- REQUEST_SET_RESOURCE_ATTR, resource_id, attr_mask);
+ 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 -EIO;
if (sscanf(buffer, "%d:%d", &response_req, &ret) < 2)
return -EINVAL;
- if (response_req != REQUEST_SET_RESOURCE_ATTR) {
+ if (response_req != REQUEST_IS_RESOURCE_ATTR_SUPPORTED) {
_E("[libpass] wrong response");
return -EINVAL;
}
- return ret;
+ return (bool)ret;
}
EXPORT
-int tmonitor_unset_resource_attr(int id, int resource_id, u_int64_t attr_mask)
+int tmonitor_update(int id)
{
- return 0;
-}
+ char buffer[MAX_BUF_SIZE + 1];
+ int buffer_len;
+ int response_req;
+ int ret;
-EXPORT
-bool tmonitor_is_resource_attr_supported(int id, int resource_id, u_int64_t attr_id)
-{
- return 0;
-}
+ 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;
+ }
-EXPORT
-int tmonitor_update(int id)
-{
- return 0;
+ /* wait for response */
+ buffer_len = recv(id, buffer, MAX_BUF_SIZE, 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;
}
EXPORT
delete_resource(res);
}
+static void update_resource(gpointer key, gpointer value, gpointer user_data)
+{
+ struct resource *res = value;
+ int ret;
+
+ ret = update_resource_attrs(res);
+ if (ret < 0)
+ _E("failed to update resource attributes (name:%s,id:%d)\n",
+ res->name, res->id);
+}
+
static void finalize_request_client(struct request_client *client)
{
if (!client)
return res->id;
}
+static int handle_request_delete_resource(struct request_client *client, char *args)
+{
+ struct resource *res;
+ int resource_id;
+
+ if (!client || !args)
+ return -ENOENT;
+
+ /**
+ * Format of REQUEST_DELETE_RESOURCE args:
+ * - <RESOURCE_ID>
+ */
+ resource_id = atoi(args);
+
+ res = get_resource_by_id(client, resource_id);
+ if (!res)
+ return -EINVAL;
+
+ delete_resource(res);
+
+ return 0;
+}
+
static int handle_request_update_resource(struct request_client *client, char *args)
{
struct resource *res;
return update_resource_attrs(res);
}
-static int handle_request_set_resource_attr(struct request_client *client, char *args)
+static int handle_request_get_resource_count(struct request_client *client, char *args)
+{
+ int resource_type;
+
+ if (!client || !args)
+ return -ENOENT;
+
+ /**
+ * Format of REQUEST_GET_RESOURCE_COUNT args:
+ * - <RESOURCE_TYPE>
+ */
+ resource_type = atoi(args);
+
+ return get_resource_device_count(resource_type);
+}
+
+static int handle_request_update_resource_all(struct request_client *client, char *args)
+{
+ if (!client)
+ return -ENOENT;
+
+ /**
+ * Format of REQUEST_UPDATE_RESOURCE args:
+ * - NULL
+ */
+ if (client->resource_table)
+ g_hash_table_foreach(client->resource_table, (GHFunc)update_resource, NULL);
+
+ return 0;
+}
+
+static int handle_request_set_resource_attr(struct request_client *client, char *args, int request_type)
{
struct resource *res;
- int resource_id;
+ int resource_id, ret;
u_int64_t interest_masks;
if (!client || !args)
return -ENOENT;
/**
- * Format of REQUEST_SET_RESOURCE_ATTR args:
+ * Format of REQUEST_SET_RESOURCE_ATTR and REQUEST_UNSET_RESOURCE_ATTR args:
* - <RESOURCE_ID:INTEREST_MASK>
*/
if (sscanf(args, "%d:%"PRIu64, &resource_id, &interest_masks) < 2)
if (!res)
return -EINVAL;
- set_resource_attr_interest(res, interest_masks);
+ switch (request_type) {
+ case REQUEST_SET_RESOURCE_ATTR:
+ ret = set_resource_attr_interest(res, interest_masks);
+ break;
+ case REQUEST_UNSET_RESOURCE_ATTR:
+ ret = unset_resource_attr_interest(res, interest_masks);
+ break;
+ default:
+ return -EINVAL;
+ }
- return 0;
+ return ret;
+}
+
+static int handle_request_is_resource_attr_supported(struct request_client *client, char *args)
+{
+ struct resource *res;
+ int resource_id;
+ u_int64_t attr_id;
+
+ if (!client || !args)
+ return -ENOENT;
+
+ /**
+ * Format of REQUEST_IS_RESOURCE_ATTR_SUPPORTED args:
+ * - <RESOURCE_ID:RESOURCE_ATTR_ID>
+ */
+ if (sscanf(args, "%d:%"PRIu64"", &resource_id, &attr_id) < 2)
+ return -EINVAL;
+
+ res = get_resource_by_id(client, resource_id);
+ if (!res)
+ return -EINVAL;
+
+ return (int)is_resource_attr_supported(res, attr_id);
}
static int handle_request_set_resource_ctrl(struct request_client *client, char *args)
if (ret < 0)
_D("failed to create resource");
break;
+ case REQUEST_DELETE_RESOURCE:
+ ret = handle_request_delete_resource(client, args);
+ if (ret < 0)
+ _E("failed to delete resource");
+ break;
case REQUEST_UPDATE_RESOURCE:
ret = handle_request_update_resource(client, args);
if (ret < 0)
_D("failed to update resource");
break;
+ case REQUEST_GET_RESOURCE_COUNT:
+ ret = handle_request_get_resource_count(client, args);
+ if (ret < 0)
+ _E("failed to get resource count");
+ break;
+ case REQUEST_UPDATE_RESOURCE_ALL:
+ ret = handle_request_update_resource_all(client, args);
+ if (ret < 0)
+ _E("failed to update all resources");
+ break;
case REQUEST_SET_RESOURCE_CTRL:
ret = handle_request_set_resource_ctrl(client, args);
if (ret < 0)
_D("failed to set resource control");
break;
case REQUEST_SET_RESOURCE_ATTR:
- ret = handle_request_set_resource_attr(client, args);
+ case REQUEST_UNSET_RESOURCE_ATTR:
+ ret = handle_request_set_resource_attr(client, args, request_type);
+ if (ret < 0)
+ _E("failed to %s attr interest",
+ request_type == REQUEST_SET_RESOURCE_ATTR
+ ? "set" : "unset");
+ break;
+ case REQUEST_IS_RESOURCE_ATTR_SUPPORTED:
+ ret = handle_request_is_resource_attr_supported(client, args);
if (ret < 0)
- _D("failed to set attr interest");
+ _E("failed to check whether attr is supported or not");
break;
case REQUEST_GET_VALUE_INT:
{