553{
554 const char *opLetters = ":f:hl:rv";
555 struct option opVec[] =
556 {
557 {
OPT_TYPE "format", 1, 0, (int)
'f'},
561 {
OPT_TYPE "refresh", 0, 0, (int)
'r'},
562 {
OPT_TYPE "verify", 0, 0, (int)
'v'},
563 {0, 0, 0, 0}
564 };
565 extern int optind, opterr;
566 extern char *optarg;
568 clMap *baseNode, *clNow;
570 char opC;
571 int i;
572 bool doRefresh = false;
573
574
575
576 opterr = 0;
578 while((opC = getopt_long(argc, argv, opLetters, opVec, &i)) != (char)-1)
579 switch(opC)
580
581
582 {case 'f': if (!strcmp("json",optarg))
583 {doJson = true; doHush = true;}
584 else if (!strcmp("text",optarg))
585 doJson = false;
586 else Usage(
"Invalid format argument.");
587 break;
589 break;
590 case 'l': if (!strcmp("all",optarg))
591 {listMan = true; listSrv = true;}
592 else if (!strcmp("m", optarg))
593 {listMan = true; listSrv = false;}
594 else if (!strcmp("s", optarg))
595 {listMan = false; listSrv = true;}
596 else Usage(
"Invalid list argument.");
597 break;
598 case 'q': doHush = true;
599 break;
600 case 'r': doRefresh = true;
601 break;
602 case 'v': doVerify = true;
603 break;
604 case ':':
EMSG(
"'" <<OpName(argv) <<
"' argument missing.");
605 exit(2); break;
606 case '?':
EMSG(
"Invalid option, '" <<OpName(argv) <<
"'.");
607 exit(2); break;
608 default:
EMSG(
"Internal error processing '" <<OpName(argv) <<
"'.");
609 exit(2); break;
610 }
611
612
613
614 if (
optind >= argc)
Usage(
"Initial node not specified.");
615
616
617
619 {
EMSG(
"Unable to validate initial node; " <<
eMsg);
620 exit(2);
621 }
622
623
624
627 exit(2);
628 }
629
630
631
632 baseNode =
new clMap(argv[
optind]);
633
634
635
637 else doVerify = false;
638
639
640
641 SetEnv();
642
643
644
645 MapCluster(baseNode, baseNode);
646
647
648
650 {MapPath(baseNode,
Path, doRefresh);
651 eMsg = (doVerify ?
"0*rv* " :
"0*r** ");
652 }
else eMsg =
"0**** ";
653
654
655
656 if (doJson)
657 {PrintJson(baseNode);
658 putchar('\n');
659 }
660 else
661 {std::cout <<
eMsg <<baseNode->name <<baseNode->state <<std::endl;
662 PrintMap(baseNode, 1);
663 }
664
665
666
668 {std::cerr <<"Warning! " <<baseNode->name
669 <<" referred to the following unconnected node:" <<std::endl;
670 clNow = clLost;
671 while(clNow)
672 {std::cerr <<"????? " <<clNow->name <<std::endl;
673 clNow = clNow->nextSrv;
674 }
675 }
676
677
678
679 exit(0);
680}
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)