4848#include "stdio-util.h"
4949#include "string-table.h"
5050#include "string-util.h"
51+ #include "strv.h"
5152#include "terminal-util.h"
5253#include "time-util.h"
5354#include "utf8.h"
@@ -136,6 +137,19 @@ static int parse_fieldv(const void *data, size_t length, const ParseFieldVec *fi
136137 return 0 ;
137138}
138139
140+ static int field_set_test (Set * fields , const char * name , size_t n ) {
141+ char * s = NULL ;
142+
143+ if (!fields )
144+ return 1 ;
145+
146+ s = strndupa (name , n );
147+ if (!s )
148+ return log_oom ();
149+
150+ return set_get (fields , s ) ? 1 : 0 ;
151+ }
152+
139153static bool shall_print (const char * p , size_t l , OutputFlags flags ) {
140154 assert (p );
141155
@@ -353,7 +367,8 @@ static int output_short(
353367 sd_journal * j ,
354368 OutputMode mode ,
355369 unsigned n_columns ,
356- OutputFlags flags ) {
370+ OutputFlags flags ,
371+ Set * output_fields ) {
357372
358373 int r ;
359374 const void * data ;
@@ -466,7 +481,8 @@ static int output_verbose(
466481 sd_journal * j ,
467482 OutputMode mode ,
468483 unsigned n_columns ,
469- OutputFlags flags ) {
484+ OutputFlags flags ,
485+ Set * output_fields ) {
470486
471487 const void * data ;
472488 size_t length ;
@@ -527,6 +543,12 @@ static int output_verbose(
527543 }
528544 fieldlen = c - (const char * ) data ;
529545
546+ r = field_set_test (output_fields , data , fieldlen );
547+ if (r < 0 )
548+ return r ;
549+ if (!r )
550+ continue ;
551+
530552 if (flags & OUTPUT_COLOR && startswith (data , "MESSAGE=" )) {
531553 on = ANSI_HIGHLIGHT ;
532554 off = ANSI_NORMAL ;
@@ -564,7 +586,8 @@ static int output_export(
564586 sd_journal * j ,
565587 OutputMode mode ,
566588 unsigned n_columns ,
567- OutputFlags flags ) {
589+ OutputFlags flags ,
590+ Set * output_fields ) {
568591
569592 sd_id128_t boot_id ;
570593 char sid [33 ];
@@ -601,25 +624,31 @@ static int output_export(
601624 sd_id128_to_string (boot_id , sid ));
602625
603626 JOURNAL_FOREACH_DATA_RETVAL (j , data , length , r ) {
627+ const char * c ;
604628
605629 /* We already printed the boot id, from the data in
606630 * the header, hence let's suppress it here */
607631 if (length >= 9 &&
608632 startswith (data , "_BOOT_ID=" ))
609633 continue ;
610634
635+ c = memchr (data , '=' , length );
636+ if (!c ) {
637+ log_error ("Invalid field." );
638+ return - EINVAL ;
639+ }
640+
641+ r = field_set_test (output_fields , data , c - (const char * ) data );
642+ if (r < 0 )
643+ return r ;
644+ if (!r )
645+ continue ;
646+
611647 if (utf8_is_printable_newline (data , length , false))
612648 fwrite (data , length , 1 , f );
613649 else {
614- const char * c ;
615650 uint64_t le64 ;
616651
617- c = memchr (data , '=' , length );
618- if (!c ) {
619- log_error ("Invalid field." );
620- return - EINVAL ;
621- }
622-
623652 fwrite (data , c - (const char * ) data , 1 , f );
624653 fputc ('\n' , f );
625654 le64 = htole64 (length - (c - (const char * ) data ) - 1 );
@@ -695,7 +724,8 @@ static int output_json(
695724 sd_journal * j ,
696725 OutputMode mode ,
697726 unsigned n_columns ,
698- OutputFlags flags ) {
727+ OutputFlags flags ,
728+ Set * output_fields ) {
699729
700730 uint64_t realtime , monotonic ;
701731 _cleanup_free_ char * cursor = NULL ;
@@ -814,13 +844,6 @@ static int output_json(
814844 if (!eq )
815845 continue ;
816846
817- if (separator ) {
818- if (mode == OUTPUT_JSON_PRETTY )
819- fputs (",\n\t" , f );
820- else
821- fputs (", " , f );
822- }
823-
824847 m = eq - (const char * ) data ;
825848
826849 n = strndup (data , m );
@@ -829,6 +852,18 @@ static int output_json(
829852 goto finish ;
830853 }
831854
855+ if (output_fields && !set_get (output_fields , n )) {
856+ free (n );
857+ continue ;
858+ }
859+
860+ if (separator ) {
861+ if (mode == OUTPUT_JSON_PRETTY )
862+ fputs (",\n\t" , f );
863+ else
864+ fputs (", " , f );
865+ }
866+
832867 u = PTR_TO_UINT (hashmap_get2 (h , n , (void * * ) & kk ));
833868 if (u == 0 ) {
834869 /* We already printed this, let's jump to the next */
@@ -913,7 +948,8 @@ static int output_cat(
913948 sd_journal * j ,
914949 OutputMode mode ,
915950 unsigned n_columns ,
916- OutputFlags flags ) {
951+ OutputFlags flags ,
952+ Set * output_fields ) {
917953
918954 const void * data ;
919955 size_t l ;
@@ -946,7 +982,8 @@ static int (*output_funcs[_OUTPUT_MODE_MAX])(
946982 sd_journal * j ,
947983 OutputMode mode ,
948984 unsigned n_columns ,
949- OutputFlags flags ) = {
985+ OutputFlags flags ,
986+ Set * output_fields ) = {
950987
951988 [OUTPUT_SHORT ] = output_short ,
952989 [OUTPUT_SHORT_ISO ] = output_short ,
@@ -969,16 +1006,28 @@ int output_journal(
9691006 OutputMode mode ,
9701007 unsigned n_columns ,
9711008 OutputFlags flags ,
1009+ char * * output_fields ,
9721010 bool * ellipsized ) {
9731011
9741012 int ret ;
1013+ _cleanup_set_free_free_ Set * fields = NULL ;
9751014 assert (mode >= 0 );
9761015 assert (mode < _OUTPUT_MODE_MAX );
9771016
9781017 if (n_columns <= 0 )
9791018 n_columns = columns ();
9801019
981- ret = output_funcs [mode ](f , j , mode , n_columns , flags );
1020+ if (output_fields ) {
1021+ fields = set_new (& string_hash_ops );
1022+ if (!fields )
1023+ return log_oom ();
1024+
1025+ ret = set_put_strdupv (fields , output_fields );
1026+ if (ret < 0 )
1027+ return ret ;
1028+ }
1029+
1030+ ret = output_funcs [mode ](f , j , mode , n_columns , flags , fields );
9821031
9831032 if (ellipsized && ret > 0 )
9841033 * ellipsized = true;
@@ -1060,7 +1109,7 @@ static int show_journal(FILE *f,
10601109 line ++ ;
10611110 maybe_print_begin_newline (f , & flags );
10621111
1063- r = output_journal (f , j , mode , n_columns , flags , ellipsized );
1112+ r = output_journal (f , j , mode , n_columns , flags , NULL , ellipsized );
10641113 if (r < 0 )
10651114 return r ;
10661115 }
0 commit comments