chiark / gitweb /
main: added support for loading IMA custom policies
[elogind.git] / src / logs-show.c
index cb18da2aa5ae21ee61cf29cb491fa928706e7c31..f71c6b08455d8823d29b8fd10b064a8b23bf4d58 100644 (file)
@@ -86,7 +86,7 @@ static bool shall_print(bool show_all, char *p, size_t l) {
         return true;
 }
 
-static int output_short(sd_journal *j, unsigned line, bool show_all, bool monotonic_mode) {
+static int output_short(sd_journal *j, unsigned line, unsigned n_columns, bool show_all, bool monotonic_mode) {
         int r;
         const void *data;
         size_t length;
@@ -178,6 +178,7 @@ static int output_short(sd_journal *j, unsigned line, bool show_all, bool monoto
                 uint64_t x;
                 time_t t;
                 struct tm tm;
+
                 r = -ENOENT;
 
                 if (realtime)
@@ -224,19 +225,20 @@ static int output_short(sd_journal *j, unsigned line, bool show_all, bool monoto
 
         if (show_all)
                 printf(": %.*s\n", (int) message_len, message);
-        else if (contains_unprintable(message, message_len))
-                fputs(": [blob data]\n", stdout);
-        else if (message_len + n < columns())
+        else if (contains_unprintable(message, message_len)) {
+                char bytes[FORMAT_BYTES_MAX];
+                printf(": [%s blob data]\n", format_bytes(bytes, sizeof(bytes), message_len));
+        } else if (message_len + n < n_columns)
                 printf(": %.*s\n", (int) message_len, message);
-        else if (n < columns()) {
+        else if (n < n_columns) {
                 char *e;
 
-                e = ellipsize_mem(message, message_len, columns() - n - 2, 90);
+                e = ellipsize_mem(message, message_len, n_columns - n - 2, 90);
 
                 if (!e)
                         printf(": %.*s\n", (int) message_len, message);
                 else
-                        printf(": %s", e);
+                        printf(": %s\n", e);
 
                 free(e);
         } else
@@ -257,15 +259,15 @@ finish:
         return r;
 }
 
-static int output_short_realtime(sd_journal *j, unsigned line, bool show_all) {
-        return output_short(j, line, show_all, false);
+static int output_short_realtime(sd_journal *j, unsigned line, unsigned n_columns, bool show_all) {
+        return output_short(j, line, n_columns, show_all, false);
 }
 
-static int output_short_monotonic(sd_journal *j, unsigned line, bool show_all) {
-        return output_short(j, line, show_all, true);
+static int output_short_monotonic(sd_journal *j, unsigned line, unsigned n_columns, bool show_all) {
+        return output_short(j, line, n_columns, show_all, true);
 }
 
-static int output_verbose(sd_journal *j, unsigned line, bool show_all) {
+static int output_verbose(sd_journal *j, unsigned line, unsigned n_columns, bool show_all) {
         const void *data;
         size_t length;
         char *cursor;
@@ -297,6 +299,7 @@ static int output_verbose(sd_journal *j, unsigned line, bool show_all) {
                 if (!show_all && (length > PRINT_THRESHOLD ||
                                   contains_unprintable(data, length))) {
                         const char *c;
+                        char bytes[FORMAT_BYTES_MAX];
 
                         c = memchr(data, '=', length);
                         if (!c) {
@@ -304,9 +307,10 @@ static int output_verbose(sd_journal *j, unsigned line, bool show_all) {
                                 return -EINVAL;
                         }
 
-                        printf("\t%.*s=[blob data]\n",
+                        printf("\t%.*s=[%s blob data]\n",
                                (int) (c - (const char*) data),
-                               (const char*) data);
+                               (const char*) data,
+                               format_bytes(bytes, sizeof(bytes), length - (c - (const char *) data) - 1));
                 } else
                         printf("\t%.*s\n", (int) length, (const char*) data);
         }
@@ -314,7 +318,7 @@ static int output_verbose(sd_journal *j, unsigned line, bool show_all) {
         return 0;
 }
 
-static int output_export(sd_journal *j, unsigned line, bool show_all) {
+static int output_export(sd_journal *j, unsigned line, unsigned n_columns, bool show_all) {
         sd_id128_t boot_id;
         char sid[33];
         int r;
@@ -420,7 +424,7 @@ static void json_escape(const char* p, size_t l) {
         }
 }
 
-static int output_json(sd_journal *j, unsigned line, bool show_all) {
+static int output_json(sd_journal *j, unsigned line, unsigned n_columns, bool show_all) {
         uint64_t realtime, monotonic;
         char *cursor;
         const void *data;
@@ -487,25 +491,49 @@ static int output_json(sd_journal *j, unsigned line, bool show_all) {
         return 0;
 }
 
-static int (*output_funcs[_OUTPUT_MODE_MAX])(sd_journal*j, unsigned line, bool show_all) = {
+static int output_cat(sd_journal *j, unsigned line, unsigned n_columns, bool show_all) {
+        const void *data;
+        size_t l;
+        int r;
+
+        assert(j);
+
+        r = sd_journal_get_data(j, "MESSAGE", &data, &l);
+        if (r < 0) {
+                log_error("Failed to get data: %s", strerror(-r));
+                return r;
+        }
+
+        assert(l >= 8);
+
+        fwrite((const char*) data + 8, 1, l - 8, stdout);
+        putchar('\n');
+
+        return 0;
+}
+
+static int (*output_funcs[_OUTPUT_MODE_MAX])(sd_journal*j, unsigned line, unsigned n_columns, bool show_all) = {
         [OUTPUT_SHORT] = output_short_realtime,
         [OUTPUT_SHORT_MONOTONIC] = output_short_monotonic,
         [OUTPUT_VERBOSE] = output_verbose,
         [OUTPUT_EXPORT] = output_export,
-        [OUTPUT_JSON] = output_json
+        [OUTPUT_JSON] = output_json,
+        [OUTPUT_CAT] = output_cat
 };
 
-int output_journal(sd_journal *j, OutputMode mode, unsigned line, bool show_all) {
+int output_journal(sd_journal *j, OutputMode mode, unsigned line, unsigned n_columns, bool show_all) {
         assert(mode >= 0);
         assert(mode < _OUTPUT_MODE_MAX);
 
-        return output_funcs[mode](j, line, show_all);
+        if (n_columns <= 0)
+                n_columns = columns();
+
+        return output_funcs[mode](j, line, n_columns, show_all);
 }
 
 int show_journal_by_unit(
                 const char *unit,
                 OutputMode mode,
-                const char *prefix,
                 unsigned n_columns,
                 usec_t not_before,
                 unsigned how_many,
@@ -532,12 +560,6 @@ int show_journal_by_unit(
         if (how_many <= 0)
                 return 0;
 
-        if (n_columns <= 0)
-                n_columns = columns();
-
-        if (!prefix)
-                prefix = "";
-
         if (asprintf(&m, "_SYSTEMD_UNIT=%s", unit) < 0) {
                 r = -ENOMEM;
                 goto finish;
@@ -599,7 +621,7 @@ int show_journal_by_unit(
 
                         line ++;
 
-                        r = output_journal(j, mode, line, show_all);
+                        r = output_journal(j, mode, line, n_columns, show_all);
                         if (r < 0)
                                 goto finish;
                 }
@@ -607,7 +629,7 @@ int show_journal_by_unit(
                 if (!follow)
                         break;
 
-                r = fd_wait_for_event(fd, POLLIN);
+                r = fd_wait_for_event(fd, POLLIN, (usec_t) -1);
                 if (r < 0)
                         goto finish;
 
@@ -635,7 +657,8 @@ static const char *const output_mode_table[_OUTPUT_MODE_MAX] = {
         [OUTPUT_SHORT_MONOTONIC] = "short-monotonic",
         [OUTPUT_VERBOSE] = "verbose",
         [OUTPUT_EXPORT] = "export",
-        [OUTPUT_JSON] = "json"
+        [OUTPUT_JSON] = "json",
+        [OUTPUT_CAT] = "cat"
 };
 
 DEFINE_STRING_TABLE_LOOKUP(output_mode, OutputMode);