/*-------------------------------------------------------------------------*/ int KnownDADiscoverFromProperties() /* Locates DAs from a list of DA hostnames */ /* */ /* Returns: number of *new* DAs found */ /*-------------------------------------------------------------------------*/ { char* temp; char* tempend; char* slider1; char* slider2; int sockfd; struct hostent* he; struct sockaddr_in peeraddr; struct timeval timeout; int result = 0; memset(&peeraddr,0,sizeof(peeraddr)); peeraddr.sin_family = AF_INET; peeraddr.sin_port = htons(SLP_RESERVED_PORT); slider1 = slider2 = temp = strdup(SLPGetProperty("net.slp.DAAddresses")); if(temp) { tempend = temp + strlen(temp); while(slider1 != tempend) { timeout.tv_sec = SLPPropertyAsInteger(SLPGetProperty("net.slp.DADiscoveryMaximumWait")); timeout.tv_usec = (timeout.tv_sec % 1000) * 1000; timeout.tv_sec = timeout.tv_sec / 1000; while(*slider2 && *slider2 != ',') slider2++; *slider2 = 0; he = gethostbyname(slider1); if(he) { peeraddr.sin_addr.s_addr = *((unsigned int*)(he->h_addr_list[0])); sockfd = SLPNetworkConnectStream(&peeraddr,&timeout); if(sockfd >= 0) { result = KnownDADiscoveryRqstRply(sockfd,&peeraddr,0,""); close(sockfd); if(result) { break; } } } slider1 = slider2; slider2++; } free(temp); } return result; }
/*-------------------------------------------------------------------------*/ int KnownDADiscoveryByProperties(struct timeval* timeout) /* Locates DAs from a list of DA hostnames */ /* */ /* Returns: number of DAs discovered */ /*-------------------------------------------------------------------------*/ { int result = 0; char* slider1; char* slider2; char* temp; char* tempend; int sock; struct hostent* he; struct sockaddr_in peeraddr; memset(&peeraddr,0,sizeof(peeraddr)); peeraddr.sin_family = AF_INET; peeraddr.sin_port = htons(SLP_RESERVED_PORT); slider1 = slider2 = temp = strdup(SLPGetProperty("net.slp.DAAddresses")); if (temp) { tempend = temp + strlen(temp); while (slider1 != tempend) { while (*slider2 && *slider2 != ',') slider2++; *slider2 = 0; he = gethostbyname(slider1); if (he) { peeraddr.sin_addr.s_addr = *((unsigned long*)(he->h_addr_list[0])); result += 1; sock = SLPNetworkConnectStream(&peeraddr,timeout); if (sock >= 0) { result += KnownDADiscoveryRqstRply(sock, &peeraddr); close(sock); } } slider1 = slider2; slider2++; } free(temp); } return result; }
/*-------------------------------------------------------------------------*/ int KnownDADiscoveryByMulticast() /* Locates DAs via multicast convergence */ /* */ /* Returns The number of DAs found */ /*-------------------------------------------------------------------------*/ { int result = 0; int sock; struct sockaddr_in peeraddr; sock = NetworkConnectToMulticast(&peeraddr); if(sock >= 0) { result = KnownDADiscoveryRqstRply(sock, &peeraddr); close(sock); } return result;; }
/*-------------------------------------------------------------------------*/ int KnownDADiscoverFromIPC() /* Ask Slpd if it knows about a DA */ /* */ /* Returns: number of *new* DAs found */ /*-------------------------------------------------------------------------*/ { struct sockaddr_in peeraddr; int sockfd; int result = 0; sockfd = NetworkConnectToSlpd(&peeraddr); if(sockfd >= 0) { result = KnownDADiscoveryRqstRply(sockfd, &peeraddr, 0, ""); close(sockfd); } return result; }
/*-------------------------------------------------------------------------*/ int KnownDADiscoverFromMulticast(int scopelistlen, const char* scopelist) /* Locates DAs via multicast convergence */ /* */ /* Returns: number of *new* DAs found */ /*-------------------------------------------------------------------------*/ { struct sockaddr_in peeraddr; int sockfd; int result = 0; sockfd = NetworkConnectToMulticast(&peeraddr); if(sockfd >= 0) { result = KnownDADiscoveryRqstRply(sockfd, &peeraddr, scopelistlen, scopelist); close(sockfd); } return result; }