diff --git a/src/journal/journalctl.c b/src/journal/journalctl.c index 58c7993d0b..d3ec22e224 100644 --- a/src/journal/journalctl.c +++ b/src/journal/journalctl.c @@ -1915,47 +1915,93 @@ static int verify(sd_journal *j, bool verbose) { return r; } -static int simple_varlink_call(const char *option, const char *method) { - _cleanup_(varlink_flush_close_unrefp) Varlink *link = NULL; - const char *fn; +static int varlink_connect_journal(Varlink **ret_link) { + const char *address; int r; - if (arg_machine) - return log_error_errno(SYNTHETIC_ERRNO(EOPNOTSUPP), "%s is not supported in conjunction with --machine=.", option); + address = arg_namespace ? + strjoina("/run/systemd/journal.", arg_namespace, "/io.systemd.journal") : + "/run/systemd/journal/io.systemd.journal"; - fn = arg_namespace ? - strjoina("/run/systemd/journal.", arg_namespace, "/io.systemd.journal") : - "/run/systemd/journal/io.systemd.journal"; - - r = varlink_connect_address(&link, fn); + r = varlink_connect_address(ret_link, address); if (r < 0) - return log_error_errno(r, "Failed to connect to %s: %m", fn); + return r; - (void) varlink_set_description(link, "journal"); - (void) varlink_set_relative_timeout(link, USEC_INFINITY); + (void) varlink_set_description(*ret_link, "journal"); + (void) varlink_set_relative_timeout(*ret_link, USEC_INFINITY); - return varlink_call_and_log(link, method, /* parameters= */ NULL, /* ret_parameters= */ NULL); + return 0; } static int flush_to_var(void) { + _cleanup_(varlink_flush_close_unrefp) Varlink *link = NULL; + int r; + + if (arg_machine || arg_namespace) + return log_error_errno(SYNTHETIC_ERRNO(EOPNOTSUPP), + "--flush is not supported in conjunction with %s.", + arg_machine ? "--machine=" : "--namespace="); + if (access("/run/systemd/journal/flushed", F_OK) >= 0) return 0; /* Already flushed, no need to contact journald */ if (errno != ENOENT) return log_error_errno(errno, "Unable to check for existence of /run/systemd/journal/flushed: %m"); - return simple_varlink_call("--flush", "io.systemd.Journal.FlushToVar"); + r = varlink_connect_journal(&link); + if (r < 0) + return log_error_errno(r, "Failed to connect to Varlink socket: %m"); + + return varlink_call_and_log(link, "io.systemd.Journal.FlushToVar", /* parameters= */ NULL, /* ret_parameters= */ NULL); } static int relinquish_var(void) { - return simple_varlink_call("--relinquish-var/--smart-relinquish-var", "io.systemd.Journal.RelinquishVar"); + _cleanup_(varlink_flush_close_unrefp) Varlink *link = NULL; + int r; + + if (arg_machine || arg_namespace) + return log_error_errno(SYNTHETIC_ERRNO(EOPNOTSUPP), + "--(smart-)relinquish-var is not supported in conjunction with %s.", + arg_machine ? "--machine=" : "--namespace="); + + r = varlink_connect_journal(&link); + if (r < 0) + return log_error_errno(r, "Failed to connect to Varlink socket: %m"); + + return varlink_call_and_log(link, "io.systemd.Journal.RelinquishVar", /* parameters= */ NULL, /* ret_parameters= */ NULL); } static int rotate(void) { - return simple_varlink_call("--rotate", "io.systemd.Journal.Rotate"); + _cleanup_(varlink_flush_close_unrefp) Varlink *link = NULL; + int r; + + if (arg_machine) + return log_error_errno(SYNTHETIC_ERRNO(EOPNOTSUPP), + "--rotate is not supported in conjunction with --machine=."); + + r = varlink_connect_journal(&link); + if (r < 0) + return log_error_errno(r, "Failed to connect to Varlink socket: %m"); + + return varlink_call_and_log(link, "io.systemd.Journal.Rotate", /* parameters= */ NULL, /* ret_parameters= */ NULL); } static int sync_journal(void) { - return simple_varlink_call("--sync", "io.systemd.Journal.Synchronize"); + _cleanup_(varlink_flush_close_unrefp) Varlink *link = NULL; + int r; + + if (arg_machine) + return log_error_errno(SYNTHETIC_ERRNO(EOPNOTSUPP), + "--sync is not supported in conjunction with --machine=."); + + r = varlink_connect_journal(&link); + if (ERRNO_IS_NEG_DISCONNECT(r) && arg_namespace) + /* If the namespaced sd-journald instance was shut down due to inactivity, it should already + * be synchronized */ + return 0; + if (r < 0) + return log_error_errno(r, "Failed to connect to Varlink socket: %m"); + + return varlink_call_and_log(link, "io.systemd.Journal.Synchronize", /* parameters= */ NULL, /* ret_parameters= */ NULL); } static int action_list_fields(sd_journal *j) {