main: client: factor out some common code for "--log-level" option

This commit is contained in:
Craig Barnes 2021-02-11 11:08:18 +00:00
parent 7698077331
commit 5437321f97
5 changed files with 61 additions and 58 deletions

View file

@ -17,6 +17,7 @@
#include "client-protocol.h" #include "client-protocol.h"
#include "debug.h" #include "debug.h"
#include "foot-features.h" #include "foot-features.h"
#include "macros.h"
#include "util.h" #include "util.h"
#include "version.h" #include "version.h"
#include "xmalloc.h" #include "xmalloc.h"
@ -156,38 +157,16 @@ main(int argc, char *const *argv)
break; break;
case 'd': { case 'd': {
static const char *log_level_map[] = { int lvl = log_level_from_string(optarg);
#if defined(_DEBUG) if (unlikely(lvl < 0)) {
[LOG_CLASS_DEBUG] = "debug",
#endif
[LOG_CLASS_INFO] = "info",
[LOG_CLASS_WARNING] = "warning",
[LOG_CLASS_ERROR] = "error",
};
bool valid_log_level = false;
for (size_t i = 0; i < ALEN(log_level_map); i++) {
if (strcmp(optarg, log_level_map[i]) == 0) {
log_level = i;
valid_log_level = true;
break;
}
}
if (!valid_log_level) {
fprintf( fprintf(
stderr, "-d,--log-level: %s: argument must be one of ", stderr,
optarg); "-d,--log-level: %s: argument must be one of %s\n",
optarg,
for (size_t i = 0; i < ALEN(log_level_map); i++) { log_level_string_hint());
fprintf(stderr, "'%s'%s",
log_level_map[i],
i < ALEN(log_level_map) - 1 ? " , " : "");
}
fprintf(stderr, "\n");
return EXIT_FAILURE; return EXIT_FAILURE;
} }
log_level = lvl;
break; break;
} }

40
log.c
View file

@ -10,11 +10,22 @@
#include <unistd.h> #include <unistd.h>
#include "debug.h" #include "debug.h"
#include "util.h"
#include "xsnprintf.h"
static bool colorize = false; static bool colorize = false;
static bool do_syslog = true; static bool do_syslog = true;
static enum log_class log_level = LOG_CLASS_INFO; static enum log_class log_level = LOG_CLASS_INFO;
static const char log_level_map[][8] = {
[LOG_CLASS_ERROR] = "error",
[LOG_CLASS_WARNING] = "warning",
[LOG_CLASS_INFO] = "info",
#if defined(_DEBUG)
[LOG_CLASS_DEBUG] = "debug",
#endif
};
void void
log_init(enum log_colorize _colorize, bool _do_syslog, log_init(enum log_colorize _colorize, bool _do_syslog,
enum log_facility syslog_facility, enum log_class _log_level) enum log_facility syslog_facility, enum log_class _log_level)
@ -149,3 +160,32 @@ void log_errno_provided(enum log_class log_class, const char *module,
va_end(ap1); va_end(ap1);
va_end(ap2); va_end(ap2);
} }
int
log_level_from_string(const char *str)
{
if (unlikely(str[0] == '\0'))
return -1;
for (int i = 0, n = ALEN(log_level_map); i < n; i++)
if (strcmp(str, log_level_map[i]) == 0)
return i;
return -1;
}
const char *
log_level_string_hint(void)
{
static char buf[64];
if (buf[0] != '\0')
return buf;
for (size_t i = 0, pos = 0, n = ALEN(log_level_map); i < n; i++) {
const char *entry = log_level_map[i];
const char *delim = (i + 1 < n) ? ", " : "";
pos += xsnprintf(buf + pos, sizeof(buf) - pos, "'%s'%s", entry, delim);
}
return buf;
}

3
log.h
View file

@ -23,6 +23,9 @@ void log_errno_provided(
const char *file, int lineno, int _errno, const char *file, int lineno, int _errno,
const char *fmt, ...) PRINTF(6); const char *fmt, ...) PRINTF(6);
int log_level_from_string(const char *str);
const char *log_level_string_hint(void);
#define LOG_ERR(...) \ #define LOG_ERR(...) \
log_msg(LOG_CLASS_ERROR, LOG_MODULE, __FILE__, __LINE__, __VA_ARGS__) log_msg(LOG_CLASS_ERROR, LOG_MODULE, __FILE__, __LINE__, __VA_ARGS__)
#define LOG_ERRNO(...) \ #define LOG_ERRNO(...) \

37
main.c
View file

@ -23,6 +23,7 @@
#include "config.h" #include "config.h"
#include "foot-features.h" #include "foot-features.h"
#include "fdm.h" #include "fdm.h"
#include "macros.h"
#include "reaper.h" #include "reaper.h"
#include "render.h" #include "render.h"
#include "server.h" #include "server.h"
@ -310,38 +311,16 @@ main(int argc, char *const *argv)
break; break;
case 'd': { case 'd': {
static const char *log_level_map[] = { int lvl = log_level_from_string(optarg);
#if defined(_DEBUG) if (unlikely(lvl < 0)) {
[LOG_CLASS_DEBUG] = "debug",
#endif
[LOG_CLASS_INFO] = "info",
[LOG_CLASS_WARNING] = "warning",
[LOG_CLASS_ERROR] = "error",
};
bool valid_log_level = false;
for (size_t i = 0; i < ALEN(log_level_map); i++) {
if (strcmp(optarg, log_level_map[i]) == 0) {
log_level = i;
valid_log_level = true;
break;
}
}
if (!valid_log_level) {
fprintf( fprintf(
stderr, "-d,--log-level: %s: argument must be one of ", stderr,
optarg); "-d,--log-level: %s: argument must be one of %s\n",
optarg,
for (size_t i = 0; i < ALEN(log_level_map); i++) { log_level_string_hint());
fprintf(stderr, "'%s'%s",
log_level_map[i],
i < ALEN(log_level_map) - 1 ? " , " : "");
}
fprintf(stderr, "\n");
return EXIT_FAILURE; return EXIT_FAILURE;
} }
log_level = lvl;
break; break;
} }

View file

@ -196,7 +196,9 @@ executable(
'foot-features.h', 'foot-features.h',
'log.c', 'log.h', 'log.c', 'log.h',
'macros.h', 'macros.h',
'util.h',
'xmalloc.c', 'xmalloc.h', 'xmalloc.c', 'xmalloc.h',
'xsnprintf.c', 'xsnprintf.h',
version, version,
install: true) install: true)