/* * This file is part of rasdaman community. * * Rasdaman community is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Rasdaman community is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with rasdaman community. If not, see . * * Copyright 2003, 2004, 2005, 2006, 2007, 2008, 2009 Peter Baumann / rasdaman GmbH. * * For more information please see * or contact Peter Baumann via . / /** * SOURCE: akgnet_inetaddr.cc * * MODULE: akg network * CLASS: HostAddress, SocketAddress * * COMMENTS: * */ #include #include #include #include akg::HostAddress::HostAddress() throw() { initDefault(); } akg::HostAddress::HostAddress(uint32_t x) { initDefault(); address.s_addr = htonl(x); struct hostent *host = gethostbyaddr((const char*)&address, sizeof(in_addr), AF_INET); init(host); } akg::HostAddress::HostAddress(const char *theHostName) { assert(theHostName != 0); initDefault(); struct hostent *host = gethostbyname (theHostName); init(host); } akg::HostAddress::HostAddress(const akg::HostAddress &ha) { fullHostName = new char[strlen(ha.fullHostName) + 1]; strcpy(fullHostName, ha.fullHostName); shortHostName = new char[strlen(ha.shortHostName) + 1]; strcpy(shortHostName, ha.shortHostName); strAddress = new char[strlen(ha.strAddress) + 1]; strcpy(strAddress, ha.strAddress); } akg::HostAddress::~HostAddress() throw() { if(fullHostName) delete[] fullHostName; if(shortHostName) delete[] shortHostName; if(strAddress) delete[] strAddress; } bool akg::HostAddress::isValid() const throw() { return address.s_addr == addrNone ? false:true; } void akg::HostAddress::initDefault() throw() { fullHostName = NULL; shortHostName = NULL; strAddress = NULL; address.s_addr = addrNone; } // New is supposed to throw bool akg::HostAddress::init(hostent *host) { if(host == NULL) return false; in_addr *ptr = (in_addr*)host->h_addr_list[0]; if(host->h_name == NULL || ptr == NULL) return false; fullHostName = new char[ strlen(host->h_name) +1]; strcpy(fullHostName,host->h_name); char *dotPos = strchr(fullHostName,'.'); int copyLen = dotPos ? dotPos-fullHostName : strlen(fullHostName); shortHostName = new char[copyLen+1]; strncpy(shortHostName,fullHostName,copyLen); shortHostName[copyLen] = 0; char *nta = inet_ntoa(*ptr); strAddress = new char[strlen(nta) + 1]; strcpy(strAddress,nta); address = *ptr; return true; } const char* akg::HostAddress::getFullHostName() const throw() { return fullHostName; } const char* akg::HostAddress::getShortHostName() const throw() { return shortHostName; } uint32_t akg::HostAddress::getAddress() const throw() { return ntohl(address.s_addr); } const char* akg::HostAddress::getStringAddress() const throw() { return strAddress; } //############################################################ akg::SocketAddress::SocketAddress() throw() { clear(); } akg::SocketAddress::SocketAddress(sockaddr_in &x) throw() { init(x); } void akg::SocketAddress::init(sockaddr_in &x) throw() { valid = true; address = x; } bool akg::SocketAddress::isValid() const throw() { return valid; } void akg::SocketAddress::clear() throw() { valid = false; address.sin_family = AF_INET; } akg::HostAddress akg::SocketAddress::getHostAddress() const throw() { return valid ? HostAddress(getAddress()) : HostAddress(); } uint32_t akg::SocketAddress::getAddress() const throw() { return ntohl(address.sin_addr.s_addr); } int akg::SocketAddress::getPort() const throw() { return ntohs(address.sin_port); }