// Copyright (C) 2003 Marc Boris Dürner // // 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 // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program 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 this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception to the GNU General Public License, permission is // granted for additional uses of the text contained in its release // of Common C++. // // The exception is that, if you link the Common C++ library with other files // to produce an executable, this does not by itself cause the // resulting executable to be covered by the GNU General Public License. // Your use of that executable is in no way restricted on account of // linking the Common C++ library code into it. // // This exception does not however invalidate any other reasons why // the executable file might be covered by the GNU General Public License. // // This exception applies only to the code released under the // name Common C++. If you copy code from other releases into a copy of // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. #include #include #include #include #include #ifdef CCXX_NAMESPACES using namespace std; using namespace ost; #endif NetworkInterface::NetworkInterface(const ost::String& node, int domain, int type) : Socket(domain, type), _node(node) { } NetworkInterface::~NetworkInterface() { } const uint32_t NetworkInterface::getMtu() const { #ifndef WIN32 struct ifreq ifr; strncpy(ifr.ifr_name, NetworkInterface::getNode().c_str(), IFNAMSIZ); if (-1 == ioctl(Socket::so, SIOCGIFMTU, &ifr)) { cout << "SIOCGIFMAP failed"<< endl; return 0; //THROW } return ifr.ifr_mtu; #else // // fill in winodws ioctl() // return 0; #endif } const vector NetworkInterface::getHwAddress() const { vector address; #ifndef WIN32 struct ifreq ifr; strncpy(ifr.ifr_name, NetworkInterface::getNode().c_str(), IFNAMSIZ); if (-1 == ioctl(Socket::so, SIOCGIFHWADDR, &ifr)) { cout << "SIOCGIFHWADDR failed"<< endl; return address; //THROW } for( int n = 0; n < IFHWADDRLEN; n++) address.push_back(ifr.ifr_hwaddr.sa_data[n]); #else // // fill in winodws ioctl() // #endif return address; } const uint32_t NetworkInterface::getBaseAddress() const { #ifndef WIN32 struct ifreq ifr; strncpy(ifr.ifr_name, NetworkInterface::getNode().c_str(), IFNAMSIZ); if (-1 == ioctl(Socket::so, SIOCGIFMAP, &ifr)) { cout << "SIOCGIFMAP failed"<< endl; return 0; //THROW } return ifr.ifr_map.base_addr; #else // // fill in winodws ioctl() // return 0; #endif } const uint32_t NetworkInterface::getIrq() const { #ifndef WIN32 struct ifreq ifr; strncpy(ifr.ifr_name, NetworkInterface::getNode().c_str(), IFNAMSIZ); if (-1 == ioctl(Socket::so, SIOCGIFMAP, &ifr)) { cout << "SIOCGIFMAP failed"<< endl; return 0; //THROW } return ifr.ifr_map.irq; #else // // fill in winodws ioctl() // return 0; #endif } const uint32_t NetworkInterface::getPort() const { #ifndef WIN32 struct ifreq ifr; strncpy(ifr.ifr_name, NetworkInterface::getNode().c_str(), IFNAMSIZ); if (-1 == ioctl(Socket::so, SIOCGIFMAP, &ifr)) { cout << "SIOCGIFMAP failed"<< endl; return 0; //THROW } return ifr.ifr_map.port; #else // // fill in winodws ioctl() // return 0; #endif } const uint32_t NetworkInterface::getDma() const { #ifndef WIN32 struct ifreq ifr; strncpy(ifr.ifr_name, NetworkInterface::getNode().c_str(), IFNAMSIZ); if (-1 == ioctl(Socket::so, SIOCGIFMAP, &ifr)) { cout << "SIOCGIFMAP failed"<< endl; return 0; //THROW } return ifr.ifr_map.dma; #else // // fill in winodws ioctl() // return 0; #endif } /* for(int n = 0; Nodes[n]; n++){ const char* Node = Nodes[n]; int fd; struct ifreq ifr; if( (fd = socket(AF_INET, SOCK_DGRAM, 0)) >= 0 ) { strncpy(ifr.ifr_name, Node, IFNAMSIZ); if( ioctl(fd, SIOCGIFFLAGS, &ifr) >= 0 ) { ifr.ifr_flags |= IFF_UP; if( ioctl(fd, SIOCSIFFLAGS, &ifr) >= 0 ) { if( ioctl(fd, SIOCGIFMAP, &ifr) >= 0 ) { for(int n = 0; n < IoBaseAddresses.size(); n++) { if(IoBaseAddresses.at(n) == ifr.ifr_map.base_addr) { _SystemNode = Node; if( ioctl(fd, SIOCGIFHWADDR, &ifr) >= 0 ) { for( int n = 0; n < IFHWADDRLEN; n++) _MacAddress.push_back(ifr.ifr_hwaddr.sa_data[n]); } cout << _SystemNode << ":"; for( int n = 0; n < 6; n++) cout << int(_MacAddress[n]); cout << endl; break; } } } //else cerr << "Error: could not get iface properties (" << Node << ") Error:" << errno << endl; } //else cerr << "Error: could not bring up device: (" << Node << ") Error:" << errno << endl; } //else cerr << "Error: could not get iface properties (" << Node << ") Error:" << errno << endl; } //else cerr << "Error: No file descriptor. (" << Node << ") Error:" << errno << endl; */