chiark
/
gitweb
/
~ianmdlvl
/
elogind.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
basic/strv: add STRPTR_IN_SET
[elogind.git]
/
src
/
basic
/
log.c
diff --git
a/src/basic/log.c
b/src/basic/log.c
index aada46625ad31296f596231bf0556791a5fc8b96..521ea92efd16c892d4c1f3352f28a87db35e175d 100644
(file)
--- a/
src/basic/log.c
+++ b/
src/basic/log.c
@@
-1,5
+1,3
@@
-/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
-
/***
This file is part of systemd.
/***
This file is part of systemd.
@@
-21,16
+19,18
@@
#include <errno.h>
#include <fcntl.h>
#include <errno.h>
#include <fcntl.h>
-#ifdef __GLIBC__
-#include <printf.h>
-#else
-#include "parse-printf-format.h"
-#endif
+#include <inttypes.h>
+#include <limits.h>
#include <stdarg.h>
#include <stddef.h>
#include <stdio.h>
#include <stdarg.h>
#include <stddef.h>
#include <stdio.h>
+#include <string.h>
+#include <sys/signalfd.h>
#include <sys/socket.h>
#include <sys/socket.h>
+#include <sys/time.h>
+#include <sys/uio.h>
#include <sys/un.h>
#include <sys/un.h>
+#include <time.h>
#include <unistd.h>
#include "sd-messages.h"
#include <unistd.h>
#include "sd-messages.h"
@@
-52,6
+52,7
@@
#include "string-util.h"
#include "syslog-util.h"
#include "terminal-util.h"
#include "string-util.h"
#include "syslog-util.h"
#include "terminal-util.h"
+#include "time-util.h"
#include "util.h"
#define SNDBUF_SIZE (8*1024*1024)
#include "util.h"
#define SNDBUF_SIZE (8*1024*1024)
@@
-70,7
+71,9
@@
static bool syslog_is_stream = false;
static bool show_color = false;
static bool show_location = false;
static bool show_color = false;
static bool show_location = false;
-/// UNNEEDED by elogind static bool upgrade_syslog_to_journal = false;
+#if 0 /// UNNEEDED by elogind
+static bool upgrade_syslog_to_journal = false;
+#endif // 0
/* Akin to glibc's __abort_msg; which is private and we hence cannot
* use here. */
/* Akin to glibc's __abort_msg; which is private and we hence cannot
* use here. */
@@
-132,7
+135,7
@@
static int create_log_socket(int type) {
if (fd < 0)
return -errno;
if (fd < 0)
return -errno;
- fd_inc_sndbuf(fd, SNDBUF_SIZE);
+
(void)
fd_inc_sndbuf(fd, SNDBUF_SIZE);
/* We need a blocking fd here since we'd otherwise lose
messages way too early. However, let's not hang forever in the
/* We need a blocking fd here since we'd otherwise lose
messages way too early. However, let's not hang forever in the
@@
-164,7
+167,7
@@
static int log_open_syslog(void) {
goto fail;
}
goto fail;
}
- if (connect(syslog_fd, &sa.sa,
offsetof(struct sockaddr_un, sun_path) + strlen(sa.un.sun_path
)) < 0) {
+ if (connect(syslog_fd, &sa.sa,
SOCKADDR_UN_LEN(sa.un
)) < 0) {
safe_close(syslog_fd);
/* Some legacy syslog systems still use stream
safe_close(syslog_fd);
/* Some legacy syslog systems still use stream
@@
-176,7
+179,7
@@
static int log_open_syslog(void) {
goto fail;
}
goto fail;
}
- if (connect(syslog_fd, &sa.sa,
offsetof(struct sockaddr_un, sun_path) + strlen(sa.un.sun_path
)) < 0) {
+ if (connect(syslog_fd, &sa.sa,
SOCKADDR_UN_LEN(sa.un
)) < 0) {
r = -errno;
goto fail;
}
r = -errno;
goto fail;
}
@@
-192,11
+195,13
@@
fail:
return r;
}
return r;
}
-#if 0 /// UNNEEDED by elogind
void log_close_journal(void) {
void log_close_journal(void) {
+#if 0 /// elogind does not support journald
journal_fd = safe_close(journal_fd);
journal_fd = safe_close(journal_fd);
+#endif // 0
}
}
+#if 0 /// UNNEEDED by elogind
static int log_open_journal(void) {
static const union sockaddr_union sa = {
static int log_open_journal(void) {
static const union sockaddr_union sa = {
@@
-215,7
+220,7
@@
static int log_open_journal(void) {
goto fail;
}
goto fail;
}
- if (connect(journal_fd, &sa.sa,
offsetof(struct sockaddr_un, sun_path) + strlen(sa.un.sun_path
)) < 0) {
+ if (connect(journal_fd, &sa.sa,
SOCKADDR_UN_LEN(sa.un
)) < 0) {
r = -errno;
goto fail;
}
r = -errno;
goto fail;
}
@@
-238,7
+243,7
@@
int log_open(void) {
* because there is no reason to close it. */
if (log_target == LOG_TARGET_NULL) {
* because there is no reason to close it. */
if (log_target == LOG_TARGET_NULL) {
-
/// UNNEEDED by elogind
log_close_journal();
+ log_close_journal();
log_close_syslog();
log_close_console();
return 0;
log_close_syslog();
log_close_console();
return 0;
@@
-260,11
+265,12
@@
int log_open(void) {
}
}
#endif // 0
}
}
#endif // 0
+
if (log_target == LOG_TARGET_SYSLOG_OR_KMSG ||
log_target == LOG_TARGET_SYSLOG) {
r = log_open_syslog();
if (r >= 0) {
if (log_target == LOG_TARGET_SYSLOG_OR_KMSG ||
log_target == LOG_TARGET_SYSLOG) {
r = log_open_syslog();
if (r >= 0) {
-
/// UNNEEDED by elogind
log_close_journal();
+ log_close_journal();
log_close_console();
return r;
}
log_close_console();
return r;
}
@@
-272,12
+278,12
@@
int log_open(void) {
if (log_target == LOG_TARGET_AUTO ||
log_target == LOG_TARGET_SAFE ||
if (log_target == LOG_TARGET_AUTO ||
log_target == LOG_TARGET_SAFE ||
-
/// UNNEEDED by elogind
log_target == LOG_TARGET_JOURNAL_OR_KMSG ||
+ log_target == LOG_TARGET_JOURNAL_OR_KMSG ||
log_target == LOG_TARGET_SYSLOG_OR_KMSG ||
log_target == LOG_TARGET_KMSG) {
r = log_open_kmsg();
if (r >= 0) {
log_target == LOG_TARGET_SYSLOG_OR_KMSG ||
log_target == LOG_TARGET_KMSG) {
r = log_open_kmsg();
if (r >= 0) {
-
/// UNNEEDED by elogind
log_close_journal();
+ log_close_journal();
log_close_syslog();
log_close_console();
return r;
log_close_syslog();
log_close_console();
return r;
@@
-285,7
+291,7
@@
int log_open(void) {
}
}
}
}
-
/// UNNEEDED by elogind
log_close_journal();
+ log_close_journal();
log_close_syslog();
return log_open_console();
log_close_syslog();
return log_open_console();
@@
-308,7
+314,7
@@
void log_set_target(LogTarget target) {
}
void log_close(void) {
}
void log_close(void) {
-
/// UNNEDED by elogind
log_close_journal();
+ log_close_journal();
log_close_syslog();
log_close_kmsg();
log_close_console();
log_close_syslog();
log_close_kmsg();
log_close_console();
@@
-336,11
+342,9
@@
static int write_to_console(
const char *file,
int line,
const char *func,
const char *file,
int line,
const char *func,
- const char *object_field,
- const char *object,
const char *buffer) {
const char *buffer) {
- char location[
64
], prefix[1 + DECIMAL_STR_MAX(int) + 2];
+ char location[
256
], prefix[1 + DECIMAL_STR_MAX(int) + 2];
struct iovec iovec[6] = {};
unsigned n = 0;
bool highlight;
struct iovec iovec[6] = {};
unsigned n = 0;
bool highlight;
@@
-349,7
+353,7
@@
static int write_to_console(
return 0;
if (log_target == LOG_TARGET_CONSOLE_PREFIXED) {
return 0;
if (log_target == LOG_TARGET_CONSOLE_PREFIXED) {
- sprintf(prefix, "<%i>", level);
+
x
sprintf(prefix, "<%i>", level);
IOVEC_SET_STRING(iovec[n++], prefix);
}
IOVEC_SET_STRING(iovec[n++], prefix);
}
@@
-396,8
+400,6
@@
static int write_to_syslog(
const char *file,
int line,
const char *func,
const char *file,
int line,
const char *func,
- const char *object_field,
- const char *object,
const char *buffer) {
char header_priority[2 + DECIMAL_STR_MAX(int) + 1],
const char *buffer) {
char header_priority[2 + DECIMAL_STR_MAX(int) + 1],
@@
-459,8
+461,6
@@
static int write_to_kmsg(
const char *file,
int line,
const char *func,
const char *file,
int line,
const char *func,
- const char *object_field,
- const char *object,
const char *buffer) {
char header_priority[2 + DECIMAL_STR_MAX(int) + 1],
const char *buffer) {
char header_priority[2 + DECIMAL_STR_MAX(int) + 1],
@@
-492,7
+492,8
@@
static int log_do_header(
int level,
int error,
const char *file, int line, const char *func,
int level,
int error,
const char *file, int line, const char *func,
- const char *object_field, const char *object) {
+ const char *object_field, const char *object,
+ const char *extra_field, const char *extra) {
snprintf(header, size,
"PRIORITY=%i\n"
snprintf(header, size,
"PRIORITY=%i\n"
@@
-502,6
+503,7
@@
static int log_do_header(
"%s%s%s"
"%s%.*i%s"
"%s%s%s"
"%s%s%s"
"%s%.*i%s"
"%s%s%s"
+ "%s%s%s"
"SYSLOG_IDENTIFIER=%s\n",
LOG_PRI(level),
LOG_FAC(level),
"SYSLOG_IDENTIFIER=%s\n",
LOG_PRI(level),
LOG_FAC(level),
@@
-520,6
+522,9
@@
static int log_do_header(
isempty(object) ? "" : object_field,
isempty(object) ? "" : object,
isempty(object) ? "" : "\n",
isempty(object) ? "" : object_field,
isempty(object) ? "" : object,
isempty(object) ? "" : "\n",
+ isempty(extra) ? "" : extra_field,
+ isempty(extra) ? "" : extra,
+ isempty(extra) ? "" : "\n",
program_invocation_short_name);
return 0;
program_invocation_short_name);
return 0;
@@
-533,6
+538,8
@@
static int write_to_journal(
const char *func,
const char *object_field,
const char *object,
const char *func,
const char *object_field,
const char *object,
+ const char *extra_field,
+ const char *extra,
const char *buffer) {
char header[LINE_MAX];
const char *buffer) {
char header[LINE_MAX];
@@
-542,7
+549,7
@@
static int write_to_journal(
if (journal_fd < 0)
return 0;
if (journal_fd < 0)
return 0;
- log_do_header(header, sizeof(header), level, error, file, line, func, object_field, object);
+ log_do_header(header, sizeof(header), level, error, file, line, func, object_field, object
, extra_field, extra
);
IOVEC_SET_STRING(iovec[0], header);
IOVEC_SET_STRING(iovec[1], "MESSAGE=");
IOVEC_SET_STRING(iovec[0], header);
IOVEC_SET_STRING(iovec[1], "MESSAGE=");
@@
-567,10
+574,15
@@
static int log_dispatch(
const char *func,
const char *object_field,
const char *object,
const char *func,
const char *object_field,
const char *object,
+ const char *extra,
+ const char *extra_field,
char *buffer) {
assert(buffer);
char *buffer) {
assert(buffer);
+ if (error < 0)
+ error = -error;
+
if (log_target == LOG_TARGET_NULL)
return -error;
if (log_target == LOG_TARGET_NULL)
return -error;
@@
-578,9
+590,6
@@
static int log_dispatch(
if ((level & LOG_FACMASK) == 0)
level = log_facility | LOG_PRI(level);
if ((level & LOG_FACMASK) == 0)
level = log_facility | LOG_PRI(level);
- if (error < 0)
- error = -error;
-
do {
char *e;
int k = 0;
do {
char *e;
int k = 0;
@@
-598,7
+607,7
@@
static int log_dispatch(
log_target == LOG_TARGET_JOURNAL_OR_KMSG ||
log_target == LOG_TARGET_JOURNAL) {
log_target == LOG_TARGET_JOURNAL_OR_KMSG ||
log_target == LOG_TARGET_JOURNAL) {
- k = write_to_journal(level, error, file, line, func, object_field, object, buffer);
+ k = write_to_journal(level, error, file, line, func, object_field, object,
extra_field, extra,
buffer);
if (k < 0) {
if (k != -EAGAIN)
log_close_journal();
if (k < 0) {
if (k != -EAGAIN)
log_close_journal();
@@
-610,7
+619,7
@@
static int log_dispatch(
if (log_target == LOG_TARGET_SYSLOG_OR_KMSG ||
log_target == LOG_TARGET_SYSLOG) {
if (log_target == LOG_TARGET_SYSLOG_OR_KMSG ||
log_target == LOG_TARGET_SYSLOG) {
- k = write_to_syslog(level, error, file, line, func,
object_field, object,
buffer);
+ k = write_to_syslog(level, error, file, line, func, buffer);
if (k < 0) {
if (k != -EAGAIN)
log_close_syslog();
if (k < 0) {
if (k != -EAGAIN)
log_close_syslog();
@@
-622,10
+631,10
@@
static int log_dispatch(
(log_target == LOG_TARGET_AUTO ||
log_target == LOG_TARGET_SAFE ||
log_target == LOG_TARGET_SYSLOG_OR_KMSG ||
(log_target == LOG_TARGET_AUTO ||
log_target == LOG_TARGET_SAFE ||
log_target == LOG_TARGET_SYSLOG_OR_KMSG ||
-
/// UNNEEDED by elogind
log_target == LOG_TARGET_JOURNAL_OR_KMSG ||
+ log_target == LOG_TARGET_JOURNAL_OR_KMSG ||
log_target == LOG_TARGET_KMSG)) {
log_target == LOG_TARGET_KMSG)) {
- k = write_to_kmsg(level, error, file, line, func,
object_field, object,
buffer);
+ k = write_to_kmsg(level, error, file, line, func, buffer);
if (k < 0) {
log_close_kmsg();
log_open_console();
if (k < 0) {
log_close_kmsg();
log_open_console();
@@
-633,7
+642,7
@@
static int log_dispatch(
}
if (k <= 0)
}
if (k <= 0)
- (void) write_to_console(level, error, file, line, func,
object_field, object,
buffer);
+ (void) write_to_console(level, error, file, line, func, buffer);
buffer = e;
} while (buffer);
buffer = e;
} while (buffer);
@@
-659,7
+668,7
@@
int log_dump_internal(
if (_likely_(LOG_PRI(level) > log_max_level))
return -error;
if (_likely_(LOG_PRI(level) > log_max_level))
return -error;
- return log_dispatch(level, error, file, line, func, NULL, NULL, buffer);
+ return log_dispatch(level, error, file, line, func, NULL, NULL,
NULL, NULL,
buffer);
}
int log_internalv(
}
int log_internalv(
@@
-686,7
+695,7
@@
int log_internalv(
vsnprintf(buffer, sizeof(buffer), format, ap);
vsnprintf(buffer, sizeof(buffer), format, ap);
- return log_dispatch(level, error, file, line, func, NULL, NULL, buffer);
+ return log_dispatch(level, error, file, line, func, NULL, NULL,
NULL, NULL,
buffer);
}
int log_internal(
}
int log_internal(
@@
-715,6
+724,8
@@
int log_object_internalv(
const char *func,
const char *object_field,
const char *object,
const char *func,
const char *object_field,
const char *object,
+ const char *extra_field,
+ const char *extra,
const char *format,
va_list ap) {
const char *format,
va_list ap) {
@@
-748,7
+759,7
@@
int log_object_internalv(
vsnprintf(b, l, format, ap);
vsnprintf(b, l, format, ap);
- return log_dispatch(level, error, file, line, func, object_field, object, buffer);
+ return log_dispatch(level, error, file, line, func, object_field, object,
extra_field, extra,
buffer);
}
int log_object_internal(
}
int log_object_internal(
@@
-759,13
+770,15
@@
int log_object_internal(
const char *func,
const char *object_field,
const char *object,
const char *func,
const char *object_field,
const char *object,
+ const char *extra_field,
+ const char *extra,
const char *format, ...) {
va_list ap;
int r;
va_start(ap, format);
const char *format, ...) {
va_list ap;
int r;
va_start(ap, format);
- r = log_object_internalv(level, error, file, line, func, object_field, object, format, ap);
+ r = log_object_internalv(level, error, file, line, func, object_field, object,
extra_field, extra,
format, ap);
va_end(ap);
return r;
va_end(ap);
return r;
@@
-785,12
+798,12
@@
static void log_assert(
return;
DISABLE_WARNING_FORMAT_NONLITERAL;
return;
DISABLE_WARNING_FORMAT_NONLITERAL;
-
snprintf(buffer, sizeof(buffer)
, format, text, file, line, func);
+
xsprintf(buffer
, format, text, file, line, func);
REENABLE_WARNING;
log_abort_msg = buffer;
REENABLE_WARNING;
log_abort_msg = buffer;
- log_dispatch(level, 0, file, line, func, NULL, NULL, buffer);
+ log_dispatch(level, 0, file, line, func, NULL, NULL,
NULL, NULL,
buffer);
}
noreturn void log_assert_failed(const char *text, const char *file, int line, const char *func) {
}
noreturn void log_assert_failed(const char *text, const char *file, int line, const char *func) {
@@
-899,7
+912,7
@@
int log_struct_internal(
bool fallback = false;
/* If the journal is available do structured logging */
bool fallback = false;
/* If the journal is available do structured logging */
- log_do_header(header, sizeof(header), level, error, file, line, func, NULL, NULL);
+ log_do_header(header, sizeof(header), level, error, file, line, func, NULL, NULL
, NULL, NULL
);
IOVEC_SET_STRING(iovec[n++], header);
va_start(ap, format);
IOVEC_SET_STRING(iovec[n++], header);
va_start(ap, format);
@@
-947,7
+960,7
@@
int log_struct_internal(
if (!found)
return -error;
if (!found)
return -error;
- return log_dispatch(level, error, file, line, func, NULL, NULL, buf + 8);
+ return log_dispatch(level, error, file, line, func, NULL, NULL,
NULL, NULL,
buf + 8);
}
int log_set_target_from_string(const char *e) {
}
int log_set_target_from_string(const char *e) {