Merge pull request #4067 from poettering/invocation-id
Add an "invocation ID" concept to the service manager
This commit is contained in:
+40
-2
@@ -28,6 +28,7 @@
|
||||
#include <sys/stat.h>
|
||||
#include <sys/statfs.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/xattr.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "alloc-util.h"
|
||||
@@ -883,6 +884,43 @@ int cg_set_task_access(
|
||||
return 0;
|
||||
}
|
||||
|
||||
int cg_set_xattr(const char *controller, const char *path, const char *name, const void *value, size_t size, int flags) {
|
||||
_cleanup_free_ char *fs = NULL;
|
||||
int r;
|
||||
|
||||
assert(path);
|
||||
assert(name);
|
||||
assert(value || size <= 0);
|
||||
|
||||
r = cg_get_path(controller, path, NULL, &fs);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
if (setxattr(fs, name, value, size, flags) < 0)
|
||||
return -errno;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int cg_get_xattr(const char *controller, const char *path, const char *name, void *value, size_t size) {
|
||||
_cleanup_free_ char *fs = NULL;
|
||||
ssize_t n;
|
||||
int r;
|
||||
|
||||
assert(path);
|
||||
assert(name);
|
||||
|
||||
r = cg_get_path(controller, path, NULL, &fs);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
n = getxattr(fs, name, value, size);
|
||||
if (n < 0)
|
||||
return -errno;
|
||||
|
||||
return (int) n;
|
||||
}
|
||||
|
||||
int cg_pid_get_path(const char *controller, pid_t pid, char **path) {
|
||||
_cleanup_fclose_ FILE *f = NULL;
|
||||
char line[LINE_MAX];
|
||||
@@ -1666,7 +1704,7 @@ int cg_path_get_slice(const char *p, char **slice) {
|
||||
if (!e) {
|
||||
char *s;
|
||||
|
||||
s = strdup("-.slice");
|
||||
s = strdup(SPECIAL_ROOT_SLICE);
|
||||
if (!s)
|
||||
return -ENOMEM;
|
||||
|
||||
@@ -1821,7 +1859,7 @@ int cg_slice_to_path(const char *unit, char **ret) {
|
||||
assert(unit);
|
||||
assert(ret);
|
||||
|
||||
if (streq(unit, "-.slice")) {
|
||||
if (streq(unit, SPECIAL_ROOT_SLICE)) {
|
||||
char *x;
|
||||
|
||||
x = strdup("");
|
||||
|
||||
@@ -185,6 +185,9 @@ int cg_get_keyed_attribute(const char *controller, const char *path, const char
|
||||
int cg_set_group_access(const char *controller, const char *path, mode_t mode, uid_t uid, gid_t gid);
|
||||
int cg_set_task_access(const char *controller, const char *path, mode_t mode, uid_t uid, gid_t gid);
|
||||
|
||||
int cg_set_xattr(const char *controller, const char *path, const char *name, const void *value, size_t size, int flags);
|
||||
int cg_get_xattr(const char *controller, const char *path, const char *name, void *value, size_t size);
|
||||
|
||||
int cg_install_release_agent(const char *controller, const char *agent);
|
||||
int cg_uninstall_release_agent(const char *controller);
|
||||
|
||||
|
||||
+31
-24
@@ -133,7 +133,7 @@ static int create_log_socket(int type) {
|
||||
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
|
||||
@@ -330,8 +330,6 @@ static int write_to_console(
|
||||
const char *file,
|
||||
int line,
|
||||
const char *func,
|
||||
const char *object_field,
|
||||
const char *object,
|
||||
const char *buffer) {
|
||||
|
||||
char location[256], prefix[1 + DECIMAL_STR_MAX(int) + 2];
|
||||
@@ -343,7 +341,7 @@ static int write_to_console(
|
||||
return 0;
|
||||
|
||||
if (log_target == LOG_TARGET_CONSOLE_PREFIXED) {
|
||||
sprintf(prefix, "<%i>", level);
|
||||
xsprintf(prefix, "<%i>", level);
|
||||
IOVEC_SET_STRING(iovec[n++], prefix);
|
||||
}
|
||||
|
||||
@@ -390,8 +388,6 @@ static int write_to_syslog(
|
||||
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],
|
||||
@@ -453,8 +449,6 @@ static int write_to_kmsg(
|
||||
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],
|
||||
@@ -485,7 +479,8 @@ static int log_do_header(
|
||||
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"
|
||||
@@ -495,6 +490,7 @@ static int log_do_header(
|
||||
"%s%s%s"
|
||||
"%s%.*i%s"
|
||||
"%s%s%s"
|
||||
"%s%s%s"
|
||||
"SYSLOG_IDENTIFIER=%s\n",
|
||||
LOG_PRI(level),
|
||||
LOG_FAC(level),
|
||||
@@ -513,6 +509,9 @@ static int log_do_header(
|
||||
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;
|
||||
@@ -526,6 +525,8 @@ static int write_to_journal(
|
||||
const char *func,
|
||||
const char *object_field,
|
||||
const char *object,
|
||||
const char *extra_field,
|
||||
const char *extra,
|
||||
const char *buffer) {
|
||||
|
||||
char header[LINE_MAX];
|
||||
@@ -535,7 +536,7 @@ static int write_to_journal(
|
||||
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=");
|
||||
@@ -559,10 +560,15 @@ static int log_dispatch(
|
||||
const char *func,
|
||||
const char *object_field,
|
||||
const char *object,
|
||||
const char *extra,
|
||||
const char *extra_field,
|
||||
char *buffer) {
|
||||
|
||||
assert(buffer);
|
||||
|
||||
if (error < 0)
|
||||
error = -error;
|
||||
|
||||
if (log_target == LOG_TARGET_NULL)
|
||||
return -error;
|
||||
|
||||
@@ -570,9 +576,6 @@ 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;
|
||||
@@ -589,7 +592,7 @@ static int log_dispatch(
|
||||
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();
|
||||
@@ -600,7 +603,7 @@ static int log_dispatch(
|
||||
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();
|
||||
@@ -615,7 +618,7 @@ static int log_dispatch(
|
||||
log_target == LOG_TARGET_JOURNAL_OR_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();
|
||||
@@ -623,7 +626,7 @@ static int log_dispatch(
|
||||
}
|
||||
|
||||
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);
|
||||
@@ -649,7 +652,7 @@ int log_dump_internal(
|
||||
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(
|
||||
@@ -676,7 +679,7 @@ int log_internalv(
|
||||
|
||||
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(
|
||||
@@ -705,6 +708,8 @@ int log_object_internalv(
|
||||
const char *func,
|
||||
const char *object_field,
|
||||
const char *object,
|
||||
const char *extra_field,
|
||||
const char *extra,
|
||||
const char *format,
|
||||
va_list ap) {
|
||||
|
||||
@@ -738,7 +743,7 @@ int log_object_internalv(
|
||||
|
||||
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(
|
||||
@@ -749,13 +754,15 @@ int log_object_internal(
|
||||
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);
|
||||
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;
|
||||
@@ -780,7 +787,7 @@ static void log_assert(
|
||||
|
||||
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) {
|
||||
@@ -888,7 +895,7 @@ int log_struct_internal(
|
||||
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);
|
||||
@@ -935,7 +942,7 @@ int log_struct_internal(
|
||||
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) {
|
||||
|
||||
+7
-3
@@ -100,18 +100,22 @@ int log_object_internal(
|
||||
const char *func,
|
||||
const char *object_field,
|
||||
const char *object,
|
||||
const char *format, ...) _printf_(8,9);
|
||||
const char *extra_field,
|
||||
const char *extra,
|
||||
const char *format, ...) _printf_(10,11);
|
||||
|
||||
int log_object_internalv(
|
||||
int level,
|
||||
int error,
|
||||
const char*file,
|
||||
const char *file,
|
||||
int line,
|
||||
const char *func,
|
||||
const char *object_field,
|
||||
const char *object,
|
||||
const char *extra_field,
|
||||
const char *extra,
|
||||
const char *format,
|
||||
va_list ap) _printf_(8,0);
|
||||
va_list ap) _printf_(9,0);
|
||||
|
||||
int log_struct_internal(
|
||||
int level,
|
||||
|
||||
+7
-4
@@ -96,10 +96,13 @@ bool strv_overlap(char **a, char **b) _pure_;
|
||||
#define STRV_FOREACH(s, l) \
|
||||
for ((s) = (l); (s) && *(s); (s)++)
|
||||
|
||||
#define STRV_FOREACH_BACKWARDS(s, l) \
|
||||
STRV_FOREACH(s, l) \
|
||||
; \
|
||||
for ((s)--; (l) && ((s) >= (l)); (s)--)
|
||||
#define STRV_FOREACH_BACKWARDS(s, l) \
|
||||
for (s = ({ \
|
||||
char **_l = l; \
|
||||
_l ? _l + strv_length(_l) - 1U : NULL; \
|
||||
}); \
|
||||
(l) && ((s) >= (l)); \
|
||||
(s)--)
|
||||
|
||||
#define STRV_FOREACH_PAIR(x, y, l) \
|
||||
for ((x) = (l), (y) = (x+1); (x) && *(x) && *(y); (x) += 2, (y) = (x + 1))
|
||||
|
||||
Reference in New Issue
Block a user