1
0
mirror of https://github.com/systemd/systemd.git synced 2024-10-30 06:25:37 +03:00

Merge pull request #26452 from yuwata/journalctl-main-func

journalctl: use DEFINE_MAIN_FUNCTION() macro
This commit is contained in:
Lennart Poettering 2023-02-17 09:44:19 +01:00 committed by GitHub
commit 2610de2f84
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -45,6 +45,7 @@
#include "locale-util.h"
#include "log.h"
#include "logs-show.h"
#include "main-func.h"
#include "memory-util.h"
#include "missing_sched.h"
#include "mkdir.h"
@ -2091,7 +2092,7 @@ static int wait_for_change(sd_journal *j, int poll_fd) {
return 0;
}
int main(int argc, char *argv[]) {
static int run(int argc, char *argv[]) {
_cleanup_(loop_device_unrefp) LoopDevice *loop_device = NULL;
_cleanup_(umount_and_rmdir_and_freep) char *unlink_dir = NULL;
bool previous_boot_id_valid = false, first_line = true, ellipsized = false, need_seek = false;
@ -2099,6 +2100,7 @@ int main(int argc, char *argv[]) {
_cleanup_(sd_journal_closep) sd_journal *j = NULL;
sd_id128_t previous_boot_id = SD_ID128_NULL, previous_boot_id_output = SD_ID128_NULL;
dual_timestamp previous_ts_output = DUAL_TIMESTAMP_NULL;
_cleanup_close_ int machine_fd = -EBADF;
int n_shown = 0, r, poll_fd = -EBADF;
setlocale(LC_ALL, "");
@ -2110,7 +2112,7 @@ int main(int argc, char *argv[]) {
r = parse_argv(argc, argv);
if (r <= 0)
goto finish;
return r;
if (arg_image) {
assert(!arg_root);
@ -2138,12 +2140,10 @@ int main(int argc, char *argv[]) {
switch (arg_action) {
case ACTION_NEW_ID128:
r = id128_print_new(ID128_PRINT_PRETTY);
goto finish;
return id128_print_new(ID128_PRINT_PRETTY);
case ACTION_SETUP_KEYS:
r = setup_keys();
goto finish;
return setup_keys();
case ACTION_LIST_CATALOG:
case ACTION_DUMP_CATALOG:
@ -2151,15 +2151,13 @@ int main(int argc, char *argv[]) {
_cleanup_free_ char *database = NULL;
database = path_join(arg_root, CATALOG_DATABASE);
if (!database) {
r = log_oom();
goto finish;
}
if (!database)
return log_oom();
if (arg_action == ACTION_UPDATE_CATALOG) {
r = catalog_update(database, arg_root, catalog_file_dirs);
if (r < 0)
log_error_errno(r, "Failed to list catalog: %m");
return log_error_errno(r, "Failed to list catalog: %m");
} else {
bool oneline = arg_action == ACTION_LIST_CATALOG;
@ -2170,27 +2168,23 @@ int main(int argc, char *argv[]) {
else
r = catalog_list(stdout, database, oneline);
if (r < 0)
log_error_errno(r, "Failed to list catalog: %m");
return log_error_errno(r, "Failed to list catalog: %m");
}
goto finish;
return 0;
}
case ACTION_FLUSH:
r = flush_to_var();
goto finish;
return flush_to_var();
case ACTION_RELINQUISH_VAR:
r = relinquish_var();
goto finish;
return relinquish_var();
case ACTION_SYNC:
r = sync_journal();
goto finish;
return sync_journal();
case ACTION_ROTATE:
r = rotate();
goto finish;
return rotate();
case ACTION_SHOW:
case ACTION_PRINT_HEADER:
@ -2222,18 +2216,14 @@ int main(int argc, char *argv[]) {
_cleanup_(sd_bus_flush_close_unrefp) sd_bus *bus = NULL;
int fd;
if (geteuid() != 0) {
if (geteuid() != 0)
/* The file descriptor returned by OpenMachineRootDirectory() will be owned by users/groups of
* the container, thus we need root privileges to override them. */
r = log_error_errno(SYNTHETIC_ERRNO(EPERM), "Using the --machine= switch requires root privileges.");
goto finish;
}
return log_error_errno(SYNTHETIC_ERRNO(EPERM), "Using the --machine= switch requires root privileges.");
r = sd_bus_open_system(&bus);
if (r < 0) {
log_error_errno(r, "Failed to open system bus: %m");
goto finish;
}
if (r < 0)
return log_error_errno(r, "Failed to open system bus: %m");
r = sd_bus_call_method(
bus,
@ -2244,41 +2234,31 @@ int main(int argc, char *argv[]) {
&error,
&reply,
"s", arg_machine);
if (r < 0) {
log_error_errno(r, "Failed to open root directory: %s", bus_error_message(&error, r));
goto finish;
}
if (r < 0)
return log_error_errno(r, "Failed to open root directory: %s", bus_error_message(&error, r));
r = sd_bus_message_read(reply, "h", &fd);
if (r < 0) {
bus_log_parse_error(r);
goto finish;
}
fd = fcntl(fd, F_DUPFD_CLOEXEC, 3);
if (fd < 0) {
r = log_error_errno(errno, "Failed to duplicate file descriptor: %m");
goto finish;
}
r = sd_journal_open_directory_fd(&j, fd, SD_JOURNAL_OS_ROOT);
if (r < 0)
safe_close(fd);
return bus_log_parse_error(r);
machine_fd = fcntl(fd, F_DUPFD_CLOEXEC, 3);
if (machine_fd < 0)
return log_error_errno(errno, "Failed to duplicate file descriptor: %m");
r = sd_journal_open_directory_fd(&j, machine_fd, SD_JOURNAL_OS_ROOT);
} else
r = sd_journal_open_namespace(
&j,
arg_namespace,
(arg_merge ? 0 : SD_JOURNAL_LOCAL_ONLY) |
arg_namespace_flags | arg_journal_type);
if (r < 0) {
log_error_errno(r, "Failed to open %s: %m", arg_directory ?: arg_file ? "files" : "journal");
goto finish;
}
if (r < 0)
return log_error_errno(r, "Failed to open %s: %m", arg_directory ?: arg_file ? "files" : "journal");
r = journal_access_check_and_warn(j, arg_quiet,
!(arg_journal_type == SD_JOURNAL_CURRENT_USER || arg_user_units));
if (r < 0)
goto finish;
return r;
switch (arg_action) {
@ -2294,61 +2274,58 @@ int main(int argc, char *argv[]) {
case ACTION_PRINT_HEADER:
journal_print_header(j);
r = 0;
goto finish;
return 0;
case ACTION_VERIFY:
r = verify(j, !arg_quiet);
goto finish;
return verify(j, !arg_quiet);
case ACTION_DISK_USAGE: {
uint64_t bytes = 0;
r = sd_journal_get_usage(j, &bytes);
if (r < 0)
goto finish;
return r;
printf("Archived and active journals take up %s in the file system.\n",
FORMAT_BYTES(bytes));
goto finish;
return 0;
}
case ACTION_LIST_BOOTS:
r = list_boots(j);
goto finish;
return list_boots(j);
case ACTION_ROTATE_AND_VACUUM:
r = rotate();
if (r < 0)
goto finish;
return r;
_fallthrough_;
case ACTION_VACUUM: {
Directory *d;
int ret = 0;
HASHMAP_FOREACH(d, j->directories_by_path) {
int q;
q = journal_directory_vacuum(d->path, arg_vacuum_size, arg_vacuum_n_files, arg_vacuum_time, NULL, !arg_quiet);
if (q < 0)
r = log_error_errno(q, "Failed to vacuum %s: %m", d->path);
r = journal_directory_vacuum(d->path, arg_vacuum_size, arg_vacuum_n_files, arg_vacuum_time, NULL, !arg_quiet);
if (r < 0) {
log_error_errno(r, "Failed to vacuum %s: %m", d->path);
if (ret >= 0)
ret = r;
}
}
goto finish;
return ret;
}
case ACTION_LIST_FIELD_NAMES: {
const char *field;
SD_JOURNAL_FOREACH_FIELD(j, field) {
SD_JOURNAL_FOREACH_FIELD(j, field)
printf("%s\n", field);
n_shown++;
}
r = 0;
goto finish;
return 0;
}
case ACTION_SHOW:
@ -2363,42 +2340,41 @@ int main(int argc, char *argv[]) {
sd_journal_has_runtime_files(j) > 0 &&
sd_journal_has_persistent_files(j) == 0) {
log_info("Specifying boot ID or boot offset has no effect, no persistent journal was found.");
r = 0;
goto finish;
if (arg_action == ACTION_SHOW && arg_compiled_pattern)
return -ENOENT;
return 0;
}
/* add_boot() must be called first!
* It may need to seek the journal to find parent boot IDs. */
r = add_boot(j);
if (r < 0)
goto finish;
return r;
r = add_dmesg(j);
if (r < 0)
goto finish;
return r;
r = add_units(j);
if (r < 0) {
log_error_errno(r, "Failed to add filter for units: %m");
goto finish;
}
if (r < 0)
return log_error_errno(r, "Failed to add filter for units: %m");
r = add_syslog_identifier(j);
if (r < 0) {
log_error_errno(r, "Failed to add filter for syslog identifiers: %m");
goto finish;
}
if (r < 0)
return log_error_errno(r, "Failed to add filter for syslog identifiers: %m");
r = add_priorities(j);
if (r < 0)
goto finish;
return r;
r = add_facilities(j);
if (r < 0)
goto finish;
return r;
r = add_matches(j, argv + optind);
if (r < 0)
goto finish;
return r;
if (DEBUG_LOGGING) {
_cleanup_free_ char *filter = NULL;
@ -2417,16 +2393,12 @@ int main(int argc, char *argv[]) {
assert(arg_field);
r = sd_journal_set_data_threshold(j, 0);
if (r < 0) {
log_error_errno(r, "Failed to unset data size threshold: %m");
goto finish;
}
if (r < 0)
return log_error_errno(r, "Failed to unset data size threshold: %m");
r = sd_journal_query_unique(j, arg_field);
if (r < 0) {
log_error_errno(r, "Failed to query unique data objects: %m");
goto finish;
}
if (r < 0)
return log_error_errno(r, "Failed to query unique data objects: %m");
SD_JOURNAL_FOREACH_UNIQUE(j, data, size) {
const void *eq;
@ -2443,8 +2415,7 @@ int main(int argc, char *argv[]) {
n_shown++;
}
r = 0;
goto finish;
return 0;
}
/* Opening the fd now means the first sd_journal_wait() will actually wait */
@ -2453,13 +2424,10 @@ int main(int argc, char *argv[]) {
if (poll_fd == -EMFILE) {
log_warning_errno(poll_fd, "Insufficient watch descriptors available. Reverting to -n.");
arg_follow = false;
} else if (poll_fd == -EMEDIUMTYPE) {
log_error_errno(poll_fd, "The --follow switch is not supported in conjunction with reading from STDIN.");
goto finish;
} else if (poll_fd < 0) {
log_error_errno(poll_fd, "Failed to get journal fd: %m");
goto finish;
}
} else if (poll_fd == -EMEDIUMTYPE)
return log_error_errno(poll_fd, "The --follow switch is not supported in conjunction with reading from STDIN.");
else if (poll_fd < 0)
return log_error_errno(poll_fd, "Failed to get journal fd: %m");
}
if (arg_cursor || arg_after_cursor || arg_cursor_file) {
@ -2468,10 +2436,8 @@ int main(int argc, char *argv[]) {
if (arg_cursor_file) {
r = read_one_line_file(arg_cursor_file, &cursor_from_file);
if (r < 0 && r != -ENOENT) {
log_error_errno(r, "Failed to read cursor file %s: %m", arg_cursor_file);
goto finish;
}
if (r < 0 && r != -ENOENT)
return log_error_errno(r, "Failed to read cursor file %s: %m", arg_cursor_file);
if (r > 0) {
cursor = cursor_from_file;
@ -2482,10 +2448,9 @@ int main(int argc, char *argv[]) {
if (cursor) {
r = sd_journal_seek_cursor(j, cursor);
if (r < 0) {
log_error_errno(r, "Failed to seek to cursor: %m");
goto finish;
}
if (r < 0)
return log_error_errno(r, "Failed to seek to cursor: %m");
use_cursor = true;
}
}
@ -2506,52 +2471,41 @@ int main(int argc, char *argv[]) {
} else if (arg_since_set && !arg_reverse) {
r = sd_journal_seek_realtime_usec(j, arg_since);
if (r < 0) {
log_error_errno(r, "Failed to seek to date: %m");
goto finish;
}
if (r < 0)
return log_error_errno(r, "Failed to seek to date: %m");
r = sd_journal_next(j);
} else if (arg_until_set && arg_reverse) {
r = sd_journal_seek_realtime_usec(j, arg_until);
if (r < 0) {
log_error_errno(r, "Failed to seek to date: %m");
goto finish;
}
if (r < 0)
return log_error_errno(r, "Failed to seek to date: %m");
r = sd_journal_previous(j);
} else if (arg_reverse) {
r = sd_journal_seek_tail(j);
if (r < 0) {
log_error_errno(r, "Failed to seek to tail: %m");
goto finish;
}
if (r < 0)
return log_error_errno(r, "Failed to seek to tail: %m");
r = sd_journal_previous(j);
} else if (arg_lines >= 0) {
r = sd_journal_seek_tail(j);
if (r < 0) {
log_error_errno(r, "Failed to seek to tail: %m");
goto finish;
}
if (r < 0)
return log_error_errno(r, "Failed to seek to tail: %m");
r = sd_journal_previous_skip(j, arg_lines);
} else {
r = sd_journal_seek_head(j);
if (r < 0) {
log_error_errno(r, "Failed to seek to head: %m");
goto finish;
}
if (r < 0)
return log_error_errno(r, "Failed to seek to head: %m");
r = sd_journal_next(j);
}
if (r < 0) {
log_error_errno(r, "Failed to iterate through journal: %m");
goto finish;
}
if (r < 0)
return log_error_errno(r, "Failed to iterate through journal: %m");
if (r == 0)
need_seek = true;
@ -2563,11 +2517,8 @@ int main(int argc, char *argv[]) {
char start_buf[FORMAT_TIMESTAMP_MAX], end_buf[FORMAT_TIMESTAMP_MAX];
r = sd_journal_get_cutoff_realtime_usec(j, &start, &end);
if (r < 0) {
log_error_errno(r, "Failed to get cutoff: %m");
goto finish;
}
if (r < 0)
return log_error_errno(r, "Failed to get cutoff: %m");
if (r > 0) {
if (arg_follow)
printf("-- Journal begins at %s. --\n",
@ -2589,10 +2540,8 @@ int main(int argc, char *argv[]) {
r = sd_journal_next(j);
else
r = sd_journal_previous(j);
if (r < 0) {
log_error_errno(r, "Failed to iterate through journal: %m");
goto finish;
}
if (r < 0)
return log_error_errno(r, "Failed to iterate through journal: %m");
if (r == 0)
break;
}
@ -2601,10 +2550,8 @@ int main(int argc, char *argv[]) {
usec_t usec;
r = sd_journal_get_realtime_usec(j, &usec);
if (r < 0) {
log_error_errno(r, "Failed to determine timestamp: %m");
goto finish;
}
if (r < 0)
return log_error_errno(r, "Failed to determine timestamp: %m");
if (usec > arg_until)
break;
}
@ -2613,10 +2560,8 @@ int main(int argc, char *argv[]) {
usec_t usec;
r = sd_journal_get_realtime_usec(j, &usec);
if (r < 0) {
log_error_errno(r, "Failed to determine timestamp: %m");
goto finish;
}
if (r < 0)
return log_error_errno(r, "Failed to determine timestamp: %m");
if (usec < arg_since)
break;
}
@ -2647,8 +2592,7 @@ int main(int argc, char *argv[]) {
continue;
}
log_error_errno(r, "Failed to get MESSAGE field: %m");
goto finish;
return log_error_errno(r, "Failed to get MESSAGE field: %m");
}
assert_se(message = startswith(message, "MESSAGE="));
@ -2656,7 +2600,7 @@ int main(int argc, char *argv[]) {
r = pattern_matches_and_log(arg_compiled_pattern, message,
len - strlen("MESSAGE="), highlight);
if (r < 0)
goto finish;
return r;
if (r == 0) {
need_seek = true;
continue;
@ -2677,8 +2621,8 @@ int main(int argc, char *argv[]) {
need_seek = true;
if (r == -EADDRNOTAVAIL)
break;
else if (r < 0)
goto finish;
if (r < 0)
return r;
n_shown++;
@ -2690,10 +2634,8 @@ int main(int argc, char *argv[]) {
* (deleted) journal files. */
if ((n_shown % PROCESS_INOTIFY_INTERVAL) == 0) {
r = sd_journal_process(j);
if (r < 0) {
log_error_errno(r, "Failed to process inotify events: %m");
goto finish;
}
if (r < 0)
return log_error_errno(r, "Failed to process inotify events: %m");
}
}
@ -2707,7 +2649,7 @@ int main(int argc, char *argv[]) {
r = wait_for_change(j, poll_fd);
if (r < 0)
goto finish;
return r;
first_line = false;
}
@ -2717,8 +2659,8 @@ int main(int argc, char *argv[]) {
r = sd_journal_get_cursor(j, &cursor);
if (r < 0 && r != -EADDRNOTAVAIL)
log_error_errno(r, "Failed to get cursor: %m");
else if (r >= 0) {
return log_error_errno(r, "Failed to get cursor: %m");
if (r >= 0) {
if (arg_show_cursor)
printf("-- cursor: %s\n", cursor);
@ -2727,23 +2669,20 @@ int main(int argc, char *argv[]) {
WRITE_STRING_FILE_CREATE |
WRITE_STRING_FILE_ATOMIC);
if (r < 0)
log_error_errno(r,
"Failed to write new cursor to %s: %m",
arg_cursor_file);
return log_error_errno(r, "Failed to write new cursor to %s: %m",
arg_cursor_file);
}
}
}
finish:
pager_close();
if (arg_compiled_pattern && r == 0 && n_shown == 0)
if (arg_compiled_pattern && n_shown == 0)
/* --grep was used, no error was thrown, but the pattern didn't
* match anything. Let's mimic grep's behavior here and return
* a non-zero exit code, so journalctl --grep can be used
* in scripts and such */
r = -ENOENT;
return -ENOENT;
static_destruct();
return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
return 0;
}
DEFINE_MAIN_FUNCTION(run);