5d0f262073
As a step toward non-blocking JSON RPC client change the the way we retrive the response. Now we retrive full response by calling spdk_jsonrpc_client_recv_response(). If response is ready it will be parsed to spdk_jsonrpc_client_response object then user can issue spdk_jsonrpc_client_get_response() to get the response object. When processing response object is done the user calls spdk_jsonrpc_client_free_response() to free it. This logic will simplify both non-blocking mode and multiple response handling. Change-Id: I737d8a34283f4a68795d6bc6ba0c8646b7ae3319 Signed-off-by: Pawel Wodkowski <pawelx.wodkowski@intel.com> Reviewed-on: https://review.gerrithub.io/429262 Tested-by: SPDK CI Jenkins <sys_sgci@intel.com> Reviewed-by: Ben Walker <benjamin.walker@intel.com> Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com> Reviewed-by: Darek Stojaczyk <dariusz.stojaczyk@intel.com> Reviewed-by: Jim Harris <james.r.harris@intel.com> Chandler-Test-Pool: SPDK Automated Test System <sys_sgsw@intel.com>
138 lines
3.9 KiB
C
138 lines
3.9 KiB
C
/*-
|
|
* BSD LICENSE
|
|
*
|
|
* Copyright (c) Intel Corporation.
|
|
* All rights reserved.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions
|
|
* are met:
|
|
*
|
|
* * Redistributions of source code must retain the above copyright
|
|
* notice, this list of conditions and the following disclaimer.
|
|
* * Redistributions in binary form must reproduce the above copyright
|
|
* notice, this list of conditions and the following disclaimer in
|
|
* the documentation and/or other materials provided with the
|
|
* distribution.
|
|
* * Neither the name of Intel Corporation nor the names of its
|
|
* contributors may be used to endorse or promote products derived
|
|
* from this software without specific prior written permission.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
*/
|
|
|
|
#include "spdk/stdinc.h"
|
|
#include "spdk/event.h"
|
|
#include "spdk/jsonrpc.h"
|
|
|
|
#define RPC_MAX_METHODS 200
|
|
|
|
static const char *g_rpcsock_addr = SPDK_DEFAULT_RPC_ADDR;
|
|
static int g_addr_family = AF_UNIX;
|
|
|
|
#define RPC_MAX_METHODS 200
|
|
|
|
struct get_jsonrpc_methods_resp {
|
|
char *method_names[RPC_MAX_METHODS];
|
|
size_t method_num;
|
|
};
|
|
|
|
static int
|
|
get_jsonrpc_method_json_parser(struct get_jsonrpc_methods_resp *resp,
|
|
const struct spdk_json_val *result)
|
|
{
|
|
return spdk_json_decode_array(result, spdk_json_decode_string, resp->method_names,
|
|
RPC_MAX_METHODS, &resp->method_num, sizeof(char *));
|
|
}
|
|
|
|
static int
|
|
spdk_jsonrpc_client_check_rpc_method(struct spdk_jsonrpc_client *client, char *method_name)
|
|
{
|
|
int rc, i;
|
|
struct spdk_jsonrpc_client_response *json_resp = NULL;
|
|
struct get_jsonrpc_methods_resp resp = {};
|
|
struct spdk_json_write_ctx *w;
|
|
struct spdk_jsonrpc_client_request *request;
|
|
|
|
request = spdk_jsonrpc_client_create_request();
|
|
if (request == NULL) {
|
|
return -ENOMEM;
|
|
}
|
|
|
|
w = spdk_jsonrpc_begin_request(request, 1, "get_rpc_methods");
|
|
spdk_jsonrpc_end_request(request, w);
|
|
spdk_jsonrpc_client_send_request(client, request);
|
|
spdk_jsonrpc_client_free_request(request);
|
|
|
|
rc = spdk_jsonrpc_client_recv_response(client);
|
|
if (rc) {
|
|
goto out;
|
|
}
|
|
|
|
json_resp = spdk_jsonrpc_client_get_response(client);
|
|
if (json_resp == NULL) {
|
|
rc = -errno;
|
|
goto out;
|
|
|
|
}
|
|
|
|
/* Check for error response */
|
|
if (json_resp->error != NULL) {
|
|
rc = -1;
|
|
goto out;
|
|
}
|
|
|
|
assert(json_resp->result);
|
|
|
|
rc = get_jsonrpc_method_json_parser(&resp, json_resp->result);
|
|
if (rc) {
|
|
goto out;
|
|
}
|
|
|
|
for (i = 0; i < (int)resp.method_num; i++) {
|
|
if (strcmp(method_name, resp.method_names[i]) == 0) {
|
|
rc = 0;
|
|
goto out;
|
|
}
|
|
}
|
|
|
|
rc = -1;
|
|
|
|
out:
|
|
for (i = 0; i < (int)resp.method_num; i++) {
|
|
SPDK_NOTICELOG("%s\n", resp.method_names[i]);
|
|
free(resp.method_names[i]);
|
|
}
|
|
|
|
spdk_jsonrpc_client_free_response(json_resp);
|
|
return rc;
|
|
}
|
|
|
|
int main(int argc, char **argv)
|
|
{
|
|
struct spdk_jsonrpc_client *client;
|
|
int rc;
|
|
char *method_name = "get_rpc_methods";
|
|
|
|
client = spdk_jsonrpc_client_connect(g_rpcsock_addr, g_addr_family);
|
|
if (!client) {
|
|
return EXIT_FAILURE;
|
|
}
|
|
|
|
rc = spdk_jsonrpc_client_check_rpc_method(client, method_name);
|
|
|
|
spdk_jsonrpc_client_close(client);
|
|
|
|
return rc ? EXIT_FAILURE : 0;
|
|
}
|