[PATCH v3 02/14] mingw: implement syslog
From: Erik Faye-Lund <hidden>
Date: 2016-06-15 22:49:45
Subsystem:
the rest · Maintainer:
Linus Torvalds
From: Mike Pape <redacted> Syslog does not usually exist on Windows, so we implement our own using Window's ReportEvent mechanism. Signed-off-by: Mike Pape <redacted> Signed-off-by: Erik Faye-Lund <redacted> --- compat/mingw.c | 60 +++++++++++++++++++++++++++++++++++++++++++++++++++++ compat/mingw.h | 15 +++++++++++++ daemon.c | 2 - git-compat-util.h | 1 + 4 files changed, 76 insertions(+), 2 deletions(-)
diff --git a/compat/mingw.c b/compat/mingw.c
index 563ef1f..cc5eb2c 100644
--- a/compat/mingw.c
+++ b/compat/mingw.c@@ -1431,6 +1431,66 @@ int sigaction(int sig, struct sigaction *in, struct sigaction *out) return 0; } +static HANDLE ms_eventlog; + +void openlog(const char *ident, int logopt, int facility) +{ + if (ms_eventlog) + return; + + ms_eventlog = RegisterEventSourceA(NULL, ident); + + if (!ms_eventlog) + warning("RegisterEventSource() failed: %lu", GetLastError()); +} + +void syslog(int priority, const char *fmt, const char *arg) +{ + WORD logtype; + + if (!ms_eventlog) + return; + + if (strcmp(fmt, "%s")) { + warning("format string of syslog() not implemented"); + return; + } + + switch (priority) { + case LOG_EMERG: + case LOG_ALERT: + case LOG_CRIT: + case LOG_ERR: + logtype = EVENTLOG_ERROR_TYPE; + break; + + case LOG_WARNING: + logtype = EVENTLOG_WARNING_TYPE; + break; + + case LOG_NOTICE: + case LOG_INFO: + case LOG_DEBUG: + default: + logtype = EVENTLOG_INFORMATION_TYPE; + break; + } + + /* + * ReportEvent() doesn't handle strings containing %n, where n is + * an integer. Such events must be reformatted by the caller. + */ + ReportEventA(ms_eventlog, + logtype, + 0, + 0, + NULL, + 1, + 0, + (const char **)&arg, + NULL); +} + #undef signal sig_handler_t mingw_signal(int sig, sig_handler_t handler) {
diff --git a/compat/mingw.h b/compat/mingw.h
index a5bde82..bbfcc0c 100644
--- a/compat/mingw.h
+++ b/compat/mingw.h@@ -51,6 +51,19 @@ typedef int socklen_t; #define EAFNOSUPPORT WSAEAFNOSUPPORT #define ECONNABORTED WSAECONNABORTED +#define LOG_PID 0x01 + +#define LOG_EMERG 0 +#define LOG_ALERT 1 +#define LOG_CRIT 2 +#define LOG_ERR 3 +#define LOG_WARNING 4 +#define LOG_NOTICE 5 +#define LOG_INFO 6 +#define LOG_DEBUG 7 + +#define LOG_DAEMON (3<<3) + struct passwd { char *pw_name; char *pw_gecos;
@@ -185,6 +198,8 @@ struct passwd *getpwuid(uid_t uid); int setitimer(int type, struct itimerval *in, struct itimerval *out); int sigaction(int sig, struct sigaction *in, struct sigaction *out); int link(const char *oldpath, const char *newpath); +void openlog(const char *ident, int logopt, int facility); +void syslog(int priority, const char *fmt, const char *arg); /* * replacements of existing functions
diff --git a/daemon.c b/daemon.c
index d6e20c6..d594375 100644
--- a/daemon.c
+++ b/daemon.c@@ -5,8 +5,6 @@ #include "strbuf.h" #include "string-list.h" -#include <syslog.h> - #ifndef HOST_NAME_MAX #define HOST_NAME_MAX 256 #endif
diff --git a/git-compat-util.h b/git-compat-util.h
index 2af8d3e..8770854 100644
--- a/git-compat-util.h
+++ b/git-compat-util.h@@ -119,6 +119,7 @@ #include <netdb.h> #include <pwd.h> #include <inttypes.h> +#include <syslog.h> #if defined(__CYGWIN__) #undef _XOPEN_SOURCE #include <grp.h>
--
1.7.3.1.51.ge462f.dirty