Merge pull request #575 from jnovy/574

Fix errno race condition and logging macro issues
This commit is contained in:
Jindrich Novy 2025-08-18 18:57:46 +02:00 committed by GitHub
commit b91d4ee0f7
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 48 additions and 20 deletions

View File

@ -6,6 +6,7 @@
#include <syslog.h>
#include <stdbool.h>
#include <unistd.h>
#include <errno.h>
#include <glib.h>
#include <glib-unix.h>
#include <sys/uio.h>
@ -35,41 +36,58 @@ extern log_level_t log_level;
extern char *log_cid;
extern gboolean use_syslog;
#define _pexit(s) \
do { \
int saved_errno = errno; \
errno = saved_errno; \
fprintf(stderr, "[conmon:e]: %s %m\n", s); \
if (use_syslog) \
if (use_syslog) { \
errno = saved_errno; \
syslog(LOG_ERR, "conmon %.20s <error>: %s %m\n", log_cid, s); \
} \
_exit(EXIT_FAILURE); \
} while (0)
#define _pexitf(fmt, ...) \
do { \
int saved_errno = errno; \
errno = saved_errno; \
fprintf(stderr, "[conmon:e]: " fmt " %m\n", ##__VA_ARGS__); \
if (use_syslog) \
if (use_syslog) { \
errno = saved_errno; \
syslog(LOG_ERR, "conmon %.20s <error>: " fmt ": %m\n", log_cid, ##__VA_ARGS__); \
} \
_exit(EXIT_FAILURE); \
} while (0)
#define pexit(s) \
do { \
int saved_errno = errno; \
errno = saved_errno; \
fprintf(stderr, "[conmon:e]: %s %m\n", s); \
if (use_syslog) \
if (use_syslog) { \
errno = saved_errno; \
syslog(LOG_ERR, "conmon %.20s <error>: %s %m\n", log_cid, s); \
} \
exit(EXIT_FAILURE); \
} while (0)
#define pexitf(fmt, ...) \
do { \
int saved_errno = errno; \
errno = saved_errno; \
fprintf(stderr, "[conmon:e]: " fmt " %m\n", ##__VA_ARGS__); \
if (use_syslog) \
if (use_syslog) { \
errno = saved_errno; \
syslog(LOG_ERR, "conmon %.20s <error>: " fmt ": %m\n", log_cid, ##__VA_ARGS__); \
} \
exit(EXIT_FAILURE); \
} while (0)
#define nexit(s) \
do { \
fprintf(stderr, "[conmon:e] %s\n", s); \
fprintf(stderr, "[conmon:e]: %s\n", s); \
if (use_syslog) \
syslog(LOG_ERR, "conmon %.20s <error>: %s\n", log_cid, s); \
exit(EXIT_FAILURE); \
@ -79,25 +97,35 @@ extern gboolean use_syslog;
do { \
fprintf(stderr, "[conmon:e]: " fmt "\n", ##__VA_ARGS__); \
if (use_syslog) \
syslog(LOG_ERR, "conmon %.20s <error>: " fmt " \n", log_cid, ##__VA_ARGS__); \
syslog(LOG_ERR, "conmon %.20s <error>: " fmt "\n", log_cid, ##__VA_ARGS__); \
exit(EXIT_FAILURE); \
} while (0)
#define pwarn(s) \
do { \
fprintf(stderr, "[conmon:w]: %s %s\n", s, strerror(errno)); \
if (use_syslog) \
syslog(LOG_INFO, "conmon %.20s <pwarn>: %s %s\n", log_cid, s, strerror(errno)); \
if (log_level >= WARN_LEVEL) { \
int saved_errno = errno; \
errno = saved_errno; \
fprintf(stderr, "[conmon:w]: %s %m\n", s); \
if (use_syslog) { \
errno = saved_errno; \
syslog(LOG_INFO, "conmon %.20s <pwarn>: %s %m\n", log_cid, s); \
} \
} \
} while (0)
#define pwarnf(fmt, ...) \
if (log_level >= WARN_LEVEL) { \
do { \
fprintf(stderr, "[conmon:w]: " fmt " %s\n", ##__VA_ARGS__, strerror(errno)); \
if (use_syslog) \
syslog(LOG_INFO, "conmon %.20s <nwarn>: " fmt ": %s\n", log_cid, ##__VA_ARGS__, strerror(errno)); \
} while (0); \
}
do { \
if (log_level >= WARN_LEVEL) { \
int saved_errno = errno; \
errno = saved_errno; \
fprintf(stderr, "[conmon:w]: " fmt " %m\n", ##__VA_ARGS__); \
if (use_syslog) { \
errno = saved_errno; \
syslog(LOG_INFO, "conmon %.20s <pwarnf>: " fmt ": %m\n", log_cid, ##__VA_ARGS__); \
} \
} \
} while (0)
#define nwarn(s) \
if (log_level >= WARN_LEVEL) { \
@ -113,7 +141,7 @@ extern gboolean use_syslog;
do { \
fprintf(stderr, "[conmon:w]: " fmt "\n", ##__VA_ARGS__); \
if (use_syslog) \
syslog(LOG_INFO, "conmon %.20s <nwarn>: " fmt " \n", log_cid, ##__VA_ARGS__); \
syslog(LOG_INFO, "conmon %.20s <nwarn>: " fmt "\n", log_cid, ##__VA_ARGS__); \
} while (0); \
}
@ -131,7 +159,7 @@ extern gboolean use_syslog;
do { \
fprintf(stderr, "[conmon:i]: " fmt "\n", ##__VA_ARGS__); \
if (use_syslog) \
syslog(LOG_INFO, "conmon %.20s <ninfo>: " fmt " \n", log_cid, ##__VA_ARGS__); \
syslog(LOG_INFO, "conmon %.20s <ninfo>: " fmt "\n", log_cid, ##__VA_ARGS__); \
} while (0); \
}
@ -149,7 +177,7 @@ extern gboolean use_syslog;
do { \
fprintf(stderr, "[conmon:d]: " fmt "\n", ##__VA_ARGS__); \
if (use_syslog) \
syslog(LOG_INFO, "conmon %.20s <ndebug>: " fmt " \n", log_cid, ##__VA_ARGS__); \
syslog(LOG_INFO, "conmon %.20s <ndebug>: " fmt "\n", log_cid, ##__VA_ARGS__); \
} while (0); \
}
@ -167,7 +195,7 @@ extern gboolean use_syslog;
do { \
fprintf(stderr, "[conmon:d]: " fmt "\n", ##__VA_ARGS__); \
if (use_syslog) \
syslog(LOG_INFO, "conmon %.20s <ntrace>: " fmt " \n", log_cid, ##__VA_ARGS__); \
syslog(LOG_INFO, "conmon %.20s <ntrace>: " fmt "\n", log_cid, ##__VA_ARGS__); \
} while (0); \
}