From: malaterre Date: Thu, 6 Jan 2005 18:53:02 +0000 (+0000) Subject: ENH: Found a Win32 version that seems to be working X-Git-Tag: Version1.0.bp~463 X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=commitdiff_plain;h=a43ecb687bb299c0affce3561917cb7878e855a5;p=gdcm.git ENH: Found a Win32 version that seems to be working --- diff --git a/src/gdcmUtil.cxx b/src/gdcmUtil.cxx index 3cd372ab..589609b0 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/06 18:46:02 $ - Version: $Revision: 1.72 $ + Date: $Date: 2005/01/06 18:53:02 $ + Version: $Revision: 1.73 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -315,6 +315,32 @@ bool Util::IsCurrentProcessorBigEndian() #include //for bzero #include +#ifdef _WIN32 +#include +#include +#include +typedef BOOL(WINAPI * pSnmpExtensionInit) ( + IN DWORD dwTimeZeroReference, + OUT HANDLE * hPollForTrapEvent, + OUT AsnObjectIdentifier * supportedView); + +typedef BOOL(WINAPI * pSnmpExtensionTrap) ( + OUT AsnObjectIdentifier * enterprise, + OUT AsnInteger * genericTrap, + OUT AsnInteger * specificTrap, + OUT AsnTimeticks * timeStamp, + OUT RFC1157VarBindList * variableBindings); + +typedef BOOL(WINAPI * pSnmpExtensionQuery) ( + IN BYTE requestType, + IN OUT RFC1157VarBindList * variableBindings, + OUT AsnInteger * errorStatus, + OUT AsnInteger * errorIndex); + +typedef BOOL(WINAPI * pSnmpExtensionInitEx) ( + OUT AsnObjectIdentifier * supportedView); +#endif //_WIN32 + #ifdef __linux__ #include #include @@ -334,6 +360,178 @@ bool Util::IsCurrentProcessorBigEndian() long GetMacAddrSys ( u_char *addr) { +#ifdef _WIN32 + WSADATA WinsockData; + if (WSAStartup(MAKEWORD(2, 0), &WinsockData) != 0) { + fprintf(stderr, "This program requires Winsock 2.x!\n"); + return; + } + + HINSTANCE m_hInst; + pSnmpExtensionInit m_Init; + pSnmpExtensionInitEx m_InitEx; + pSnmpExtensionQuery m_Query; + pSnmpExtensionTrap m_Trap; + HANDLE PollForTrapEvent; + AsnObjectIdentifier SupportedView; + UINT OID_ifEntryType[] = { + 1, 3, 6, 1, 2, 1, 2, 2, 1, 3 + }; + UINT OID_ifEntryNum[] = { + 1, 3, 6, 1, 2, 1, 2, 1 + }; + UINT OID_ipMACEntAddr[] = { + 1, 3, 6, 1, 2, 1, 2, 2, 1, 6 + }; //, 1 ,6 }; + AsnObjectIdentifier MIB_ifMACEntAddr = + { sizeof(OID_ipMACEntAddr) / sizeof(UINT), OID_ipMACEntAddr }; + AsnObjectIdentifier MIB_ifEntryType = { + sizeof(OID_ifEntryType) / sizeof(UINT), OID_ifEntryType + }; + AsnObjectIdentifier MIB_ifEntryNum = { + sizeof(OID_ifEntryNum) / sizeof(UINT), OID_ifEntryNum + }; + RFC1157VarBindList varBindList; + RFC1157VarBind varBind[2]; + AsnInteger errorStatus; + AsnInteger errorIndex; + AsnObjectIdentifier MIB_NULL = { + 0, 0 + }; + int ret; + int dtmp; + int i = 0, j = 0; + BOOL found = FALSE; + char TempEthernet[13]; + m_Init = NULL; + m_InitEx = NULL; + m_Query = NULL; + m_Trap = NULL; + + /* Load the SNMP dll and get the addresses of the functions + necessary */ + m_hInst = LoadLibrary("inetmib1.dll"); + if (m_hInst < (HINSTANCE) HINSTANCE_ERROR) { + m_hInst = NULL; + return; + } + m_Init = + (pSnmpExtensionInit) GetProcAddress(m_hInst, "SnmpExtensionInit"); + m_InitEx = + (pSnmpExtensionInitEx) GetProcAddress(m_hInst, + "SnmpExtensionInitEx"); + m_Query = + (pSnmpExtensionQuery) GetProcAddress(m_hInst, + "SnmpExtensionQuery"); + m_Trap = + (pSnmpExtensionTrap) GetProcAddress(m_hInst, "SnmpExtensionTrap"); + m_Init(GetTickCount(), &PollForTrapEvent, &SupportedView); + + /* Initialize the variable list to be retrieved by m_Query */ + varBindList.list = varBind; + varBind[0].name = MIB_NULL; + varBind[1].name = MIB_NULL; + + /* Copy in the OID to find the number of entries in the + Inteface table */ + varBindList.len = 1; /* Only retrieving one item */ + SNMP_oidcpy(&varBind[0].name, &MIB_ifEntryNum); + ret = + m_Query(ASN_RFC1157_GETNEXTREQUEST, &varBindList, &errorStatus, + &errorIndex); +// printf("# of adapters in this system : %i\n", +// varBind[0].value.asnValue.number); varBindList.len = 2; + + /* Copy in the OID of ifType, the type of interface */ + SNMP_oidcpy(&varBind[0].name, &MIB_ifEntryType); + + /* Copy in the OID of ifPhysAddress, the address */ + SNMP_oidcpy(&varBind[1].name, &MIB_ifMACEntAddr); + + do { + + /* Submit the query. Responses will be loaded into varBindList. + We can expect this call to succeed a # of times corresponding + to the # of adapters reported to be in the system */ + ret = + m_Query(ASN_RFC1157_GETNEXTREQUEST, &varBindList, &errorStatus, + &errorIndex); if (!ret) ret = 1; + + else + /* Confirm that the proper type has been returned */ + ret = + SNMP_oidncmp(&varBind[0].name, &MIB_ifEntryType, + MIB_ifEntryType.idLength); if (!ret) { + j++; + dtmp = varBind[0].value.asnValue.number; + //printf("Interface #%i type : %i\n", j, dtmp); + + /* Type 6 describes ethernet interfaces */ + if (dtmp == 6) { + + /* Confirm that we have an address here */ + ret = + SNMP_oidncmp(&varBind[1].name, &MIB_ifMACEntAddr, + MIB_ifMACEntAddr.idLength); + if ((!ret) + && (varBind[1].value.asnValue.address.stream != NULL)) { + if ( + (varBind[1].value.asnValue.address.stream[0] == + 0x44) + && (varBind[1].value.asnValue.address.stream[1] == + 0x45) + && (varBind[1].value.asnValue.address.stream[2] == + 0x53) + && (varBind[1].value.asnValue.address.stream[3] == + 0x54) + && (varBind[1].value.asnValue.address.stream[4] == + 0x00)) { + + /* Ignore all dial-up networking adapters */ + //printf("Interface #%i is a DUN adapter\n", j); + continue; + } + if ( + (varBind[1].value.asnValue.address.stream[0] == + 0x00) + && (varBind[1].value.asnValue.address.stream[1] == + 0x00) + && (varBind[1].value.asnValue.address.stream[2] == + 0x00) + && (varBind[1].value.asnValue.address.stream[3] == + 0x00) + && (varBind[1].value.asnValue.address.stream[4] == + 0x00) + && (varBind[1].value.asnValue.address.stream[5] == + 0x00)) { + + /* Ignore NULL addresses returned by other network + interfaces */ + //printf("Interface #%i is a NULL address\n", j); + continue; + } + sprintf(addr, "%02x%02x%02x%02x%02x%02x", + varBind[1].value.asnValue.address.stream[0], + varBind[1].value.asnValue.address.stream[1], + varBind[1].value.asnValue.address.stream[2], + varBind[1].value.asnValue.address.stream[3], + varBind[1].value.asnValue.address.stream[4], + varBind[1].value.asnValue.address.stream[5]); + //printf("MAC Address of interface #%i: %s\n", j, TempEthernet); + } + } + } + } while (!ret); /* Stop only on an error. An error will occur + when we go exhaust the list of interfaces to + be examined */ + //getch(); + + /* Free the bindings */ + SNMP_FreeVarBind(&varBind[0]); + SNMP_FreeVarBind(&varBind[1]); + return 0; +#endif //_WIN32 + /* implementation for Linux */ #ifdef __linux__ struct ifreq ifr;