monitor: Add a handler function for REQUEST_SET_RESOURCE_PUBLIC
authorSung-hun Kim <sfoon.kim@samsung.com>
Tue, 23 Aug 2022 11:27:56 +0000 (20:27 +0900)
committerSung-hun Kim <sfoon.kim@samsung.com>
Tue, 23 Aug 2022 11:27:56 +0000 (20:27 +0900)
For users of capi, some information such as process information
does not be provided. To distinguish users, we set the visibility
of the resource to PUBLIC or PRIVATE due to the user's context.

Change-Id: I23a6b279aa2983aeb6e88cd51458d0c430e8692b
Signed-off-by: Sung-hun Kim <sfoon.kim@samsung.com>
include/monitor/request.h
include/util/resource.h
src/monitor/request-handler.c
src/util/resource.c

index 1be6279581cb4519d3829489a49df518522f666b..d1954db6117d757b6062f41104406bb83c3525c7 100644 (file)
@@ -47,6 +47,7 @@ enum {
        REQUEST_GET_RESOURCE_TS,
        REQUEST_GET_RESOURCE_LIST_JSON,
        REQUEST_IS_RESOURCE_ATTR_SET,
+       REQUEST_SET_RESOURCE_PUBLIC,
        REQUEST_MAX,
 };
 
@@ -72,6 +73,7 @@ static const char request_name[][128] = {
        "REQUEST_GET_RESOURCE_TS",
        "REQUEST_GET_RESOURCE_LIST_JSON",
        "REQUEST_IS_RESOURCE_ATTR_SET",
+       "REQUEST_SET_RESOURCE_PUBLIC",
        "REQUEST_MAX",
 };
 
index 43c178ac626eb2b5a99d9e7dee925485c1ff812e..f93962006adfce39439b143ad34abb29588b242e 100644 (file)
@@ -155,6 +155,9 @@ void remove_resource_device(struct resource_device *resource_device);
 struct resource *create_resource(int resource_type);
 void delete_resource(struct resource *resource);
 
+/* Set visibility of the resource to public */
+int set_resource_public(struct resource *resource);
+
 /* Handle resource control */
 int set_resource_control(struct resource *resource, u_int64_t ctrl_id, const void *data);
 const char *get_resource_control_name(struct resource *resource, u_int64_t ctrl_id);
index 068d9508f04e8b5b39e1aec3e24dbf939f6a1bf0..502c17506d5c41ba674a4532e7914c05efdf246d 100644 (file)
@@ -261,6 +261,42 @@ static int handle_request_set_resource_attr(struct request_client *client, char
        return ret;
 }
 
+static int handle_request_set_resource_public(struct request_client *client, char *args)
+{
+       struct resource *res;
+       int resource_id, ret;
+
+       if (!client || !args) {
+               _E("Invalid parameter\n");
+               return -ENOENT;
+       }
+
+       /**
+        * Format of REQUEST_SET_RESOURCE_ATTR and REQUEST_UNSET_RESOURCE_ATTR args:
+        *  - <RESOURCE_ID>
+        */
+       if (sscanf(args, "%d", &resource_id) < 1) {
+               _E("failed to get resource and attribute id, client(%d)\n",
+                                       client->socket_fd);
+               return -EINVAL;
+       }
+
+       res = get_resource_by_id(client, resource_id);
+       if (!res) {
+               _E("failed to get resource, client(%d) | res:name(%s)id(%d)\n",
+                                       client->socket_fd,
+                                       get_resource_name(res), resource_id);
+               return -EINVAL;
+       }
+
+       ret = set_resource_public(res);
+       if (ret < 0)
+               _E("failed to set visibility to public, client(%d) | res:name(%s)id(%d)\n",
+                               client->socket_fd,
+                               get_resource_name(res), resource_id);
+       return ret;
+}
+
 static int handle_request_is_resource_attr_supported(struct request_client *client, char *args, bool *supported)
 {
        struct resource *res;
@@ -763,6 +799,9 @@ static int handle_request(struct request_client *client, char *request)
        case REQUEST_UPDATE_RESOURCE:
                ret = handle_request_update_resource(client, args);
                break;
+       case REQUEST_SET_RESOURCE_PUBLIC:
+               ret = handle_request_set_resource_public(client, args);
+               break;
        case REQUEST_GET_RESOURCE_COUNT:
                {
                        int32_t value;
index 3e7b828e8c41f1df33762568c6a63ee4d0122ee7..cb6bc5ff2d7b04adf1b195b7cf67606d7d6b591b 100644 (file)
@@ -45,6 +45,8 @@ struct resource {
        u_int64_t attr_interest;
        u_int64_t attr_supported;
 
+       int visibility;
+
        int64_t ts_start;
        int64_t ts_end;
 };
@@ -257,6 +259,8 @@ struct resource *create_resource(int resource_type)
        resource->ctrls = driver->ctrls;
        resource->num_ctrls = driver->num_ctrls;
 
+       resource->visibility = VISIBILITY_PRIVATE;
+
        if (driver->ops.create) {
                ret = driver->ops.create(resource);
                if (ret < 0) {
@@ -270,6 +274,15 @@ struct resource *create_resource(int resource_type)
        return resource;
 }
 
+int set_resource_public(struct resource *resource)
+{
+       if (!resource)
+               return -EINVAL;
+
+       resource->visibility = VISIBILITY_PUBLIC;
+       return 0;
+}
+
 int set_resource_control(struct resource *resource, u_int64_t ctrl_id, const void *data)
 {
        const struct resource_control *ctrl;
@@ -947,6 +960,14 @@ int set_resource_attr_interest(struct resource *resource, u_int64_t interest_mas
                        goto err;
                }
 
+               if (resource->visibility < resource->attrs[i].visibility) {
+                       _E("visibility(%d) of res:name(%s) is not enough to read the attr:name(%s, %d)",
+                                       resource->visibility, resource->name,
+                                       resource->attrs[i].name, resource->attrs[i].visibility);
+                       ret = -EPERM;
+                       goto err;
+               }
+
                attr_value = get_resource_attr_value(resource, resource->attrs[i].id);
                if (!attr_value) {
                        _E("failed to get attribute value, res:type(%s) | attr:name(%s)",