> 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.


Reply via email to