Thread (43 messages) flat view 43 messages, 5 authors, 2016-06-15

Re: [msysGit] [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

On Sun, Oct 10, 2010 at 11:28 PM, Eric Sunshine [off-list ref] wrote:
On 10/10/2010 4:37 PM, Erik Faye-Lund wrote:
quoted
On Sun, Oct 10, 2010 at 9:50 PM, Eric Sunshine[off-list ref]
 wrote:
quoted
On 10/10/2010 9:20 AM, Erik Faye-Lund wrote:
quoted
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>
---
+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;
+       }
It is not exactly clear what the intention is here. Is this trying to say
that no formatting directives are allowed in 'fmt' or what? The simple
case
it is actually checking (where 'fmt' is solely '%s') could easily be
handled
manually, as could more complex formats.
This is the result of the feed-back in v1, where we tried to implement
all format strings.
In retrospect, when thinking more carefully about the conditional
expression, I suppose the code is self-documenting, though perhaps a comment
in code or in commit message would help.
quoted
But that turned out to be very complex (due to the
lack of a portable va_copy()) and since we control all call-sites for
syslog and already only use "%s" as the format, it should be OK.
Do you mean vsnprintf() rather than va_copy()?
OK, I had to read some old discussions to figure out what the issue was :)

The problem was lack of portable va_copy, because I tried to add a
non-variadic version of strbuf_addf(), namely strbuf_vaddf() to do the
work.

I guess it could be implemented pretty easily with vsnprintf(),
though. I was afraid of doing that originally because I know there's
portability issues with the return value of snprintf. Luckily it seems
that we have a fix for that in compat/sprintf.c, and we rely on the
return value being correct in strbuf_addf() so it would probably be
safe.

Something like this (on top)

---8<---
diff --git a/compat/mingw.c b/compat/mingw.c
index bbe45d0..e3f3f92 100644
--- a/compat/mingw.c
+++ b/compat/mingw.c
@@ -1435,17 +1435,24 @@ void openlog(const char *ident, int logopt,
int facility)
 		warning("RegisterEventSource() failed: %lu", GetLastError());
 }

-void syslog(int priority, const char *fmt, const char *arg)
+void syslog(int priority, const char *fmt, ...)
 {
 	WORD logtype;
+	char *str;
+	int str_len;
+	va_list ap;

 	if (!ms_eventlog)
 		return;

-	if (strcmp(fmt, "%s")) {
-		warning("format string of syslog() not implemented");
-		return;
-	}
+	va_start(ap, fmt);
+	str_len = vsnprintf(NULL, 0, fmt, ap);
+	va_end(ap);
+
+	str = malloc(str_len + 1);
+	va_start(ap, fmt);
+	vsnprintf(str, str_len, fmt, ap);
+	va_end(ap);

 	switch (priority) {
 	case LOG_EMERG:
@@ -1478,8 +1485,9 @@ void syslog(int priority, const char *fmt, const
char *arg)
 	    NULL,
 	    1,
 	    0,
-	    (const char **)&arg,
+	    (const char **)&str,
 	    NULL);
+	free(str);
 }

 #undef signal
diff --git a/compat/mingw.h b/compat/mingw.h
index aed49d8..45a63a0 100644
--- a/compat/mingw.h
+++ b/compat/mingw.h
@@ -186,7 +186,7 @@ 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);
+void syslog(int priority, const char *fmt, ...);

 /*
  * replacements of existing functions
---8<---
quoted
Are you suggesting that we report an error when we can't report the
string correctly? We could do that, but I'm not sure how the end-user
would benefit from that. ReportEvent is used to report errors (unless
the --verbose flag has been specified), and reporting that we can't
present an error message strike me as a bit confusing... Even the
corrupted error message is probably better :P
I am not suggesting reporting an error. As a first-time reader of the code,
I was trying to understand the presence of the comment which did not really
seem to relate to the code. Perhaps adding a "FIXME" to the comment saying
that the condition should perhaps be handled in the future would help to
explain the comments presence.
A FIXME would certainly a good idea, if I don't just end up supporting
varargs here.
(On the other hand, for the '%s' check above, the code does report a warning
and then exits, so it is not inconceivable that a '%n' could also emit a
warning.)
I guess I could add something like this:

if (strstr(arg, "%1"))
	warning("arg contains %1, message might be corrupted");

I don't want to return in that case, because I think some output is
better than no output, and it seems to work on Vista. In fact, working
on Vista is kind of demotivating me to add such a warning in the first
place...
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help