LOG: add a way of getting the target state

This is so we can do the following:

for (t = 0; t < QB_LOG_TARGET_MAX; t++) {
    if (qb_log_ctl(t, QB_LOG_CONF_STATE_GET, 0) == QB_LOG_STATE_ENABLED) {
        // bla bla
    }
}

Signed-off-by: Angus Salkeld <asalkeld@redhat.com>
This commit is contained in:
Angus Salkeld 2011-09-08 16:40:02 +10:00
parent be8248bd50
commit f5fcf2a30b
4 changed files with 42 additions and 19 deletions

View File

@ -349,6 +349,14 @@ void qb_log_from_external_source_va(const char *function,
#define QB_LOG_STDERR 1
#define QB_LOG_BLACKBOX 2
#define QB_LOG_TARGET_MAX 32
enum qb_log_target_state {
QB_LOG_STATE_UNUSED = 1,
QB_LOG_STATE_DISABLED = 2,
QB_LOG_STATE_ENABLED = 3,
};
enum qb_log_conf {
QB_LOG_CONF_ENABLED,
QB_LOG_CONF_FACILITY,
@ -356,6 +364,7 @@ enum qb_log_conf {
QB_LOG_CONF_SIZE,
QB_LOG_CONF_THREADED,
QB_LOG_CONF_PRIORITY_BUMP,
QB_LOG_CONF_STATE_GET,
};
enum qb_log_filter_type {
@ -426,14 +435,16 @@ void qb_log_callsites_dump(void);
/**
* Main logging control function.
*
* @param t QB_LOG_SYSLOG, QB_LOG_STDERR or result from qb_log_file_open()
* @param c what to configure
* @param target QB_LOG_SYSLOG, QB_LOG_STDERR or result from qb_log_file_open()
* @param conf_type what to configure
* @param arg the new value
* @see qb_log_conf
*
* @retval -errno on error
* @retval 0 on success
* @retval qb_log_target_state for QB_LOG_CONF_STATE_GET
*/
int32_t qb_log_ctl(int32_t t, enum qb_log_conf c, int32_t arg);
int32_t qb_log_ctl(int32_t target, enum qb_log_conf conf_type, int32_t arg);
/**
* This allows you modify the 'tags' and 'targets' callsite fields at runtime.

View File

@ -34,7 +34,7 @@
#include "log_int.h"
#include "util_int.h"
static struct qb_log_target conf[32];
static struct qb_log_target conf[QB_LOG_TARGET_MAX];
static uint32_t conf_used_max = 0;
static uint32_t conf_active_max = 0;
static int32_t in_logger = QB_FALSE;
@ -526,7 +526,8 @@ qb_log_filter_ctl(int32_t t, enum qb_log_filter_conf c,
if (!logger_inited) {
return -EINVAL;
}
if (t < 0 || t >= 32 || conf[t].state == QB_LOG_STATE_UNUSED) {
if (t < 0 || t >= QB_LOG_TARGET_MAX ||
conf[t].state == QB_LOG_STATE_UNUSED) {
return -EBADF;
}
if (text == NULL ||
@ -590,7 +591,7 @@ done:
#endif /* QB_HAVE_ATTRIBUTE_SECTION */
static void
_log_target_state_set(struct qb_log_target *t, enum qb_log_state s)
_log_target_state_set(struct qb_log_target *t, enum qb_log_target_state s)
{
int32_t i;
int32_t a_set = QB_FALSE;
@ -618,7 +619,7 @@ qb_log_init(const char *name, int32_t facility, uint8_t priority)
i = pthread_rwlock_init(&_listlock, NULL);
assert(i == 0);
for (i = 0; i < 32; i++) {
for (i = 0; i < QB_LOG_TARGET_MAX; i++) {
conf[i].pos = i;
conf[i].debug = QB_FALSE;
conf[i].state = QB_LOG_STATE_UNUSED;
@ -697,7 +698,7 @@ struct qb_log_target *
qb_log_target_alloc(void)
{
int32_t i;
for (i = 0; i < 32; i++) {
for (i = 0; i < QB_LOG_TARGET_MAX; i++) {
if (conf[i].state == QB_LOG_STATE_UNUSED) {
_log_target_state_set(&conf[i], QB_LOG_STATE_DISABLED);
return &conf[i];
@ -730,7 +731,8 @@ qb_log_target_user_data_get(int32_t t)
errno = -EINVAL;
return NULL;
}
if (t < 0 || t >= 32 || conf[t].state == QB_LOG_STATE_UNUSED) {
if (t < 0 || t >= QB_LOG_TARGET_MAX ||
conf[t].state == QB_LOG_STATE_UNUSED) {
errno = -EBADF;
return NULL;
}
@ -744,7 +746,8 @@ qb_log_target_user_data_set(int32_t t, void *user_data)
if (!logger_inited) {
return -EINVAL;
}
if (t < 0 || t >= 32 || conf[t].state == QB_LOG_STATE_UNUSED) {
if (t < 0 || t >= QB_LOG_TARGET_MAX ||
conf[t].state == QB_LOG_STATE_UNUSED) {
return -EBADF;
}
@ -783,7 +786,8 @@ qb_log_custom_close(int32_t t)
if (!logger_inited) {
return;
}
if (t < 0 || t >= 32 || conf[t].state == QB_LOG_STATE_UNUSED) {
if (t < 0 || t >= QB_LOG_TARGET_MAX ||
conf[t].state == QB_LOG_STATE_UNUSED) {
return;
}
@ -839,7 +843,8 @@ qb_log_ctl(int32_t t, enum qb_log_conf c, int32_t arg)
if (!logger_inited) {
return -EINVAL;
}
if (t < 0 || t >= 32 || conf[t].state == QB_LOG_STATE_UNUSED) {
if (t < 0 || t >= QB_LOG_TARGET_MAX ||
conf[t].state == QB_LOG_STATE_UNUSED) {
return -EBADF;
}
switch (c) {
@ -850,6 +855,9 @@ qb_log_ctl(int32_t t, enum qb_log_conf c, int32_t arg)
_log_target_disable(&conf[t]);
}
break;
case QB_LOG_CONF_STATE_GET:
rc = conf[t].state;
break;
case QB_LOG_CONF_FACILITY:
conf[t].facility = arg;
if (t == QB_LOG_SYSLOG) {

View File

@ -25,17 +25,11 @@
#include <qb/qblog.h>
#include <qb/qbrb.h>
enum qb_log_state {
QB_LOG_STATE_UNUSED,
QB_LOG_STATE_DISABLED,
QB_LOG_STATE_ENABLED,
};
struct qb_log_target;
struct qb_log_target {
uint32_t pos;
enum qb_log_state state;
enum qb_log_target_state state;
char name[PATH_MAX];
struct qb_list_head filter_head;
int32_t facility;

View File

@ -311,9 +311,19 @@ END_TEST
START_TEST(test_log_enable)
{
int32_t t;
int32_t state;
qb_log_init("test", LOG_USER, LOG_DEBUG);
state = qb_log_ctl(QB_LOG_SYSLOG, QB_LOG_CONF_STATE_GET, 0);
ck_assert_int_eq(state, QB_LOG_STATE_ENABLED);
state = qb_log_ctl(QB_LOG_STDERR, QB_LOG_CONF_STATE_GET, 0);
ck_assert_int_eq(state, QB_LOG_STATE_DISABLED);
state = qb_log_ctl(QB_LOG_BLACKBOX, QB_LOG_CONF_STATE_GET, 0);
ck_assert_int_eq(state, QB_LOG_STATE_DISABLED);
qb_log_ctl(QB_LOG_SYSLOG, QB_LOG_CONF_ENABLED, QB_FALSE);
state = qb_log_ctl(QB_LOG_SYSLOG, QB_LOG_CONF_STATE_GET, 0);
ck_assert_int_eq(state, QB_LOG_STATE_DISABLED);
t = qb_log_custom_open(_test_logger, NULL, NULL, NULL);
qb_log_ctl(t, QB_LOG_CONF_ENABLED, QB_TRUE);