From: malaterre Date: Thu, 6 Jan 2005 18:46:02 +0000 (+0000) Subject: ENH: Saving temp code until I have time for Win32 version. This will return the MAC... X-Git-Tag: Version1.0.bp~464 X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=commitdiff_plain;h=ba0bc3fcf8f575dd3e1509642598408b522d20e6;p=gdcm.git ENH: Saving temp code until I have time for Win32 version. This will return the MAC adress which is much more intelligent than returning the IP adress --- diff --git a/src/gdcmUtil.cxx b/src/gdcmUtil.cxx index 948fd2cc..3cd372ab 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/05 15:19:42 $ - Version: $Revision: 1.71 $ + Date: $Date: 2005/01/06 18:46:02 $ + Version: $Revision: 1.72 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -309,6 +309,161 @@ bool Util::IsCurrentProcessorBigEndian() } +#include +#include +#include +#include //for bzero +#include + +#ifdef __linux__ +#include +#include +#include +#include +#include +#endif + +#ifdef __HP_aCC +#include +#endif + +#ifdef _AIX +#include +#include +#endif + +long GetMacAddrSys ( u_char *addr) +{ +/* implementation for Linux */ +#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; + } + + 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; + } + } + } + } + + close(s); + if (ok) { + bcopy( ifr.ifr_hwaddr.sa_data, addr, 6); + } + else { + return -1; + } + return 0; +#endif + +/* implementation for HP-UX */ +#ifdef __HP_aCC + +#define LAN_DEV0 "/dev/lan0" + + int fd; + struct fis iocnt_block; + int i; + char net_buf[sizeof(LAN_DEV0)+1]; + char *p; + + (void)sprintf(net_buf, "%s", LAN_DEV0); + p = net_buf + strlen(net_buf) - 1; + + /* + * Get 802.3 address from card by opening the driver and interrogating it. + */ + for (i = 0; i < 10; i++, (*p)++) { + if ((fd = open (net_buf, O_RDONLY)) != -1) { + iocnt_block.reqtype = LOCAL_ADDRESS; + ioctl (fd, NETSTAT, &iocnt_block); + close (fd); + + if (iocnt_block.vtype == 6) + break; + } + } + + if (fd == -1 || iocnt_block.vtype != 6) { + return -1; + } + + bcopy( &iocnt_block.value.s[0], addr, 6); + return 0; + +#endif /* HPUX */ + +/* implementation for AIX */ +#ifdef _AIX + + int size; + struct kinfo_ndd *nddp; + + size = getkerninfo(KINFO_NDD, 0, 0, 0); + if (size <= 0) { + return -1; + } + nddp = (struct kinfo_ndd *)malloc(size); + + if (!nddp) { + return -1; + } + if (getkerninfo(KINFO_NDD, nddp, &size, 0) < 0) { + free(nddp); + return -1; + } + bcopy(nddp->ndd_addr, addr, 6); + free(nddp); + return 0; +#endif //_AIX + +/* Not implemented platforms */ + return -1; +} + +//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 +// long stat; +// int i; +// u_char addr[6]; +// +// stat = mac_addr_sys( addr); +// if (0 == stat) +// { +// printf( "MAC address = "); +// for (i=0; i<6; ++i) { +// printf("%2.2x", addr[i]); +// } +// printf( "\n"); +// } +// else { +// fprintf( stderr, "can't get MAC address\n"); +// exit( 1); +// } +//} + /** * \ingroup Util * \brief Return the IP adress of the machine writting the DICOM image