From 33d1cf04a7e8d5b4cb7ed45af75eed06a27d1292 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Mon, 18 Mar 2013 19:09:25 +0100 Subject: Add log message support --- include/gmrf/gmrf.h | 2 ++ mmss/CMakeLists.txt | 1 + mmss/log.c | 73 +++++++++++++++++++++++++++++++++++++++++++++++++++++ mmss/mmss.c | 4 +-- mmss/mmss.h | 2 ++ mmss/protocol.c | 2 ++ 6 files changed, 82 insertions(+), 2 deletions(-) create mode 100644 mmss/log.c diff --git a/include/gmrf/gmrf.h b/include/gmrf/gmrf.h index bccf338..7f3cbde 100644 --- a/include/gmrf/gmrf.h +++ b/include/gmrf/gmrf.h @@ -31,6 +31,7 @@ #include #include #include +#include typedef struct gmrf gmrf_t; @@ -52,6 +53,7 @@ static inline bool gmrf_addr_equal(const gmrf_addr_t *addr1, const gmrf_addr_t * return (memcmp(addr1->d, addr2->d, GMRF_ADDR_LEN) == 0); } +void gmrf_logf(gmrf_t *gmrf, int priority, const char *format, ...); gmrf_addr_t gmrf_iface_get_addr(gmrf_t *gmrf, gmrf_iface_t *iface); size_t gmrf_iface_get_mtu(gmrf_t *gmrf, gmrf_iface_t *iface); diff --git a/mmss/CMakeLists.txt b/mmss/CMakeLists.txt index 5105436..c200d7a 100644 --- a/mmss/CMakeLists.txt +++ b/mmss/CMakeLists.txt @@ -2,6 +2,7 @@ include_directories(${GMRF_SOURCE_DIR}/include) add_executable(mmss iface.c + log.c mmss.c protocol.c queue.c diff --git a/mmss/log.c b/mmss/log.c new file mode 100644 index 0000000..5599e95 --- /dev/null +++ b/mmss/log.c @@ -0,0 +1,73 @@ +/* + Copyright (c) 2013, Matthias Schiffer + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#include "mmss.h" + +#include + + +static inline int snprintf_safe(char *buffer, size_t size, const char *format, ...) { + va_list ap; + va_start(ap, format); + int ret = vsnprintf(buffer, size, format, ap); + va_end(ap); + + return ret < 0 ? 0 : ret > size ? size : ret; +} + +static inline const char* get_log_prefix(int log_level) { + switch(log_level) { + case LOG_CRIT: + return "Fatal: "; + case LOG_ERR: + return "Error: "; + case LOG_WARNING: + return "Warning: "; + case LOG_NOTICE: + return "Info: "; + case LOG_INFO: + return "Verbose: "; + case LOG_DEBUG: + return "DEBUG: "; + default: + return ""; + } +} + + +void gmrf_logf(gmrf_t *gmrf, int priority, const char *format, ...) { + char buf[1024]; + size_t pos = 0; + + pos += snprintf_safe(buf, sizeof(buf), "[% 5u.%03u] %s: %s", gmrf->mmss->now/1000, gmrf->mmss->now%1000, gmrf->name, get_log_prefix(priority)); + + va_list ap; + va_start(ap, format); + vsnprintf(buf+pos, sizeof(buf)-pos, format, ap); + va_end(ap); + + fprintf(stderr, "%s\n", buf); +} diff --git a/mmss/mmss.c b/mmss/mmss.c index 31a5623..444445e 100644 --- a/mmss/mmss.c +++ b/mmss/mmss.c @@ -67,7 +67,7 @@ int main(int argc, char *argv[]) { mmss_t mmss = { .now = 0 }; mmss_network_t net = { .mtu = 1500 }; - gmrf_t node1 = { .mmss = &mmss, .proto = proto }, node2 = { .mmss = &mmss, .proto = proto }; + gmrf_t node1 = { .name = "node1", .mmss = &mmss, .proto = proto }, node2 = { .name = "node2", .mmss = &mmss, .proto = proto }; gmrf_iface_t iface1 = {}, iface2 = {}; iface1.net = &net; @@ -93,7 +93,7 @@ int main(int argc, char *argv[]) { int timeout = get_queue_timeout(&mmss); if (timeout < 0) { - fprintf(stderr, "Nothing queued, deadlock occured.\n"); + fprintf(stderr, "nothing queued, deadlock occured.\n"); break; } diff --git a/mmss/mmss.h b/mmss/mmss.h index 59e3d4e..c10a119 100644 --- a/mmss/mmss.h +++ b/mmss/mmss.h @@ -67,6 +67,8 @@ struct mmss_scheduled { struct gmrf { gmrf_t *next; + const char *name; + mmss_t *mmss; gmrf_context_t *ctx; gmrf_iface_t *interfaces; diff --git a/mmss/protocol.c b/mmss/protocol.c index 2df9809..046cb58 100644 --- a/mmss/protocol.c +++ b/mmss/protocol.c @@ -45,5 +45,7 @@ const mmss_protocol_t* mmss_load_protocol(const char *module) { return NULL; } + fprintf(stderr, "loaded protocol `%s' version %s\n", proto->get_name(), proto->get_version()); + return proto; } -- cgit v1.2.3