chiark / gitweb /
journal: when show blob data show length
[elogind.git] / src / logs-show.c
index cb18da2aa5ae21ee61cf29cb491fa928706e7c31..5a001331407f9fa7a9c08a0fa707101c91fc2540 100644 (file)
@@ -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;
                 uint64_t x;
                 time_t t;
                 struct tm tm;
+
                 r = -ENOENT;
 
                 if (realtime)
                 r = -ENOENT;
 
                 if (realtime)
@@ -224,9 +225,10 @@ static int output_short(sd_journal *j, unsigned line, bool show_all, bool monoto
 
         if (show_all)
                 printf(": %.*s\n", (int) message_len, message);
 
         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 < columns())
                 printf(": %.*s\n", (int) message_len, message);
         else if (n < columns()) {
                 char *e;
                 printf(": %.*s\n", (int) message_len, message);
         else if (n < columns()) {
                 char *e;
@@ -236,7 +238,7 @@ static int output_short(sd_journal *j, unsigned line, bool show_all, bool monoto
                 if (!e)
                         printf(": %.*s\n", (int) message_len, message);
                 else
                 if (!e)
                         printf(": %.*s\n", (int) message_len, message);
                 else
-                        printf(": %s", e);
+                        printf(": %s\n", e);
 
                 free(e);
         } else
 
                 free(e);
         } else
@@ -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;
                 if (!show_all && (length > PRINT_THRESHOLD ||
                                   contains_unprintable(data, length))) {
                         const char *c;
+                        char bytes[FORMAT_BYTES_MAX];
 
                         c = memchr(data, '=', length);
                         if (!c) {
 
                         c = memchr(data, '=', length);
                         if (!c) {
@@ -304,9 +307,10 @@ static int output_verbose(sd_journal *j, unsigned line, bool show_all) {
                                 return -EINVAL;
                         }
 
                                 return -EINVAL;
                         }
 
-                        printf("\t%.*s=[blob data]\n",
+                        printf("\t%.*s=[%s blob data]\n",
                                (int) (c - (const char*) data),
                                (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);
         }
                 } else
                         printf("\t%.*s\n", (int) length, (const char*) data);
         }
@@ -487,12 +491,34 @@ static int output_json(sd_journal *j, unsigned line, bool show_all) {
         return 0;
 }
 
         return 0;
 }
 
+static int output_cat(sd_journal *j, unsigned line, 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, bool show_all) = {
         [OUTPUT_SHORT] = output_short_realtime,
         [OUTPUT_SHORT_MONOTONIC] = output_short_monotonic,
         [OUTPUT_VERBOSE] = output_verbose,
         [OUTPUT_EXPORT] = output_export,
 static int (*output_funcs[_OUTPUT_MODE_MAX])(sd_journal*j, unsigned line, 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, bool show_all) {
@@ -635,7 +661,8 @@ static const char *const output_mode_table[_OUTPUT_MODE_MAX] = {
         [OUTPUT_SHORT_MONOTONIC] = "short-monotonic",
         [OUTPUT_VERBOSE] = "verbose",
         [OUTPUT_EXPORT] = "export",
         [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);
 };
 
 DEFINE_STRING_TABLE_LOOKUP(output_mode, OutputMode);