This is an automated email from the ASF dual-hosted git repository. janc pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/mynewt-nimble.git
commit a161f0abcdcb6a669d395c4a58be12976de0c126 Author: Szymon Janc <[email protected]> AuthorDate: Thu Jul 20 15:27:48 2023 +0200 apps/btshell: Convert to parse_arg module Mkae use of common argument parsing code. --- apps/btshell/pkg.yml | 1 + apps/btshell/src/cmd.c | 122 ++++----- apps/btshell/src/cmd.h | 40 +-- apps/btshell/src/cmd_gatt.c | 30 +-- apps/btshell/src/cmd_l2cap.c | 14 +- apps/btshell/src/parse.c | 624 ------------------------------------------- 6 files changed, 89 insertions(+), 742 deletions(-) diff --git a/apps/btshell/pkg.yml b/apps/btshell/pkg.yml index b50b371c..d98f541f 100644 --- a/apps/btshell/pkg.yml +++ b/apps/btshell/pkg.yml @@ -29,6 +29,7 @@ pkg.deps: - "@apache-mynewt-core/sys/stats" - "@apache-mynewt-core/sys/console" - "@apache-mynewt-core/sys/shell" + - "@apache-mynewt-core/util/parse_arg" - nimble/host - nimble/host/services/gap - nimble/host/services/gatt diff --git a/apps/btshell/src/cmd.c b/apps/btshell/src/cmd.c index 22819219..e0fc57ac 100644 --- a/apps/btshell/src/cmd.c +++ b/apps/btshell/src/cmd.c @@ -69,7 +69,7 @@ cmd_parse_conn_start_end(uint16_t *out_conn, uint16_t *out_start, return 0; } -static const struct kv_pair cmd_own_addr_types[] = { +static const struct parse_arg_kv_pair cmd_own_addr_types[] = { { "public", BLE_OWN_ADDR_PUBLIC }, { "random", BLE_OWN_ADDR_RANDOM }, { "rpa_pub", BLE_OWN_ADDR_RPA_PUBLIC_DEFAULT }, @@ -77,7 +77,7 @@ static const struct kv_pair cmd_own_addr_types[] = { { NULL } }; -static const struct kv_pair cmd_peer_addr_types[] = { +static const struct parse_arg_kv_pair cmd_peer_addr_types[] = { { "public", BLE_ADDR_PUBLIC }, { "random", BLE_ADDR_RANDOM }, { "public_id", BLE_ADDR_PUBLIC_ID }, @@ -85,7 +85,7 @@ static const struct kv_pair cmd_peer_addr_types[] = { { NULL } }; -static const struct kv_pair cmd_addr_type[] = { +static const struct parse_arg_kv_pair cmd_addr_type[] = { { "public", BLE_ADDR_PUBLIC }, { "random", BLE_ADDR_RANDOM }, { NULL } @@ -93,7 +93,7 @@ static const struct kv_pair cmd_addr_type[] = { static int -parse_dev_addr(const char *prefix, const struct kv_pair *addr_types, +parse_dev_addr(const char *prefix, const struct parse_arg_kv_pair *addr_types, ble_addr_t *addr) { char name[32]; @@ -115,7 +115,7 @@ parse_dev_addr(const char *prefix, const struct kv_pair *addr_types, } written += rc; - rc = parse_arg_addr(name, addr); + rc = parse_arg_ble_addr(name, addr); if (rc == ENOENT) { /* not found */ return rc; @@ -153,7 +153,7 @@ parse_dev_addr(const char *prefix, const struct kv_pair *addr_types, /***************************************************************************** * $advertise * *****************************************************************************/ -static const struct kv_pair cmd_adv_filt_types[] = { +static const struct parse_arg_kv_pair cmd_adv_filt_types[] = { { "none", BLE_HCI_ADV_FILT_NONE }, { "scan", BLE_HCI_ADV_FILT_SCAN }, { "conn", BLE_HCI_ADV_FILT_CONN }, @@ -162,7 +162,7 @@ static const struct kv_pair cmd_adv_filt_types[] = { }; #if MYNEWT_VAL(BLE_EXT_ADV) -static struct kv_pair cmd_ext_adv_phy_opts[] = { +static struct parse_arg_kv_pair cmd_ext_adv_phy_opts[] = { { "1M", 0x01 }, { "2M", 0x02 }, { "coded", 0x03 }, @@ -177,7 +177,7 @@ cmd_advertise_configure(int argc, char **argv) uint8_t instance; int rc; - rc = parse_arg_all(argc - 1, argv + 1); + rc = parse_arg_init(argc - 1, argv + 1); if (rc != 0) { return rc; } @@ -338,7 +338,7 @@ cmd_advertise_set_addr(int argc, char **argv) uint8_t instance; int rc; - rc = parse_arg_all(argc - 1, argv + 1); + rc = parse_arg_init(argc - 1, argv + 1); if (rc != 0) { return rc; } @@ -349,7 +349,7 @@ cmd_advertise_set_addr(int argc, char **argv) return rc; } - rc = parse_arg_mac("addr", addr.val); + rc = parse_arg_mac_addr("addr", addr.val); if (rc != 0) { console_printf("invalid 'addr' parameter\n"); return rc; @@ -375,7 +375,7 @@ cmd_advertise_start(int argc, char **argv) bool restart; int rc; - rc = parse_arg_all(argc - 1, argv + 1); + rc = parse_arg_init(argc - 1, argv + 1); if (rc != 0) { return rc; } @@ -419,7 +419,7 @@ cmd_advertise_stop(int argc, char **argv) uint8_t instance; int rc; - rc = parse_arg_all(argc - 1, argv + 1); + rc = parse_arg_init(argc - 1, argv + 1); if (rc != 0) { return rc; } @@ -445,7 +445,7 @@ cmd_advertise_remove(int argc, char **argv) uint8_t instance; int rc; - rc = parse_arg_all(argc - 1, argv + 1); + rc = parse_arg_init(argc - 1, argv + 1); if (rc != 0) { return rc; } @@ -546,14 +546,14 @@ static const struct shell_cmd_help advertise_remove_help = { #endif #else -static const struct kv_pair cmd_adv_conn_modes[] = { +static const struct parse_arg_kv_pair cmd_adv_conn_modes[] = { { "non", BLE_GAP_CONN_MODE_NON }, { "und", BLE_GAP_CONN_MODE_UND }, { "dir", BLE_GAP_CONN_MODE_DIR }, { NULL } }; -static const struct kv_pair cmd_adv_disc_modes[] = { +static const struct parse_arg_kv_pair cmd_adv_disc_modes[] = { { "non", BLE_GAP_DISC_MODE_NON }, { "ltd", BLE_GAP_DISC_MODE_LTD }, { "gen", BLE_GAP_DISC_MODE_GEN }, @@ -571,7 +571,7 @@ cmd_advertise(int argc, char **argv) bool restart; int rc; - rc = parse_arg_all(argc - 1, argv + 1); + rc = parse_arg_init(argc - 1, argv + 1); if (rc != 0) { return rc; } @@ -699,7 +699,7 @@ static const struct shell_cmd_help advertise_help = { * $connect * *****************************************************************************/ -static struct kv_pair cmd_ext_conn_phy_opts[] = { +static struct parse_arg_kv_pair cmd_ext_conn_phy_opts[] = { { "none", 0x00 }, { "1M", 0x01 }, { "coded", 0x02 }, @@ -721,7 +721,7 @@ cmd_connect(int argc, char **argv) int own_addr_type; int rc; - rc = parse_arg_all(argc - 1, argv + 1); + rc = parse_arg_init(argc - 1, argv + 1); if (rc != 0) { return rc; } @@ -1014,7 +1014,7 @@ cmd_disconnect(int argc, char **argv) uint8_t reason; int rc; - rc = parse_arg_all(argc - 1, argv + 1); + rc = parse_arg_init(argc - 1, argv + 1); if (rc != 0) { return rc; } @@ -1117,7 +1117,7 @@ cmd_set_scan_opts(int argc, char **argv) char *name_filter; int rc; - rc = parse_arg_all(argc - 1, argv + 1); + rc = parse_arg_init(argc - 1, argv + 1); if (rc != 0) { return rc; } @@ -1173,7 +1173,7 @@ static const struct shell_cmd_help set_scan_opts_help = { * $scan * *****************************************************************************/ -static const struct kv_pair cmd_scan_filt_policies[] = { +static const struct parse_arg_kv_pair cmd_scan_filt_policies[] = { { "no_wl", BLE_HCI_SCAN_FILT_NO_WL }, { "use_wl", BLE_HCI_SCAN_FILT_USE_WL }, { "no_wl_inita", BLE_HCI_SCAN_FILT_NO_WL_INITA }, @@ -1181,7 +1181,7 @@ static const struct kv_pair cmd_scan_filt_policies[] = { { NULL } }; -static struct kv_pair cmd_scan_ext_types[] = { +static struct parse_arg_kv_pair cmd_scan_ext_types[] = { { "none", 0x00 }, { "1M", 0x01 }, { "coded", 0x02 }, @@ -1204,7 +1204,7 @@ cmd_scan(int argc, char **argv) uint16_t period; int rc; - rc = parse_arg_all(argc - 1, argv + 1); + rc = parse_arg_init(argc - 1, argv + 1); if (rc != 0) { return rc; } @@ -1428,7 +1428,7 @@ cmd_set(int argc, char **argv) int good = 0; int rc; - rc = parse_arg_all(argc - 1, argv + 1); + rc = parse_arg_init(argc - 1, argv + 1); if (rc != 0) { return rc; } @@ -1544,11 +1544,11 @@ cmd_set_adv_data_or_scan_rsp(int argc, char **argv, bool scan_rsp, int8_t eddystone_measured_power = 0; char eddystone_url_body[BLE_EDDYSTONE_URL_MAX_LEN]; char *eddystone_url_full; - int svc_data_uuid16_len; - int svc_data_uuid32_len; - int svc_data_uuid128_len; - int uri_len; - int mfg_data_len; + unsigned int svc_data_uuid16_len; + unsigned int svc_data_uuid32_len; + unsigned int svc_data_uuid128_len; + unsigned int uri_len; + unsigned int mfg_data_len; int tmp; int rc; #if MYNEWT_VAL(BLE_EXT_ADV) @@ -1566,7 +1566,7 @@ cmd_set_adv_data_or_scan_rsp(int argc, char **argv, bool scan_rsp, memset(&adv_fields, 0, sizeof adv_fields); - rc = parse_arg_all(argc - 1, argv + 1); + rc = parse_arg_init(argc - 1, argv + 1); if (rc != 0) { return rc; } @@ -1753,9 +1753,9 @@ cmd_set_adv_data_or_scan_rsp(int argc, char **argv, bool scan_rsp, return rc; } - rc = parse_arg_byte_stream("service_data_uuid128", + rc = parse_arg_byte_stream_custom("service_data_uuid128", ":-", CMD_ADV_DATA_SVC_DATA_UUID128_MAX_LEN, - svc_data_uuid128, &svc_data_uuid128_len); + svc_data_uuid128, 0, &svc_data_uuid128_len); if (rc == 0) { adv_fields.svc_data_uuid128 = svc_data_uuid128; adv_fields.svc_data_uuid128_len = svc_data_uuid128_len; @@ -1932,7 +1932,7 @@ cmd_set_priv_mode(int argc, char **argv) uint8_t priv_mode; int rc; - rc = parse_arg_all(argc - 1, argv + 1); + rc = parse_arg_init(argc - 1, argv + 1); if (rc != 0) { return rc; } @@ -1980,7 +1980,7 @@ cmd_white_list(int argc, char **argv) int addrs_cnt; int rc; - rc = parse_arg_all(argc - 1, argv + 1); + rc = parse_arg_init(argc - 1, argv + 1); if (rc != 0) { return rc; } @@ -2036,7 +2036,7 @@ cmd_conn_rssi(int argc, char **argv) int8_t rssi; int rc; - rc = parse_arg_all(argc - 1, argv + 1); + rc = parse_arg_init(argc - 1, argv + 1); if (rc != 0) { return rc; } @@ -2082,7 +2082,7 @@ cmd_conn_update_params(int argc, char **argv) uint16_t conn_handle; int rc; - rc = parse_arg_all(argc - 1, argv + 1); + rc = parse_arg_init(argc - 1, argv + 1); if (rc != 0) { return rc; } @@ -2176,7 +2176,7 @@ cmd_conn_datalen(int argc, char **argv) uint16_t tx_time; int rc; - rc = parse_arg_all(argc - 1, argv + 1); + rc = parse_arg_init(argc - 1, argv + 1); if (rc != 0) { return rc; } @@ -2229,7 +2229,7 @@ static const struct shell_cmd_help conn_datalen_help = { * keystore * *****************************************************************************/ -static const struct kv_pair cmd_keystore_entry_type[] = { +static const struct parse_arg_kv_pair cmd_keystore_entry_type[] = { { "msec", BLE_STORE_OBJ_TYPE_PEER_SEC }, { "ssec", BLE_STORE_OBJ_TYPE_OUR_SEC }, { "cccd", BLE_STORE_OBJ_TYPE_CCCD }, @@ -2327,7 +2327,7 @@ cmd_keystore_add(int argc, char **argv) int obj_type; int rc; - rc = parse_arg_all(argc - 1, argv + 1); + rc = parse_arg_init(argc - 1, argv + 1); if (rc != 0) { return rc; } @@ -2391,7 +2391,7 @@ cmd_keystore_del(int argc, char **argv) int obj_type; int rc; - rc = parse_arg_all(argc - 1, argv + 1); + rc = parse_arg_init(argc - 1, argv + 1); if (rc != 0) { return rc; } @@ -2480,7 +2480,7 @@ cmd_keystore_show(int argc, char **argv) int type; int rc; - rc = parse_arg_all(argc - 1, argv + 1); + rc = parse_arg_init(argc - 1, argv + 1); if (rc != 0) { return rc; } @@ -2546,7 +2546,7 @@ cmd_auth_passkey(int argc, char **argv) char *yesno; int rc; - rc = parse_arg_all(argc - 1, argv + 1); + rc = parse_arg_init(argc - 1, argv + 1); if (rc != 0) { return rc; } @@ -2666,7 +2666,7 @@ cmd_security_pair(int argc, char **argv) uint16_t conn_handle; int rc; - rc = parse_arg_all(argc - 1, argv + 1); + rc = parse_arg_init(argc - 1, argv + 1); if (rc != 0) { return rc; } @@ -2710,7 +2710,7 @@ cmd_security_unpair(int argc, char **argv) int rc; int oldest; - rc = parse_arg_all(argc - 1, argv + 1); + rc = parse_arg_init(argc - 1, argv + 1); if (rc != 0) { return rc; } @@ -2767,7 +2767,7 @@ cmd_security_start(int argc, char **argv) uint16_t conn_handle; int rc; - rc = parse_arg_all(argc - 1, argv + 1); + rc = parse_arg_init(argc - 1, argv + 1); if (rc != 0) { return rc; } @@ -2815,7 +2815,7 @@ cmd_security_encryption(int argc, char **argv) int rc; int auth; - rc = parse_arg_all(argc - 1, argv + 1); + rc = parse_arg_init(argc - 1, argv + 1); if (rc != 0) { return rc; } @@ -2896,7 +2896,7 @@ cmd_security_set_data(int argc, char **argv) good = 0; - rc = parse_arg_all(argc - 1, argv + 1); + rc = parse_arg_init(argc - 1, argv + 1); if (rc != 0) { return rc; } @@ -3010,7 +3010,7 @@ cmd_test_tx(int argc, char **argv) uint16_t num; uint8_t stop; - rc = parse_arg_all(argc - 1, argv + 1); + rc = parse_arg_init(argc - 1, argv + 1); if (rc != 0) { return rc; } @@ -3087,7 +3087,7 @@ cmd_phy_set(int argc, char **argv) uint16_t phy_opts; int rc; - rc = parse_arg_all(argc - 1, argv + 1); + rc = parse_arg_init(argc - 1, argv + 1); if (rc != 0) { return rc; } @@ -3147,7 +3147,7 @@ cmd_phy_set_default(int argc, char **argv) uint8_t rx_phys_mask; int rc; - rc = parse_arg_all(argc - 1, argv + 1); + rc = parse_arg_init(argc - 1, argv + 1); if (rc != 0) { return rc; } @@ -3193,7 +3193,7 @@ cmd_phy_read(int argc, char **argv) uint8_t rx_phy; int rc; - rc = parse_arg_all(argc - 1, argv + 1); + rc = parse_arg_init(argc - 1, argv + 1); if (rc != 0) { return rc; } @@ -3634,7 +3634,7 @@ cmd_periodic_configure(int argc, char **argv) uint8_t instance; int rc; - rc = parse_arg_all(argc - 1, argv + 1); + rc = parse_arg_init(argc - 1, argv + 1); if (rc != 0) { return rc; } @@ -3690,7 +3690,7 @@ cmd_periodic_start(int argc, char **argv) uint8_t instance; int rc; - rc = parse_arg_all(argc - 1, argv + 1); + rc = parse_arg_init(argc - 1, argv + 1); if (rc != 0) { return rc; } @@ -3716,7 +3716,7 @@ cmd_periodic_stop(int argc, char **argv) uint8_t instance; int rc; - rc = parse_arg_all(argc - 1, argv + 1); + rc = parse_arg_init(argc - 1, argv + 1); if (rc != 0) { return rc; } @@ -3783,7 +3783,7 @@ cmd_sync_create(int argc, char **argv) uint8_t sid; int rc; - rc = parse_arg_all(argc - 1, argv + 1); + rc = parse_arg_init(argc - 1, argv + 1); if (rc != 0) { return rc; } @@ -3868,7 +3868,7 @@ cmd_sync_transfer(int argc, char **argv) uint16_t sync_handle; int rc; - rc = parse_arg_all(argc - 1, argv + 1); + rc = parse_arg_init(argc - 1, argv + 1); if (rc != 0) { return rc; } @@ -3907,7 +3907,7 @@ cmd_sync_reporting(int argc, char **argv) bool enable; int rc; - rc = parse_arg_all(argc - 1, argv + 1); + rc = parse_arg_init(argc - 1, argv + 1); if (rc != 0) { return rc; } @@ -3968,7 +3968,7 @@ cmd_sync_transfer_set_info(int argc, char **argv) uint8_t instance; int rc; - rc = parse_arg_all(argc - 1, argv + 1); + rc = parse_arg_init(argc - 1, argv + 1); if (rc != 0) { return rc; } @@ -4023,7 +4023,7 @@ cmd_sync_transfer_receive(int argc, char **argv) bool disable; int rc; - rc = parse_arg_all(argc - 1, argv + 1); + rc = parse_arg_init(argc - 1, argv + 1); if (rc != 0) { return rc; } @@ -4100,7 +4100,7 @@ cmd_sync_terminate(int argc, char **argv) uint16_t sync_handle; int rc; - rc = parse_arg_all(argc - 1, argv + 1); + rc = parse_arg_init(argc - 1, argv + 1); if (rc != 0) { return rc; } @@ -4138,7 +4138,7 @@ cmd_sync_stats(int argc, char **argv) uint16_t sync_handle; int rc; - rc = parse_arg_all(argc - 1, argv + 1); + rc = parse_arg_init(argc - 1, argv + 1); if (rc != 0) { return rc; } diff --git a/apps/btshell/src/cmd.h b/apps/btshell/src/cmd.h index 63bd50d1..0984d009 100644 --- a/apps/btshell/src/cmd.h +++ b/apps/btshell/src/cmd.h @@ -22,44 +22,14 @@ #include <inttypes.h> #include "host/ble_uuid.h" +#include <parse_arg/parse_arg.h> -struct kv_pair { - char *key; - int val; -}; - -uint32_t parse_arg_time_dflt(char *name, int step, uint32_t dflt, int *out_status); -const struct kv_pair *parse_kv_find(const struct kv_pair *kvs, char *name); -int parse_arg_find_idx(const char *key); -char *parse_arg_extract(const char *key); -long parse_arg_long_bounds(char *name, long min, long max, int *out_status); -long parse_arg_long_bounds_dflt(char *name, long min, long max, - long dflt, int *out_status); -uint64_t parse_arg_uint64_bounds(char *name, uint64_t min, - uint64_t max, int *out_status); -long parse_arg_long(char *name, int *staus); -uint8_t parse_arg_bool(char *name, int *status); -uint8_t parse_arg_bool_dflt(char *name, uint8_t dflt, int *out_status); -uint8_t parse_arg_uint8(char *name, int *status); -uint8_t parse_arg_uint8_dflt(char *name, uint8_t dflt, int *out_status); -uint16_t parse_arg_uint16(char *name, int *status); -uint16_t parse_arg_uint16_dflt(char *name, uint16_t dflt, int *out_status); -uint32_t parse_arg_uint32(char *name, int *out_status); -uint32_t parse_arg_uint32_dflt(char *name, uint32_t dflt, int *out_status); -uint64_t parse_arg_uint64(char *name, int *out_status); -int parse_arg_kv(char *name, const struct kv_pair *kvs, int *out_status); -int parse_arg_kv_dflt(char *name, const struct kv_pair *kvs, int def_val, - int *out_status); -int parse_arg_byte_stream(char *name, int max_len, uint8_t *dst, int *out_len); -int parse_arg_uint8_list_with_separator(char *name, char *separator, int max_len, - uint8_t *dst, int *out_len); -int parse_arg_byte_stream_exact_length(char *name, uint8_t *dst, int len); -int parse_arg_mac(char *name, uint8_t *dst); -int parse_arg_addr(char *name, ble_addr_t *addr); -int parse_arg_uuid(char *name, ble_uuid_any_t *uuid); -int parse_arg_all(int argc, char **argv); +//int parse_arg_mac(char *name, uint8_t *dst); +//int parse_arg_addr(char *name, ble_addr_t *addr); +//int parse_arg_uuid(char *name, ble_uuid_any_t *uuid); int parse_eddystone_url(char *full_url, uint8_t *out_scheme, char *out_body, uint8_t *out_body_len, uint8_t *out_suffix); + int cmd_parse_conn_start_end(uint16_t *out_conn, uint16_t *out_start, uint16_t *out_end); diff --git a/apps/btshell/src/cmd_gatt.c b/apps/btshell/src/cmd_gatt.c index 4c57b42d..734b1004 100644 --- a/apps/btshell/src/cmd_gatt.c +++ b/apps/btshell/src/cmd_gatt.c @@ -45,7 +45,7 @@ cmd_gatt_discover_characteristic(int argc, char **argv) ble_uuid_any_t uuid; int rc; - rc = parse_arg_all(argc - 1, argv + 1); + rc = parse_arg_init(argc - 1, argv + 1); if (rc != 0) { return rc; } @@ -56,7 +56,7 @@ cmd_gatt_discover_characteristic(int argc, char **argv) return rc; } - rc = parse_arg_uuid("uuid", &uuid); + rc = parse_arg_ble_uuid("uuid", &uuid); if (rc == 0) { rc = btshell_disc_chrs_by_uuid(conn_handle, start_handle, end_handle, &uuid.u); @@ -82,7 +82,7 @@ cmd_gatt_discover_descriptor(int argc, char **argv) uint16_t end_handle; int rc; - rc = parse_arg_all(argc - 1, argv + 1); + rc = parse_arg_init(argc - 1, argv + 1); if (rc != 0) { return rc; } @@ -109,7 +109,7 @@ cmd_gatt_discover_service(int argc, char **argv) int conn_handle; int rc; - rc = parse_arg_all(argc - 1, argv + 1); + rc = parse_arg_init(argc - 1, argv + 1); if (rc != 0) { return rc; } @@ -120,7 +120,7 @@ cmd_gatt_discover_service(int argc, char **argv) return rc; } - rc = parse_arg_uuid("uuid", &uuid); + rc = parse_arg_ble_uuid("uuid", &uuid); if (rc == 0) { rc = btshell_disc_svc_by_uuid(conn_handle, &uuid.u); } else if (rc == ENOENT) { @@ -144,7 +144,7 @@ cmd_gatt_discover_full(int argc, char **argv) int conn_handle; int rc; - rc = parse_arg_all(argc - 1, argv + 1); + rc = parse_arg_init(argc - 1, argv + 1); if (rc != 0) { return rc; } @@ -174,7 +174,7 @@ cmd_gatt_exchange_mtu(int argc, char **argv) uint16_t conn_handle; int rc; - rc = parse_arg_all(argc - 1, argv + 1); + rc = parse_arg_init(argc - 1, argv + 1); if (rc != 0) { return rc; } @@ -204,7 +204,7 @@ cmd_gatt_notify(int argc, char **argv) uint16_t attr_handle; int rc; - rc = parse_arg_all(argc - 1, argv + 1); + rc = parse_arg_init(argc - 1, argv + 1); if (rc != 0) { return rc; } @@ -241,7 +241,7 @@ cmd_gatt_read(int argc, char **argv) bool is_var; int rc; - rc = parse_arg_all(argc - 1, argv + 1); + rc = parse_arg_init(argc - 1, argv + 1); if (rc != 0) { return rc; } @@ -279,7 +279,7 @@ cmd_gatt_read(int argc, char **argv) } } - rc = parse_arg_uuid("uuid", &uuid); + rc = parse_arg_ble_uuid("uuid", &uuid); if (rc == ENOENT) { is_uuid = 0; } else if (rc == 0) { @@ -351,7 +351,7 @@ cmd_gatt_service_changed(int argc, char **argv) uint16_t end; int rc; - rc = parse_arg_all(argc - 1, argv + 1); + rc = parse_arg_init(argc - 1, argv + 1); if (rc != 0) { return rc; } @@ -384,7 +384,7 @@ cmd_gatt_service_visibility(int argc, char **argv) bool vis; int rc; - rc = parse_arg_all(argc - 1, argv + 1); + rc = parse_arg_init(argc - 1, argv + 1); if (rc != 0) { return rc; } @@ -418,7 +418,7 @@ cmd_gatt_find_included_services(int argc, char **argv) uint16_t end_handle; int rc; - rc = parse_arg_all(argc - 1, argv + 1); + rc = parse_arg_init(argc - 1, argv + 1); if (rc != 0) { return rc; } @@ -482,13 +482,13 @@ cmd_gatt_write(int argc, char **argv) uint16_t offset; int total_attr_len; int num_attrs; - int attr_len; + unsigned int attr_len; int is_long; int no_rsp; int rc; int i; - rc = parse_arg_all(argc - 1, argv + 1); + rc = parse_arg_init(argc - 1, argv + 1); if (rc != 0) { return rc; } diff --git a/apps/btshell/src/cmd_l2cap.c b/apps/btshell/src/cmd_l2cap.c index e74e3bf3..0c9d6a45 100644 --- a/apps/btshell/src/cmd_l2cap.c +++ b/apps/btshell/src/cmd_l2cap.c @@ -40,7 +40,7 @@ cmd_l2cap_update(int argc, char **argv) uint16_t conn_handle; int rc; - rc = parse_arg_all(argc - 1, argv + 1); + rc = parse_arg_init(argc - 1, argv + 1); if (rc != 0) { return rc; } @@ -101,7 +101,7 @@ cmd_l2cap_create_server(int argc, char **argv) int accept_response = 0; int rc; - rc = parse_arg_all(argc - 1, argv + 1); + rc = parse_arg_init(argc - 1, argv + 1); if (rc != 0) { return rc; } @@ -159,7 +159,7 @@ cmd_l2cap_connect(int argc, char **argv) uint8_t num; int rc; - rc = parse_arg_all(argc - 1, argv + 1); + rc = parse_arg_init(argc - 1, argv + 1); if (rc != 0) { return rc; } @@ -202,7 +202,7 @@ cmd_l2cap_disconnect(int argc, char **argv) uint16_t idx; int rc; - rc = parse_arg_all(argc - 1, argv + 1); + rc = parse_arg_init(argc - 1, argv + 1); if (rc != 0) { return rc; } @@ -234,7 +234,7 @@ cmd_l2cap_send(int argc, char **argv) uint16_t bytes; int rc; - rc = parse_arg_all(argc - 1, argv + 1); + rc = parse_arg_init(argc - 1, argv + 1); if (rc != 0) { return rc; } @@ -294,7 +294,7 @@ cmd_l2cap_reconfig(int argc, char **argv) int num; int rc; - rc = parse_arg_all(argc - 1, argv + 1); + rc = parse_arg_init(argc - 1, argv + 1); if (rc != 0) { return rc; } @@ -311,7 +311,7 @@ cmd_l2cap_reconfig(int argc, char **argv) return rc; } - rc = parse_arg_uint8_list_with_separator("idxs", ",", 5, idxs, &num); + rc = parse_arg_byte_stream_custom("idxs", ",", 5, idxs, 0, &num); if (rc != 0) { console_printf("invalid 'idxs' parameter\n"); return rc; diff --git a/apps/btshell/src/parse.c b/apps/btshell/src/parse.c index e4dbade4..d759511a 100644 --- a/apps/btshell/src/parse.c +++ b/apps/btshell/src/parse.c @@ -19,633 +19,9 @@ #include <string.h> #include <stdlib.h> -#include <limits.h> -#include <stdarg.h> -#include <errno.h> -#include <assert.h> -#include <ctype.h> -#include "console/console.h" #include "host/ble_hs.h" -#include "host/ble_uuid.h" #include "host/ble_eddystone.h" #include "cmd.h" -#include "btshell.h" - -#define CMD_MAX_ARGS 16 - -static char *cmd_args[CMD_MAX_ARGS][2]; -static int cmd_num_args; - -int -parse_arg_find_idx(const char *key) -{ - int i; - - for (i = 0; i < cmd_num_args; i++) { - if (strcmp(cmd_args[i][0], key) == 0) { - return i; - } - } - - return -1; -} - -char * -parse_arg_peek(const char *key) -{ - int i; - - for (i = 0; i < cmd_num_args; i++) { - if (strcmp(cmd_args[i][0], key) == 0) { - return cmd_args[i][1]; - } - } - - return NULL; -} - -char * -parse_arg_extract(const char *key) -{ - int i; - - for (i = 0; i < cmd_num_args; i++) { - if (strcmp(cmd_args[i][0], key) == 0) { - /* Erase parameter. */ - cmd_args[i][0][0] = '\0'; - - return cmd_args[i][1]; - } - } - - return NULL; -} - -/** - * Determines which number base to use when parsing the specified numeric - * string. This just avoids base '0' so that numbers don't get interpreted as - * octal. - */ -static int -parse_arg_long_base(char *sval) -{ - if (sval[0] == '0' && sval[1] == 'x') { - return 0; - } else { - return 10; - } -} - -long -parse_long_bounds(char *sval, long min, long max, int *out_status) -{ - char *endptr; - long lval; - - lval = strtol(sval, &endptr, parse_arg_long_base(sval)); - if (sval[0] != '\0' && *endptr == '\0' && - lval >= min && lval <= max) { - - *out_status = 0; - return lval; - } - - *out_status = EINVAL; - return 0; -} - -long -parse_arg_long_bounds_peek(char *name, long min, long max, int *out_status) -{ - char *sval; - - sval = parse_arg_peek(name); - if (sval == NULL) { - *out_status = ENOENT; - return 0; - } - return parse_long_bounds(sval, min, max, out_status); -} - -long -parse_arg_long_bounds(char *name, long min, long max, int *out_status) -{ - char *sval; - - sval = parse_arg_extract(name); - if (sval == NULL) { - *out_status = ENOENT; - return 0; - } - return parse_long_bounds(sval, min, max, out_status); -} - -long -parse_arg_long_bounds_dflt(char *name, long min, long max, - long dflt, int *out_status) -{ - long val; - int rc; - - val = parse_arg_long_bounds(name, min, max, &rc); - if (rc == ENOENT) { - rc = 0; - val = dflt; - } - - *out_status = rc; - - return val; -} - -uint64_t -parse_arg_uint64_bounds(char *name, uint64_t min, uint64_t max, int *out_status) -{ - char *endptr; - char *sval; - uint64_t lval; - - sval = parse_arg_extract(name); - if (sval == NULL) { - *out_status = ENOENT; - return 0; - } - - lval = strtoull(sval, &endptr, parse_arg_long_base(sval)); - if (sval[0] != '\0' && *endptr == '\0' && - lval >= min && lval <= max) { - - *out_status = 0; - return lval; - } - - *out_status = EINVAL; - return 0; -} - -long -parse_arg_long(char *name, int *out_status) -{ - return parse_arg_long_bounds(name, LONG_MIN, LONG_MAX, out_status); -} - -uint8_t -parse_arg_bool(char *name, int *out_status) -{ - return parse_arg_long_bounds(name, 0, 1, out_status); -} - -uint8_t -parse_arg_bool_dflt(char *name, uint8_t dflt, int *out_status) -{ - return parse_arg_long_bounds_dflt(name, 0, 1, dflt, out_status); -} - -uint8_t -parse_arg_uint8(char *name, int *out_status) -{ - return parse_arg_long_bounds(name, 0, UINT8_MAX, out_status); -} - -uint16_t -parse_arg_uint16(char *name, int *out_status) -{ - return parse_arg_long_bounds(name, 0, UINT16_MAX, out_status); -} - -uint16_t -parse_arg_uint16_peek(char *name, int *out_status) -{ - return parse_arg_long_bounds_peek(name, 0, UINT16_MAX, out_status); -} - -uint32_t -parse_arg_uint32(char *name, int *out_status) -{ - return parse_arg_uint64_bounds(name, 0, UINT32_MAX, out_status); -} - -uint64_t -parse_arg_uint64(char *name, int *out_status) -{ - return parse_arg_uint64_bounds(name, 0, UINT64_MAX, out_status); -} - -uint8_t -parse_arg_uint8_dflt(char *name, uint8_t dflt, int *out_status) -{ - uint8_t val; - int rc; - - val = parse_arg_uint8(name, &rc); - if (rc == ENOENT) { - val = dflt; - rc = 0; - } - - *out_status = rc; - return val; -} - -uint16_t -parse_arg_uint16_dflt(char *name, uint16_t dflt, int *out_status) -{ - uint16_t val; - int rc; - - val = parse_arg_uint16(name, &rc); - if (rc == ENOENT) { - val = dflt; - rc = 0; - } - - *out_status = rc; - return val; -} - -uint32_t -parse_arg_uint32_dflt(char *name, uint32_t dflt, int *out_status) -{ - uint32_t val; - int rc; - - val = parse_arg_uint32(name, &rc); - if (rc == ENOENT) { - val = dflt; - rc = 0; - } - - *out_status = rc; - return val; -} - -static uint32_t -parse_time_unit_mult(const char *str) -{ - if (!strcasecmp(str, "us")) { - return 1; - } else if (!strcasecmp(str, "ms")) { - return 1000; - } else if (!strcasecmp(str, "s")) { - return 1000000; - } - - return 0; -} - -static uint32_t -parse_time_us(const char *str, int *out_status) -{ - uint32_t val = 0; - uint32_t val_div = 1; - uint32_t val_mult = 1; - uint32_t val_us; - - while (isdigit((unsigned char)*str)) { - val *= 10; - val += *str - '0'; - str++; - } - - if (*str == '.') { - str++; - while (isdigit((unsigned char)*str)) { - val *= 10; - val += *str - '0'; - val_div *= 10; - str++; - } - } - - val_mult = parse_time_unit_mult(str); - if (val_mult == 0) { - *out_status = EINVAL; - return 0; - } - - if (val_mult > val_div) { - val_us = val * (val_mult / val_div); - } else { - val_us = val * (val_div / val_mult); - } - - *out_status = 0; - - return val_us; -} - -uint32_t -parse_arg_time_dflt(char *name, int step_us, uint32_t dflt, int *out_status) -{ - const char *arg; - uint32_t val; - int rc; - - arg = parse_arg_peek(name); - if (!arg) { - *out_status = 0; - return dflt; - } - - val = parse_time_us(arg, &rc); - if (rc) { - val = parse_arg_uint32(name, &rc); - if (rc == ENOENT) { - *out_status = 0; - return dflt; - } - } else { - val /= step_us; - parse_arg_extract(name); - } - - *out_status = rc; - return val; -} - -const struct kv_pair * -parse_kv_find(const struct kv_pair *kvs, char *name) -{ - const struct kv_pair *kv; - int i; - - for (i = 0; kvs[i].key != NULL; i++) { - kv = kvs + i; - if (strcmp(name, kv->key) == 0) { - return kv; - } - } - - return NULL; -} - -int -parse_arg_kv(char *name, const struct kv_pair *kvs, int *out_status) -{ - const struct kv_pair *kv; - char *sval; - - sval = parse_arg_extract(name); - if (sval == NULL) { - *out_status = ENOENT; - return -1; - } - - kv = parse_kv_find(kvs, sval); - if (kv == NULL) { - *out_status = EINVAL; - return -1; - } - - *out_status = 0; - return kv->val; -} - -int -parse_arg_kv_dflt(char *name, const struct kv_pair *kvs, int def_val, - int *out_status) -{ - int val; - int rc; - - val = parse_arg_kv(name, kvs, &rc); - if (rc == ENOENT) { - rc = 0; - val = def_val; - } - - *out_status = rc; - - return val; -} - - -static int -parse_arg_byte_stream_delim(char *sval, char *delims, int max_len, - uint8_t *dst, int *out_len) -{ - unsigned long ul; - char *endptr; - char *token; - int i; - char *tok_ptr; - - i = 0; - for (token = strtok_r(sval, delims, &tok_ptr); - token != NULL; - token = strtok_r(NULL, delims, &tok_ptr)) { - - if (i >= max_len) { - return EINVAL; - } - - ul = strtoul(token, &endptr, 16); - if (sval[0] == '\0' || *endptr != '\0' || ul > UINT8_MAX) { - return -1; - } - - dst[i] = ul; - i++; - } - - *out_len = i; - - return 0; -} - -int -parse_arg_byte_stream(char *name, int max_len, uint8_t *dst, int *out_len) -{ - char *sval; - - sval = parse_arg_extract(name); - if (sval == NULL) { - return ENOENT; - } - - return parse_arg_byte_stream_delim(sval, ":-", max_len, dst, out_len); -} - -int -parse_arg_uint8_list_with_separator(char *name, char *separator, int max_len, - uint8_t *dst, int *out_len) -{ - char *sval; - - sval = parse_arg_extract(name); - if (sval == NULL) { - return ENOENT; - } - - return parse_arg_byte_stream_delim(sval, separator, max_len, dst, out_len); -} - -int -parse_arg_byte_stream_exact_length(char *name, uint8_t *dst, int len) -{ - int actual_len; - int rc; - - rc = parse_arg_byte_stream(name, len, dst, &actual_len); - if (rc != 0) { - return rc; - } - - if (actual_len != len) { - return EINVAL; - } - - return 0; -} - -static void -parse_reverse_bytes(uint8_t *bytes, int len) -{ - uint8_t tmp; - int i; - - for (i = 0; i < len / 2; i++) { - tmp = bytes[i]; - bytes[i] = bytes[len - i - 1]; - bytes[len - i - 1] = tmp; - } -} - -int -parse_arg_mac(char *name, uint8_t *dst) -{ - int rc; - - rc = parse_arg_byte_stream_exact_length(name, dst, 6); - if (rc != 0) { - return rc; - } - - parse_reverse_bytes(dst, 6); - - return 0; -} - -int -parse_arg_addr(char *name, ble_addr_t *addr) -{ - char *arg; - size_t len; - uint8_t addr_type; - bool addr_type_found; - int rc; - - arg = parse_arg_peek(name); - if (!arg) { - return ENOENT; - } - - len = strlen(arg); - if (len < 2) { - return EINVAL; - } - - addr_type_found = false; - if ((arg[len - 2] == ':') || (arg[len - 2] == '-')) { - if (tolower(arg[len - 1]) == 'p') { - addr_type = BLE_ADDR_PUBLIC; - addr_type_found = true; - } else if (tolower(arg[len - 1]) == 'r') { - addr_type = BLE_ADDR_RANDOM; - addr_type_found = true; - } - - if (addr_type_found) { - arg[len - 2] = '\0'; - } -} - - rc = parse_arg_mac(name, addr->val); - if (rc != 0) { - return rc; - } - - if (addr_type_found) { - addr->type = addr_type; - } else { - rc = EAGAIN; - } - - return rc; -} - -int -parse_arg_uuid(char *str, ble_uuid_any_t *uuid) -{ - uint16_t uuid16; - uint8_t val[16]; - int len; - int rc; - - uuid16 = parse_arg_uint16_peek(str, &rc); - switch (rc) { - case ENOENT: - parse_arg_extract(str); - return ENOENT; - - case 0: - len = 2; - val[0] = uuid16; - val[1] = uuid16 >> 8; - parse_arg_extract(str); - break; - - default: - len = 16; - rc = parse_arg_byte_stream_exact_length(str, val, 16); - if (rc != 0) { - return EINVAL; - } - parse_reverse_bytes(val, 16); - break; - } - - rc = ble_uuid_init_from_buf(uuid, val, len); - if (rc != 0) { - return EINVAL; - } else { - return 0; - } -} - -int -parse_arg_all(int argc, char **argv) -{ - char *key; - char *val; - int i; - char *tok_ptr; - - cmd_num_args = 0; - - for (i = 0; i < argc; i++) { - key = strtok_r(argv[i], "=", &tok_ptr); - val = strtok_r(NULL, "=", &tok_ptr); - - if (key != NULL && val != NULL) { - if (strlen(key) == 0) { - console_printf("Error: invalid argument: %s\n", argv[i]); - return -1; - } - - if (cmd_num_args >= CMD_MAX_ARGS) { - console_printf("Error: too many arguments"); - return -1; - } - - cmd_args[cmd_num_args][0] = key; - cmd_args[cmd_num_args][1] = val; - cmd_num_args++; - } - } - - return 0; -} int parse_eddystone_url(char *full_url, uint8_t *out_scheme, char *out_body,
