diff --git a/shared/n-dhcp4/src/n-dhcp4-client.c b/shared/n-dhcp4/src/n-dhcp4-client.c index 5f7794fb14..5449106a9b 100644 --- a/shared/n-dhcp4/src/n-dhcp4-client.c +++ b/shared/n-dhcp4/src/n-dhcp4-client.c @@ -94,6 +94,9 @@ int n_dhcp4_client_config_dup(NDhcp4ClientConfig *config, NDhcp4ClientConfig **d dup->n_mac = config->n_mac; memcpy(dup->broadcast_mac, config->broadcast_mac, sizeof(dup->broadcast_mac)); dup->n_broadcast_mac = config->n_broadcast_mac; + dup->log.level = config->log.level; + dup->log.func = config->log.func; + dup->log.data = config->log.data; r = n_dhcp4_client_config_set_client_id(dup, config->client_id, @@ -248,6 +251,15 @@ _c_public_ int n_dhcp4_client_config_set_client_id(NDhcp4ClientConfig *config, c return 0; } +_c_public_ void n_dhcp4_client_config_set_log_level(NDhcp4ClientConfig *config, int level) { + config->log.level = level; +} + +_c_public_ void n_dhcp4_client_config_set_log_func(NDhcp4ClientConfig *config, NDhcp4LogFunc func, void *data) { + config->log.func = func; + config->log.data = data; +} + /** * n_dhcp4_c_event_node_new() - allocate new event * @nodep: output argument for new event diff --git a/shared/n-dhcp4/src/n-dhcp4-private.h b/shared/n-dhcp4/src/n-dhcp4-private.h index c38ddbfc80..a42a12e4eb 100644 --- a/shared/n-dhcp4/src/n-dhcp4-private.h +++ b/shared/n-dhcp4/src/n-dhcp4-private.h @@ -239,6 +239,11 @@ struct NDhcp4ClientConfig { size_t n_broadcast_mac; uint8_t *client_id; size_t n_client_id; + struct { + int level; + NDhcp4LogFunc func; + void *data; + } log; }; #define N_DHCP4_CLIENT_CONFIG_NULL(_x) { \ @@ -686,3 +691,19 @@ static inline uint64_t n_dhcp4_gettime(clockid_t clock) { return ts.tv_sec * 1000ULL * 1000ULL * 1000ULL + ts.tv_nsec; } + +#define n_dhcp4_c_log(_config, _level, ...) \ + do { \ + const NDhcp4ClientConfig *__config = _config; \ + \ + if (_level <= __config->log.level && __config->log.func) { \ + if (1) { \ + _config->log.func(_level, \ + __config->log.data, \ + __VA_ARGS__); \ + } else { \ + /* To have the compiler check arguments */ \ + printf(__VA_ARGS__); \ + } \ + } \ + } while (0) diff --git a/shared/n-dhcp4/src/n-dhcp4.h b/shared/n-dhcp4/src/n-dhcp4.h index a800352b50..d374766263 100644 --- a/shared/n-dhcp4/src/n-dhcp4.h +++ b/shared/n-dhcp4/src/n-dhcp4.h @@ -29,6 +29,8 @@ typedef struct NDhcp4ServerEvent NDhcp4ServerEvent; typedef struct NDhcp4ServerIp NDhcp4ServerIp; typedef struct NDhcp4ServerLease NDhcp4ServerLease; +typedef void (*NDhcp4LogFunc)(int level, void *data, const char *fmt, ...); + #define N_DHCP4_CLIENT_START_DELAY_RFC2131 (UINT64_C(9000)) enum { @@ -111,6 +113,8 @@ void n_dhcp4_client_config_set_request_broadcast(NDhcp4ClientConfig *config, boo void n_dhcp4_client_config_set_mac(NDhcp4ClientConfig *config, const uint8_t *mac, size_t n_mac); void n_dhcp4_client_config_set_broadcast_mac(NDhcp4ClientConfig *config, const uint8_t *mac, size_t n_mac); int n_dhcp4_client_config_set_client_id(NDhcp4ClientConfig *config, const uint8_t *id, size_t n_id); +void n_dhcp4_client_config_set_log_level(NDhcp4ClientConfig *config, int level); +void n_dhcp4_client_config_set_log_func(NDhcp4ClientConfig *config, NDhcp4LogFunc func, void *data); /* client-probe configs */