REQUEST_GET_RESOURCE_TS,
REQUEST_GET_RESOURCE_LIST_JSON,
REQUEST_IS_RESOURCE_ATTR_SET,
+ REQUEST_SET_RESOURCE_PUBLIC,
REQUEST_MAX,
};
"REQUEST_GET_RESOURCE_TS",
"REQUEST_GET_RESOURCE_LIST_JSON",
"REQUEST_IS_RESOURCE_ATTR_SET",
+ "REQUEST_SET_RESOURCE_PUBLIC",
"REQUEST_MAX",
};
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);
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;
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;
u_int64_t attr_interest;
u_int64_t attr_supported;
+ int visibility;
+
int64_t ts_start;
int64_t ts_end;
};
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) {
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;
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)",