/* SPDX-License-Identifier: GPL-2.0-or-later */
/*
 * Copyright (C) 2016 Red Hat, Inc.
 */

#ifndef __NETWORKMANAGER_DHCP_CLIENT_LOGGING_H__
#define __NETWORKMANAGER_DHCP_CLIENT_LOGGING_H__

#include "nm-dhcp-client.h"

static inline NMLogDomain
_nm_dhcp_client_get_domain(NMDhcpClient *self)
{
    if (self) {
        switch (nm_dhcp_client_get_addr_family(self)) {
        case AF_INET:
            return LOGD_DHCP4;
        case AF_INET6:
            return LOGD_DHCP6;
        default:
            nm_assert_not_reached();
            break;
        }
    }
    return LOGD_DHCP;
}

#define _NMLOG_PREFIX_NAME "dhcp"
#define _NMLOG_DOMAIN      LOGD_DHCP
#define _NMLOG(level, ...)                                                               \
    G_STMT_START                                                                         \
    {                                                                                    \
        const NMLogLevel _level = (level);                                               \
                                                                                         \
        /* we check first for LOGD_DHCP instead of the correct domain.
         * In the worst case, we guess wrong and enter the block.
         *
         * Same for the _NMLOG_ENABLED() macro. Probably it would be more
         * expensive to determine the correct value then what we could
         * safe. */                   \
        if (nm_logging_enabled(_level, _NMLOG_DOMAIN)) {                                 \
            NMDhcpClient     *_self    = (NMDhcpClient *) (self);                        \
            const char       *__ifname = _self ? nm_dhcp_client_get_iface(_self) : NULL; \
            const char       *_type    = nm_dhcp_client_get_iface_type_for_log(_self);   \
            const NMLogDomain _domain  = _nm_dhcp_client_get_domain(_self);              \
                                                                                         \
            nm_log(_level,                                                               \
                   _domain,                                                              \
                   __ifname,                                                             \
                   NULL,                                                                 \
                   "%s%s%s%s%s%s%s%s%s: " _NM_UTILS_MACRO_FIRST(__VA_ARGS__),            \
                   _NMLOG_PREFIX_NAME,                                                   \
                   (_domain == LOGD_DHCP4 ? "4" : (_domain == LOGD_DHCP6 ? "6" : "")),   \
                   (__ifname || _type) ? " " : "",                                       \
                   NM_PRINT_FMT_QUOTED(__ifname, "(", __ifname, ")", ""),                \
                   NM_PRINT_FMT_QUOTED(_type, "[", _type, "]", "")                       \
                       _NM_UTILS_MACRO_REST(__VA_ARGS__));                               \
        }                                                                                \
    }                                                                                    \
    G_STMT_END

#define _NMLOG2(level, domain, ifname, ...)                                            \
    G_STMT_START                                                                       \
    {                                                                                  \
        const NMLogLevel  _level  = (level);                                           \
        const NMLogDomain _domain = (domain);                                          \
                                                                                       \
        /* we check first for LOGD_DHCP instead of the correct domain.
         * In the worst case, we guess wrong and enter the block.
         *
         * Same for the _NMLOG_ENABLED() macro. Probably it would be more
         * expensive to determine the correct value then what we could
         * safe. */                 \
        if (nm_logging_enabled(_level, _domain)) {                                     \
            const char *__ifname = (ifname);                                           \
                                                                                       \
            nm_log(_level,                                                             \
                   _domain,                                                            \
                   __ifname,                                                           \
                   NULL,                                                               \
                   "%s%s%s%s%s: " _NM_UTILS_MACRO_FIRST(__VA_ARGS__),                  \
                   _NMLOG_PREFIX_NAME,                                                 \
                   (_domain == LOGD_DHCP4 ? "4" : (_domain == LOGD_DHCP6 ? "6" : "")), \
                   NM_PRINT_FMT_QUOTED(__ifname, " (", __ifname, ")", "")              \
                       _NM_UTILS_MACRO_REST(__VA_ARGS__));                             \
        }                                                                              \
    }                                                                                  \
    G_STMT_END

#endif /* __NETWORKMANAGER_DHCP_CLIENT_LOGGING_H__ */
