refactor(splits): Minor cleanups to periph invocation
* Add strlcpy from public domain version. * Leverage strlcpy to detect truncation of behavior dev strs, and log. * Use `offsetof` for cleaner detection on peripheral side.
This commit is contained in:
parent
b8700eaaa1
commit
7430750428
5 changed files with 55 additions and 3 deletions
|
@ -23,6 +23,7 @@ zephyr_linker_sources(RODATA include/linker/zmk-events.ld)
|
||||||
# find_package(Zephyr) which defines the target.
|
# find_package(Zephyr) which defines the target.
|
||||||
target_include_directories(app PRIVATE include)
|
target_include_directories(app PRIVATE include)
|
||||||
target_sources_ifdef(CONFIG_ZMK_SLEEP app PRIVATE src/power.c)
|
target_sources_ifdef(CONFIG_ZMK_SLEEP app PRIVATE src/power.c)
|
||||||
|
target_sources(app PRIVATE src/stdlib.c)
|
||||||
target_sources(app PRIVATE src/activity.c)
|
target_sources(app PRIVATE src/activity.c)
|
||||||
target_sources(app PRIVATE src/kscan.c)
|
target_sources(app PRIVATE src/kscan.c)
|
||||||
target_sources(app PRIVATE src/matrix_transform.c)
|
target_sources(app PRIVATE src/matrix_transform.c)
|
||||||
|
|
19
app/include/zmk/stdlib.h
Normal file
19
app/include/zmk/stdlib.h
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2022 The ZMK Contributors
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: MIT
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <stdlib.h> /* for size_t */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ANSI C version of strlcpy
|
||||||
|
* Based on the NetBSD strlcpy man page.
|
||||||
|
*
|
||||||
|
* Nathan Myers <ncm-nospam@cantrip.org>, 2003/06/03
|
||||||
|
* Placed in the public domain.
|
||||||
|
*/
|
||||||
|
|
||||||
|
size_t strlcpy(char *dst, const char *src, size_t size);
|
|
@ -17,6 +17,7 @@
|
||||||
|
|
||||||
LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL);
|
LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL);
|
||||||
|
|
||||||
|
#include <zmk/stdlib.h>
|
||||||
#include <zmk/ble.h>
|
#include <zmk/ble.h>
|
||||||
#include <zmk/behavior.h>
|
#include <zmk/behavior.h>
|
||||||
#include <zmk/split/bluetooth/uuid.h>
|
#include <zmk/split/bluetooth/uuid.h>
|
||||||
|
@ -549,8 +550,12 @@ int zmk_split_bt_invoke_behavior(uint8_t source, struct zmk_behavior_binding *bi
|
||||||
.position = event.position,
|
.position = event.position,
|
||||||
.state = state ? 1 : 0,
|
.state = state ? 1 : 0,
|
||||||
}};
|
}};
|
||||||
strncpy(payload.behavior_dev, binding->behavior_dev, ZMK_SPLIT_RUN_BEHAVIOR_DEV_LEN - 1);
|
const size_t payload_dev_size = sizeof(payload.behavior_dev);
|
||||||
payload.behavior_dev[ZMK_SPLIT_RUN_BEHAVIOR_DEV_LEN - 1] = '\0';
|
if (strlcpy(payload.behavior_dev, binding->behavior_dev, payload_dev_size) >=
|
||||||
|
payload_dev_size) {
|
||||||
|
LOG_ERR("Truncated behavior label %s to %s before invoking peripheral behavior",
|
||||||
|
log_strdup(binding->behavior_dev), log_strdup(payload.behavior_dev));
|
||||||
|
}
|
||||||
|
|
||||||
struct zmk_split_run_behavior_payload_wrapper wrapper = {.source = source, .payload = payload};
|
struct zmk_split_run_behavior_payload_wrapper wrapper = {.source = source, .payload = payload};
|
||||||
return split_bt_invoke_behavior_payload(wrapper);
|
return split_bt_invoke_behavior_payload(wrapper);
|
||||||
|
|
|
@ -51,8 +51,10 @@ static ssize_t split_svc_run_behavior(struct bt_conn *conn, const struct bt_gatt
|
||||||
// We run if:
|
// We run if:
|
||||||
// 1: We've gotten all the position/state/param data.
|
// 1: We've gotten all the position/state/param data.
|
||||||
// 2: We have a null terminated string for the behavior device label.
|
// 2: We have a null terminated string for the behavior device label.
|
||||||
|
const size_t behavior_dev_offset =
|
||||||
|
offsetof(struct zmk_split_run_behavior_payload, behavior_dev);
|
||||||
if ((end_addr > sizeof(struct zmk_split_run_behavior_data)) &&
|
if ((end_addr > sizeof(struct zmk_split_run_behavior_data)) &&
|
||||||
payload->behavior_dev[end_addr - sizeof(struct zmk_split_run_behavior_data) - 1] == '\0') {
|
payload->behavior_dev[end_addr - behavior_dev_offset - 1] == '\0') {
|
||||||
struct zmk_behavior_binding binding = {
|
struct zmk_behavior_binding binding = {
|
||||||
.param1 = payload->data.param1,
|
.param1 = payload->data.param1,
|
||||||
.param2 = payload->data.param2,
|
.param2 = payload->data.param2,
|
||||||
|
|
25
app/src/stdlib.c
Normal file
25
app/src/stdlib.c
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2022 The ZMK Contributors
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: MIT
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <zmk/stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ANSI C version of strlcpy
|
||||||
|
* Based on the NetBSD strlcpy man page.
|
||||||
|
*
|
||||||
|
* Nathan Myers <ncm-nospam@cantrip.org>, 2003/06/03
|
||||||
|
* Placed in the public domain.
|
||||||
|
*/
|
||||||
|
|
||||||
|
size_t strlcpy(char *dst, const char *src, size_t size) {
|
||||||
|
const size_t len = strlen(src);
|
||||||
|
if (size != 0) {
|
||||||
|
memcpy(dst, src, (len > size - 1) ? size - 1 : len);
|
||||||
|
dst[size - 1] = 0;
|
||||||
|
}
|
||||||
|
return len;
|
||||||
|
}
|
Loading…
Reference in a new issue