|
13 | 13 |
|
14 | 14 | NRF_RPC_GROUP_DECLARE(dev_info_group);
|
15 | 15 |
|
16 |
| -static char version[16]; |
| 16 | +#define MAX_ARGV_SIZE 255 |
17 | 17 |
|
18 |
| -const char *nrf_rpc_get_ncs_commit_sha(void) |
| 18 | +static char *allocate_buffer_and_decode_str(struct nrf_rpc_cbor_ctx *ctx, |
| 19 | + enum def_info_rpc_cmd_server cmd) |
19 | 20 | {
|
20 |
| - struct nrf_rpc_cbor_ctx ctx; |
21 |
| - size_t size = ARRAY_SIZE(version); |
| 21 | + const void *ptr; |
| 22 | + size_t len; |
| 23 | + char *output = NULL; |
| 24 | + |
| 25 | + ptr = nrf_rpc_decode_str_ptr_and_len(ctx, &len); |
| 26 | + |
| 27 | + if (ptr) { |
| 28 | + output = k_malloc(len + 1); |
| 29 | + if (output) { |
| 30 | + memcpy(output, ptr, len); |
| 31 | + output[len] = '\0'; |
| 32 | + } |
| 33 | + } |
| 34 | + |
| 35 | + if (!nrf_rpc_decoding_done_and_check(&dev_info_group, ctx)) { |
| 36 | + nrf_rpc_err(-EBADMSG, NRF_RPC_ERR_SRC_RECV, &dev_info_group, cmd, |
| 37 | + NRF_RPC_PACKET_TYPE_RSP); |
| 38 | + k_free(output); |
| 39 | + return NULL; |
| 40 | + } |
22 | 41 |
|
23 |
| - memset(version, 0, ARRAY_SIZE(version)); |
| 42 | + return output; |
| 43 | +} |
| 44 | + |
| 45 | +char *nrf_rpc_get_ncs_commit_sha(void) |
| 46 | +{ |
| 47 | + struct nrf_rpc_cbor_ctx ctx; |
24 | 48 |
|
25 | 49 | NRF_RPC_CBOR_ALLOC(&dev_info_group, ctx, 0);
|
26 | 50 |
|
27 | 51 | nrf_rpc_cbor_cmd_rsp_no_err(&dev_info_group, DEV_INFO_RPC_GET_VERSION, &ctx);
|
28 | 52 |
|
29 |
| - nrf_rpc_decode_str(&ctx, version, size); |
| 53 | + return allocate_buffer_and_decode_str(&ctx, DEV_INFO_RPC_GET_VERSION); |
| 54 | +} |
| 55 | + |
| 56 | +static size_t get_cmd_len(size_t argc, char *argv[]) |
| 57 | +{ |
| 58 | + size_t len = 0; |
| 59 | + |
| 60 | + for (size_t i = 0; i < argc; i++) { |
| 61 | + if (argv[i] == NULL) { |
| 62 | + return 0; |
| 63 | + } |
| 64 | + |
| 65 | + len += strnlen(argv[i], MAX_ARGV_SIZE) + 1; |
| 66 | + } |
| 67 | + |
| 68 | + return len; |
| 69 | +} |
| 70 | + |
| 71 | +static size_t create_cmd_line(char *buffer, size_t cmd_buffer_size, size_t argc, char *argv[]) |
| 72 | +{ |
| 73 | + size_t len = 0; |
| 74 | + |
| 75 | + for (size_t i = 0; i < argc; i++) { |
| 76 | + if (argv[i] == NULL) { |
| 77 | + return 0; |
| 78 | + } |
| 79 | + |
| 80 | + size_t arg_len = strnlen(argv[i], MAX_ARGV_SIZE); |
| 81 | + |
| 82 | + if (len + arg_len + 1 > cmd_buffer_size) { |
| 83 | + return 0; |
| 84 | + } |
| 85 | + memcpy(buffer + len, argv[i], arg_len); |
| 86 | + len += arg_len; |
| 87 | + buffer[len++] = ' '; |
| 88 | + } |
| 89 | + |
| 90 | + buffer[len - 1] = '\0'; |
30 | 91 |
|
31 |
| - if (!nrf_rpc_decoding_done_and_check(&dev_info_group, &ctx)) { |
32 |
| - nrf_rpc_err(-EBADMSG, NRF_RPC_ERR_SRC_RECV, &dev_info_group, |
33 |
| - DEV_INFO_RPC_GET_VERSION, NRF_RPC_PACKET_TYPE_RSP); |
| 92 | + return len; |
| 93 | +} |
| 94 | + |
| 95 | +char *nrf_rpc_invoke_remote_shell_cmd(size_t argc, char *argv[]) |
| 96 | +{ |
| 97 | + struct nrf_rpc_cbor_ctx ctx; |
| 98 | + size_t cmd_buffer_size = get_cmd_len(argc, argv); |
| 99 | + char *cmd_buffer = k_malloc(cmd_buffer_size); |
| 100 | + |
| 101 | + if (!cmd_buffer) { |
| 102 | + nrf_rpc_err(-ENOMEM, NRF_RPC_ERR_SRC_SEND, &dev_info_group, |
| 103 | + DEV_INFO_RPC_INVOKE_SHELL_CMD, NRF_RPC_PACKET_TYPE_CMD); |
34 | 104 | return NULL;
|
35 | 105 | }
|
36 | 106 |
|
37 |
| - return version; |
| 107 | + size_t cmd_len = create_cmd_line(cmd_buffer, cmd_buffer_size, argc, argv); |
| 108 | + |
| 109 | + if (!cmd_len) { |
| 110 | + nrf_rpc_err(-ENOMEM, NRF_RPC_ERR_SRC_SEND, &dev_info_group, |
| 111 | + DEV_INFO_RPC_INVOKE_SHELL_CMD, NRF_RPC_PACKET_TYPE_CMD); |
| 112 | + k_free(cmd_buffer); |
| 113 | + return NULL; |
| 114 | + } |
| 115 | + |
| 116 | + NRF_RPC_CBOR_ALLOC(&dev_info_group, ctx, 3 + cmd_len); |
| 117 | + |
| 118 | + nrf_rpc_encode_str(&ctx, cmd_buffer, cmd_len); |
| 119 | + |
| 120 | + nrf_rpc_cbor_cmd_rsp_no_err(&dev_info_group, DEV_INFO_RPC_INVOKE_SHELL_CMD, &ctx); |
| 121 | + |
| 122 | + return allocate_buffer_and_decode_str(&ctx, DEV_INFO_RPC_INVOKE_SHELL_CMD); |
38 | 123 | }
|
0 commit comments