diff --git a/hw/xnest/Init.c b/hw/xnest/Init.c index ccd663903..4cb0a6f55 100644 --- a/hw/xnest/Init.c +++ b/hw/xnest/Init.c @@ -23,6 +23,7 @@ is" without express or implied warranty. #include "dix/screenint_priv.h" #include "miext/extinit_priv.h" #include "os/ddx_priv.h" +#include "os/log_priv.h" #include "os/osdep.h" #include "screenint.h" diff --git a/os/log.c b/os/log.c index c16302b86..8fca48ed6 100644 --- a/os/log.c +++ b/os/log.c @@ -88,6 +88,10 @@ OR PERFORMANCE OF THIS SOFTWARE. #include #include +#ifdef CONFIG_SYSLOG +#include +#endif + #include "dix/dix_priv.h" #include "dix/input_priv.h" #include "os/audit.h" @@ -111,11 +115,16 @@ void (*OsVendorVErrorFProc) (const char *, va_list args) = NULL; /* Default logging parameters. */ #define DEFAULT_LOG_VERBOSITY 0 #define DEFAULT_LOG_FILE_VERBOSITY 3 +#define DEFAULT_SYSLOG_VERBOSITY 0 static int logFileFd = -1; Bool xorgLogSync = FALSE; int xorgLogVerbosity = DEFAULT_LOG_VERBOSITY; int xorgLogFileVerbosity = DEFAULT_LOG_FILE_VERBOSITY; +#ifdef CONFIG_SYSLOG +int xorgSyslogVerbosity = DEFAULT_SYSLOG_VERBOSITY; +const char *xorgSyslogIdent = "X"; +#endif /* Buffer to information logged before the log file is opened. */ static char *saveBuffer = NULL; @@ -207,6 +216,18 @@ static inline void doLogSync(void) { #endif } +static void initSyslog(void) { +#ifdef CONFIG_SYSLOG + char buffer[4096]; + strcpy(buffer, xorgSyslogIdent); + + snprintf(buffer, sizeof(buffer), "%s :%s", xorgSyslogIdent, (display ? display : "<>")); + + /* initialize syslog */ + openlog(buffer, LOG_PID, LOG_LOCAL1); +#endif +} + /* * LogInit is called to start logging to a file. It is also called (with * NULL arguments) when logging to a file is not wanted. It must always be @@ -264,6 +285,7 @@ LogInit(const char *fname, const char *backup) } needBuffer = FALSE; + initSyslog(); return logFileName; } @@ -295,6 +317,7 @@ LogSetDisplay(void) free(saved_log_fname); free(saved_log_backup); } + initSyslog(); } void @@ -541,6 +564,19 @@ pnprintf(char *string, int size, const char *f, ...) return rc; } +static void +LogSyslogWrite(int verb, const char *buf, size_t len, Bool end_line) { +#ifdef CONFIG_SYSLOG + if (inSignalContext) // syslog() ins't signal-safe yet :( + return; // shall we try syslog(2) syscall instead ? + + if (verb >= 0 && xorgSyslogVerbosity < verb) + return; + + syslog(LOG_PID, "%.*s", (int)len, buf); +#endif +} + /* This function does the actual log message writes. It must be signal safe. * When attempting to call non-signal-safe functions, guard them with a check * of the inSignalContext global variable. */ @@ -550,6 +586,8 @@ LogSWrite(int verb, const char *buf, size_t len, Bool end_line) static Bool newline = TRUE; int ret; + LogSyslogWrite(verb, buf, len, end_line); + if (verb < 0 || xorgLogVerbosity >= verb) ret = write(2, buf, len); diff --git a/os/log_priv.h b/os/log_priv.h index 660b121ef..b86555a77 100644 --- a/os/log_priv.h +++ b/os/log_priv.h @@ -72,4 +72,21 @@ extern int xorgLogFileVerbosity; */ extern Bool xorgLogSync; +/** + * @brief syslog verbosity + * + * The verbosity level of logging to syslog. All messages with + * verbosity level below this one will be sent to local syslog daemon. + */ +extern int xorgSyslogVerbosity; + +/** + * @brief syslog identifier + * + * The identifier prefix used for syslog logging. + * Per default will be filled with basename(argv[0]). DDX'es can override + * this before calling LogInit() + */ +extern const char *xorgSyslogIdent; + #endif /* __XORG_OS_LOGGING_H */ diff --git a/os/meson.build b/os/meson.build index 8b1255349..8d5268f4d 100644 --- a/os/meson.build +++ b/os/meson.build @@ -23,6 +23,8 @@ srcs_os = [ 'log.c', ] +conf_data.set('CONFIG_SYSLOG', cc.has_header('syslog.h') ? '1' : false) + # Wrapper code for missing C library functions. Note that conf_data contains either '1' or false. srcs_libc = [] if conf_data.get('HAVE_REALLOCARRAY').to_int() == 0 diff --git a/os/utils.c b/os/utils.c index 52c30f56f..4a0a271a2 100644 --- a/os/utils.c +++ b/os/utils.c @@ -67,6 +67,8 @@ OR PERFORMANCE OF THIS SOFTWARE. #define TRANS_REOPEN #include +#include + #include "input.h" #include "dixfont.h" #include @@ -428,6 +430,12 @@ ProcessCommandLine(int argc, char *argv[]) } SeatId = getenv("XDG_SEAT"); +#ifdef CONFIG_SYSLOG + xorgSyslogIdent = getenv("SYSLOG_IDENT"); + if (!xorgSyslogIdent) + xorgSyslogIdent = strdup(basename(argv[0])); +#endif + for (i = 1; i < argc; i++) { /* call ddx first, so it can peek/override if it wants */ if ((skip = ddxProcessArgument(argc, argv, i))) { @@ -797,6 +805,9 @@ ProcessCommandLine(int argc, char *argv[]) else UseMsg(); } +#ifdef CONFIG_SYSLOG + else if (ProcessCmdLineMultiInt(argc, argv, &i, "-syslogverbose", &xorgSyslogVerbosity)); +#endif else { ErrorF("Unrecognized option: %s\n", argv[i]); UseMsg();