log: add an "error" parameter to all low-level logging calls and intrdouce log_error_errno() as log calls that take error numbers

This change has two benefits:

- The format string %m will now resolve to the specified error (or to
  errno if the specified error is 0. This allows getting rid of a ton of
  strerror() invocations, a function that is not thread-safe.

- The specified error can be passed to the journal in the ERRNO= field.

Now of course, we just need somebody to convert all cases of this:

        log_error("Something happened: %s", strerror(-r));

into thus:

        log_error_errno(-r, "Something happened: %m");
This commit is contained in:
Lennart Poettering
2014-11-27 22:05:23 +01:00
parent fb6d9b77a7
commit 086891e5c1
21 changed files with 209 additions and 153 deletions
+12 -6
View File
@@ -38,10 +38,16 @@
#include "exit-status.h"
#include "sd-messages.h"
int log_syntax_internal(const char *unit, int level,
const char *file, unsigned line, const char *func,
const char *config_file, unsigned config_line,
int error, const char *format, ...) {
int log_syntax_internal(
const char *unit,
int level,
const char *file,
int line,
const char *func,
const char *config_file,
unsigned config_line,
int error,
const char *format, ...) {
_cleanup_free_ char *msg = NULL;
int r;
@@ -55,21 +61,21 @@ int log_syntax_internal(const char *unit, int level,
if (unit)
r = log_struct_internal(level,
error > 0 ? error : EINVAL,
file, line, func,
getpid() == 1 ? "UNIT=%s" : "USER_UNIT=%s", unit,
MESSAGE_ID(SD_MESSAGE_CONFIG_ERROR),
"CONFIG_FILE=%s", config_file,
"CONFIG_LINE=%u", config_line,
"ERRNO=%d", error > 0 ? error : EINVAL,
"MESSAGE=[%s:%u] %s", config_file, config_line, msg,
NULL);
else
r = log_struct_internal(level,
error > 0 ? error : EINVAL,
file, line, func,
MESSAGE_ID(SD_MESSAGE_CONFIG_ERROR),
"CONFIG_FILE=%s", config_file,
"CONFIG_LINE=%u", config_line,
"ERRNO=%d", error > 0 ? error : EINVAL,
"MESSAGE=[%s:%u] %s", config_file, config_line, msg,
NULL);