[Bug 268436] [libc] syslog() and vsyslog() do not preserve the errno at the time of the call.
Date: Sun, 01 Sep 2024 08:56:53 UTC
https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=268436
--- Comment #4 from Hodong <hodong@nimfsoft.art> ---
#include <syslog.h>
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <stdarg.h>
#include <string.h>
void* c_realloc (void* ptr, size_t size)
{
if (!size)
{
free (ptr);
return NULL;
}
void* mem = realloc (ptr, size);
if (mem)
return mem;
perror (__PRETTY_FUNCTION__);
abort ();
}
char* c_str_join (const char *str, ...)
{
va_list ap;
size_t offset = 0;
char* result = NULL;
va_start (ap, str);
for (const char* s = str; s != NULL; s = va_arg (ap, const char*))
{
size_t len = strlen (s);
result = c_realloc (result, offset + len + 1);
memcpy (result + offset, s, len);
offset = offset + len;
}
va_end (ap);
if (result)
result[offset] = '\0';
return result;
}
void c_log (int priority, const char* format, ...)
{
const char* prefix;
char* new_format;
va_list args;
switch (priority)
{
case LOG_EMERG:
prefix = "EMERGENCY";
break;
case LOG_ALERT:
prefix = "ALERT";
break;
case LOG_CRIT:
prefix = "CRITICAL";
break;
case LOG_ERR:
prefix = "ERROR";
break;
case LOG_WARNING:
prefix = "WARNING";
break;
case LOG_NOTICE:
prefix = "NOTICE";
break;
case LOG_INFO:
prefix = "INFO";
break;
case LOG_DEBUG:
prefix = "DEBUG";
break;
default:
prefix = "NOTICE";
break;
}
openlog (getprogname(), LOG_PID | LOG_PERROR, LOG_DAEMON);
new_format = c_str_join (prefix, ": ", format, NULL);
/*
* 2022.12.18
* https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=268436
* The freebsd libc syslog, vsyslog does not preserve the errno at the time
of
* the call, so errno may change after the syslog call.
*/
//int saved_errno = errno;
va_start (args, format);
vsyslog (priority, new_format, args);
va_end (args);
//errno = saved_errno;
free (new_format);
closelog ();
}
#define c_log_critical(format, ...) \
c_log (LOG_CRIT, __FILE__ ":%d:%s: " format, \
__LINE__, __PRETTY_FUNCTION__, ## __VA_ARGS__)
#define c_log_warning(format, ...) \
c_log (LOG_WARNING, __FILE__ ":%d:%s: " format, \
__LINE__, __PRETTY_FUNCTION__, ## __VA_ARGS__)
#define c_log_info(format, ...) \
c_log (LOG_INFO, format, ## __VA_ARGS__)
int main ()
{
printf ("before: %d\n", errno);
c_log_info ("Example: %d", errno);
c_log_warning ("Example: %d", errno);
c_log_critical ("Example: %d", errno);
printf ("after: %d\n", errno);
return 0;
}
When I tested this code in the past, there was an issue where errno was changed
after calling vsyslog().
So I used this:
int saved_errno = errno;
va_start (args, format);
vsyslog (priority, new_format, args);
va_end (args);
errno = saved_errno;
But now that I've tested it again, errno doesn't change after calling
vsyslog().
//int saved_errno = errno;
va_start (args, format);
vsyslog (priority, new_format, args);
va_end (args);
//errno = saved_errno;
So this issue seems to be resolved and I think we can close this issue.
--
You are receiving this mail because:
You are the assignee for the bug.