X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=src%2FgdcmUtil.cxx;h=443abb45e88445858ee6d2c23713b9b1045e8bb3;hb=5887c4beef24959af83e43efad0bb86acac9339e;hp=5930aff41988b79e8e2a096630902f973e8b29e8;hpb=52ec19b00fbcd40a19c24dcecd87764b5b6739aa;p=gdcm.git diff --git a/src/gdcmUtil.cxx b/src/gdcmUtil.cxx index 5930aff4..443abb45 100644 --- a/src/gdcmUtil.cxx +++ b/src/gdcmUtil.cxx @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: gdcmUtil.cxx,v $ Language: C++ - Date: $Date: 2005/01/07 23:59:12 $ - Version: $Revision: 1.81 $ + Date: $Date: 2005/01/11 00:24:44 $ + Version: $Revision: 1.89 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -38,20 +38,68 @@ #endif #endif +// For GetMACAddress +#include +#include +#include + +#ifdef _WIN32 +#include +#include +#else +#include //for bzero on unix +#endif + +#ifdef __linux__ +#include +#include +#include +#include +#include +#endif + +#ifdef __FreeBSD__ +#include +#include +#include +#include +#endif + +#ifdef __HP_aCC +#include +#endif + +#ifdef _AIX +#include +#include +#endif + +#ifdef __APPLE__ +#include +#include +#include +#include +#include +#endif //__APPLE__ +// End For GetMACAddress + namespace gdcm { /** * \ingroup Globals * \brief Provide a better 'c++' approach for sprintf * For example c code is: - * sprintf(trash, "%04x|%04x", group , element); + * sprintf(trash, "%04x|%04x", group , elem); * - * c++ is + * c++ code is * std::ostringstream buf; * buf << std::right << std::setw(4) << std::setfill('0') << std::hex * << group << "|" << std::right << std::setw(4) << std::setfill('0') - * << std::hex << element; + * << std::hex << elem; * buf.str(); + * + * gdcm style code is + * Format("%04x|%04x", group , elem); */ std::string Util::Format(const char *format, ...) @@ -299,24 +347,16 @@ bool Util::DicomStringEqual(const std::string &s1, const char *s2) */ bool Util::IsCurrentProcessorBigEndian() { - uint16_t intVal = 1; - uint8_t bigEndianRepr[4] = { 0x00, 0x00, 0x00, 0x01 }; - int res = memcmp(reinterpret_cast(&intVal), - reinterpret_cast(bigEndianRepr), 4); - if (res == 0) - return true; - else - return false; +#ifdef GDCM_WORDS_BIGENDIAN + return true; +#else + return false; +#endif } -#include -#include -#include #ifdef _WIN32 -#include -#include typedef BOOL(WINAPI * pSnmpExtensionInit) ( IN DWORD dwTimeZeroReference, OUT HANDLE * hPollForTrapEvent, @@ -337,39 +377,10 @@ typedef BOOL(WINAPI * pSnmpExtensionQuery) ( typedef BOOL(WINAPI * pSnmpExtensionInitEx) ( OUT AsnObjectIdentifier * supportedView); -#else -#include //for bzero on unix #endif //_WIN32 -#ifdef __linux__ -#include -#include -#include -#include -#include -#endif - -#ifdef __HP_aCC -#include -#endif - -#ifdef _AIX -#include -#include -#endif #ifdef __APPLE__ - -#include - -#include -#include -#include -#include - -static kern_return_t FindEthernetInterfaces(io_iterator_t *matchingServices); -static kern_return_t GetMACAddress(io_iterator_t intfIterator, UInt8 *MACAddress); - // Returns an iterator containing the primary (built-in) Ethernet interface. The caller is responsible for // releasing the iterator after the caller is done with it. static kern_return_t FindEthernetInterfaces(io_iterator_t *matchingServices) @@ -467,7 +478,7 @@ static kern_return_t GetMACAddress_MAC(io_iterator_t intfIterator, UInt8 *MACAdd bzero(MACAddress, kIOEthernetAddressSize); // IOIteratorNext retains the returned object, so release it when we're done with it. - while (intfService = IOIteratorNext(intfIterator)) + while ( (intfService = IOIteratorNext(intfIterator))) { CFTypeRef MACAddressAsCFData; @@ -556,7 +567,6 @@ long GetMacAddrSys ( u_char *addr) int dtmp; int i = 0, j = 0; BOOL found = FALSE; - char TempEthernet[13]; m_Init = NULL; m_InitEx = NULL; m_Query = NULL; @@ -688,48 +698,86 @@ long GetMacAddrSys ( u_char *addr) #endif //_WIN32 /* implementation for Linux */ -// FreeBSD might be similar ?? #ifdef __linux__ - struct ifreq ifr; - struct ifreq *IFR; - struct ifconf ifc; - char buf[1024]; - int s, i; - int ok = 0; - - s = socket(AF_INET, SOCK_DGRAM, 0); - if (s==-1) { - return -1; - } + struct ifreq ifr; + struct ifreq *IFR; + struct ifconf ifc; + char buf[1024]; + int s, i; + int ok = 0; + + s = socket(AF_INET, SOCK_DGRAM, 0); + if (s==-1) { + return -1; + } - ifc.ifc_len = sizeof(buf); - ifc.ifc_buf = buf; - ioctl(s, SIOCGIFCONF, &ifc); + ifc.ifc_len = sizeof(buf); + ifc.ifc_buf = buf; + ioctl(s, SIOCGIFCONF, &ifc); - IFR = ifc.ifc_req; - for (i = ifc.ifc_len / sizeof(struct ifreq); --i >= 0; IFR++) { - - strcpy(ifr.ifr_name, IFR->ifr_name); - if (ioctl(s, SIOCGIFFLAGS, &ifr) == 0) { - if (! (ifr.ifr_flags & IFF_LOOPBACK)) { - if (ioctl(s, SIOCGIFHWADDR, &ifr) == 0) { - ok = 1; - break; - } - } - } - } + IFR = ifc.ifc_req; + for (i = ifc.ifc_len / sizeof(struct ifreq); --i >= 0; IFR++) { + + strcpy(ifr.ifr_name, IFR->ifr_name); + if (ioctl(s, SIOCGIFFLAGS, &ifr) == 0) { + if (! (ifr.ifr_flags & IFF_LOOPBACK)) { + if (ioctl(s, SIOCGIFHWADDR, &ifr) == 0) { + ok = 1; + break; + } + } + } + } - close(s); - if (ok) { - bcopy( ifr.ifr_hwaddr.sa_data, addr, 6); - } - else { - return -1; - } - return 0; + close(s); + if (ok) { + bcopy( ifr.ifr_hwaddr.sa_data, addr, 6); + } + else { + return -1; + } + return 0; #endif +/* implementation for FreeBSD */ +#ifdef __FreeBSD__ + struct ifaddrs *ifap, *ifaphead; + int rtnerr; + const struct sockaddr_dl *sdl; + caddr_t ap; + int alen; + + rtnerr = getifaddrs(&ifaphead); + if (rtnerr) { + //perror(NULL); + return -1; + } + + for (ifap = ifaphead; ifap; ifap = ifap->ifa_next) { + + if (ifap->ifa_addr->sa_family == AF_LINK) { + sdl = (const struct sockaddr_dl *) ifap->ifa_addr; + ap = ((caddr_t)((sdl)->sdl_data + (sdl)->sdl_nlen)); + alen = sdl->sdl_alen; + if (ap && alen > 0) { + int i; + + //printf ("%s:", ifap->ifa_name); + //for (i = 0; i < alen; i++, ap++) + { + //printf("%c%02x", i > 0 ? ':' : ' ', 0xff&*ap); + } + bcopy( ap, addr, 6); + //putchar('\n'); + } + } + } + //putchar('\n'); + + freeifaddrs(ifaphead); + return 0; +#endif //FreeBSD + /* implementation for HP-UX */ #ifdef __HP_aCC @@ -801,7 +849,7 @@ long GetMacAddrSys ( u_char *addr) */ io_iterator_t intfIterator; - //UInt8 MACAddress[ kIOEthernetAddressSize ]; + UInt8 MACAddress[ kIOEthernetAddressSize ]; kernResult = FindEthernetInterfaces(&intfIterator); @@ -810,7 +858,7 @@ long GetMacAddrSys ( u_char *addr) printf("FindEthernetInterfaces returned 0x%08x\n", kernResult); } else { - kernResult = GetMACAddress_MAC(intfIterator, addr); + kernResult = GetMACAddress_MAC(intfIterator, MACAddress); if (KERN_SUCCESS != kernResult) { @@ -820,6 +868,7 @@ long GetMacAddrSys ( u_char *addr) (void) IOObjectRelease(intfIterator); // Release the iterator. + memcpy(addr, MACAddress, kIOEthernetAddressSize); return kernResult; #endif //APPLE @@ -832,6 +881,8 @@ std::string Util::GetMACAddress() { // This is a rip from: http://cplus.kompf.de/macaddr.html for Linux, HPUX and AIX // and http://tangentsoft.net/wskfaq/examples/src/snmpmac.cpp for windows version + // and http://groups-beta.google.com/group/sol.lists.freebsd.hackers/msg/0d0f862e05fce6c0 for the FreeBSD version + // and http://developer.apple.com/samplecode/GetPrimaryMACAddress/GetPrimaryMACAddress.html for MacOSX version long stat; u_char addr[6]; std::string macaddr;