]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
coredumpctl: support --file=PATH 15414/head
authorFrantisek Sumsal <frantisek@sumsal.cz>
Sun, 12 Apr 2020 18:39:09 +0000 (20:39 +0200)
committerFrantisek Sumsal <frantisek@sumsal.cz>
Mon, 13 Apr 2020 15:10:27 +0000 (17:10 +0200)
Let's match journalctl's functionality by throwing --file for
coredumpctl into the mix, so we can work on a single journal file
as well.

man/coredumpctl.xml
src/coredump/coredumpctl.c

index 4e99bc0d69880917467d1368d17d15283ea9a62c..ab5dffdfb37411dd09da8be8386deb5949af0637 100644 (file)
         will be used. </para></listitem>
       </varlistentry>
 
+      <varlistentry>
+        <term><option>--file=<replaceable>GLOB</replaceable></option></term>
+
+        <listitem><para>Takes a file glob as an argument. If
+        specified, coredumpctl will operate on the specified journal
+        files matching <replaceable>GLOB</replaceable> instead of the
+        default runtime and system journal paths. May be specified
+        multiple times, in which case files will be suitably
+        interleaved.</para></listitem>
+      </varlistentry>
+
       <varlistentry>
         <term><option>-D</option> <replaceable>DIR</replaceable></term>
         <term><option>--directory=</option><replaceable>DIR</replaceable></term>
index ed124649611f2e7250d536dd35313aea7ca0ad72..a848268177ae5558ce5ab7974c4c274a894de24f 100644 (file)
@@ -17,6 +17,7 @@
 #include "def.h"
 #include "fd-util.h"
 #include "fs-util.h"
+#include "glob-util.h"
 #include "journal-internal.h"
 #include "journal-util.h"
 #include "log.h"
@@ -44,6 +45,7 @@ static usec_t arg_since = USEC_INFINITY, arg_until = USEC_INFINITY;
 static const char* arg_field = NULL;
 static const char *arg_debugger = NULL;
 static const char *arg_directory = NULL;
+static char **arg_file = NULL;
 static PagerFlags arg_pager_flags = 0;
 static int arg_no_legend = false;
 static int arg_one = false;
@@ -51,6 +53,8 @@ static const char* arg_output = NULL;
 static bool arg_reverse = false;
 static bool arg_quiet = false;
 
+STATIC_DESTRUCTOR_REGISTER(arg_file, strv_freep);
+
 static int add_match(sd_journal *j, const char *match) {
         _cleanup_free_ char *p = NULL;
         const char* prefix, *pattern;
@@ -111,6 +115,10 @@ static int acquire_journal(sd_journal **ret, char **matches) {
                 r = sd_journal_open_directory(&j, arg_directory, 0);
                 if (r < 0)
                         return log_error_errno(r, "Failed to open journals in directory: %s: %m", arg_directory);
+        } else if (arg_file) {
+                r = sd_journal_open_files(&j, (const char**)arg_file, 0);
+                if (r < 0)
+                        return log_error_errno(r, "Failed to open journal files: %m");
         } else {
                 r = sd_journal_open(&j, SD_JOURNAL_LOCAL_ONLY);
                 if (r < 0)
@@ -164,6 +172,7 @@ static int help(void) {
                "  -r --reverse           Show the newest entries first\n"
                "  -F --field=FIELD       List all values a certain field takes\n"
                "  -o --output=FILE       Write output to FILE\n"
+               "     --file=PATH         Use journal file\n"
                "  -D --directory=DIR     Use journal files from directory\n\n"
                "  -q --quiet             Do not show info messages and privilege warning\n"
                "\nSee the %s for details.\n"
@@ -182,6 +191,7 @@ static int parse_argv(int argc, char *argv[]) {
                 ARG_NO_PAGER,
                 ARG_NO_LEGEND,
                 ARG_DEBUGGER,
+                ARG_FILE,
         };
 
         int c, r;
@@ -194,6 +204,7 @@ static int parse_argv(int argc, char *argv[]) {
                 { "debugger",     required_argument, NULL, ARG_DEBUGGER  },
                 { "output",       required_argument, NULL, 'o'           },
                 { "field",        required_argument, NULL, 'F'           },
+                { "file",         required_argument, NULL, ARG_FILE      },
                 { "directory",    required_argument, NULL, 'D'           },
                 { "reverse",      no_argument,       NULL, 'r'           },
                 { "since",        required_argument, NULL, 'S'           },
@@ -225,6 +236,12 @@ static int parse_argv(int argc, char *argv[]) {
                         arg_debugger = optarg;
                         break;
 
+                case ARG_FILE:
+                        r = glob_extend(&arg_file, optarg);
+                        if (r < 0)
+                                return log_error_errno(r, "Failed to add paths: %m");
+                        break;
+
                 case 'o':
                         if (arg_output)
                                 return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
@@ -1096,6 +1113,7 @@ static int run(int argc, char *argv[]) {
                        ansi_highlight_red(),
                        units_active, units_active == 1 ? "unit is running" : "units are running",
                        ansi_normal());
+
         return r;
 }