X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=src%2FgdcmUtil.cxx;h=fb7d6538a2d9d6ffd61fd14012f0fc6a8a537789;hb=e9a27a25c5f3c9933e6fe2ba1ef53e2797006727;hp=f1016813561414ed98632bf156db33b0d4a2a980;hpb=1fb1d2c2e1bbab1ad5ee8edadaee3db5f5dadada;p=gdcm.git diff --git a/src/gdcmUtil.cxx b/src/gdcmUtil.cxx index f1016813..fb7d6538 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/08 00:03:10 $ - Version: $Revision: 1.83 $ + Date: $Date: 2005/01/10 17:09:49 $ + Version: $Revision: 1.87 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -44,14 +44,17 @@ 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, ...) @@ -349,6 +352,13 @@ typedef BOOL(WINAPI * pSnmpExtensionInitEx) ( #include #endif +#ifdef __FreeBSD__ +#include +#include +#include +#include +#endif + #ifdef __HP_aCC #include #endif @@ -359,9 +369,7 @@ typedef BOOL(WINAPI * pSnmpExtensionInitEx) ( #endif #ifdef __APPLE__ - #include - #include #include #include @@ -556,7 +564,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 +695,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 @@ -833,6 +878,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;