From: Luiz Augusto von Dentz <luiz.von.dentz@xxxxxxxxx> --- src/shared/gatt-db.c | 32 ++++++++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/src/shared/gatt-db.c b/src/shared/gatt-db.c index b5b6c72..5a912f8 100644 --- a/src/shared/gatt-db.c +++ b/src/shared/gatt-db.c @@ -900,7 +900,7 @@ bool gatt_db_attribute_read(struct gatt_db_attribute *attrib, uint16_t offset, return true; } - /* Check length boundary if value is stored in the db */ + /* Check boundary if value is stored in the db */ if (offset >= attrib->value_len) return false; @@ -916,5 +916,33 @@ bool gatt_db_attribute_write(struct gatt_db_attribute *attrib, uint16_t offset, gatt_db_attribute_write_t func, void *user_data) { - return false; + if (!attrib) + return false; + + if (attrib->write_func) { + attrib->write_func(attrib->handle, offset, value, len, opcode, + bdaddr, attrib->user_data); + return true; + } + + /* For values stored in db allocate on demand */ + if (!attrib->value) { + attrib->value = malloc0(len + offset); + if (!attrib->value) + return false; + attrib->value_len = len + offset; + } else if (offset >= attrib->value_len || + len > (unsigned) (attrib->value_len - offset)) { + attrib->value = realloc(attrib->value, len + offset); + if (!attrib->value) + return 0; + attrib->value_len = len + offset; + } + + memcpy(&attrib->value[offset], value, len); + + if (func) + func(attrib, 0, user_data); + + return true; } -- 1.9.3 -- To unsubscribe from this list: send the line "unsubscribe linux-bluetooth" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html