diff --git a/include/spdk/rpc.h b/include/spdk/rpc.h index f012910b4..8e5a52c49 100644 --- a/include/spdk/rpc.h +++ b/include/spdk/rpc.h @@ -81,6 +81,17 @@ typedef void (*spdk_rpc_method_handler)(struct spdk_jsonrpc_request *request, void spdk_rpc_register_method(const char *method, spdk_rpc_method_handler func, uint32_t state_mask); +/** + * Check if \c method is allowed for \c state_mask + * + * \param method Method name + * \param state_mask state mask to check against + * \return 0 if method is allowed or negative error code: + * -EPERM method is not allowed + * -ENOENT method not found + */ +int spdk_rpc_is_method_allowed(const char *method, uint32_t state_mask); + #define SPDK_RPC_STARTUP 0x1 #define SPDK_RPC_RUNTIME 0x2 diff --git a/lib/rpc/rpc.c b/lib/rpc/rpc.c index 2b1dbd824..ea8175df0 100644 --- a/lib/rpc/rpc.c +++ b/lib/rpc/rpc.c @@ -223,6 +223,26 @@ spdk_rpc_register_method(const char *method, spdk_rpc_method_handler func, uint3 SLIST_INSERT_HEAD(&g_rpc_methods, m, slist); } +int +spdk_rpc_is_method_allowed(const char *method, uint32_t state_mask) +{ + struct spdk_rpc_method *m; + + SLIST_FOREACH(m, &g_rpc_methods, slist) { + if (strcmp(m->name, method) != 0) { + continue; + } + + if ((m->state_mask & state_mask) == state_mask) { + return 0; + } else { + return -EPERM; + } + } + + return -ENOENT; +} + void spdk_rpc_close(void) {