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