diff options
-rw-r--r-- | include/os.h | 6 | ||||
-rw-r--r-- | os/log.c | 32 |
2 files changed, 29 insertions, 9 deletions
diff --git a/include/os.h b/include/os.h index 2f43e4eda..3949ff5aa 100644 --- a/include/os.h +++ b/include/os.h @@ -327,6 +327,9 @@ _X_ATTRIBUTE_PRINTF(2, 3); extern _X_EXPORT void LogMessageVerbSigSafe(MessageType type, int verb, const char *format, ...) _X_ATTRIBUTE_PRINTF(3, 4); +extern _X_EXPORT void +LogVMessageVerbSigSafe(MessageType type, int verb, const char *format, va_list args) +_X_ATTRIBUTE_PRINTF(3, 0); extern _X_EXPORT void LogVHdrMessageVerb(MessageType type, int verb, @@ -376,9 +379,6 @@ xorg_backtrace(void); typedef _sigset_t sigset_t; #endif -/* should not be used anymore, just for backwards compat with drivers */ -#define LogVMessageVerbSigSafe(...) LogVMessageVerb(__VA_ARGS__) - /* only for backwards compat with drivers that haven't kept up yet (xf86-video-intel) @@ -680,17 +680,21 @@ static inline void writeLog(int verb, char *buf, int len) LogSWrite(verb, buf, len, (buf[len - 1] == '\n')); } -/* signal safe */ void LogVMessageVerb(MessageType type, int verb, const char *format, va_list args) { char buf[LOG_MSG_BUF_SIZE]; + if (inSignalContext) { + LogVMessageVerbSigSafe(type, verb, format, args); + return; + } + size_t len = prepMsgHdr(type, verb, buf); if (len == -1) return; - len += vpnprintf(&buf[len], sizeof(buf) - len, format, args); + len += Xvscnprintf(&buf[len], sizeof(buf) - len, format, args); writeLog(verb, buf, len); } @@ -723,25 +727,41 @@ LogMessageVerbSigSafe(MessageType type, int verb, const char *format, ...) { va_list ap; va_start(ap, format); - LogVMessageVerb(type, verb, format, ap); + LogVMessageVerbSigSafe(type, verb, format, ap); va_end(ap); } void +LogVMessageVerbSigSafe(MessageType type, int verb, const char *format, va_list args) +{ + char buf[LOG_MSG_BUF_SIZE]; + + int len = prepMsgHdr(type, verb, buf); + if (len == -1) + return; + + len += vpnprintf(&buf[len], sizeof(buf) - len, format, args); + + writeLog(verb, buf, len); +} + +void LogVHdrMessageVerb(MessageType type, int verb, const char *msg_format, va_list msg_args, const char *hdr_format, va_list hdr_args) { char buf[LOG_MSG_BUF_SIZE]; + int (*vprintf_func)(char *, int, const char* _X_RESTRICT_KYWD f, va_list args) + _X_ATTRIBUTE_PRINTF(3, 0) = (inSignalContext ? vpnprintf : Xvscnprintf); size_t len = prepMsgHdr(type, verb, buf); if (len == -1) return; if (hdr_format && sizeof(buf) - len > 1) - len += vpnprintf(&buf[len], sizeof(buf) - len, hdr_format, hdr_args); + len += vprintf_func(&buf[len], sizeof(buf) - len, hdr_format, hdr_args); if (msg_format && sizeof(buf) - len > 1) - len += vpnprintf(&buf[len], sizeof(buf) - len, msg_format, msg_args); + len += vprintf_func(&buf[len], sizeof(buf) - len, msg_format, msg_args); writeLog(verb, buf, len); } @@ -921,7 +941,7 @@ ErrorF(const char *f, ...) void VErrorFSigSafe(const char *f, va_list args) { - LogVMessageVerb(X_ERROR, -1, f, args); + LogVMessageVerbSigSafe(X_ERROR, -1, f, args); } void |