coredumpctl: handle errors earlier

No functional change, just refactoring.
This commit is contained in:
Yu Watanabe
2026-08-26 02:13:11 +09:00
parent c616943f7e
commit 89a5de18f3
+24 -27
View File
@@ -86,9 +86,6 @@ static int acquire_core_from_journal(sd_journal *j, int fd, char **ret_tmpfile)
}
int acquire_core(sd_journal *j, int fd, char **ret_tmpfile, char **ret_path) {
const char *data;
_cleanup_free_ char *filename = NULL;
size_t len;
int r;
assert(j);
@@ -96,31 +93,10 @@ int acquire_core(sd_journal *j, int fd, char **ret_tmpfile, char **ret_path) {
assert((fd >= 0) == !ret_path);
/* Look for a coredump on disk first. */
const char *data;
size_t len;
r = sd_journal_get_data(j, "COREDUMP_FILENAME", (const void**) &data, &len);
if (r == 0) {
_cleanup_free_ char *resolved = NULL;
r = retrieve(data, len, "COREDUMP_FILENAME", &filename);
if (r < 0)
return r;
assert(r > 0);
r = chase_and_access(filename, arg_root, CHASE_PREFIX_ROOT, F_OK, &resolved);
if (r < 0)
return log_error_errno(r, "Cannot access \"%s%s\": %m", strempty(arg_root), filename);
free_and_replace(filename, resolved);
if (ret_path && !ENDSWITH_SET(filename, ".xz", ".lz4", ".zst")) {
*ret_tmpfile = NULL;
*ret_path = TAKE_PTR(filename);
return 0;
}
} else {
if (r != -ENOENT)
return log_error_errno(r, "Failed to retrieve COREDUMP_FILENAME field: %m");
if (r == -ENOENT) {
/* If not found, try to obtain a coredump from a COREDUMP field. */
r = acquire_core_from_journal(j, fd, ret_tmpfile);
if (r < 0)
@@ -131,6 +107,27 @@ int acquire_core(sd_journal *j, int fd, char **ret_tmpfile, char **ret_path) {
return 0;
}
if (r < 0)
return log_error_errno(r, "Failed to retrieve COREDUMP_FILENAME field: %m");
_cleanup_free_ char *filename = NULL;
r = retrieve(data, len, "COREDUMP_FILENAME", &filename);
if (r < 0)
return r;
assert(r > 0);
_cleanup_free_ char *path = NULL;
r = chase_and_access(filename, arg_root, CHASE_PREFIX_ROOT, F_OK, &path);
if (r < 0)
return log_error_errno(r, "Cannot access \"%s%s\": %m", strempty(arg_root), filename);
free_and_replace(filename, path);
if (ret_path && !ENDSWITH_SET(filename, ".xz", ".lz4", ".zst")) {
*ret_tmpfile = NULL;
*ret_path = TAKE_PTR(filename);
return 0;
}
_cleanup_(unlink_and_freep) char *temp = NULL;
_cleanup_close_ int fdt = -EBADF;