xref: /spdk/module/keyring/file/keyring_rpc.c (revision 95d6c9fac17572b107042103439aafd696d60b0e)
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright (c) 2024 Intel Corporation. All rights reserved.
3  */
4 
5 #include "spdk/json.h"
6 #include "spdk/module/keyring/file.h"
7 #include "spdk/rpc.h"
8 #include "spdk/string.h"
9 #include "spdk/util.h"
10 
11 struct rpc_keyring_file_add_key {
12 	char *name;
13 	char *path;
14 };
15 
16 static const struct spdk_json_object_decoder rpc_keyring_file_add_key_decoders[] = {
17 	{"name", offsetof(struct rpc_keyring_file_add_key, name), spdk_json_decode_string},
18 	{"path", offsetof(struct rpc_keyring_file_add_key, path), spdk_json_decode_string},
19 };
20 
21 static void
22 free_rpc_keyring_file_add_key(struct rpc_keyring_file_add_key *opts)
23 {
24 	free(opts->name);
25 	free(opts->path);
26 }
27 
28 static void
29 rpc_keyring_file_add_key(struct spdk_jsonrpc_request *request,
30 			 const struct spdk_json_val *params)
31 {
32 	struct rpc_keyring_file_add_key opts = {};
33 	int rc;
34 
35 	if (spdk_json_decode_object_relaxed(params, rpc_keyring_file_add_key_decoders,
36 					    SPDK_COUNTOF(rpc_keyring_file_add_key_decoders),
37 					    &opts)) {
38 		spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INVALID_PARAMS,
39 						 spdk_strerror(EINVAL));
40 		return;
41 	}
42 
43 	rc = spdk_keyring_file_add_key(opts.name, opts.path);
44 	if (rc != 0) {
45 		spdk_jsonrpc_send_error_response(request, rc, spdk_strerror(-rc));
46 		goto out;
47 	}
48 
49 	spdk_jsonrpc_send_bool_response(request, true);
50 out:
51 	free_rpc_keyring_file_add_key(&opts);
52 }
53 SPDK_RPC_REGISTER("keyring_file_add_key", rpc_keyring_file_add_key, SPDK_RPC_RUNTIME)
54 
55 struct rpc_keyring_file_remove_key {
56 	char *name;
57 };
58 
59 static const struct spdk_json_object_decoder rpc_keyring_file_remove_key_decoders[] = {
60 	{"name", offsetof(struct rpc_keyring_file_remove_key, name), spdk_json_decode_string},
61 };
62 
63 static void
64 free_rpc_keyring_file_remove_key(struct rpc_keyring_file_remove_key *r)
65 {
66 	free(r->name);
67 }
68 
69 static void
70 rpc_keyring_file_remove_key(struct spdk_jsonrpc_request *request,
71 			    const struct spdk_json_val *params)
72 {
73 	struct rpc_keyring_file_remove_key req = {};
74 	int rc;
75 
76 	if (spdk_json_decode_object(params, rpc_keyring_file_remove_key_decoders,
77 				    SPDK_COUNTOF(rpc_keyring_file_remove_key_decoders),
78 				    &req)) {
79 		spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INVALID_PARAMS,
80 						 spdk_strerror(EINVAL));
81 		return;
82 	}
83 
84 	rc = spdk_keyring_file_remove_key(req.name);
85 	if (rc != 0) {
86 		spdk_jsonrpc_send_error_response(request, rc, spdk_strerror(-rc));
87 		goto out;
88 	}
89 
90 	spdk_jsonrpc_send_bool_response(request, true);
91 out:
92 	free_rpc_keyring_file_remove_key(&req);
93 }
94 SPDK_RPC_REGISTER("keyring_file_remove_key", rpc_keyring_file_remove_key, SPDK_RPC_RUNTIME)
95