diff --git a/samples/bluetooth/peripheral_dis/src/main.c b/samples/bluetooth/peripheral_dis/src/main.c index cb2191703bc8..e9397e3966de 100644 --- a/samples/bluetooth/peripheral_dis/src/main.c +++ b/samples/bluetooth/peripheral_dis/src/main.c @@ -45,7 +45,8 @@ static struct bt_conn_cb conn_callbacks = { .disconnected = disconnected, }; -static int zephyr_settings_fw_load(struct settings_store *cs); +static int zephyr_settings_fw_load(struct settings_store *cs, + const char *subtree); static const struct settings_store_itf zephyr_settings_fw_itf = { .csi_load = zephyr_settings_fw_load, @@ -55,7 +56,8 @@ static struct settings_store zephyr_settings_fw_store = { .cs_itf = &zephyr_settings_fw_itf }; -static int zephyr_settings_fw_load(struct settings_store *cs) +static int zephyr_settings_fw_load(struct settings_store *cs, + const char *subtree) { #if defined(CONFIG_BT_GATT_DIS_SETTINGS) diff --git a/samples/boards/nrf52/mesh/onoff_level_lighting_vnd_app/src/storage.c b/samples/boards/nrf52/mesh/onoff_level_lighting_vnd_app/src/storage.c index 81809a637831..560945cf013f 100644 --- a/samples/boards/nrf52/mesh/onoff_level_lighting_vnd_app/src/storage.c +++ b/samples/boards/nrf52/mesh/onoff_level_lighting_vnd_app/src/storage.c @@ -114,48 +114,52 @@ void save_on_flash(u8_t id) k_work_submit(&storage_work); } -static int ps_set(int argc, char **argv, size_t len_rd, +static int ps_set(const char *key, size_t len_rd, settings_read_cb read_cb, void *cb_arg) { ssize_t len = 0; + int key_len; + const char *next; - if (argc == 1) { - if (!strcmp(argv[0], "rc")) { + key_len = settings_name_next(key, &next); + + if (!next) { + if (!strncmp(key, "rc", key_len)) { len = read_cb(cb_arg, &reset_counter, sizeof(reset_counter)); } - if (!strcmp(argv[0], "gdtt")) { + if (!strncmp(key, "gdtt", key_len)) { len = read_cb(cb_arg, &gen_def_trans_time_srv_user_data.tt, sizeof(gen_def_trans_time_srv_user_data.tt)); } - if (!strcmp(argv[0], "gpo")) { + if (!strncmp(key, "gpo", key_len)) { len = read_cb(cb_arg, &gen_power_onoff_srv_user_data.onpowerup, sizeof(gen_power_onoff_srv_user_data.onpowerup)); } - if (!strcmp(argv[0], "ltd")) { + if (!strncmp(key, "ltd", key_len)) { len = read_cb(cb_arg, &light_ctl_srv_user_data.lightness_temp_def, sizeof(light_ctl_srv_user_data.lightness_temp_def)); } - if (!strcmp(argv[0], "ltl")) { + if (!strncmp(key, "ltl", key_len)) { len = read_cb(cb_arg, &light_ctl_srv_user_data.lightness_temp_last, sizeof(light_ctl_srv_user_data.lightness_temp_last)); } - if (!strcmp(argv[0], "lr")) { + if (!strncmp(key, "lr", key_len)) { len = read_cb(cb_arg, &light_lightness_srv_user_data.lightness_range, sizeof(light_lightness_srv_user_data.lightness_range)); } - if (!strcmp(argv[0], "tr")) { + if (!strncmp(key, "tr", key_len)) { len = read_cb(cb_arg, &light_ctl_srv_user_data.temperature_range, sizeof(light_ctl_srv_user_data.temperature_range)); diff --git a/subsys/bluetooth/host/gatt.c b/subsys/bluetooth/host/gatt.c index 5217adda348e..f8ecf83086ff 100644 --- a/subsys/bluetooth/host/gatt.c +++ b/subsys/bluetooth/host/gatt.c @@ -3550,26 +3550,29 @@ static u8_t ccc_load(const struct bt_gatt_attr *attr, void *user_data) return load->count ? BT_GATT_ITER_CONTINUE : BT_GATT_ITER_STOP; } -static int ccc_set(int argc, char **argv, size_t len_rd, - settings_read_cb read_cb, void *cb_arg) +static int ccc_set(const char *name, size_t len_rd, settings_read_cb read_cb, + void *cb_arg) { struct ccc_store ccc_store[CCC_STORE_MAX]; struct ccc_load load; bt_addr_le_t addr; int len, err; + const char *next; - if (argc < 1) { + settings_name_next(name, &next); + + if (!name) { BT_ERR("Insufficient number of arguments"); return -EINVAL; - } else if (argc == 1) { + } else if (!next) { load.addr_with_id.id = BT_ID_DEFAULT; } else { - load.addr_with_id.id = strtol(argv[1], NULL, 10); + load.addr_with_id.id = strtol(next, NULL, 10); } - err = bt_settings_decode_key(argv[0], &addr); + err = bt_settings_decode_key(name, &addr); if (err) { - BT_ERR("Unable to decode address %s", argv[0]); + BT_ERR("Unable to decode address %s", name); return -EINVAL; } @@ -3606,21 +3609,21 @@ static int ccc_set(int argc, char **argv, size_t len_rd, BT_SETTINGS_DEFINE(ccc, ccc_set, NULL, NULL); #if defined(CONFIG_BT_GATT_CACHING) -static int cf_set(int argc, char **argv, size_t len_rd, - settings_read_cb read_cb, void *cb_arg) +static int cf_set(const char *name, size_t len_rd, settings_read_cb read_cb, + void *cb_arg) { struct gatt_cf_cfg *cfg; bt_addr_le_t addr; int len, err; - if (argc < 1) { + if (!name) { BT_ERR("Insufficient number of arguments"); return -EINVAL; } - err = bt_settings_decode_key(argv[0], &addr); + err = bt_settings_decode_key(name, &addr); if (err) { - BT_ERR("Unable to decode address %s", argv[0]); + BT_ERR("Unable to decode address %s", name); return -EINVAL; } @@ -3654,7 +3657,7 @@ BT_SETTINGS_DEFINE(cf, cf_set, NULL, NULL); static u8_t stored_hash[16]; -static int db_hash_set(int argc, char **argv, size_t len_rd, +static int db_hash_set(const char *name, size_t len_rd, settings_read_cb read_cb, void *cb_arg) { int len; diff --git a/subsys/bluetooth/host/keys.c b/subsys/bluetooth/host/keys.c index 2e21ee159d0f..b37a1d445eac 100644 --- a/subsys/bluetooth/host/keys.c +++ b/subsys/bluetooth/host/keys.c @@ -277,8 +277,8 @@ int bt_keys_store(struct bt_keys *keys) return 0; } -static int keys_set(int argc, char **argv, size_t len_rd, - settings_read_cb read_cb, void *cb_arg) +static int keys_set(const char *name, size_t len_rd, settings_read_cb read_cb, + void *cb_arg) { struct bt_keys *keys; bt_addr_le_t addr; @@ -286,8 +286,9 @@ static int keys_set(int argc, char **argv, size_t len_rd, size_t len; int err; char val[BT_KEYS_STORAGE_LEN]; + const char *next; - if (argc < 1) { + if (!name) { BT_ERR("Insufficient number of arguments"); return -EINVAL; } @@ -298,18 +299,20 @@ static int keys_set(int argc, char **argv, size_t len_rd, return -EINVAL; } - BT_DBG("argv[0] %s val %s", argv[0], (len) ? val : "(null)"); + BT_DBG("name %s val %s", name, (len) ? val : "(null)"); - err = bt_settings_decode_key(argv[0], &addr); + err = bt_settings_decode_key(name, &addr); if (err) { - BT_ERR("Unable to decode address %s", argv[0]); + BT_ERR("Unable to decode address %s", name); return -EINVAL; } - if (argc == 1) { + settings_name_next(name, &next); + + if (!next) { id = BT_ID_DEFAULT; } else { - id = strtol(argv[1], NULL, 10); + id = strtol(next, NULL, 10); } if (!len) { diff --git a/subsys/bluetooth/host/mesh/settings.c b/subsys/bluetooth/host/mesh/settings.c index 3f19d00f2efb..49521af80343 100644 --- a/subsys/bluetooth/host/mesh/settings.c +++ b/subsys/bluetooth/host/mesh/settings.c @@ -146,8 +146,8 @@ static inline int mesh_x_set(settings_read_cb read_cb, void *cb_arg, void *out, return 0; } -static int net_set(int argc, char **argv, size_t len_rd, - settings_read_cb read_cb, void *cb_arg) +static int net_set(const char *name, size_t len_rd, settings_read_cb read_cb, + void *cb_arg) { struct net_val net; int err; @@ -175,8 +175,8 @@ static int net_set(int argc, char **argv, size_t len_rd, return 0; } -static int iv_set(int argc, char **argv, size_t len_rd, - settings_read_cb read_cb, void *cb_arg) +static int iv_set(const char *name, size_t len_rd, settings_read_cb read_cb, + void *cb_arg) { struct iv_val iv; int err; @@ -205,8 +205,8 @@ static int iv_set(int argc, char **argv, size_t len_rd, return 0; } -static int seq_set(int argc, char **argv, size_t len_rd, - settings_read_cb read_cb, void *cb_arg) +static int seq_set(const char *name, size_t len_rd, settings_read_cb read_cb, + void *cb_arg) { struct seq_val seq; int err; @@ -269,7 +269,7 @@ static struct bt_mesh_rpl *rpl_alloc(u16_t src) return NULL; } -static int rpl_set(int argc, char **argv, size_t len_rd, +static int rpl_set(const char *name, size_t len_rd, settings_read_cb read_cb, void *cb_arg) { struct bt_mesh_rpl *entry; @@ -277,12 +277,12 @@ static int rpl_set(int argc, char **argv, size_t len_rd, int err; u16_t src; - if (argc < 1) { - BT_ERR("Invalid argc (%d)", argc); + if (!name) { + BT_ERR("Insufficient number of arguments"); return -ENOENT; } - src = strtol(argv[0], NULL, 16); + src = strtol(name, NULL, 16); entry = rpl_find(src); if (len_rd == 0) { @@ -319,7 +319,7 @@ static int rpl_set(int argc, char **argv, size_t len_rd, return 0; } -static int net_key_set(int argc, char **argv, size_t len_rd, +static int net_key_set(const char *name, size_t len_rd, settings_read_cb read_cb, void *cb_arg) { struct bt_mesh_subnet *sub; @@ -327,7 +327,12 @@ static int net_key_set(int argc, char **argv, size_t len_rd, int i, err; u16_t net_idx; - net_idx = strtol(argv[0], NULL, 16); + if (!name) { + BT_ERR("Insufficient number of arguments"); + return -ENOENT; + } + + net_idx = strtol(name, NULL, 16); sub = bt_mesh_subnet_get(net_idx); if (len_rd == 0) { @@ -382,7 +387,7 @@ static int net_key_set(int argc, char **argv, size_t len_rd, return 0; } -static int app_key_set(int argc, char **argv, size_t len_rd, +static int app_key_set(const char *name, size_t len_rd, settings_read_cb read_cb, void *cb_arg) { struct bt_mesh_app_key *app; @@ -390,7 +395,12 @@ static int app_key_set(int argc, char **argv, size_t len_rd, u16_t app_idx; int err; - app_idx = strtol(argv[0], NULL, 16); + if (!name) { + BT_ERR("Insufficient number of arguments"); + return -ENOENT; + } + + app_idx = strtol(name, NULL, 16); if (len_rd == 0) { BT_DBG("val (null)"); @@ -434,7 +444,7 @@ static int app_key_set(int argc, char **argv, size_t len_rd, return 0; } -static int hb_pub_set(int argc, char **argv, size_t len_rd, +static int hb_pub_set(const char *name, size_t len_rd, settings_read_cb read_cb, void *cb_arg) { struct bt_mesh_hb_pub *pub = bt_mesh_hb_pub_get(); @@ -479,7 +489,7 @@ static int hb_pub_set(int argc, char **argv, size_t len_rd, return 0; } -static int cfg_set(int argc, char **argv, size_t len_rd, +static int cfg_set(const char *name, size_t len_rd, settings_read_cb read_cb, void *cb_arg) { struct bt_mesh_cfg_srv *cfg = bt_mesh_cfg_get(); @@ -604,19 +614,21 @@ static int mod_set_pub(struct bt_mesh_model *mod, size_t len_rd, return 0; } -static int mod_set(bool vnd, int argc, char **argv, size_t len_rd, +static int mod_set(bool vnd, const char *name, size_t len_rd, settings_read_cb read_cb, void *cb_arg) { struct bt_mesh_model *mod; u8_t elem_idx, mod_idx; u16_t mod_key; + int len; + const char *next; - if (argc < 2) { - BT_ERR("Too small argc (%d)", argc); + if (!name) { + BT_ERR("Insufficient number of arguments"); return -ENOENT; } - mod_key = strtol(argv[0], NULL, 16); + mod_key = strtol(name, NULL, 16); elem_idx = mod_key >> 8; mod_idx = mod_key; @@ -630,37 +642,44 @@ static int mod_set(bool vnd, int argc, char **argv, size_t len_rd, return -ENOENT; } - if (!strcmp(argv[1], "bind")) { + len = settings_name_next(name, &next); + + if (!next) { + BT_ERR("Insufficient number of arguments"); + return -ENOENT; + } + + if (!strncmp(next, "bind", len)) { return mod_set_bind(mod, len_rd, read_cb, cb_arg); } - if (!strcmp(argv[1], "sub")) { + if (!strncmp(next, "sub", len)) { return mod_set_sub(mod, len_rd, read_cb, cb_arg); } - if (!strcmp(argv[1], "pub")) { + if (!strncmp(next, "pub", len)) { return mod_set_pub(mod, len_rd, read_cb, cb_arg); } - BT_WARN("Unknown module key %s", argv[1]); + BT_WARN("Unknown module key %s", next); return -ENOENT; } -static int sig_mod_set(int argc, char **argv, size_t len_rd, +static int sig_mod_set(const char *name, size_t len_rd, settings_read_cb read_cb, void *cb_arg) { - return mod_set(false, argc, argv, len_rd, read_cb, cb_arg); + return mod_set(false, name, len_rd, read_cb, cb_arg); } -static int vnd_mod_set(int argc, char **argv, size_t len_rd, +static int vnd_mod_set(const char *name, size_t len_rd, settings_read_cb read_cb, void *cb_arg) { - return mod_set(true, argc, argv, len_rd, read_cb, cb_arg); + return mod_set(true, name, len_rd, read_cb, cb_arg); } const struct mesh_setting { const char *name; - int (*func)(int argc, char **argv, size_t len_rd, + int (*func)(const char *name, size_t len_rd, settings_read_cb read_cb, void *cb_arg); } settings[] = { { "Net", net_set }, @@ -675,27 +694,26 @@ const struct mesh_setting { { "v", vnd_mod_set }, }; -static int mesh_set(int argc, char **argv, size_t len_rd, +static int mesh_set(const char *name, size_t len_rd, settings_read_cb read_cb, void *cb_arg) { - int i; + int i, len; + const char *next; - if (argc < 1) { + if (!name) { BT_ERR("Insufficient number of arguments"); return -EINVAL; } - for (i = 0; i < ARRAY_SIZE(settings); i++) { - if (!strcmp(settings[i].name, argv[0])) { - argc--; - argv++; + len = settings_name_next(name, &next); - return settings[i].func(argc, argv, len_rd, read_cb, - cb_arg); + for (i = 0; i < ARRAY_SIZE(settings); i++) { + if (!strncmp(settings[i].name, name, len)) { + return settings[i].func(next, len_rd, read_cb, cb_arg); } } - BT_WARN("No matching handler for key %s", log_strdup(argv[0])); + BT_WARN("No matching handler for key %s", log_strdup(name)); return -ENOENT; } diff --git a/subsys/bluetooth/host/settings.c b/subsys/bluetooth/host/settings.c index e7ebe4ef8798..e2a0483a9924 100644 --- a/subsys/bluetooth/host/settings.c +++ b/subsys/bluetooth/host/settings.c @@ -43,12 +43,12 @@ void bt_settings_encode_key(char *path, size_t path_size, const char *subsys, BT_DBG("Encoded path %s", log_strdup(path)); } -int bt_settings_decode_key(char *key, bt_addr_le_t *addr) +int bt_settings_decode_key(const char *key, bt_addr_le_t *addr) { bool high; int i; - if (strlen(key) != 13) { + if (settings_name_next(key, NULL) != 13) { return -EINVAL; } @@ -86,24 +86,27 @@ int bt_settings_decode_key(char *key, bt_addr_le_t *addr) return 0; } -static int set(int argc, char **argv, size_t len_rd, settings_read_cb read_cb, +static int set(const char *name, size_t len_rd, settings_read_cb read_cb, void *cb_arg) { ssize_t len; - const struct bt_settings_handler *h; + const char *next; - for (h = _bt_settings_start; h < _bt_settings_end; h++) { - if (!strcmp(argv[0], h->name)) { - argc--; - argv++; + if (!name) { + BT_ERR("Insufficient number of arguments"); + return -ENOENT; + } - return h->set(argc, argv, len_rd, read_cb, - cb_arg); + len = settings_name_next(name, &next); + + for (h = _bt_settings_start; h < _bt_settings_end; h++) { + if (!strncmp(name, h->name, len)) { + return h->set(next, len_rd, read_cb, cb_arg); } } - if (!strcmp(argv[0], "id")) { + if (!strncmp(name, "id", len)) { /* Any previously provided identities supersede flash */ if (atomic_test_bit(bt_dev.flags, BT_DEV_PRESET_ID)) { BT_WARN("Ignoring identities stored in flash"); @@ -137,7 +140,7 @@ static int set(int argc, char **argv, size_t len_rd, settings_read_cb read_cb, } #if defined(CONFIG_BT_DEVICE_NAME_DYNAMIC) - if (!strcmp(argv[0], "name")) { + if (!strncmp(name, "name", len)) { len = read_cb(cb_arg, &bt_dev.name, sizeof(bt_dev.name) - 1); if (len < 0) { BT_ERR("Failed to read device name from storage" @@ -152,7 +155,7 @@ static int set(int argc, char **argv, size_t len_rd, settings_read_cb read_cb, #endif #if defined(CONFIG_BT_PRIVACY) - if (!strcmp(argv[0], "irk")) { + if (!strncmp(name, "irk", len)) { len = read_cb(cb_arg, bt_dev.irk, sizeof(bt_dev.irk)); if (len < sizeof(bt_dev.irk[0])) { if (len < 0) { @@ -184,7 +187,7 @@ static int set(int argc, char **argv, size_t len_rd, settings_read_cb read_cb, static void save_id(struct k_work *work) { int err; - + BT_INFO("Saving ID"); err = settings_save_one("bt/id", &bt_dev.id_addr, ID_DATA_LEN(bt_dev.id_addr)); if (err) { diff --git a/subsys/bluetooth/host/settings.h b/subsys/bluetooth/host/settings.h index 88f436dd63cd..069346d9eaec 100644 --- a/subsys/bluetooth/host/settings.h +++ b/subsys/bluetooth/host/settings.h @@ -6,7 +6,7 @@ struct bt_settings_handler { const char *name; - int (*set)(int argc, char **argv, size_t len, settings_read_cb read_cb, + int (*set)(const char *name, size_t len, settings_read_cb read_cb, void *cb_arg); int (*commit)(void); int (*export)(int (*func)(const char *name, @@ -30,7 +30,7 @@ struct bt_settings_handler { /* Helpers for keys containing a bdaddr */ void bt_settings_encode_key(char *path, size_t path_size, const char *subsys, bt_addr_le_t *addr, const char *key); -int bt_settings_decode_key(char *key, bt_addr_le_t *addr); +int bt_settings_decode_key(const char *key, bt_addr_le_t *addr); void bt_settings_save_id(void); diff --git a/subsys/bluetooth/services/dis.c b/subsys/bluetooth/services/dis.c index c98615a84fbe..3383504893b4 100644 --- a/subsys/bluetooth/services/dis.c +++ b/subsys/bluetooth/services/dis.c @@ -144,12 +144,14 @@ BT_GATT_SERVICE_DEFINE(dis_svc, ); #if defined(CONFIG_BT_SETTINGS) && defined(CONFIG_BT_GATT_DIS_SETTINGS) -static int dis_set(int argc, char **argv, size_t len_rd, +static int dis_set(const char *name, size_t len_rd, settings_read_cb read_cb, void *store) { - int len; + int len, nlen; + const char *next; - if (!strcmp(argv[0], "manuf")) { + nlen = settings_name_next(name, &next); + if (!strncmp(name, "manuf", nlen)) { len = read_cb(store, &dis_manuf, sizeof(dis_manuf) - 1); if (len < 0) { BT_ERR("Failed to read manufacturer from storage" @@ -161,7 +163,7 @@ static int dis_set(int argc, char **argv, size_t len_rd, } return 0; } - if (!strcmp(argv[0], "model")) { + if (!strncmp(name, "model", nlen)) { len = read_cb(store, &dis_model, sizeof(dis_model) - 1); if (len < 0) { BT_ERR("Failed to read model from storage" @@ -174,7 +176,7 @@ static int dis_set(int argc, char **argv, size_t len_rd, return 0; } #if defined(CONFIG_BT_GATT_DIS_SERIAL_NUMBER) - if (!strcmp(argv[0], "serial")) { + if (!strncmp(name, "serial", nlen)) { len = read_cb(store, &dis_serial_number, sizeof(dis_serial_number) - 1); if (len < 0) { @@ -189,7 +191,7 @@ static int dis_set(int argc, char **argv, size_t len_rd, } #endif #if defined(CONFIG_BT_GATT_DIS_FW_REV) - if (!strcmp(argv[0], "fw")) { + if (!strncmp(name, "fw", nlen)) { len = read_cb(store, &dis_fw_rev, sizeof(dis_fw_rev) - 1); if (len < 0) { BT_ERR("Failed to read firmware revision from storage" @@ -203,7 +205,7 @@ static int dis_set(int argc, char **argv, size_t len_rd, } #endif #if defined(CONFIG_BT_GATT_DIS_HW_REV) - if (!strcmp(argv[0], "hw")) { + if (!strncmp(name, "hw", nlen)) { len = read_cb(store, &dis_hw_rev, sizeof(dis_hw_rev) - 1); if (len < 0) { BT_ERR("Failed to read hardware revision from storage" @@ -217,7 +219,7 @@ static int dis_set(int argc, char **argv, size_t len_rd, } #endif #if defined(CONFIG_BT_GATT_DIS_SW_REV) - if (!strcmp(argv[0], "sw")) { + if (!strncmp(name, "sw", nlen)) { len = read_cb(store, &dis_sw_rev, sizeof(dis_sw_rev) - 1); if (len < 0) { BT_ERR("Failed to read software revision from storage"