chiark / gitweb /
log: also set errno to the passed error code before processing format string in log_s...
[elogind.git] / src / shared / log.c
index ba959b914e117ef0d3639dc3bdff35604d74fa9b..eba5853ab0a53ed9ad587b2a5f7c2339472b8eb1 100644 (file)
@@ -366,7 +366,7 @@ static int write_to_syslog(
                 const char *object,
                 const char *buffer) {
 
-        char header_priority[16], header_time[64], header_pid[16];
+        char header_priority[1 + DECIMAL_STR_MAX(int) + 2], header_time[64], header_pid[1 + DECIMAL_STR_MAX(pid_t) + 4];
         struct iovec iovec[5] = {};
         struct msghdr msghdr = {
                 .msg_iov = iovec,
@@ -429,7 +429,7 @@ static int write_to_kmsg(
                 const char *object,
                 const char *buffer) {
 
-        char header_priority[16], header_pid[16];
+        char header_priority[1 + DECIMAL_STR_MAX(int) + 2], header_pid[1 + DECIMAL_STR_MAX(pid_t) + 4];
         struct iovec iovec[5] = {};
 
         if (kmsg_fd < 0)
@@ -545,6 +545,9 @@ static int log_dispatch(
         if ((level & LOG_FACMASK) == 0)
                 level = log_facility | LOG_PRI(level);
 
+        if (error < 0)
+                error = -error;
+
         do {
                 char *e;
                 int k = 0;
@@ -627,7 +630,7 @@ int log_dump_internal(
         return log_dispatch(level, error, file, line, func, NULL, NULL, buffer);
 }
 
-int log_metav(
+int log_internalv(
                 int level,
                 int error,
                 const char*file,
@@ -644,7 +647,7 @@ int log_metav(
 
         /* Make sure that %m maps to the specified error */
         if (error != 0)
-                errno = error;
+                errno = abs(error);
 
         vsnprintf(buffer, sizeof(buffer), format, ap);
         char_array_0(buffer);
@@ -652,7 +655,7 @@ int log_metav(
         return log_dispatch(level, error, file, line, func, NULL, NULL, buffer);
 }
 
-int log_meta(
+int log_internal(
                 int level,
                 int error,
                 const char*file,
@@ -664,13 +667,13 @@ int log_meta(
         va_list ap;
 
         va_start(ap, format);
-        r = log_metav(level, error, file, line, func, format, ap);
+        r = log_internalv(level, error, file, line, func, format, ap);
         va_end(ap);
 
         return r;
 }
 
-int log_metav_object(
+int log_object_internalv(
                 int level,
                 int error,
                 const char*file,
@@ -689,7 +692,7 @@ int log_metav_object(
 
         /* Make sure that %m maps to the specified error */
         if (error != 0)
-                errno = error;
+                errno = abs(error);
 
         vsnprintf(buffer, sizeof(buffer), format, ap);
         char_array_0(buffer);
@@ -697,7 +700,7 @@ int log_metav_object(
         return log_dispatch(level, error, file, line, func, object_field, object, buffer);
 }
 
-int log_meta_object(
+int log_object_internal(
                 int level,
                 int error,
                 const char*file,
@@ -711,7 +714,7 @@ int log_meta_object(
         va_list ap;
 
         va_start(ap, format);
-        r = log_metav_object(level, error, file, line, func, object_field, object, format, ap);
+        r = log_object_internalv(level, error, file, line, func, object_field, object, format, ap);
         va_end(ap);
 
         return r;
@@ -756,7 +759,7 @@ void log_assert_failed_return(const char *text, const char *file, int line, cons
 }
 
 int log_oom_internal(const char *file, int line, const char *func) {
-        log_meta(LOG_ERR, ENOMEM, file, line, func, "Out of memory.");
+        log_internal(LOG_ERR, ENOMEM, file, line, func, "Out of memory.");
         return -ENOMEM;
 }
 
@@ -781,6 +784,9 @@ int log_struct_internal(
         if ((level & LOG_FACMASK) == 0)
                 level = log_facility | LOG_PRI(level);
 
+        if (error < 0)
+                error = -error;
+
         if ((log_target == LOG_TARGET_AUTO ||
              log_target == LOG_TARGET_JOURNAL_OR_KMSG ||
              log_target == LOG_TARGET_JOURNAL) &&
@@ -807,6 +813,9 @@ int log_struct_internal(
                          * since vasprintf() leaves it afterwards at
                          * an undefined location */
 
+                        if (error != 0)
+                                errno = error;
+
                         va_copy(aq, ap);
                         if (vasprintf(&buf, format, aq) < 0) {
                                 va_end(aq);
@@ -850,6 +859,9 @@ int log_struct_internal(
                 while (format) {
                         va_list aq;
 
+                        if (error != 0)
+                                errno = error;
+
                         va_copy(aq, ap);
                         vsnprintf(buf, sizeof(buf), format, aq);
                         va_end(aq);