X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fjournal%2Fcoredumpctl.c;h=bf943bc032528ca717630c5c293570f5d736409d;hp=8bfab0075f5438ee7ad79d080203455f253b4fc3;hb=03e334a1c7dc8c20c38902aa039440763acc9b17;hpb=1b12a7b5896f94bdf33b3a6661ebabd761ea6adc diff --git a/src/journal/coredumpctl.c b/src/journal/coredumpctl.c index 8bfab0075..bf943bc03 100644 --- a/src/journal/coredumpctl.c +++ b/src/journal/coredumpctl.c @@ -34,6 +34,8 @@ #include "log.h" #include "path-util.h" #include "pager.h" +#include "macro.h" +#include "journal-internal.h" static enum { ACTION_NONE, @@ -42,7 +44,6 @@ static enum { ACTION_GDB, } arg_action = ACTION_LIST; -static Set *matches = NULL; static FILE* output = NULL; static char* field = NULL; @@ -67,10 +68,9 @@ static Set *new_matches(void) { return NULL; } - r = set_put(set, tmp); + r = set_consume(set, tmp); if (r < 0) { log_error("failed to add to set: %s", strerror(-r)); - free(tmp); set_free(set); return NULL; } @@ -84,6 +84,7 @@ static int help(void) { "Flags:\n" " -o --output=FILE Write output to FILE\n" " --no-pager Do not pipe output into a pager\n" + " --no-legend Do not print the column headers.\n\n" "Commands:\n" " -h --help Show this help\n" @@ -103,7 +104,7 @@ static int add_match(Set *set, const char *match) { unsigned pid; const char* prefix; char *pattern = NULL; - char _cleanup_free_ *p = NULL; + _cleanup_free_ char *p = NULL; if (strchr(match, '=')) prefix = ""; @@ -124,22 +125,22 @@ static int add_match(Set *set, const char *match) { if (!pattern) goto fail; + log_debug("Adding pattern: %s", pattern); r = set_put(set, pattern); if (r < 0) { - log_error("failed to add pattern '%s': %s", + log_error("Failed to add pattern '%s': %s", pattern, strerror(-r)); + free(pattern); goto fail; } - log_debug("Added pattern: %s", pattern); return 0; fail: - free(pattern); - log_error("failed to add match: %s", strerror(-r)); + log_error("Failed to add match: %s", strerror(-r)); return r; } -static int parse_argv(int argc, char *argv[]) { +static int parse_argv(int argc, char *argv[], Set *matches) { enum { ARG_VERSION = 0x100, ARG_NO_PAGER, @@ -155,7 +156,7 @@ static int parse_argv(int argc, char *argv[]) { { "no-legend", no_argument, NULL, ARG_NO_LEGEND }, { "output", required_argument, NULL, 'o' }, { "field", required_argument, NULL, 'F' }, - { NULL, 0, NULL, 0 } + {} }; assert(argc >= 0); @@ -163,15 +164,15 @@ static int parse_argv(int argc, char *argv[]) { while ((c = getopt_long(argc, argv, "ho:F:", options, NULL)) >= 0) switch(c) { + case 'h': - help(); arg_action = ACTION_NONE; - return 0; + return help(); case ARG_VERSION: + arg_action = ACTION_NONE; puts(PACKAGE_STRING); puts(SYSTEMD_FEATURES); - arg_action = ACTION_NONE; return 0; case ARG_NO_PAGER: @@ -209,13 +210,12 @@ static int parse_argv(int argc, char *argv[]) { return -EINVAL; default: - log_error("Unknown option code %c", c); - return -EINVAL; + assert_not_reached("Unhandled option"); } if (optind < argc) { const char *cmd = argv[optind++]; - if(streq(cmd, "list")) + if (streq(cmd, "list")) arg_action = ACTION_LIST; else if (streq(cmd, "dump")) arg_action = ACTION_DUMP; @@ -268,7 +268,7 @@ static int retrieve(const void *data, } static void print_field(FILE* file, sd_journal *j) { - const char _cleanup_free_ *value = NULL; + _cleanup_free_ const char *value = NULL; const void *d; size_t l; @@ -281,7 +281,7 @@ static void print_field(FILE* file, sd_journal *j) { } static int print_entry(FILE* file, sd_journal *j, int had_legend) { - const char _cleanup_free_ + _cleanup_free_ const char *pid = NULL, *uid = NULL, *gid = NULL, *sgnl = NULL, *exe = NULL; const void *d; @@ -342,7 +342,7 @@ static int dump_list(sd_journal *j) { assert(j); /* The coredumps are likely to compressed, and for just - * listing them we don#t need to decompress them, so let's + * listing them we don't need to decompress them, so let's * pick a fairly low data threshold here */ sd_journal_set_data_threshold(j, 4096); @@ -417,7 +417,7 @@ static int dump_core(sd_journal* j) { r = sd_journal_previous(j); if (r >= 0) - log_warning("More than one entry matches, ignoring rest.\n"); + log_warning("More than one entry matches, ignoring rest."); return 0; } @@ -472,7 +472,7 @@ static int run_gdb(sd_journal *j) { data = (const uint8_t*) data + 9; len -= 9; - fd = mkostemp(path, O_WRONLY); + fd = mkostemp_safe(path, O_WRONLY|O_CLOEXEC); if (fd < 0) { log_error("Failed to create temporary file: %m"); return -errno; @@ -480,7 +480,7 @@ static int run_gdb(sd_journal *j) { sz = write(fd, data, len); if (sz < 0) { - log_error("Failed to write temporary file: %s", strerror(errno)); + log_error("Failed to write temporary file: %m"); r = -errno; goto finish; } @@ -490,8 +490,7 @@ static int run_gdb(sd_journal *j) { goto finish; } - close_nointr_nofail(fd); - fd = -1; + fd = safe_close(fd); pid = fork(); if (pid < 0) { @@ -519,10 +518,11 @@ finish: } int main(int argc, char *argv[]) { - sd_journal *j = NULL; + _cleanup_journal_close_ sd_journal*j = NULL; const char* match; Iterator it; int r = 0; + _cleanup_set_free_free_ Set *matches = NULL; setlocale(LC_ALL, ""); log_parse_environment(); @@ -534,7 +534,7 @@ int main(int argc, char *argv[]) { goto end; } - r = parse_argv(argc, argv); + r = parse_argv(argc, argv, matches); if (r < 0) goto end; @@ -556,6 +556,13 @@ int main(int argc, char *argv[]) { } } + if (_unlikely_(log_get_max_level() >= LOG_PRI(LOG_DEBUG))) { + _cleanup_free_ char *filter; + + filter = journal_make_match_string(j); + log_debug("Journal filter: %s", filter); + } + switch(arg_action) { case ACTION_LIST: @@ -578,11 +585,6 @@ int main(int argc, char *argv[]) { } end: - if (j) - sd_journal_close(j); - - set_free_free(matches); - pager_close(); if (output)