int NameServer::main(int argc, char *argv[]) { //Network yarp; // pick an address Contact suggest("...",0); // suggestion is initially empty ConstString nameSpace = ""; if (argc>=1) { if (argv[0][0]=='/') { nameSpace = argv[0]; // BUT: not used yet argv++; argc--; } if (argc>=2) { suggest = Contact(argv[0],NetType::toInt(argv[1])); } else if (argc>=1) { suggest = Contact("...",NetType::toInt(argv[0])); } } Property config; config.fromCommand(argc,argv,false); bool bNoAuto=config.check("noauto"); // see what address is lying around Contact prev; NameConfig conf; if (nameSpace!="") { conf.setNamespace(nameSpace.c_str()); } if (conf.fromFile()) { prev = conf.getAddress(); } else if (bNoAuto) { YARP_ERROR(Logger::get(), ConstString("Could not find configuration file ") + conf.getConfigFileName()); return 1; } // merge if (prev.isValid()) { if (suggest.getHost()=="...") { suggest = Contact(prev.getHost(),suggest.getPort()); } if (suggest.getPort()==0) { suggest = Contact(suggest.getHost(),prev.getPort()); } } // still something not set? if (suggest.getPort()==0) { suggest = Contact(suggest.getHost(),NetworkBase::getDefaultPortRange()); } if (suggest.getHost()=="...") { // should get my IP suggest = Contact(conf.getHostName(),suggest.getPort()); } // finally, should make sure IP is local, and if not, correct it if (!conf.isLocalName(suggest.getHost())) { YARP_INFO(Logger::get(),"Overriding non-local address for name server"); suggest = Contact(conf.getHostName(),suggest.getPort()); } // and save conf.setAddress(suggest); if (!conf.toFile()) { YARP_ERROR(Logger::get(), ConstString("Could not save configuration file ") + conf.getConfigFileName()); } MainNameServer name(suggest.getPort() + 2); // register root for documentation purposes name.registerName(conf.getNamespace(),suggest); Port server; name.setPort(server); server.setReaderCreator(name); suggest.setName(conf.getNamespace()); bool ok = server.open(suggest, false); if (ok) { YARP_DEBUG(Logger::get(), ConstString("Name server listening at ") + suggest.toURI()); YARP_SPRINTF2(Logger::get(),info, "Name server can be browsed at http://%s:%d/", suggest.getHost().c_str(), suggest.getPort()); #ifdef YARP_HAS_ACE FallbackNameServer fallback(name); fallback.start(); // register fallback root for documentation purposes name.registerName("fallback",FallbackNameServer::getAddress()); YARP_INFO(Logger::get(), ConstString("Bootstrap server listening at ") + FallbackNameServer::getAddress().toURI()); #endif while (true) { YARP_DEBUG(Logger::get(),"name server running happily"); Time::delay(60); } server.close(); #ifdef YARP_HAS_ACE fallback.close(); fallback.join(); #endif } if (!ok) { YARP_ERROR(Logger::get(), "Name server failed to start"); //YARP_ERROR(Logger::get(), ConstString(" reason for failure is \"") + //e.toString() + "\""); YARP_ERROR(Logger::get(), "Maybe it is already be running?"); if (suggest.getPort()>0) { YARP_ERROR(Logger::get(), ConstString("Or perhaps another service may already be running on port ") + NetType::toString(suggest.getPort()) + "?"); } return 1; } return 0; }