> On Feb 21, 2017, at 10:10 AM, Christopher Collins <[email protected]> wrote: > > Hi Jacob, > > On Tue, Feb 21, 2017 at 10:34:53AM -0700, Jacob Rosenthal wrote: >> Im trying to build a DIS service with identification strings like bsp and >> app name from config/id package with conf_get_value >> >> I think Im using the api correctly? >> >> char *val; >> int rc; >> uint16_t uuid16; >> char tmp_buf[32 + 1]; ///hwid is only one that needs some tmp buffer >> >> if(ctxt->op != BLE_GATT_ACCESS_OP_READ_CHR) >> { >> return BLE_ATT_ERR_UNLIKELY; >> } >> uuid16 = ble_uuid_u16(ctxt->chr->uuid); >> assert(uuid16 != 0); >> >> switch (uuid16) { >> case BLE_SVC_DIS_CHR_SYS_ID_UUID16: >> val = conf_get_value("id/hwid", tmp_buf, sizeof(tmp_buf)); >> console_printf("hwid %s\n", val); >> rc = os_mbuf_append(ctxt->om, val, strlen(val)); >> return rc == 0 ? 0 : BLE_ATT_ERR_INSUFFICIENT_RES; >> >> But I cant seem to get anything other than a empty string at runtime... > [...] > > This is indeed a bummer. The problem is that the conf_get_value() > function expects the setting name to be a mutable string. String > literals (e.g., "id/hwid") are constant, and cause the setting lookup to > fail. The reason the name needs to be mutable is that the lookup > routine calls strtok_r on the string, which replaces instances of '/' > with \0. > > Anyway, the immediate fix is to put the setting name in a char array, > rather than pass a string literal to conf_get_value(). For example: > > char conf_name[] = "id/hwid"; > > val = conf_get_value(conf_name, tmp_buf, sizeof(tmp_buf)); > > In my view, this aspect of the conf API isn't particularly obvious. We > should either change the API such that it works with constant strings or > clearly document this requirement. >
Note that this routine was not meant to be exported, but if it’s useful, we should continue doing that :) We could add another routine which makes a copy of the conf_name, and then does the operation. As well as for setting a value.
