diff --git a/src/log.cpp b/src/log.cpp index 29f7539..19c2333 100644 --- a/src/log.cpp +++ b/src/log.cpp @@ -10,6 +10,10 @@ #include +// must include before epicsStdio.h to avoid clash with printf macro +#include +#include + #include #include #include @@ -123,6 +127,47 @@ int logger_init(logger *logger) return logger_gbl->init(logger); } +void xerrlogHexPrintf(const void *buf, size_t buflen, + const char *fmt, ...) +{ + const uint8_t* const cbuf = static_cast(buf); + va_list args; + + // whole buffer + for(size_t pos=0; pos>4)&0xf]; + buf[grp][chr+1] = hex[(v>>0)&0xf]; + } + for(; chr<8; chr+=2) + { + buf[grp][chr+0] = '\0'; + buf[grp][chr+1] = '\0'; + } + buf[grp][8] = '\0'; + } + + errlogPrintf("%04x : %s %s %s %s\n", addr, buf[0], buf[1], buf[2], buf[3]); + } + + va_start(args, fmt); + errlogVprintf(fmt, args); + va_end(args); +} + void logger_level_set(const char *name, int lvl) { epicsThreadOnce(&logger_once, &logger_prepare, nullptr); diff --git a/src/pvxs/log.h b/src/pvxs/log.h index 323285a..4f77f44 100644 --- a/src/pvxs/log.h +++ b/src/pvxs/log.h @@ -35,17 +35,25 @@ struct logger { PVXS_API int logger_init(logger *logger); static inline -bool log_test(logger& logger, int lvl) +bool _log_test(logger& logger, int lvl) { int cur = ::epics::atomic::get(logger.lvl); if(cur==-1) cur = logger_init(&logger); return cur>=lvl; } +PVXS_API +void xerrlogHexPrintf(const void *buf, size_t buflen, + const char *fmt, ...) EPICS_PRINTF_STYLE(3,4); + +#define log_test(LOGGER, LVL) ::pvxs::_log_test(LOGGER, LVL) + #define log_printf(LOGGER, LVL, ...) do{ if(log_test(LOGGER, LVL)) errlogPrintf(__VA_ARGS__); }while(0) #define log_vprintf(LOGGER, LVL, FMT, ARGS) do{ if(log_test(LOGGER, LVL)) errlogVprintf(FMT, ARGS); }while(0) +#define log_hex_printf(LOGGER, LVL, BUF, BUFLEN, ...) do{ if(log_test(LOGGER, LVL)) xerrlogHexPrintf(BUF, BUFLEN, __VA_ARGS__); }while(0) + //! Set level for a specific logger PVXS_API void logger_level_set(const char *name, int lvl); diff --git a/src/udp_collector.cpp b/src/udp_collector.cpp index 2b01894..9420a4b 100644 --- a/src/udp_collector.cpp +++ b/src/udp_collector.cpp @@ -77,6 +77,8 @@ struct UDPCollector : public std::enable_shared_from_this return; } + log_hex_printf(logio, PLVL_DEBUG, &buf[0], nrx, "UDP Rx from %s", msg.src.tostring().c_str()); + msgs.clear(); sbuf packet(&buf[0], size_t(nrx)); diff --git a/tools/pvxvct.cpp b/tools/pvxvct.cpp index 7d434e9..853728b 100644 --- a/tools/pvxvct.cpp +++ b/tools/pvxvct.cpp @@ -182,7 +182,7 @@ int main(int argc, char *argv[]) } if(opts.peers.empty()) { log_printf(out, PLVL_DEBUG, "No peer filter\n"); - } else if(pva::log_test(out, PLVL_DEBUG)) { + } else if(log_test(out, PLVL_DEBUG)) { for(const auto& tup : opts.peers) { in_addr addr, netmask; std::tie(addr.s_addr, netmask.s_addr) = tup;