diff options
Diffstat (limited to 'ACE/apps/drwho/Multicast_Manager.cpp')
-rw-r--r-- | ACE/apps/drwho/Multicast_Manager.cpp | 182 |
1 files changed, 182 insertions, 0 deletions
diff --git a/ACE/apps/drwho/Multicast_Manager.cpp b/ACE/apps/drwho/Multicast_Manager.cpp new file mode 100644 index 00000000000..71bb56ee894 --- /dev/null +++ b/ACE/apps/drwho/Multicast_Manager.cpp @@ -0,0 +1,182 @@ +// $Id$ + +#include "Multicast_Manager.h" +#include "ace/Mem_Map.h" +#include "ace/Log_Msg.h" +#include "ace/OS_NS_string.h" +#include "ace/OS_NS_arpa_inet.h" +#include "ace/OS_NS_netdb.h" +#include "ace/OS_Memory.h" +#include "ace/os_include/os_ctype.h" + +// Initialize all the static member vars. +int Multicast_Manager::received_host_count = 0; +Host_Elem *Multicast_Manager::drwho_list = 0; +Host_Elem *Multicast_Manager::current_ptr = 0; + +// Names of hosts to query for friend info. +const char *Multicast_Manager::host_names[] = +{ + "tango.cs.wustl.edu", + 0 // The NULL entry... +}; + +void +Multicast_Manager::insert_default_hosts (void) +{ + // Enter the static list of hosts into the dynamic table! + + for (const char **np = host_names; + *np != 0; + np++) + Multicast_Manager::add_host (*np); +} + +// Inserts all the names in FILENAME into the list of hosts to +// contact. + +int +Multicast_Manager::insert_hosts_from_file (const char *filename) +{ + ACE_Mem_Map mmap (filename); + char *host_ptr = (char *) mmap.addr (); + + if (host_ptr == 0) + return -1; + else + { + for (char *end_ptr = host_ptr + mmap.size (); + host_ptr < end_ptr; + ) + { + Multicast_Manager::add_host (host_ptr); + + while (*host_ptr != '\n') + host_ptr++; + + *host_ptr++ = '\0'; + } + + return 0; + } +} + +// Returns the IP host address for the next unexamined host in the +// list. If no more unexamined hosts remain a 0 is returned, else a +// 1. + +int +Multicast_Manager::get_next_host_addr (in_addr &host_addr) +{ + for (Multicast_Manager::current_ptr = Multicast_Manager::current_ptr == 0 ? Multicast_Manager::drwho_list : Multicast_Manager::current_ptr->next; + + Multicast_Manager::current_ptr != 0; + Multicast_Manager::current_ptr = Multicast_Manager::current_ptr->next) + { + const char *host_name = Multicast_Manager::current_ptr->host_name; + hostent *hp = Multicast_Manager::get_host_entry (host_name); + + if (hp == 0) + { + ACE_ERROR ((LM_ERROR, + "%s: host unknown.\n", + host_name)); + continue; + } + + Multicast_Manager::received_host_count++; + ACE_OS::memcpy (&host_addr, + hp->h_addr, + sizeof host_addr); + ACE_OS::memcpy (&Multicast_Manager::current_ptr->host_addr, + hp->h_addr, + sizeof host_addr); + return 1; + } + + return 0; +} + +// This function attempts to get the internet address for either a +// hostname or hostnumber. The function makes the simplifying +// assumption that hostnames begin with an alphabetic character! + +hostent * +Multicast_Manager::get_host_entry (const char *host) +{ + static hostent host_entry; + hostent *hp; + + if (isdigit (*host)) // IP address. + { + u_long ia = ACE_OS::inet_addr (host); + + if (ia == (u_long) -1) + hp = 0; + else + hp = ACE_OS::gethostbyaddr ((char *) &ia, + sizeof ia, + AF_INET); + } + else + // Host name. + hp = ACE_OS::gethostbyname (host); + + + return hp == 0 ? 0 : (hostent *) ACE_OS::memcpy (&host_entry, hp, sizeof *hp); +} + +// Adds an additional new host to the list of host machines. + +void +Multicast_Manager::add_host (const char *host_name) +{ + ACE_NEW (Multicast_Manager::drwho_list, + Host_Elem (host_name, + Multicast_Manager::drwho_list)); +} + +void +Multicast_Manager::checkoff_host (in_addr host_addr) +{ + for (Host_Elem *tmp = Multicast_Manager::drwho_list; + tmp != 0; + tmp = tmp->next) + if (ACE_OS::memcmp (&tmp->host_addr.s_addr, + &host_addr.s_addr, + sizeof host_addr.s_addr) == 0) + { + tmp->checked_off = 1; + Multicast_Manager::received_host_count--; + return; + } +} + +int +Multicast_Manager::get_next_non_responding_host (const char *&host_name) +{ + for (Multicast_Manager::current_ptr = Multicast_Manager::current_ptr == 0 ? Multicast_Manager::drwho_list : Multicast_Manager::current_ptr->next; + Multicast_Manager::current_ptr != 0; + Multicast_Manager::current_ptr = Multicast_Manager::current_ptr->next) + if (Multicast_Manager::current_ptr->checked_off == 0) + { + host_name = Multicast_Manager::current_ptr->host_name; + return 1; + } + + return 0; +} + +Host_Elem::Host_Elem (const char *h_name, + Host_Elem *n) + : host_name (h_name), + checked_off (0), + next (n) +{ +} + +int +Multicast_Manager::outstanding_hosts_remain (void) +{ + return Multicast_Manager::received_host_count > 0; +} |