4 * Copyright (c) Intel Corporation.
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
11 * * Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * * Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in
15 * the documentation and/or other materials provided with the
17 * * Neither the name of Intel Corporation nor the names of its
18 * contributors may be used to endorse or promote products derived
19 * from this software without specific prior written permission.
21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
35 #include "spdk/util.h"
37 #include "spdk_internal/log.h"
43 struct rpc_log_level
{
48 free_rpc_log_flag(struct rpc_log_flag
*p
)
54 free_rpc_log_level(struct rpc_log_level
*p
)
59 static const struct spdk_json_object_decoder rpc_log_flag_decoders
[] = {
60 {"flag", offsetof(struct rpc_log_flag
, flag
), spdk_json_decode_string
},
63 static const struct spdk_json_object_decoder rpc_log_level_decoders
[] = {
64 {"level", offsetof(struct rpc_log_level
, level
), spdk_json_decode_string
},
68 _parse_log_level(char *level
)
70 if (!strcasecmp(level
, "ERROR")) {
71 return SPDK_LOG_ERROR
;
72 } else if (!strcasecmp(level
, "WARNING")) {
74 } else if (!strcasecmp(level
, "NOTICE")) {
75 return SPDK_LOG_NOTICE
;
76 } else if (!strcasecmp(level
, "INFO")) {
78 } else if (!strcasecmp(level
, "DEBUG")) {
79 return SPDK_LOG_DEBUG
;
85 _get_log_level_name(int level
)
87 if (level
== SPDK_LOG_ERROR
) {
89 } else if (level
== SPDK_LOG_WARN
) {
91 } else if (level
== SPDK_LOG_NOTICE
) {
93 } else if (level
== SPDK_LOG_INFO
) {
95 } else if (level
== SPDK_LOG_DEBUG
) {
102 spdk_rpc_set_log_print_level(struct spdk_jsonrpc_request
*request
,
103 const struct spdk_json_val
*params
)
105 struct rpc_log_level req
= {};
107 struct spdk_json_write_ctx
*w
;
109 if (spdk_json_decode_object(params
, rpc_log_level_decoders
,
110 SPDK_COUNTOF(rpc_log_level_decoders
), &req
)) {
111 SPDK_DEBUGLOG(SPDK_LOG_LOG
, "spdk_json_decode_object failed\n");
115 level
= _parse_log_level(req
.level
);
117 SPDK_DEBUGLOG(SPDK_LOG_LOG
, "try to set invalid log level\n");
121 spdk_log_set_print_level(level
);
122 free_rpc_log_level(&req
);
124 w
= spdk_jsonrpc_begin_result(request
);
129 spdk_json_write_bool(w
, true);
130 spdk_jsonrpc_end_result(request
, w
);
134 spdk_jsonrpc_send_error_response(request
, SPDK_JSONRPC_ERROR_INVALID_PARAMS
, "Invalid parameters");
135 free_rpc_log_level(&req
);
137 SPDK_RPC_REGISTER("set_log_print_level", spdk_rpc_set_log_print_level
,
138 SPDK_RPC_STARTUP
| SPDK_RPC_RUNTIME
)
141 spdk_rpc_get_log_print_level(struct spdk_jsonrpc_request
*request
,
142 const struct spdk_json_val
*params
)
144 struct spdk_json_write_ctx
*w
;
148 if (params
!= NULL
) {
149 spdk_jsonrpc_send_error_response(request
, SPDK_JSONRPC_ERROR_INVALID_PARAMS
,
150 "get_log_print_level requires no parameters");
154 level
= spdk_log_get_print_level();
155 name
= _get_log_level_name(level
);
157 spdk_jsonrpc_send_error_response(request
, SPDK_JSONRPC_ERROR_INTERNAL_ERROR
,
162 w
= spdk_jsonrpc_begin_result(request
);
167 spdk_json_write_string(w
, name
);
169 spdk_jsonrpc_end_result(request
, w
);
171 SPDK_RPC_REGISTER("get_log_print_level", spdk_rpc_get_log_print_level
,
172 SPDK_RPC_STARTUP
| SPDK_RPC_RUNTIME
)
175 spdk_rpc_set_log_level(struct spdk_jsonrpc_request
*request
,
176 const struct spdk_json_val
*params
)
178 struct rpc_log_level req
= {};
180 struct spdk_json_write_ctx
*w
;
182 if (spdk_json_decode_object(params
, rpc_log_level_decoders
,
183 SPDK_COUNTOF(rpc_log_level_decoders
), &req
)) {
184 SPDK_DEBUGLOG(SPDK_LOG_LOG
, "spdk_json_decode_object failed\n");
188 level
= _parse_log_level(req
.level
);
190 SPDK_DEBUGLOG(SPDK_LOG_LOG
, "try to set invalid log level\n");
195 spdk_log_set_level(level
);
196 free_rpc_log_level(&req
);
198 w
= spdk_jsonrpc_begin_result(request
);
203 spdk_json_write_bool(w
, true);
204 spdk_jsonrpc_end_result(request
, w
);
208 spdk_jsonrpc_send_error_response(request
, SPDK_JSONRPC_ERROR_INVALID_PARAMS
, "Invalid parameters");
209 free_rpc_log_level(&req
);
211 SPDK_RPC_REGISTER("set_log_level", spdk_rpc_set_log_level
, SPDK_RPC_STARTUP
| SPDK_RPC_RUNTIME
)
214 spdk_rpc_get_log_level(struct spdk_jsonrpc_request
*request
,
215 const struct spdk_json_val
*params
)
217 struct spdk_json_write_ctx
*w
;
221 if (params
!= NULL
) {
222 spdk_jsonrpc_send_error_response(request
, SPDK_JSONRPC_ERROR_INVALID_PARAMS
,
223 "get_log_level requires no parameters");
227 level
= spdk_log_get_level();
228 name
= _get_log_level_name(level
);
230 spdk_jsonrpc_send_error_response(request
, SPDK_JSONRPC_ERROR_INTERNAL_ERROR
,
235 w
= spdk_jsonrpc_begin_result(request
);
240 spdk_json_write_string(w
, name
);
242 spdk_jsonrpc_end_result(request
, w
);
244 SPDK_RPC_REGISTER("get_log_level", spdk_rpc_get_log_level
, SPDK_RPC_STARTUP
| SPDK_RPC_RUNTIME
)
247 spdk_rpc_set_log_flag(struct spdk_jsonrpc_request
*request
,
248 const struct spdk_json_val
*params
)
250 struct rpc_log_flag req
= {};
251 struct spdk_json_write_ctx
*w
;
253 if (spdk_json_decode_object(params
, rpc_log_flag_decoders
,
254 SPDK_COUNTOF(rpc_log_flag_decoders
), &req
)) {
255 SPDK_DEBUGLOG(SPDK_LOG_LOG
, "spdk_json_decode_object failed\n");
260 SPDK_DEBUGLOG(SPDK_LOG_LOG
, "flag was 0\n");
264 spdk_log_set_flag(req
.flag
);
265 free_rpc_log_flag(&req
);
267 w
= spdk_jsonrpc_begin_result(request
);
272 spdk_json_write_bool(w
, true);
273 spdk_jsonrpc_end_result(request
, w
);
277 spdk_jsonrpc_send_error_response(request
, SPDK_JSONRPC_ERROR_INVALID_PARAMS
, "Invalid parameters");
278 free_rpc_log_flag(&req
);
280 SPDK_RPC_REGISTER("set_log_flag", spdk_rpc_set_log_flag
, SPDK_RPC_STARTUP
| SPDK_RPC_RUNTIME
)
281 SPDK_RPC_REGISTER_ALIAS_DEPRECATED(set_log_flag
, set_trace_flag
)
284 spdk_rpc_clear_log_flag(struct spdk_jsonrpc_request
*request
,
285 const struct spdk_json_val
*params
)
287 struct rpc_log_flag req
= {};
288 struct spdk_json_write_ctx
*w
;
290 if (spdk_json_decode_object(params
, rpc_log_flag_decoders
,
291 SPDK_COUNTOF(rpc_log_flag_decoders
), &req
)) {
292 SPDK_DEBUGLOG(SPDK_LOG_LOG
, "spdk_json_decode_object failed\n");
297 SPDK_DEBUGLOG(SPDK_LOG_LOG
, "flag was 0\n");
301 spdk_log_clear_flag(req
.flag
);
302 free_rpc_log_flag(&req
);
304 w
= spdk_jsonrpc_begin_result(request
);
309 spdk_json_write_bool(w
, true);
310 spdk_jsonrpc_end_result(request
, w
);
314 spdk_jsonrpc_send_error_response(request
, SPDK_JSONRPC_ERROR_INVALID_PARAMS
, "Invalid parameters");
315 free_rpc_log_flag(&req
);
317 SPDK_RPC_REGISTER("clear_log_flag", spdk_rpc_clear_log_flag
,
318 SPDK_RPC_STARTUP
| SPDK_RPC_RUNTIME
)
319 SPDK_RPC_REGISTER_ALIAS_DEPRECATED(clear_log_flag
, clear_trace_flag
)
322 spdk_rpc_get_log_flags(struct spdk_jsonrpc_request
*request
,
323 const struct spdk_json_val
*params
)
325 struct spdk_json_write_ctx
*w
;
326 struct spdk_log_flag
*flag
;
328 if (params
!= NULL
) {
329 spdk_jsonrpc_send_error_response(request
, SPDK_JSONRPC_ERROR_INVALID_PARAMS
,
330 "get_log_flags requires no parameters");
334 w
= spdk_jsonrpc_begin_result(request
);
339 spdk_json_write_object_begin(w
);
340 flag
= spdk_log_get_first_flag();
342 spdk_json_write_name(w
, flag
->name
);
343 spdk_json_write_bool(w
, flag
->enabled
);
344 flag
= spdk_log_get_next_flag(flag
);
346 spdk_json_write_object_end(w
);
347 spdk_jsonrpc_end_result(request
, w
);
349 SPDK_RPC_REGISTER("get_log_flags", spdk_rpc_get_log_flags
, SPDK_RPC_STARTUP
| SPDK_RPC_RUNTIME
)
350 SPDK_RPC_REGISTER_ALIAS_DEPRECATED(get_log_flags
, get_trace_flags
)