570{
571 const char *opLetters = ":f:hl:rv";
572 struct option opVec[] =
573 {
574 {
OPT_TYPE "format", 1, 0, (int)
'f'},
578 {
OPT_TYPE "refresh", 0, 0, (int)
'r'},
579 {
OPT_TYPE "verify", 0, 0, (int)
'v'},
580 {0, 0, 0, 0}
581 };
582 extern int optind, opterr;
583 extern char *optarg;
585 clMap *baseNode, *clNow;
587 char opC;
588 int i;
589 bool doRefresh = false;
590
591
592
593 opterr = 0;
595 while((opC = getopt_long(argc, argv, opLetters, opVec, &i)) != (char)-1)
596 switch(opC)
597
598
599 {case 'f': if (!strcmp("json",optarg))
600 {doJson = true; doHush = true;}
601 else if (!strcmp("text",optarg))
602 doJson = false;
603 else Usage(
"Invalid format argument.");
604 break;
606 break;
607 case 'l': if (!strcmp("all",optarg))
608 {listMan = true; listSrv = true;}
609 else if (!strcmp("m", optarg))
610 {listMan = true; listSrv = false;}
611 else if (!strcmp("s", optarg))
612 {listMan = false; listSrv = true;}
613 else Usage(
"Invalid list argument.");
614 break;
615 case 'q': doHush = true;
616 break;
617 case 'r': doRefresh = true;
618 break;
619 case 'v': doVerify = true;
620 break;
621 case ':':
EMSG(
"'" <<OpName(argv) <<
"' argument missing.");
622 exit(2); break;
623 case '?':
EMSG(
"Invalid option, '" <<OpName(argv) <<
"'.");
624 exit(2); break;
625 default:
EMSG(
"Internal error processing '" <<OpName(argv) <<
"'.");
626 exit(2); break;
627 }
628
629
630
631 if (
optind >= argc)
Usage(
"Initial node not specified.");
632
633
634
636 {
EMSG(
"Unable to validate initial node; " <<
eMsg);
637 exit(2);
638 }
639
640
641
644 exit(2);
645 }
646
647
648
649 baseNode =
new clMap(argv[
optind]);
650
651
652
654 else doVerify = false;
655
656
657
658 SetEnv();
659
660
661
662 MapCluster(baseNode, baseNode);
663
664
665
667 {MapPath(baseNode,
Path, doRefresh);
668 eMsg = (doVerify ?
"0*rv* " :
"0*r** ");
669 }
else eMsg =
"0**** ";
670
671
672
673 if (doJson)
674 {PrintJson(baseNode);
675 putchar('\n');
676 }
677 else
678 {std::cout <<
eMsg <<baseNode->name <<baseNode->state <<std::endl;
679 PrintMap(baseNode, 1);
680 }
681
682
683
685 {std::cerr <<"Warning! " <<baseNode->name
686 <<" referred to the following unconnected node:" <<std::endl;
687 clNow = clLost;
688 while(clNow)
689 {std::cerr <<"????? " <<clNow->name <<std::endl;
690 clNow = clNow->nextSrv;
691 }
692 }
693
694
695
696 exit(0);
697}
void Usage(const char *msg)
const char * Name(const char *eName=0, const char **eText=0)
const char * Set(const char *hSpec, int pNum=PortInSpec)