@@ -517,34 +517,73 @@ enum action {
517517 ACTION_SECURITY_INFO ,
518518};
519519
520+ static int do_action_endpoint (enum action action , nvme_mi_ep_t ep , int argc , char * * argv )
521+ {
522+ int rc ;
523+
524+ switch (action ) {
525+ case ACTION_INFO :
526+ rc = do_info (ep );
527+ break ;
528+ case ACTION_CONTROLLERS :
529+ rc = do_controllers (ep );
530+ break ;
531+ case ACTION_IDENTIFY :
532+ rc = do_identify (ep , argc , argv );
533+ break ;
534+ case ACTION_GET_LOG_PAGE :
535+ rc = do_get_log_page (ep , argc , argv );
536+ break ;
537+ case ACTION_ADMIN_RAW :
538+ rc = do_admin_raw (ep , argc , argv );
539+ break ;
540+ case ACTION_SECURITY_INFO :
541+ rc = do_security_info (ep , argc , argv );
542+ break ;
543+ }
544+ return rc ;
545+ }
546+
520547int main (int argc , char * * argv )
521548{
522549 enum action action ;
523550 nvme_root_t root ;
524551 nvme_mi_ep_t ep ;
552+ bool dbus = false, usage = true;
525553 uint8_t eid ;
526- int rc , net ;
527-
528- if (argc < 3 ) {
554+ int rc = 0 , net ;
555+
556+ if (argc >= 2 && strcmp (argv [1 ], "dbus" ) == 0 ) {
557+ usage = false;
558+ dbus = true;
559+ argv += 1 ;
560+ argc -= 1 ;
561+ } else if (argc >= 3 ) {
562+ usage = false;
563+ net = atoi (argv [1 ]);
564+ eid = atoi (argv [2 ]) & 0xff ;
565+ argv += 2 ;
566+ argc -= 2 ;
567+ }
568+
569+ if (usage ) {
529570 fprintf (stderr ,
530- "usage: %s <net> <eid> [action] [action args]\n" ,
531- argv [0 ]);
571+ "usage: %s <net> <eid> [action] [action args]\n"
572+ " %s 'dbus' [action] [action args]\n" ,
573+ argv [0 ], argv [0 ]);
532574 fprintf (stderr , "where action is:\n"
533575 " info\n"
534576 " controllers\n"
535577 " identify <controller-id> [--partial]\n"
536578 " get-log-page <controller-id> [<log-id>]\n"
537579 " admin <controller-id> <opcode> [<cdw10>, <cdw11>, ...]\n"
538580 " security-info <controller-id>\n"
581+ "\n"
582+ " 'dbus' target will query D-Bus for known MCTP endpoints\n"
539583 );
540584 return EXIT_FAILURE ;
541585 }
542586
543- net = atoi (argv [1 ]);
544- eid = atoi (argv [2 ]) & 0xff ;
545- argv += 2 ;
546- argc -= 2 ;
547-
548587 if (argc == 1 ) {
549588 action = ACTION_INFO ;
550589 } else {
@@ -569,40 +608,37 @@ int main(int argc, char **argv)
569608 return EXIT_FAILURE ;
570609 }
571610 }
611+ if (dbus ) {
612+ nvme_root_t root ;
613+ int i = 0 ;
614+
615+ root = nvme_mi_scan_mctp ();
616+ if (!root )
617+ errx (EXIT_FAILURE , "can't scan D-Bus entries" );
618+
619+ nvme_mi_for_each_endpoint (root , ep ) i ++ ;
620+ printf ("Found %d endpoints in D-Bus:\n" , i );
621+ nvme_mi_for_each_endpoint (root , ep ) {
622+ char * desc = nvme_mi_endpoint_desc (ep );
623+ printf ("%s\n" , desc );
624+ rc = do_action_endpoint (action , ep , argc , argv );
625+ printf ("---\n" );
626+ free (desc );
627+ }
628+ nvme_mi_free_root (root );
629+ } else {
630+ root = nvme_mi_create_root (stderr , DEFAULT_LOGLEVEL );
631+ if (!root )
632+ err (EXIT_FAILURE , "can't create NVMe root" );
572633
573- root = nvme_mi_create_root (stderr , DEFAULT_LOGLEVEL );
574- if (!root )
575- err (EXIT_FAILURE , "can't create NVMe root" );
576-
577- ep = nvme_mi_open_mctp (root , net , eid );
578- if (!ep )
579- err (EXIT_FAILURE , "can't open MCTP endpoint %d:%d" , net , eid );
580-
581- switch (action ) {
582- case ACTION_INFO :
583- rc = do_info (ep );
584- break ;
585- case ACTION_CONTROLLERS :
586- rc = do_controllers (ep );
587- break ;
588- case ACTION_IDENTIFY :
589- rc = do_identify (ep , argc , argv );
590- break ;
591- case ACTION_GET_LOG_PAGE :
592- rc = do_get_log_page (ep , argc , argv );
593- break ;
594- case ACTION_ADMIN_RAW :
595- rc = do_admin_raw (ep , argc , argv );
596- break ;
597- case ACTION_SECURITY_INFO :
598- rc = do_security_info (ep , argc , argv );
599- break ;
634+ ep = nvme_mi_open_mctp (root , net , eid );
635+ if (!ep )
636+ errx (EXIT_FAILURE , "can't open MCTP endpoint %d:%d" , net , eid );
637+ rc = do_action_endpoint (action , ep , argc , argv );
638+ nvme_mi_close (ep );
639+ nvme_mi_free_root (root );
600640 }
601641
602- nvme_mi_close (ep );
603-
604- nvme_mi_free_root (root );
605-
606642 return rc ? EXIT_FAILURE : EXIT_SUCCESS ;
607643}
608644
0 commit comments