@@ -33,6 +33,7 @@ static PagerFlags arg_pager_flags = 0;
3333static bool arg_legend = true;
3434static char * * arg_services = NULL ;
3535static UserDBFlags arg_userdb_flags = 0 ;
36+ static JsonFormatFlags arg_json_format_flags = JSON_FORMAT_OFF ;
3637
3738STATIC_DESTRUCTOR_REGISTER (arg_services , strv_freep );
3839
@@ -58,7 +59,7 @@ static int show_user(UserRecord *ur, Table *table) {
5859 break ;
5960
6061 case OUTPUT_JSON :
61- json_variant_dump (ur -> json , JSON_FORMAT_COLOR_AUTO | JSON_FORMAT_PRETTY , NULL , 0 );
62+ json_variant_dump (ur -> json , arg_json_format_flags , NULL , 0 );
6263 break ;
6364
6465 case OUTPUT_FRIENDLY :
@@ -183,7 +184,7 @@ static int display_user(int argc, char *argv[], void *userdata) {
183184 }
184185
185186 if (table ) {
186- r = table_print (table , NULL );
187+ r = table_print_with_pager (table , arg_json_format_flags , arg_pager_flags , arg_legend );
187188 if (r < 0 )
188189 return table_log_print_error (r );
189190 }
@@ -216,7 +217,7 @@ static int show_group(GroupRecord *gr, Table *table) {
216217 }
217218
218219 case OUTPUT_JSON :
219- json_variant_dump (gr -> json , JSON_FORMAT_COLOR_AUTO | JSON_FORMAT_PRETTY , NULL , 0 );
220+ json_variant_dump (gr -> json , arg_json_format_flags , NULL , 0 );
220221 break ;
221222
222223 case OUTPUT_FRIENDLY :
@@ -339,7 +340,7 @@ static int display_group(int argc, char *argv[], void *userdata) {
339340 }
340341
341342 if (table ) {
342- r = table_print (table , NULL );
343+ r = table_print_with_pager (table , arg_json_format_flags , arg_pager_flags , arg_legend );
343344 if (r < 0 )
344345 return table_log_print_error (r );
345346 }
@@ -371,7 +372,7 @@ static int show_membership(const char *user, const char *group, Table *table) {
371372 if (r < 0 )
372373 return log_error_errno (r , "Failed to build JSON object: %m" );
373374
374- json_variant_dump (v , JSON_FORMAT_PRETTY | JSON_FORMAT_COLOR_AUTO , NULL , NULL );
375+ json_variant_dump (v , arg_json_format_flags , NULL , NULL );
375376 break ;
376377 }
377378
@@ -477,7 +478,7 @@ static int display_memberships(int argc, char *argv[], void *userdata) {
477478 }
478479
479480 if (table ) {
480- r = table_print (table , NULL );
481+ r = table_print_with_pager (table , arg_json_format_flags , arg_pager_flags , arg_legend );
481482 if (r < 0 )
482483 return table_log_print_error (r );
483484 }
@@ -545,10 +546,9 @@ static int display_services(int argc, char *argv[], void *userdata) {
545546 return 0 ;
546547 }
547548
548- if (arg_output == OUTPUT_JSON )
549- table_print_json (t , NULL , JSON_FORMAT_PRETTY |JSON_FORMAT_COLOR_AUTO );
550- else
551- table_print (t , NULL );
549+ r = table_print_with_pager (t , arg_json_format_flags , arg_pager_flags , arg_legend );
550+ if (r < 0 )
551+ return table_log_print_error (r );
552552
553553 return 0 ;
554554}
@@ -617,6 +617,7 @@ static int help(int argc, char *argv[], void *userdata) {
617617 " --synthesize=BOOL Synthesize root/nobody user\n"
618618 " --with-dropin=BOOL Control whether to include drop-in records\n"
619619 " --with-varlink=BOOL Control whether to talk to services at all\n"
620+ " --json=pretty|short JSON output mode\n"
620621 "\nSee the %s for details.\n" ,
621622 program_invocation_short_name ,
622623 ansi_highlight (),
@@ -637,19 +638,21 @@ static int parse_argv(int argc, char *argv[]) {
637638 ARG_WITH_DROPIN ,
638639 ARG_WITH_VARLINK ,
639640 ARG_SYNTHESIZE ,
641+ ARG_JSON ,
640642 };
641643
642644 static const struct option options [] = {
643- { "help" , no_argument , NULL , 'h' },
644- { "version" , no_argument , NULL , ARG_VERSION },
645- { "no-pager" , no_argument , NULL , ARG_NO_PAGER },
646- { "no-legend" , no_argument , NULL , ARG_NO_LEGEND },
647- { "output" , required_argument , NULL , ARG_OUTPUT },
648- { "service" , required_argument , NULL , 's' },
649- { "with-nss" , required_argument , NULL , ARG_WITH_NSS },
650- { "with-dropin" , required_argument , NULL , ARG_WITH_DROPIN },
645+ { "help" , no_argument , NULL , 'h' },
646+ { "version" , no_argument , NULL , ARG_VERSION },
647+ { "no-pager" , no_argument , NULL , ARG_NO_PAGER },
648+ { "no-legend" , no_argument , NULL , ARG_NO_LEGEND },
649+ { "output" , required_argument , NULL , ARG_OUTPUT },
650+ { "service" , required_argument , NULL , 's' },
651+ { "with-nss" , required_argument , NULL , ARG_WITH_NSS },
652+ { "with-dropin" , required_argument , NULL , ARG_WITH_DROPIN },
651653 { "with-varlink" , required_argument , NULL , ARG_WITH_VARLINK },
652- { "synthesize" , required_argument , NULL , ARG_SYNTHESIZE },
654+ { "synthesize" , required_argument , NULL , ARG_SYNTHESIZE },
655+ { "json" , required_argument , NULL , ARG_JSON },
653656 {}
654657 };
655658
@@ -696,7 +699,9 @@ static int parse_argv(int argc, char *argv[]) {
696699 break ;
697700
698701 case ARG_OUTPUT :
699- if (streq (optarg , "classic" ))
702+ if (isempty (optarg ))
703+ arg_output = _OUTPUT_INVALID ;
704+ else if (streq (optarg , "classic" ))
700705 arg_output = OUTPUT_CLASSIC ;
701706 else if (streq (optarg , "friendly" ))
702707 arg_output = OUTPUT_FRIENDLY ;
@@ -713,9 +718,19 @@ static int parse_argv(int argc, char *argv[]) {
713718 } else
714719 return log_error_errno (SYNTHETIC_ERRNO (EINVAL ), "Invalid --output= mode: %s" , optarg );
715720
721+ arg_json_format_flags = arg_output == OUTPUT_JSON ? JSON_FORMAT_PRETTY |JSON_FORMAT_COLOR_AUTO : JSON_FORMAT_OFF ;
722+ break ;
723+
724+ case ARG_JSON :
725+ r = parse_json_argument (optarg , & arg_json_format_flags );
726+ if (r <= 0 )
727+ return r ;
728+
729+ arg_output = FLAGS_SET (arg_json_format_flags , JSON_FORMAT_OFF ) ? _OUTPUT_INVALID : OUTPUT_JSON ;
716730 break ;
717731
718732 case 'j' :
733+ arg_json_format_flags = JSON_FORMAT_PRETTY |JSON_FORMAT_COLOR_AUTO ;
719734 arg_output = OUTPUT_JSON ;
720735 break ;
721736
0 commit comments