diff options
Diffstat (limited to 'fw/app/src')
| -rw-r--r-- | fw/app/src/http.c | 15 | ||||
| -rw-r--r-- | fw/app/src/settings.c | 41 | ||||
| -rw-r--r-- | fw/app/src/settings.h | 21 | ||||
| -rw-r--r-- | fw/app/src/syslog.c | 3 | 
4 files changed, 64 insertions, 16 deletions
diff --git a/fw/app/src/http.c b/fw/app/src/http.c index 83a3568..1c24490 100644 --- a/fw/app/src/http.c +++ b/fw/app/src/http.c @@ -5,6 +5,7 @@   */ +#include <errno.h>  #include <stdint.h>  #include <zephyr/init.h> @@ -101,14 +102,24 @@ static int settings_handler(  ) {  	static char buffer[100]; -	int ret = settings_to_json(buffer, sizeof(buffer)); +	int ret = settings_to_json(buffer, sizeof(buffer) - 1);  	if (ret < 0) {  		LOG_ERR("Could not serialize payload for settings request");  		return ret;  	} +	size_t len = strnlen(buffer, sizeof(buffer)); +	if (len + 2 > sizeof(buffer)) { +		LOG_ERR("Settings JSON requires %d octets but buffer has only %d", +		        len + 2, sizeof(buffer)); +		return -ENOMEM; +	} + +	buffer[len] = '\n'; +	buffer[len + 1] = '\0'; +  	response_ctx->body = (const uint8_t *)buffer; -	response_ctx->body_len = ret; +	response_ctx->body_len = len + 1;  	response_ctx->final_chunk = true;  	response_ctx->status = HTTP_200_OK; diff --git a/fw/app/src/settings.c b/fw/app/src/settings.c index 89f2f88..4b2c248 100644 --- a/fw/app/src/settings.c +++ b/fw/app/src/settings.c @@ -4,9 +4,9 @@   * obtain one at https://mozilla.org/MPL/2.0/.   */ +#include <string.h> -#include <stdio.h> - +#include <zephyr/data/json.h>  #include <zephyr/init.h>  #include <zephyr/logging/log.h>  #include <zephyr/settings/settings.h> @@ -36,27 +36,42 @@ int init_settings(void) {  }  SYS_INIT(init_settings, APPLICATION, 50); +static const struct json_obj_descr settings_syslog_target_descr[] = { +	JSON_OBJ_DESCR_PRIM(struct settings_syslog_target, ip, JSON_TOK_STRING), +}; + +static const struct json_obj_descr settings_syslog_descr[] = { +	JSON_OBJ_DESCR_OBJECT(struct settings_syslog, target, settings_syslog_target_descr), +}; + +static const struct json_obj_descr settings_descr[] = { +	JSON_OBJ_DESCR_OBJECT(struct settings, syslog, settings_syslog_descr), +}; +  int settings_to_json(void *buffer, size_t len)  { -	static const char format[] = "{\"syslog\":{\"target\":{\"ip\":\"%s\"}}}\n"; +	struct settings settings = {0,}; +	settings.syslog.target.ip = (char *)settings.syslog.target.ip_array; -	char ip[100]; -	int ret = settings_runtime_get("syslog/target/ip", ip, sizeof(ip)); +	int ret = settings_runtime_get("syslog/target/ip", +	                               settings.syslog.target.ip_array, +	                               sizeof(settings.syslog.target.ip_array));  	if (ret < 0) {  		LOG_ERR("Failed to get runtime setting syslog/target/ip (%d)", ret);  		return ret;  	} -	ret = snprintf(buffer, len, format, ip); - -	if (ret >= len) { -		LOG_ERR("Buffer too small to serialize settings as JSON"); -		return -ENOMEM; -	} - +	ret = json_obj_encode_buf( +		settings_descr, +		ARRAY_SIZE(settings_descr), +		&settings, +		buffer, +		len +	);  	if (ret < 0) {  		LOG_ERR("Failed to serialize settings as JSON"); +		return ret;  	} -	return ret; +	return 0;  } diff --git a/fw/app/src/settings.h b/fw/app/src/settings.h index a5cf2ac..290d1ff 100644 --- a/fw/app/src/settings.h +++ b/fw/app/src/settings.h @@ -4,8 +4,29 @@   * obtain one at https://mozilla.org/MPL/2.0/.   */ +#ifndef SRC_SETTINGS_H +#define SRC_SETTINGS_H  #include <stddef.h> +#include <zephyr/data/json.h> + +#define IPV6_STRLEN_MAX 39  // excluding '\0' + + +struct settings_syslog_target { +	char ip_array[IPV6_STRLEN_MAX]; +	char *ip;  /* Zephyr's JSON lib does not work with arrays directly */ +}; + +struct settings_syslog { +	struct settings_syslog_target target; +}; + +struct settings { +	struct settings_syslog syslog; +};  int settings_to_json(void *buffer, size_t data); + +#endif  // !SRC_SETTINGS_H diff --git a/fw/app/src/syslog.c b/fw/app/src/syslog.c index 700547b..22aa034 100644 --- a/fw/app/src/syslog.c +++ b/fw/app/src/syslog.c @@ -25,11 +25,12 @@  #include <zephyr/sys/reboot.h>  #endif  // CONFIG_IOT_CONTACT_NETWORK_HACK +#include "settings.h" +  LOG_MODULE_REGISTER(syslog);  #define NETWORK_BUG_DELAY K_MSEC(4000)  #define L4_EVENT_MASK (NET_EVENT_L4_CONNECTED | NET_EVENT_L4_DISCONNECTED) -#define IPV6_STRLEN_MAX 39  // excluding '\0'  #define SYSLOG_TARGET_PORT 514  struct net_mgmt_event_callback l4_cb;  | 
