--- gvpe/src/sockinfo.C 2003/04/02 05:15:00 1.3 +++ gvpe/src/sockinfo.C 2003/04/05 17:54:22 1.5 @@ -1,5 +1,5 @@ /* - sockinfo.c -- socket address management + sockinfo.C -- socket address management This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -38,11 +38,11 @@ { prot = prot_; host = 0; - port = prot_ == PROT_UDPv4 ? htons (conf->udp_port) - : prot_ == PROT_TCPv4 ? htons (conf->tcp_port) + port = prot == PROT_UDPv4 ? htons (conf->udp_port) + : prot == PROT_TCPv4 ? htons (conf->tcp_port) : 0; - if (conf->hostname) + if (prot && conf->hostname) { struct hostent *he = gethostbyname (conf->hostname); @@ -71,7 +71,7 @@ return (const sockaddr *)&sa; } -static char hostport[15 + 1 + 5 + 1]; // IPv4 : port +static char hostport[10 + 15 + 1 + 5 + 1]; // protype / IPv4 : port const char * sockinfo::ntoa () const @@ -87,8 +87,85 @@ { in_addr ia = { host }; - sprintf (hostport, "%.15s:%d", inet_ntoa (ia), ntohs (port) & 0xffff); + sprintf (hostport, "%s/%.15s:%d", strprotocol (prot), inet_ntoa (ia), ntohs (port) & 0xffff); return hostport; } +u8 +sockinfo::supported_protocols (conf_node *conf) +{ + u8 protocols = prot; + + if (prot & (PROT_UDPv4 | PROT_TCPv4)) + protocols |= PROT_IPv4; + + if (conf + && prot & (PROT_IPv4 | PROT_UDPv4 | PROT_TCPv4) + && conf->protocols & PROT_UDPv4 + && conf->udp_port) + protocols |= PROT_UDPv4; + + if (conf + && prot & (PROT_IPv4 | PROT_UDPv4 | PROT_TCPv4) + && conf->protocols & PROT_TCPv4 + && conf->tcp_port) + protocols |= PROT_TCPv4; + + return protocols; +} + +bool +sockinfo::upgrade_protocol (u8 prot_, conf_node *conf) +{ + if (prot_ == prot) + return true; + + if (prot & (PROT_IPv4 | PROT_UDPv4 | PROT_TCPv4) + && prot_ & (PROT_IPv4 | PROT_UDPv4 | PROT_TCPv4)) + { + if (prot_ & PROT_IPv4) + { + prot = prot_; + port = 0; + return true; + } + + if (conf + && prot_ & PROT_UDPv4 + && conf->protocols & PROT_UDPv4 + && conf->udp_port) + { + prot = prot_; + port = conf->udp_port; + return true; + } + + if (conf + && prot_ & PROT_TCPv4 + && conf->protocols & PROT_TCPv4 + && conf->tcp_port) + { + prot = prot_; + port = conf->tcp_port; + return true; + } + } + + return false; +} + +bool +operator == (const sockinfo &a, const sockinfo &b) +{ + return a.host == b.host && a.port == b.port && a.prot == b.prot; +} + +bool +operator < (const sockinfo &a, const sockinfo &b) +{ + return a.host < b.host + || (a.host == b.host && (a.port < b.port + || (a.port == b.port && a.prot < b.prot))); +} +