1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 |
- #pragma GCC diagnostic error "-Wall"
- #pragma GCC diagnostic error "-Wextra"
- #include "common_config.h"
- #if defined(SYSLOG_ENABLE) && !defined(BT6702_SERVICE)
- #include "common_config.h"
- #include "syslog.h"
- #include "settings_api.h"
- #include "tcpip.h"
- #include "udp.h"
- #include "rtc.h"
- #include "netconf.h"
- #include <assert.h>
- static struct udp_pcb *upcb;
- // TODO either lock the buffers against race conditions or raise the task stack sizes, or lower the memory consumption
- static char packet[256];
- static char msg[200];
- void openlog(void)
- {
- upcb = udp_new();
- udp_bind(upcb, IP_ADDR_ANY, 0);
- }
- static void timestamp_rfc3339(char *ts)
- {
- TM_RTC_t data;
- uint16_t sys_year;
- TM_RTC_GetDateTime(&data, TM_RTC_Format_BIN);
- sys_year = 2000 + data.year;
- uint32_t subseconds = (1024 - data.subseconds) * 999999 / 1024;
- // TODO timezone?
- sprintf(ts, "%04i-%02i-%02iT%02i:%02i:%02i.%06luZ", sys_year, data.month, data.date, data.hours, data.minutes, data.seconds, subseconds);
- }
- void syslog(uint8_t severity, char *fmt, ...)
- {
- //char msg[200]; // arbitrary length; "Any transport receiver MUST be able to accept messages of up to and including 480 octets in length."
- va_list va;
- va_start(va, fmt);
- vsnprintf(msg, sizeof(msg), fmt, va);
- syslog_str(severity, msg);
- va_end(va);
- }
- void syslog_str(uint8_t severity, char *msg)
- {
- if (!sSettings.sSyslog.enabled) {
- return;
- }
- const uint8_t facility = 1;
- assert(severity < 8);
- uint8_t priority = facility * 8 + severity;
- #define SYSLOG_VERSION "1" // as defined in RFC5424
- #define BOM "\xef\xbb\xbf"
- struct pbuf* psend;
- // TODO to reduce memory consumption one can use a scatter-gather I/O instead of packet[]
- //char packet[256]; // arbitrary length; "Any transport receiver MUST be able to accept messages of up to and including 480 octets in length."
- static char timestamp[30];
- timestamp_rfc3339(timestamp);
- unsigned len = snprintf(packet, sizeof(packet), "<%u>" SYSLOG_VERSION " %s %s " HW_REV "_" VERSION " - - - " BOM "%s", priority, timestamp, ipaddr_ntoa(&xnetif.ip_addr), msg);
- //psend = pbuf_alloc(PBUF_RAW, sizeof(packet), PBUF_REF);
- psend = pbuf_alloc(PBUF_RAW, len, PBUF_REF);
- psend->payload = packet;
- //psend->len = len;
- udp_sendto(upcb, psend, &sSettings.sSyslog.server_ip, sSettings.sSyslog.server_port);
- pbuf_free(psend);
- }
- #endif // defined(HARDWARE_BT6711) && !defined(BT6702_SERVICE)
|