You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mynewt.apache.org by an...@apache.org on 2019/06/17 11:33:37 UTC
[mynewt-nimble] 02/02: apps/btshell: Provide consistent address
input
This is an automated email from the ASF dual-hosted git repository.
andk pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/mynewt-nimble.git
commit 96337643ead558ec936c83905a728a9b125b3a10
Author: Andrzej Kaczmarek <an...@codecoup.pl>
AuthorDate: Tue Jun 11 01:34:38 2019 +0200
apps/btshell: Provide consistent address input
This patch changes handling of all addr-type arguments to be consistent
by providing common parsing helper.
Helper assumes there are always "addr" and "addr_type" parameters with
optional provided prefix. First, it tries to parse full address from
"addr" parameter. If address is found but no type was provided it will
try to parse "addr_type" parameter. If address is found and type was
provided it will check if there is no separate "addr_type" parameter and
won't allow such case since it could be confusing.
---
apps/btshell/src/cmd.c | 152 +++++++++++++++++++------------------------------
1 file changed, 58 insertions(+), 94 deletions(-)
diff --git a/apps/btshell/src/cmd.c b/apps/btshell/src/cmd.c
index 0702544..6053b8d 100644
--- a/apps/btshell/src/cmd.c
+++ b/apps/btshell/src/cmd.c
@@ -92,6 +92,48 @@ static const struct kv_pair cmd_addr_type[] = {
};
+static int
+parse_dev_addr(const char *prefix, const struct kv_pair *addr_types,
+ ble_addr_t *addr)
+{
+ char name[32];
+ int rc;
+
+ /* XXX string operations below are not quite safe, but do we care? */
+
+ if (!prefix) {
+ name[0] = '\0';
+ } else {
+ strcpy(name, prefix);
+ }
+
+ strcat(name, "addr");
+ rc = parse_arg_addr(name, addr);
+ if (rc == ENOENT) {
+ /* not found */
+ return rc;
+ } else if (rc == EAGAIN) {
+ /* address found, but no type provided */
+ strcat(name, "_type");
+ addr->type = parse_arg_kv(name, addr_types, &rc);
+ if (rc == ENOENT) {
+ addr->type = BLE_ADDR_PUBLIC;
+ } else if (rc != 0) {
+ return rc;
+ }
+ } else if (rc != 0) {
+ /* error parsing address */
+ return rc;
+ } else {
+ /* full address found, but let's just make sure there is no type arg */
+ strcat(name, "_type");
+ if (parse_arg_extract(name)) {
+ return E2BIG;
+ }
+ }
+
+ return 0;
+}
/*****************************************************************************
* $advertise *
@@ -187,19 +229,10 @@ cmd_advertise_configure(int argc, char **argv)
return rc;
}
- rc = parse_arg_mac("peer_addr", params.peer.val);
+ rc = parse_dev_addr("peer_", cmd_peer_addr_types, ¶ms.peer);
if (rc == 0) {
params.directed = 1;
-
- params.peer.type = parse_arg_kv_dflt("peer_addr_type",
- cmd_peer_addr_types,
- BLE_ADDR_PUBLIC, &rc);
- if (rc != 0) {
- console_printf("invalid 'peer_addr_type' parameter\n");
- return rc;
- }
- }
- else if (rc == ENOENT) {
+ } else if (rc == ENOENT) {
/* skip, no peer address provided */
} else {
console_printf("invalid 'peer_addr' parameter\n");
@@ -583,14 +616,7 @@ cmd_advertise(int argc, char **argv)
return rc;
}
- peer_addr.type = parse_arg_kv_dflt("peer_addr_type", cmd_peer_addr_types,
- BLE_ADDR_PUBLIC, &rc);
- if (rc != 0) {
- console_printf("invalid 'peer_addr_type' parameter\n");
- return rc;
- }
-
- rc = parse_arg_mac("peer_addr", peer_addr.val);
+ rc = parse_dev_addr("peer_", cmd_peer_addr_types, &peer_addr);
if (rc == ENOENT) {
peer_addr_param = NULL;
} else if (rc != 0) {
@@ -732,19 +758,7 @@ cmd_connect(int argc, char **argv)
return rc;
}
- peer_addr.type = parse_arg_kv_dflt("peer_addr_type", cmd_peer_addr_types,
- BLE_ADDR_PUBLIC, &rc);
- if (rc != 0) {
- console_printf("invalid 'peer_addr_type' parameter\n");
- return rc;
- }
-
- rc = parse_arg_mac("peer_addr", peer_addr.val);
- if (rc == ENOENT) {
- /* Allow "addr" for backwards compatibility. */
- rc = parse_arg_mac("addr", peer_addr.val);
- }
-
+ rc = parse_dev_addr("peer_", cmd_peer_addr_types, &peer_addr);
if (rc == ENOENT) {
/* With no "peer_addr" specified we'll use white list */
peer_addr_param = NULL;
@@ -1366,46 +1380,32 @@ static const struct shell_cmd_help scan_help = {
* $set *
*****************************************************************************/
-static const struct kv_pair cmd_set_addr_types[] = {
- { "public", BLE_ADDR_PUBLIC },
- { "random", BLE_ADDR_RANDOM },
- { NULL }
-};
-
static int
cmd_set_addr(void)
{
- uint8_t addr[6];
- int addr_type;
+ ble_addr_t addr;
int rc;
- addr_type = parse_arg_kv_dflt("addr_type", cmd_set_addr_types,
- BLE_ADDR_PUBLIC, &rc);
- if (rc != 0) {
- console_printf("invalid 'addr_type' parameter\n");
- return rc;
- }
-
- rc = parse_arg_mac("addr", addr);
+ rc = parse_dev_addr(NULL, cmd_addr_type, &addr);
if (rc != 0) {
console_printf("invalid 'addr' parameter\n");
return rc;
}
- switch (addr_type) {
+ switch (addr.type) {
#if MYNEWT_VAL(BLE_CONTROLLER)
case BLE_ADDR_PUBLIC:
/* We shouldn't be writing to the controller's address (g_dev_addr).
* There is no standard way to set the local public address, so this is
* our only option at the moment.
*/
- memcpy(g_dev_addr, addr, 6);
+ memcpy(g_dev_addr, addr.val, 6);
ble_hs_id_set_pub(g_dev_addr);
break;
#endif
case BLE_ADDR_RANDOM:
- rc = ble_hs_id_set_rnd(addr);
+ rc = ble_hs_id_set_rnd(addr.val);
if (rc != 0) {
return rc;
}
@@ -1940,14 +1940,7 @@ cmd_set_priv_mode(int argc, char **argv)
return rc;
}
- addr.type = parse_arg_kv_dflt("addr_type", cmd_set_addr_types,
- BLE_ADDR_PUBLIC, &rc);
- if (rc != 0) {
- console_printf("invalid 'addr_type' parameter\n");
- return rc;
- }
-
- rc = parse_arg_mac("addr", addr.val);
+ rc = parse_dev_addr(NULL, cmd_addr_type, &addr);
if (rc != 0) {
console_printf("invalid 'addr' parameter\n");
return rc;
@@ -2001,17 +1994,11 @@ cmd_white_list(int argc, char **argv)
return EINVAL;
}
- rc = parse_arg_mac("addr", addrs[addrs_cnt].val);
+ rc = parse_dev_addr(NULL, cmd_addr_type, &addrs[addrs_cnt]);
if (rc == ENOENT) {
break;
} else if (rc != 0) {
- console_printf("invalid 'addr' parameter\n");
- return rc;
- }
-
- addrs[addrs_cnt].type = parse_arg_kv("addr_type", cmd_addr_type, &rc);
- if (rc != 0) {
- console_printf("invalid 'addr_type' parameter\n");
+ console_printf("invalid 'addr' parameter #%d\n", addrs_cnt + 1);
return rc;
}
@@ -2268,14 +2255,7 @@ cmd_keystore_parse_keydata(int argc, char **argv, union ble_store_key *out,
switch (*obj_type) {
case BLE_STORE_OBJ_TYPE_PEER_SEC:
case BLE_STORE_OBJ_TYPE_OUR_SEC:
- out->sec.peer_addr.type = parse_arg_kv("addr_type",
- cmd_addr_type, &rc);
- if (rc != 0) {
- console_printf("invalid 'addr_type' parameter\n");
- return rc;
- }
-
- rc = parse_arg_mac("addr", out->sec.peer_addr.val);
+ rc = parse_dev_addr(NULL, cmd_addr_type, &out->sec.peer_addr);
if (rc != 0) {
console_printf("invalid 'addr' parameter\n");
return rc;
@@ -2705,17 +2685,8 @@ cmd_security_unpair(int argc, char **argv)
return rc;
}
- rc = parse_arg_mac("peer_addr", peer.val);
- if (rc == 0) {
-
- peer.type = parse_arg_kv_dflt("peer_addr_type",
- cmd_peer_addr_types,
- BLE_ADDR_PUBLIC, &rc);
- if (rc != 0) {
- console_printf("invalid 'peer_addr_type' parameter\n");
- return rc;
- }
- } else {
+ rc = parse_dev_addr("peer_", cmd_peer_addr_types, &peer);
+ if (rc != 0) {
console_printf("invalid 'peer_addr' parameter\n");
return rc;
}
@@ -3763,14 +3734,7 @@ cmd_sync_create(int argc, char **argv)
return 0;
}
- addr.type = parse_arg_kv_dflt("peer_addr_type", cmd_addr_type,
- BLE_ADDR_PUBLIC, &rc);
- if (rc != 0) {
- console_printf("invalid 'peer_addr_type' parameter\n");
- return rc;
- }
-
- rc = parse_arg_mac("peer_addr", addr.val);
+ rc = parse_dev_addr("peer_", cmd_addr_type, &addr);
if (rc == ENOENT) {
/* With no "peer_addr" specified we'll use periodic list */
addr_param = NULL;