From e31355bbc14e6ee96162c56c5e625aafcf42f9ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Tue, 31 May 2022 15:23:35 +0200 Subject: [PATCH] tests: add a helper that dumps /run/utmp in detail utmpdump doesn't print all the details. Looking at the list if useful when trying to tweak the wall filtering logic. This doesn't do much, but at least it serves as a smoke test for the cleanup functions. --- src/test/meson.build | 2 ++ src/test/test-utmp.c | 61 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+) create mode 100644 src/test/test-utmp.c diff --git a/src/test/meson.build b/src/test/meson.build index d9304d538b0..d2bdd201ee3 100644 --- a/src/test/meson.build +++ b/src/test/meson.build @@ -614,6 +614,8 @@ tests += [ [files('test-journal-importer.c')], + [files('test-utmp.c')], + [files('test-udev.c'), [libudevd_core, libshared], diff --git a/src/test/test-utmp.c b/src/test/test-utmp.c new file mode 100644 index 00000000000..2f66003e65e --- /dev/null +++ b/src/test/test-utmp.c @@ -0,0 +1,61 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ + +#include "format-util.h" +#include "socket-util.h" +#include "stdio-util.h" +#include "string-util.h" +#include "utmp-wtmp.h" +#include "tests.h" + +#ifndef UT_LINESIZE +# define UT_LINESIZE 32 +#endif +#ifndef UT_NAMESIZE +# define UT_NAMESIZE 32 +#endif +#ifndef UT_HOSTSIZE +# define UT_HOSTSIZE 256 +#endif + +TEST(dump_run_utmp) { + _unused_ _cleanup_(utxent_cleanup) bool utmpx = false; + + utmpx = utxent_start(); + + for (struct utmpx *u; (u = getutxent()); ) { + char _type_buf[DECIMAL_STR_MAX(short)]; + const char *type = + u->ut_type == EMPTY ? "EMPTY" : + u->ut_type == RUN_LVL ? "RUN_LVL" : + u->ut_type == BOOT_TIME ? "BOOT_TIME" : + u->ut_type == NEW_TIME ? "NEW_TIME" : + u->ut_type == OLD_TIME ? "OLD_TIME" : + u->ut_type == INIT_PROCESS ? "INIT_PROCESS" : + u->ut_type == LOGIN_PROCESS ? "LOGIN_PROCESS" : + u->ut_type == USER_PROCESS ? "USER_PROCESS" : + u->ut_type == DEAD_PROCESS ? "DEAD_PROCESS" : + u->ut_type == ACCOUNTING ? "ACCOUNTING" : + _type_buf; + if (type == _type_buf) + xsprintf(_type_buf, "%hd", u->ut_type); + + union in_addr_union addr = {}; + memcpy(&addr, u->ut_addr_v6, MIN(sizeof(addr), sizeof(u->ut_addr_v6))); + _cleanup_free_ char *pretty = NULL; + bool is_ipv4 = memeqzero((const uint8_t*) &addr + 4, sizeof(addr) - 4); + (void) in_addr_to_string(is_ipv4 ? AF_INET : AF_INET6, + &addr, &pretty); + + log_info("%14s %10"PID_PRI" line=%-7.*s id=%-4.4s name=%-8.*s session=%lu host=%.*s addr=%s", + type, + u->ut_pid, + UT_LINESIZE, u->ut_line, + u->ut_id, + UT_NAMESIZE, u->ut_user, + (long unsigned) u->ut_session, + UT_HOSTSIZE, u->ut_host, + strempty(pretty)); + } +} + +DEFINE_TEST_MAIN(LOG_DEBUG);