 088d880247
			
		
	
	088d880247
	
	
	
		
			
			Syslog does not usually exist on Windows, so implement our own using Window's ReportEvent mechanism. Strings containing "%1" gets expanded into them selves by ReportEvent, resulting in an unreadable string. "%2" and above is not a problem. Unfortunately, on Windows an IPv6 address can contain "%1", so expand "%1" to "% 1" before reporting. "%%1" is also a problem for ReportEvent, but that string cannot occur in an IPv6 address. Signed-off-by: Mike Pape <dotzenlabs@gmail.com> Signed-off-by: Erik Faye-Lund <kusmabite@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
		
			
				
	
	
		
			73 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			73 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #include "../../git-compat-util.h"
 | |
| #include "../../strbuf.h"
 | |
| 
 | |
| 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, ...)
 | |
| {
 | |
| 	struct strbuf sb = STRBUF_INIT;
 | |
| 	struct strbuf_expand_dict_entry dict[] = {
 | |
| 		{"1", "% 1"},
 | |
| 		{NULL, NULL}
 | |
| 	};
 | |
| 	WORD logtype;
 | |
| 	char *str;
 | |
| 	int str_len;
 | |
| 	va_list ap;
 | |
| 
 | |
| 	if (!ms_eventlog)
 | |
| 		return;
 | |
| 
 | |
| 	va_start(ap, fmt);
 | |
| 	str_len = vsnprintf(NULL, 0, fmt, ap);
 | |
| 	va_end(ap);
 | |
| 
 | |
| 	if (str_len < 0) {
 | |
| 		warning("vsnprintf failed: '%s'", strerror(errno));
 | |
| 		return;
 | |
| 	}
 | |
| 
 | |
| 	str = malloc(str_len + 1);
 | |
| 	va_start(ap, fmt);
 | |
| 	vsnprintf(str, str_len + 1, fmt, ap);
 | |
| 	va_end(ap);
 | |
| 	strbuf_expand(&sb, str, strbuf_expand_dict_cb, &dict);
 | |
| 	free(str);
 | |
| 
 | |
| 	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;
 | |
| 	}
 | |
| 
 | |
| 	ReportEventA(ms_eventlog, logtype, 0, 0, NULL, 1, 0,
 | |
| 	    (const char **)&sb.buf, NULL);
 | |
| 
 | |
| 	strbuf_release(&sb);
 | |
| }
 |