Contact NameServer::unregisterName(const ConstString& name) { Contact prev = queryName(name); if (prev.isValid()) { if (prev.getPort()!=-1) { NameRecord& rec = getNameRecord(prev.getRegName()); if (rec.isReusablePort()) { HostRecord& host = getHostRecord(prev.getHost()); host.release(prev.getPort()); } if (rec.isReusableIp()) { if (rec.getAddress().getCarrier()=="mcast") { mcastRecord.releaseAddress(rec.getAddress().getHost().c_str()); } } rec.clear(); tmpNames.release(name); Bottle event; event.addVocab(Vocab::encode("del")); event.addString(name.c_str()); onEvent(event); } } return queryName(name); }
bool TcpFace::open(const Contact& address) { YARP_DEBUG(Logger::get(), std::string("opening for address ") + address.toURI()); this->address = address; #ifdef YARP_HAS_ACE ACE_INET_Addr serverAddr((address.getPort()>0)?address.getPort():0); int result = peerAcceptor.open(serverAddr, 1); if (address.getPort()<=0) { ACE_INET_Addr localAddr; peerAcceptor.get_local_addr(localAddr); this->address = address; this->address.setSocket("tcp", NameConfig::getHostName(), localAddr.get_port_number()); } #else int result = peerAcceptor.open(address); if (address.getPort()<=0) { this->address = address; this->address.setSocket("tcp", NameConfig::getHostName(), peerAcceptor.get_port_number()); } #endif if (result==-1) { return false; } return true; }
int DgramTwoWayStream::restrictMcast(ACE_SOCK_Dgram_Mcast * dmcast, const Contact& group, const Contact& ipLocal, bool add) { restrictInterfaceIp = ipLocal; YARP_INFO(Logger::get(), String("multicast connection ") + group.getHost() + " on network interface for " + ipLocal.getHost()); int result = -1; // There's some major damage in ACE mcast interfaces. // Most require interface names, yet provide no way to query // these names - and in the end, convert to IP addresses. // Here we try to do an end run around ACE. // based on: ACE_SOCK_Dgram::set_nic ip_mreq multicast_address; ACE_INET_Addr group_addr(group.getPort(), group.getHost().c_str()); ACE_INET_Addr interface_addr(ipLocal.getPort(), ipLocal.getHost().c_str()); multicast_address.imr_interface.s_addr = htonl (interface_addr.get_ip_address ()); multicast_address.imr_multiaddr.s_addr = htonl (group_addr.get_ip_address ()); if (add) { YARP_DEBUG(Logger::get(),"Trying to correct mcast membership...\n"); result = ((ACE_SOCK*)dmcast)->set_option (IPPROTO_IP, IP_ADD_MEMBERSHIP, &multicast_address, sizeof (struct ip_mreq)); } else { YARP_DEBUG(Logger::get(),"Trying to correct mcast output..."); result = ((ACE_SOCK*)dmcast)->set_option (IPPROTO_IP, IP_MULTICAST_IF, &multicast_address.imr_interface.s_addr, sizeof (struct in_addr)); } if (result!=0) { int num = errno; YARP_DEBUG(Logger::get(), String("mcast result: ") + strerror(num)); if (num==98) { // our membership is already correct / Address already in use result = 0; } result = 0; // in fact, best to proceed for Windows. } return result; }
int SocketTwoWayStream::open(const Contact& address) { if (address.getPort()==-1) { return -1; } std::string host = address.getHost(); yarp::os::impl::TcpConnector connector; #ifdef YARP_HAS_ACE if (address.getHost() == "localhost") { // ACE does not like localhost. At all. NameConfig config; host = config.getHostName(true); } ACE_INET_Addr addr(address.getPort(), host.c_str()); YARP_timeval openTimeout; YARP_timeval *timeout = nullptr; if (address.hasTimeout()) { openTimeout.set(address.getTimeout()); timeout = &openTimeout; } int result = connector.connect(stream, addr, timeout, ACE_Addr::sap_any, 1); #else int result; if (address.hasTimeout()) { YARP_timeval timeout; /* set timeout seconds and microseconds */ timeout.tv_sec = (int) address.getTimeout(); timeout.tv_usec = (address.getTimeout() - (int) address.getTimeout()) * 1000000; result = connector.connect(stream, address, &timeout); } else { result = connector.connect(stream, address, nullptr); } #endif if (result>=0) { happy = true; } else { YARP_SPRINTF2(Logger::get(), debug, "TCP connection to tcp://%s:%d failed to open", host.c_str(), address.getPort()); } updateAddresses(); return result; }
Contact MultiNameSpace::registerName(const ConstString& name) { SpaceList lst = HELPER(this).getAll(); Contact result; for (int i=0; i<(int)lst.size(); i++) { Contact iresult; if (result.getPort()<=0) { iresult = lst[i]->registerName(name); } else { iresult = lst[i]->registerContact(result); } if (i==0 || result.getPort()<=0) { result = iresult; } } return result; }
int ShmemHybridStream::open(const Contact& yarp_address,bool sender) { m_bLinked=false; ACE_INET_Addr ace_address(yarp_address.getPort(),yarp_address.getHost().c_str()); if (sender) { return connect(ace_address); } else { ACE_INET_Addr ace_server_addr(ace_address.get_port_number()); int result = m_Acceptor.open(ace_server_addr); if (result<0) { YARP_ERROR(Logger::get(),ConstString("ShmemHybridStream open result")+NetType::toString(result)); return result; } m_Acceptor.get_local_addr(ace_server_addr); m_LocalAddress = Contact(ace_server_addr.get_host_addr(),ace_server_addr.get_port_number()); m_RemoteAddress = m_LocalAddress; // finalized in call to accept() return result; } return 1; }
int yarp_symlink(const char *to, const char *from) { //TODO: actually, it only works with ln -s /read rd, and yet it throwns // some errors //YPath ypath(from); //if (!ypath.isStem()) { //Check that the path exists? Is it right? // return -ENOENT; //} //Create the new Contact //Contact src = Network::queryName(from); //printf("source [%s] is %s\n", from, src.toString().c_str()); //Contact dest = Contact::byName(to).addSocket(src.getCarrier(),src.getHost(),src.getPort()); //printf("dest [%s] should be %s\n", to, src.toString().c_str()); //Network::registerContact(dest); printf("SYMLINK requested from [%s] to [%s]\n", from, to); // special symlink entry //Contact src = Network::queryName(to); Contact dest = Contact::byName(from).addSocket("symlink", "none", 1); printf("Planning to register %s / %d / %d\n", dest.toString().c_str(), dest.isValid(), dest.getPort()); Network::registerContact(dest); Network::setProperty(from,"link",Value(to)); return 0; }
Bottle NameServer::botify(const Contact& address) { Bottle result; if (address.isValid()) { Bottle bname; bname.addString("name"); bname.addString(address.getRegName().c_str()); Bottle bip; bip.addString("ip"); bip.addString(address.getHost().c_str()); Bottle bnum; bnum.addString("port_number"); bnum.addInt(address.getPort()); Bottle bcarrier; bcarrier.addString("carrier"); bcarrier.addString(address.getCarrier().c_str()); result.addString("port"); result.addList() = bname; result.addList() = bip; result.addList() = bnum; result.addList() = bcarrier; } else { Bottle bstate; bstate.addString("error"); bstate.addInt(-2); bstate.addString("port not known"); result.addString("port"); result.addList() = bstate; } return result; }
bool DgramTwoWayStream::join(const Contact& group, bool sender, const Contact& ipLocal) { #ifdef YARP_HAS_ACE YARP_DEBUG(Logger::get(),String("subscribing to mcast address ") + group.toURI() + " for " + (sender?"writing":"reading")); multiMode = true; if (sender) { if (ipLocal.isValid()) { return openMcast(group,ipLocal); } else { // just use udp as normal return open(group); } //return; } ACE_SOCK_Dgram_Mcast *dmcast = new ACE_SOCK_Dgram_Mcast; //possible flags: ((ACE_SOCK_Dgram_Mcast::options)(ACE_SOCK_Dgram_Mcast::OPT_NULLIFACE_ALL | ACE_SOCK_Dgram_Mcast::OPT_BINDADDR_YES)); dgram = dmcast; mgram = dmcast; yAssert(dgram!=NULL); ACE_INET_Addr addr(group.getPort(),group.getHost().c_str()); int result = -1; if (ipLocal.isValid()) { result = 0; result = dmcast->join(addr,1); if (result==0) { result = restrictMcast(dmcast,group,ipLocal,true); } } else { result = dmcast->join(addr,1); } configureSystemBuffers(); if (result!=0) { YARP_ERROR(Logger::get(),"cannot connect to multi-cast address"); happy = false; return false; } localAddress = group; remoteAddress = group; localHandle.set(localAddress.getPort(),localAddress.getHost().c_str()); remoteHandle.set(remoteAddress.getPort(),remoteAddress.getHost().c_str()); allocate(); return true; #else return false; #endif }
/** * Open the server port and listen for clients */ int TcpAcceptor::shared_open(const Contact& address) { struct sockaddr_in servAddr; servAddr.sin_addr.s_addr = INADDR_ANY; servAddr.sin_family = AF_INET; servAddr.sin_port = htons((address.getPort()>0)?address.getPort():0); inet_aton(address.getHost().c_str(), &servAddr.sin_addr); memset(servAddr.sin_zero, '\0', sizeof servAddr.sin_zero); // servAddress = Address(inet_ntoa(servAddr.sin_addr),servAddr.sin_port); if (bind(get_handle(), (struct sockaddr *)&servAddr, sizeof (struct sockaddr)) == -1) { perror("At bind(sockfd) there was an error..."); return -1; } if (listen(get_handle(), BACKLOG) == -1) { perror("At listen(sockfd) there was an error..."); return -1; } struct sigaction sa; sa.sa_handler = sigchld_handler; sigemptyset(&sa.sa_mask); sa.sa_flags = SA_RESTART; if (sigaction(SIGCHLD, &sa, NULL) == -1) { perror("At sigaction(address) there was an error..."); return -1; } struct sockaddr_in sin; socklen_t addrlen = sizeof(sin); if (getsockname(get_handle(), (struct sockaddr *)&sin, &addrlen) == 0 && sin.sin_family == AF_INET && addrlen == sizeof(sin)) { port_number = (int)ntohs(sin.sin_port); } else { perror("At getsockname(address) there was an error..."); return -1; } return 1; }
Contact RosNameSpace::rosify(const Contact& contact) { ConstString carrier = ((contact.getCarrier() == "rosrpc") ? "rosrpc" : "http"); ConstString hostname = contact.getHost(); if (yarp::os::impl::NameConfig::isLocalName(hostname)) { char hn[HOST_NAME_MAX]; yarp::os::gethostname(hn, sizeof(hn)); hostname = hn; } return Contact(carrier, hostname, contact.getPort()); }
ConstString NameServer::textify(const Contact& address) { ConstString result = ""; if (address.isValid()) { if (address.getPort()>=0) { result = "registration name "; result = result + address.getRegName() + " ip " + address.getHost() + " port " + NetType::toString(address.getPort()) + " type " + address.getCarrier() + "\n"; } else { result = "registration name "; result = result + address.getRegName() + " ip " + "none" + " port " + "none" + " type " + address.getCarrier() + "\n"; } } return result; }
Contact MultiNameSpace::registerName(const ConstString& name) { SpaceList lst = HELPER(this).getAll(); Contact result; // loop through namespaces for (int i=0; i<(int)lst.size(); i++) { Contact iresult; // Register name with namespace. If contact information is // fleshed out while registering, we carry that along for // registration with the next namespace. if (result.getPort()<=0) { iresult = lst[i]->registerName(name); } else { iresult = lst[i]->registerContact(result); } if (i==0 || result.getPort()<=0) { result = iresult; } } return result; }
void appendEntry(yarp::os::Bottle& reply, const Contact& c) { Bottle& info = reply.addList(); info.addString("registration"); info.addString("name"); info.addString(c.getName().c_str()); info.addString("ip"); info.addString(c.getHost().c_str()); info.addString("port"); info.addInt(c.getPort()); info.addString("type"); info.addString(c.getCarrier().c_str()); }
void requestTopic(NodeArgs& na) { ConstString topic = na.args.get(0).asString(); Contact c = lookup(topic); if (!c.isValid()) { na.fail("Cannot find topic"); return; } na.reply.addString("TCPROS"); na.reply.addString(c.getHost()); na.reply.addInt(c.getPort()); na.success(); }
Contact NetworkBase::queryName(const ConstString& name) { YARP_SPRINTF1(Logger::get(),debug,"query name %s",name.c_str()); if (getNameServerName()==name) { YARP_SPRINTF1(Logger::get(),debug,"query recognized as name server: %s",name.c_str()); return getNameServerContact(); } Contact c = c.fromString(name); if (c.isValid()&&c.getPort()>0) { return c; } return getNameSpace().queryName(name); }
Contact RosNameSpace::unregisterContact(const Contact& contact) { // Remainder of method is supporting older /name+#/foo syntax Bottle cmd, reply; cmd.addString("unregisterSubscriber"); cmd.addString(contact.getName()); cmd.addString("/yarp/registration"); Contact c("http", contact.getHost().c_str(), contact.getPort()); cmd.addString(c.toString()); bool ok = NetworkBase::write(getNameServerContact(), cmd, reply); if (!ok) return Contact(); return Contact(); }
int SocketTwoWayStream::open(const Contact& address) { if (address.getPort()==-1) { return -1; } String host = address.getHost(); #ifdef YARP_HAS_ACE ACE_SOCK_Connector connector; if (address.getHost() == "localhost") { // ACE does not like localhost. At all. NameConfig config; host = config.getHostName(true); } ACE_INET_Addr addr(address.getPort(),host.c_str()); ACE_Time_Value openTimeout; ACE_Time_Value *timeout = NULL; if (address.hasTimeout()) { openTimeout.set(address.getTimeout()); timeout = &openTimeout; } int result = connector.connect(stream,addr,timeout,ACE_Addr::sap_any,1); #else TcpConnector connector; int result = connector.connect(stream, address); #endif if (result>=0) { happy = true; } else { YARP_SPRINTF2(Logger::get(), debug, "TCP connection to tcp://%s:%d failed to open", host.c_str(), address.getPort()); } updateAddresses(); return result; }
int yarp_link(const char *from, const char *to) { //TODO: will it ever be possible to hard link ports? // If possible, it might be an alias for yarp_simlink, as with YARP // there isn't a sym/hard linking difference //Create the new Contact Contact src = Network::queryName(from); printf("source [%s] is %s\n", from, src.toString().c_str()); Contact dest = Contact::byName(to).addSocket(src.getCarrier(),src.getHost(),src.getPort()); printf("dest [%s] should be %s\n", to, src.toString().c_str()); return 0; }
bool Port::addOutput(const Contact& contact) { PortCoreAdapter& core = HELPER(implementation); if (core.isInterrupted()) return false; core.alertOnWrite(); ConstString name; if (contact.getPort()<=0) { name = contact.toString(); } else { name = contact.toURI(); } if (!core.isListening()) { return core.addOutput(name.c_str(),NULL,NULL,true); } Contact me = where(); return NetworkBase::connect(me.getName().c_str(), name.c_str()); }
bool Port::addOutput(const Contact& contact) { PortCoreAdapter& core = IMPL(); if (core.commitToRead) return false; if (core.isInterrupted()) return false; core.alertOnWrite(); std::string name; if (contact.getPort()<=0) { name = contact.toString(); } else { name = contact.toURI(); } if (!core.isListening()) { return core.addOutput(name, nullptr, nullptr, true); } Contact me = where(); return NetworkBase::connect(me.getName(), name); }
Contact NameClient::queryName(const String& name) { String np = getNamePart(name); size_t i1 = np.find(":"); if (i1!=String::npos) { Contact c = c.fromString(np.c_str()); if (c.isValid()&&c.getPort()>0) { return c; } } if (altStore!=NULL) { Contact c = altStore->query(np.c_str()); return c; } String q("NAME_SERVER query "); q += np; return probe(q); }
bool DgramTwoWayStream::openMcast(const Contact& group, const Contact& ipLocal) { #ifdef YARP_HAS_ACE multiMode = true; localAddress = ipLocal; localHandle = ACE_INET_Addr((u_short)(localAddress.getPort()), (ACE_UINT32)INADDR_ANY); ACE_SOCK_Dgram_Mcast *dmcast = new ACE_SOCK_Dgram_Mcast; dgram = dmcast; mgram = dmcast; yAssert(dgram!=NULL); int result = -1; ACE_INET_Addr addr(group.getPort(),group.getHost().c_str()); if (ipLocal.isValid()) { result = dmcast->open(addr,NULL,1); if (result==0) { result = restrictMcast(dmcast,group,ipLocal,false); } } else { result = dmcast->open(addr,NULL,1); } if (result!=0) { YARP_ERROR(Logger::get(),"could not open multicast datagram socket"); return false; } configureSystemBuffers(); remoteAddress = group; localHandle.set(localAddress.getPort(),localAddress.getHost().c_str()); remoteHandle.set(remoteAddress.getPort(),remoteAddress.getHost().c_str()); allocate(); return true; #else return false; #endif }
void checkTimeoutNetworkExists() { ContactStyle style; style.timeout = 2.0; report(0,"checking Network::exists timeout"); Port p; p.open("/tcp"); Contact c = p.where(); bool ok = Network::exists("/tcp",style); checkTrue(ok,"a yarp port"); p.close(); TcpFace face; Contact address(c.getHost(),c.getPort()); checkTrue(face.open(address),"open server socket, timeout check proceeds"); Network::registerContact(c); ok = Network::exists("/tcp",style); Network::unregisterContact(c); checkFalse(ok,"not a yarp port"); face.close(); }
int yarp_rename(const char *from, const char *to) { //TODO: the current code just renames ports, eg: // /read can become /rd, but /read/rd1 cannot become /rd/rd1 // every subport/subdirectory should have to be renamed YPath ypath(from); if (!ypath.isPort()) { //Check that the path exists? Is it right? return -ENOENT; } //Create the new Contact Contact src = Network::queryName(from); Network::unregisterContact(src); Contact dest(to, src.getCarrier(), src.getHost(), src.getPort()); Network::registerContact(dest); return 0; }
/** * Connect to server */ int TcpConnector::connect(TcpStream &new_stream, const Contact& address) { // printf("TCP/IP start in client mode\n"); // sockets.set_as_client(); // sockets.set_client_sockfd(sockfd); if (open (new_stream) == -1) return -1; // Write sockaddr struct with given address... sockaddr_in servAddr; servAddr.sin_addr.s_addr = INADDR_ANY; servAddr.sin_family = AF_INET; servAddr.sin_port = htons(address.getPort()); memset(servAddr.sin_zero, '\0', sizeof servAddr.sin_zero); struct hostent *hostInfo = gethostbyname(address.getHost().c_str()); if (hostInfo) { bcopy(hostInfo->h_addr,(char *)(&servAddr.sin_addr),hostInfo->h_length); } else { inet_aton(address.getHost().c_str(), &servAddr.sin_addr); } // Address servAddress, // servAddress = Address(inet_ntoa(servAddr.sin_addr),servAddr.sin_port); YARP_ASSERT (new_stream.get_handle() != -1); int result = ::connect(new_stream.get_handle(), (sockaddr*) &servAddr, sizeof(servAddr)); // std::cout << "Connect [handle=" << new_stream.get_handle() << "] at " << inet_ntoa(servAddr.sin_addr) << ":" << servAddr.sin_port << std::endl; if (result < 0) { perror("TcpConnector::connect fail"); std::cerr << "Connect [handle=" << new_stream.get_handle() << "] at " << inet_ntoa(servAddr.sin_addr) << ":" << servAddr.sin_port << std::endl; } return result; }
bool yarp::os::impl::McastCarrier::sendHeader(ConnectionState& proto) { // need to do more than the default bool ok = defaultSendHeader(proto); if (!ok) return false; YARP_DEBUG(Logger::get(),"Adding extra mcast header"); Contact addr; Contact alt = proto.getStreams().getLocalAddress(); ConstString altKey = proto.getRoute().getFromName() + "/net=" + alt.getHost(); McastCarrier *elect = getCaster().getElect(altKey); if (elect!=YARP_NULLPTR) { YARP_DEBUG(Logger::get(),"picking up peer mcast name"); addr = elect->mcastAddress; mcastName = elect->mcastName; } else { // fetch an mcast address Contact target("...", "mcast", "...", 0); addr = NetworkBase::registerContact(target); mcastName = addr.getRegName(); if (addr.isValid()) { // mark owner of mcast address NetworkBase::setProperty(proto.getRoute().getFromName().c_str(), "owns", Value(mcastName.c_str())); } } int ip[] = { 224, 3, 1, 1 }; int port = 11000; if (addr.isValid()) { SplitString ss(addr.getHost().c_str(),'.'); if (ss.size()!=4) { addr = Contact(); } else { yAssert(ss.size()==4); for (int i=0; i<4; i++) { ip[i] = NetType::toInt(ss.get(i)); } port = addr.getPort(); } } if (!addr.isValid()) { YARP_ERROR(Logger::get(), "Name server not responding helpfully, setting mcast name arbitrarily."); YARP_ERROR(Logger::get(), "Only a single mcast address supported in this mode."); addr = Contact("/tmp/mcast", "mcast", "224.3.1.1", 11000); } ManagedBytes block(6); for (int i=0; i<4; i++) { ((unsigned char*)block.get())[i] = (unsigned char)ip[i]; } block.get()[5] = (char)(port%256); block.get()[4] = (char)(port/256); proto.os().write(block.bytes()); mcastAddress = addr; return true; }
bool NameServiceOnTriples::cmdQuery(NameTripleState& act, bool nested) { ConstString port = act.cmd.get(1).asString(); ParseName parser; parser.apply(port.c_str()); port = parser.getPortName(); /* // port names may be prefixed - sort that out ConstString base = port; ConstString pat = ""; if (base.find("/net=") == 0 || base.find("/NET=") == 0) { int patStart = 5; int patEnd = base.find('/',patStart); if (patEnd>=patStart) { pat = base.substr(patStart,patEnd-patStart); base = base.substr(patEnd); } port = base; } */ if (act.reply.size()==0 && !act.bottleMode) { act.reply.addString("old"); } Bottle& q=(act.bottleMode&&!act.nestedMode)? act.reply : act.reply.addList(); Contact c = query(port, act, parser.getNetworkChoice(), nested); ConstString host = c.getHost(); ConstString carrier = c.getCarrier(); int sock = c.getPort(); if (c.isValid()) { if (!act.bottleMode) { q.addString("registration"); q.addString("name"); q.addString(port); q.addString("ip"); q.addString(host); q.addString("port"); q.addInt(sock); q.addString("type"); q.addString(carrier); } else { Bottle bname; bname.addString("name"); bname.addString(port); Bottle bip; bip.addString("ip"); bip.addString(host); Bottle bnum; bnum.addString("port_number"); bnum.addInt(sock); Bottle bcarrier; bcarrier.addString("carrier"); bcarrier.addString(carrier); q.addString("port"); q.addList() = bname; q.addList() = bip; q.addList() = bnum; q.addList() = bcarrier; } } else { if (act.bottleMode) { Bottle bstate; bstate.addString("error"); bstate.addInt(-2); bstate.addString("port not known"); q.addString("port"); q.addList() = bstate; } } return true; }
bool BootstrapServer::configFileBootstrap(yarp::os::Contact& contact, bool configFileRequired, bool mayEditConfigFile) { Contact suggest = contact; // see what address is lying around Contact prev; NameConfig conf; if (conf.fromFile()) { prev = conf.getAddress(); } else if (configFileRequired) { fprintf(stderr,"Could not read configuration file %s\n", conf.getConfigFileName().c_str()); return false; } // merge if (prev.isValid()) { if (suggest.getHost() == "...") { suggest.setHost(prev.getHost()); } if (suggest.getCarrier() == "...") { suggest.setCarrier(prev.getCarrier()); } if (suggest.getPort() == 0) { suggest.setPort(prev.getPort()); } } if (suggest.getRegName() == "...") { suggest.setName(conf.getNamespace()); } // still something not set? if (suggest.getPort() == 0) { suggest.setPort(10000); } if (suggest.getHost() == "...") { // should get my IP suggest.setHost(conf.getHostName()); } if (!configFileRequired) { // finally, should make sure IP is local, and if not, correct it if (!conf.isLocalName(suggest.getHost())) { fprintf(stderr,"Overriding non-local address for name server\n"); suggest.setHost(conf.getHostName()); } else { // Let's just check we're not a loopback ConstString betterHost = conf.getHostName(false,suggest.getHost()); if (betterHost!=suggest.getHost()) { fprintf(stderr,"Overriding loopback address for name server\n"); suggest.setHost(betterHost); } } } else { if (!conf.isLocalName(conf.getHostName())) { fprintf(stderr,"The address written in config file doesn't belong any interface \n"); return false; } suggest.setHost(conf.getHostName()); } bool changed = false; if (prev.isValid()) { changed = (prev.getHost() != suggest.getHost()) || (prev.getPort() != suggest.getPort()) || (conf.getMode() != "yarp" && conf.getMode() != ""); } if (changed && !mayEditConfigFile) { fprintf(stderr,"PROBLEM: need to change settings in %s\n", conf.getConfigFileName().c_str()); fprintf(stderr," Current settings: host %s port %d family %s\n", prev.getHost().c_str(), prev.getPort(), (conf.getMode()=="")?"yarp":conf.getMode().c_str()); fprintf(stderr," Desired settings: host %s port %d family %s\n", suggest.getHost().c_str(), suggest.getPort(), "yarp"); fprintf(stderr,"Please specify '--write' if it is ok to overwrite current settings, or\n"); if(!configFileRequired) fprintf(stderr,"Please specify '--read' to use the current settings, or\n"); else fprintf(stderr,"Please set an existing address in config file, or\n"); fprintf(stderr,"delete %s\n", conf.getConfigFileName().c_str()); return false; } bool shouldSave = changed || !prev.isValid(); if (shouldSave) { // and save conf.setAddress(suggest); if (!conf.toFile()) { fprintf(stderr,"Could not save configuration file %s\n", conf.getConfigFileName().c_str()); } } contact = suggest; return true; }
Contact RosNameSpace::unregisterAdvanced(const ConstString& name, NameStore *store) { NestedContact nc; nc.fromString(name); ConstString cat = nc.getCategory(); if (nc.getNestedName()!="") { if (cat == "-1") { Nodes& nodes = NameClient::getNameClient().getNodes(); Contact c = nodes.getURI(name); c.setCarrier("rosrpc"); c = rosify(c); Bottle cmd, reply; cmd.clear(); cmd.addString("unregisterService"); cmd.addString(toRosNodeName(nc.getNodeName())); cmd.addString(nc.getNestedName()); cmd.addString(c.toURI()); bool ok = NetworkBase::write(getNameServerContact(), cmd, reply); if (!ok) return Contact(); } else if (cat == "+" || cat== "-") { Bottle cmd, reply; cmd.clear(); cmd.addString((cat=="+")?"unregisterPublisher":"unregisterSubscriber"); cmd.addString(toRosNodeName(nc.getNodeName())); cmd.addString(nc.getNestedName()); Contact c; if (store) { c = rosify(store->query(nc.getNodeName())); } else { Nodes& nodes = NameClient::getNameClient().getNodes(); c = rosify(nodes.getParent(name)); } cmd.addString(c.toString()); bool ok = NetworkBase::write(getNameServerContact(), cmd, reply); if (!ok) return Contact(); } return Contact(); } // Remainder of method is supporting older /name+#/foo syntax size_t pub_idx = name.find("+#"); size_t sub_idx = name.find("-#"); ConstString node = ""; ConstString pub = ""; ConstString sub = ""; if (pub_idx!=ConstString::npos) { node = name.substr(0, pub_idx); pub = name.substr(pub_idx+2, name.length()); } if (sub_idx!=ConstString::npos) { node = name.substr(0, sub_idx); sub = name.substr(sub_idx+2, name.length()); } if (node=="") { node = name; } YARP_SPRINTF3(Logger::get(), debug, "Name [%s] sub [%s] pub [%s]\n", name.c_str(), sub.c_str(), pub.c_str()); if (pub!="") { NetworkBase::disconnect(name, ConstString("topic:/") + pub); } if (sub!="") { NetworkBase::disconnect(ConstString("topic:/") + sub, name); } Contact contact = NetworkBase::queryName(name); Bottle cmd, reply; cmd.addString("unregisterPublisher"); cmd.addString(name); cmd.addString("/yarp/registration"); Contact c("http", contact.getHost().c_str(), contact.getPort()); cmd.addString(c.toString()); bool ok = NetworkBase::write(getNameServerContact(), cmd, reply); if (!ok) return Contact(); return Contact(); }