|
|
1abbee |
From 134a85fc4fa6d1c3209e11415b2610147e2e1aac Mon Sep 17 00:00:00 2001
|
|
|
1abbee |
From: Lennart Poettering <lennart@poettering.net>
|
|
|
1abbee |
Date: Mon, 18 May 2015 23:50:34 +0200
|
|
|
1abbee |
Subject: [PATCH] journalctl: only have a single exit path from main()
|
|
|
1abbee |
|
|
|
1abbee |
That way we can be sure we execute the destructors properly, and can be
|
|
|
1abbee |
valgrind-clean.
|
|
|
1abbee |
|
|
|
1abbee |
Cherry-picked from: 909dea0c7ced0042fa3acd8cd05f5007a2cf2cea
|
|
|
1abbee |
Related: #1318994
|
|
|
1abbee |
---
|
|
|
23b3cf |
src/journal/journalctl.c | 51 +++++++++++++++++++++-------------------
|
|
|
1abbee |
1 file changed, 27 insertions(+), 24 deletions(-)
|
|
|
1abbee |
|
|
|
1abbee |
diff --git a/src/journal/journalctl.c b/src/journal/journalctl.c
|
|
|
181b3f |
index c7a19f236..31da357c1 100644
|
|
|
1abbee |
--- a/src/journal/journalctl.c
|
|
|
1abbee |
+++ b/src/journal/journalctl.c
|
|
|
1abbee |
@@ -532,7 +532,7 @@ static int parse_argv(int argc, char *argv[]) {
|
|
|
1abbee |
arg_boot = true;
|
|
|
1abbee |
|
|
|
1abbee |
if (optarg) {
|
|
|
1abbee |
- r = parse_boot_descriptor(optarg, &arg_boot_id, &arg_boot_offset);
|
|
|
1abbee |
+ r = parse_boot_descriptor(optarg, &arg_boot_id, &arg_boot_offset);
|
|
|
1abbee |
if (r < 0) {
|
|
|
1abbee |
log_error("Failed to parse boot descriptor '%s'", optarg);
|
|
|
1abbee |
return -EINVAL;
|
|
|
1abbee |
@@ -1929,12 +1929,12 @@ int main(int argc, char *argv[]) {
|
|
|
1abbee |
if (r < 0) {
|
|
|
1abbee |
log_error_errno(r, "Failed to open %s: %m",
|
|
|
1abbee |
arg_directory ? arg_directory : arg_file ? "files" : "journal");
|
|
|
1abbee |
- return EXIT_FAILURE;
|
|
|
1abbee |
+ goto finish;
|
|
|
1abbee |
}
|
|
|
1abbee |
|
|
|
1abbee |
r = access_check(j);
|
|
|
1abbee |
if (r < 0)
|
|
|
1abbee |
- return EXIT_FAILURE;
|
|
|
1abbee |
+ goto finish;
|
|
|
1abbee |
|
|
|
1abbee |
if (arg_action == ACTION_VERIFY) {
|
|
|
1abbee |
r = verify(j);
|
|
|
1abbee |
@@ -1943,7 +1943,8 @@ int main(int argc, char *argv[]) {
|
|
|
1abbee |
|
|
|
1abbee |
if (arg_action == ACTION_PRINT_HEADER) {
|
|
|
1abbee |
journal_print_header(j);
|
|
|
1abbee |
- return EXIT_SUCCESS;
|
|
|
1abbee |
+ r = 0;
|
|
|
1abbee |
+ goto finish;
|
|
|
1abbee |
}
|
|
|
1abbee |
|
|
|
1abbee |
if (arg_action == ACTION_DISK_USAGE) {
|
|
|
1abbee |
@@ -1952,11 +1953,11 @@ int main(int argc, char *argv[]) {
|
|
|
1abbee |
|
|
|
1abbee |
r = sd_journal_get_usage(j, &bytes);
|
|
|
1abbee |
if (r < 0)
|
|
|
1abbee |
- return EXIT_FAILURE;
|
|
|
1abbee |
+ goto finish;
|
|
|
1abbee |
|
|
|
1abbee |
printf("Archived and active journals take up %s on disk.\n",
|
|
|
1abbee |
format_bytes(sbytes, sizeof(sbytes), bytes));
|
|
|
1abbee |
- return EXIT_SUCCESS;
|
|
|
1abbee |
+ goto finish;
|
|
|
1abbee |
}
|
|
|
1abbee |
|
|
|
1abbee |
if (arg_action == ACTION_VACUUM) {
|
|
|
1abbee |
@@ -1976,7 +1977,7 @@ int main(int argc, char *argv[]) {
|
|
|
1abbee |
}
|
|
|
1abbee |
}
|
|
|
1abbee |
|
|
|
1abbee |
- return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
|
|
|
1abbee |
+ goto finish;
|
|
|
1abbee |
}
|
|
|
1abbee |
|
|
|
1abbee |
if (arg_action == ACTION_LIST_BOOTS) {
|
|
|
1abbee |
@@ -1995,11 +1996,11 @@ int main(int argc, char *argv[]) {
|
|
|
1abbee |
* It may need to seek the journal to find parent boot IDs. */
|
|
|
1abbee |
r = add_boot(j);
|
|
|
1abbee |
if (r < 0)
|
|
|
1abbee |
- return EXIT_FAILURE;
|
|
|
1abbee |
+ goto finish;
|
|
|
1abbee |
|
|
|
1abbee |
r = add_dmesg(j);
|
|
|
1abbee |
if (r < 0)
|
|
|
1abbee |
- return EXIT_FAILURE;
|
|
|
1abbee |
+ goto finish;
|
|
|
1abbee |
|
|
|
1abbee |
r = add_units(j);
|
|
|
1abbee |
strv_free(arg_system_units);
|
|
|
1abbee |
@@ -2007,25 +2008,25 @@ int main(int argc, char *argv[]) {
|
|
|
1abbee |
|
|
|
1abbee |
if (r < 0) {
|
|
|
1abbee |
log_error_errno(r, "Failed to add filter for units: %m");
|
|
|
1abbee |
- return EXIT_FAILURE;
|
|
|
1abbee |
+ goto finish;
|
|
|
1abbee |
}
|
|
|
1abbee |
|
|
|
1abbee |
r = add_syslog_identifier(j);
|
|
|
1abbee |
if (r < 0) {
|
|
|
1abbee |
log_error_errno(r, "Failed to add filter for syslog identifiers: %m");
|
|
|
1abbee |
- return EXIT_FAILURE;
|
|
|
1abbee |
+ goto finish;
|
|
|
1abbee |
}
|
|
|
1abbee |
|
|
|
1abbee |
r = add_priorities(j);
|
|
|
1abbee |
if (r < 0) {
|
|
|
1abbee |
log_error_errno(r, "Failed to add filter for priorities: %m");
|
|
|
1abbee |
- return EXIT_FAILURE;
|
|
|
1abbee |
+ goto finish;
|
|
|
1abbee |
}
|
|
|
1abbee |
|
|
|
1abbee |
r = add_matches(j, argv + optind);
|
|
|
1abbee |
if (r < 0) {
|
|
|
1abbee |
log_error_errno(r, "Failed to add filters: %m");
|
|
|
1abbee |
- return EXIT_FAILURE;
|
|
|
1abbee |
+ goto finish;
|
|
|
1abbee |
}
|
|
|
1abbee |
|
|
|
1abbee |
if (_unlikely_(log_get_max_level() >= LOG_DEBUG)) {
|
|
|
1abbee |
@@ -2042,13 +2043,13 @@ int main(int argc, char *argv[]) {
|
|
|
1abbee |
r = sd_journal_set_data_threshold(j, 0);
|
|
|
1abbee |
if (r < 0) {
|
|
|
1abbee |
log_error("Failed to unset data size threshold");
|
|
|
1abbee |
- return EXIT_FAILURE;
|
|
|
1abbee |
+ goto finish;
|
|
|
1abbee |
}
|
|
|
1abbee |
|
|
|
1abbee |
r = sd_journal_query_unique(j, arg_field);
|
|
|
1abbee |
if (r < 0) {
|
|
|
1abbee |
log_error_errno(r, "Failed to query unique data objects: %m");
|
|
|
1abbee |
- return EXIT_FAILURE;
|
|
|
1abbee |
+ goto finish;
|
|
|
1abbee |
}
|
|
|
1abbee |
|
|
|
1abbee |
SD_JOURNAL_FOREACH_UNIQUE(j, data, size) {
|
|
|
1abbee |
@@ -2066,22 +2067,24 @@ int main(int argc, char *argv[]) {
|
|
|
1abbee |
n_shown ++;
|
|
|
1abbee |
}
|
|
|
1abbee |
|
|
|
1abbee |
- return EXIT_SUCCESS;
|
|
|
1abbee |
+ r = 0;
|
|
|
1abbee |
+ goto finish;
|
|
|
1abbee |
}
|
|
|
1abbee |
|
|
|
1abbee |
/* Opening the fd now means the first sd_journal_wait() will actually wait */
|
|
|
1abbee |
if (arg_follow) {
|
|
|
1abbee |
r = sd_journal_get_fd(j);
|
|
|
1abbee |
if (r < 0)
|
|
|
1abbee |
- return EXIT_FAILURE;
|
|
|
1abbee |
+ goto finish;
|
|
|
1abbee |
}
|
|
|
1abbee |
|
|
|
1abbee |
if (arg_cursor || arg_after_cursor) {
|
|
|
1abbee |
r = sd_journal_seek_cursor(j, arg_cursor ?: arg_after_cursor);
|
|
|
1abbee |
if (r < 0) {
|
|
|
1abbee |
log_error_errno(r, "Failed to seek to cursor: %m");
|
|
|
1abbee |
- return EXIT_FAILURE;
|
|
|
1abbee |
+ goto finish;
|
|
|
1abbee |
}
|
|
|
1abbee |
+
|
|
|
1abbee |
if (!arg_reverse)
|
|
|
1abbee |
r = sd_journal_next_skip(j, 1 + !!arg_after_cursor);
|
|
|
1abbee |
else
|
|
|
1abbee |
@@ -2099,7 +2102,7 @@ int main(int argc, char *argv[]) {
|
|
|
1abbee |
r = sd_journal_seek_realtime_usec(j, arg_since);
|
|
|
1abbee |
if (r < 0) {
|
|
|
1abbee |
log_error_errno(r, "Failed to seek to date: %m");
|
|
|
1abbee |
- return EXIT_FAILURE;
|
|
|
1abbee |
+ goto finish;
|
|
|
1abbee |
}
|
|
|
1abbee |
r = sd_journal_next(j);
|
|
|
1abbee |
|
|
|
1abbee |
@@ -2107,7 +2110,7 @@ int main(int argc, char *argv[]) {
|
|
|
1abbee |
r = sd_journal_seek_realtime_usec(j, arg_until);
|
|
|
1abbee |
if (r < 0) {
|
|
|
1abbee |
log_error_errno(r, "Failed to seek to date: %m");
|
|
|
1abbee |
- return EXIT_FAILURE;
|
|
|
1abbee |
+ goto finish;
|
|
|
1abbee |
}
|
|
|
1abbee |
r = sd_journal_previous(j);
|
|
|
1abbee |
|
|
|
1abbee |
@@ -2115,7 +2118,7 @@ int main(int argc, char *argv[]) {
|
|
|
1abbee |
r = sd_journal_seek_tail(j);
|
|
|
1abbee |
if (r < 0) {
|
|
|
1abbee |
log_error_errno(r, "Failed to seek to tail: %m");
|
|
|
1abbee |
- return EXIT_FAILURE;
|
|
|
1abbee |
+ goto finish;
|
|
|
1abbee |
}
|
|
|
1abbee |
|
|
|
1abbee |
r = sd_journal_previous_skip(j, arg_lines);
|
|
|
1abbee |
@@ -2124,7 +2127,7 @@ int main(int argc, char *argv[]) {
|
|
|
1abbee |
r = sd_journal_seek_tail(j);
|
|
|
1abbee |
if (r < 0) {
|
|
|
1abbee |
log_error_errno(r, "Failed to seek to tail: %m");
|
|
|
1abbee |
- return EXIT_FAILURE;
|
|
|
1abbee |
+ goto finish;
|
|
|
1abbee |
}
|
|
|
1abbee |
|
|
|
1abbee |
r = sd_journal_previous(j);
|
|
|
1abbee |
@@ -2133,7 +2136,7 @@ int main(int argc, char *argv[]) {
|
|
|
1abbee |
r = sd_journal_seek_head(j);
|
|
|
1abbee |
if (r < 0) {
|
|
|
1abbee |
log_error_errno(r, "Failed to seek to head: %m");
|
|
|
1abbee |
- return EXIT_FAILURE;
|
|
|
1abbee |
+ goto finish;
|
|
|
1abbee |
}
|
|
|
1abbee |
|
|
|
1abbee |
r = sd_journal_next(j);
|
|
|
1abbee |
@@ -2141,7 +2144,7 @@ int main(int argc, char *argv[]) {
|
|
|
1abbee |
|
|
|
1abbee |
if (r < 0) {
|
|
|
1abbee |
log_error_errno(r, "Failed to iterate through journal: %m");
|
|
|
1abbee |
- return EXIT_FAILURE;
|
|
|
1abbee |
+ goto finish;
|
|
|
1abbee |
}
|
|
|
1abbee |
|
|
|
1abbee |
if (r == 0) {
|