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.

Chris

Reply via email to