|
|
@@ -1,7 +1,7 @@
|
|
|
//
|
|
|
// UUIDGenerator.cpp
|
|
|
//
|
|
|
-// $Id: //poco/svn/Foundation/src/UUIDGenerator.cpp#2 $
|
|
|
+// $Id: //poco/1.3/Foundation/src/UUIDGenerator.cpp#4 $
|
|
|
//
|
|
|
// Library: Foundation
|
|
|
// Package: UUID
|
|
|
@@ -62,7 +62,7 @@ UUID UUIDGenerator::create()
|
|
|
|
|
|
if (!_haveNode)
|
|
|
{
|
|
|
- getNode();
|
|
|
+ Environment::nodeId(_node);
|
|
|
_haveNode = true;
|
|
|
}
|
|
|
Timestamp::UtcTimeVal tv = timeStamp();
|
|
|
@@ -153,210 +153,3 @@ UUIDGenerator& UUIDGenerator::defaultGenerator()
|
|
|
|
|
|
|
|
|
} // namespace Poco
|
|
|
-
|
|
|
-
|
|
|
-//
|
|
|
-// platform-specific code below
|
|
|
-//
|
|
|
-
|
|
|
-
|
|
|
-#if defined(POCO_OS_FAMILY_WINDOWS)
|
|
|
-//
|
|
|
-// Windows
|
|
|
-//
|
|
|
-#include "Poco/UnWindows.h"
|
|
|
-#include <iphlpapi.h>
|
|
|
-
|
|
|
-
|
|
|
-namespace Poco {
|
|
|
-
|
|
|
-
|
|
|
-void UUIDGenerator::getNode()
|
|
|
-{
|
|
|
- PIP_ADAPTER_INFO pAdapterInfo;
|
|
|
- PIP_ADAPTER_INFO pAdapter = 0;
|
|
|
- ULONG len = sizeof(IP_ADAPTER_INFO);
|
|
|
- pAdapterInfo = reinterpret_cast<IP_ADAPTER_INFO*>(new char[len]);
|
|
|
- // Make an initial call to GetAdaptersInfo to get
|
|
|
- // the necessary size into len
|
|
|
- DWORD rc = GetAdaptersInfo(pAdapterInfo, &len);
|
|
|
- if (rc == ERROR_BUFFER_OVERFLOW)
|
|
|
- {
|
|
|
- delete [] reinterpret_cast<char*>(pAdapterInfo);
|
|
|
- pAdapterInfo = reinterpret_cast<IP_ADAPTER_INFO*>(new char[len]);
|
|
|
- }
|
|
|
- else if (rc != ERROR_SUCCESS)
|
|
|
- {
|
|
|
- throw SystemException("cannot get network adapter list");
|
|
|
- }
|
|
|
- try
|
|
|
- {
|
|
|
- bool found = false;
|
|
|
- if (GetAdaptersInfo(pAdapterInfo, &len) == NO_ERROR)
|
|
|
- {
|
|
|
- pAdapter = pAdapterInfo;
|
|
|
- while (pAdapter && !found)
|
|
|
- {
|
|
|
- if (pAdapter->Type == MIB_IF_TYPE_ETHERNET && pAdapter->AddressLength == sizeof(_node))
|
|
|
- {
|
|
|
- std::memcpy(_node, pAdapter->Address, pAdapter->AddressLength);
|
|
|
- found = true;
|
|
|
- }
|
|
|
- pAdapter = pAdapter->Next;
|
|
|
- }
|
|
|
- }
|
|
|
- else throw SystemException("cannot get network adapter list");
|
|
|
- if (!found) throw SystemException("no Ethernet adapter found");
|
|
|
- }
|
|
|
- catch (Exception&)
|
|
|
- {
|
|
|
- delete [] reinterpret_cast<char*>(pAdapterInfo);
|
|
|
- throw;
|
|
|
- }
|
|
|
- delete [] reinterpret_cast<char*>(pAdapterInfo);
|
|
|
-}
|
|
|
-
|
|
|
-
|
|
|
-} // namespace Poco
|
|
|
-
|
|
|
-
|
|
|
-#elif defined(POCO_OS_FAMILY_BSD) || POCO_OS == POCO_OS_QNX
|
|
|
-//
|
|
|
-// BSD variants
|
|
|
-//
|
|
|
-#include <sys/types.h>
|
|
|
-#include <sys/socket.h>
|
|
|
-#include <ifaddrs.h>
|
|
|
-#include <net/if_dl.h>
|
|
|
-
|
|
|
-
|
|
|
-namespace Poco {
|
|
|
-
|
|
|
-
|
|
|
-void UUIDGenerator::getNode()
|
|
|
-{
|
|
|
- struct ifaddrs* ifaphead;
|
|
|
- int rc = getifaddrs(&ifaphead);
|
|
|
- if (rc) throw SystemException("cannot get network adapter list");
|
|
|
-
|
|
|
- bool foundAdapter = false;
|
|
|
- for (struct ifaddrs* ifap = ifaphead; ifap; ifap = ifap->ifa_next)
|
|
|
- {
|
|
|
- if (ifap->ifa_addr && ifap->ifa_addr->sa_family == AF_LINK)
|
|
|
- {
|
|
|
- struct sockaddr_dl* sdl = reinterpret_cast<struct sockaddr_dl*>(ifap->ifa_addr);
|
|
|
- caddr_t ap = (caddr_t) (sdl->sdl_data + sdl->sdl_nlen);
|
|
|
- int alen = sdl->sdl_alen;
|
|
|
- if (ap && alen > 0)
|
|
|
- {
|
|
|
- std::memcpy(_node, ap, sizeof(_node));
|
|
|
- foundAdapter = true;
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- freeifaddrs(ifaphead);
|
|
|
- if (!foundAdapter) throw SystemException("cannot determine MAC address (no suitable network adapter found)");
|
|
|
-}
|
|
|
-
|
|
|
-
|
|
|
-} // namespace Poco
|
|
|
-
|
|
|
-
|
|
|
-#elif defined(__CYGWIN__) || POCO_OS == POCO_OS_LINUX
|
|
|
-//
|
|
|
-// Linux
|
|
|
-//
|
|
|
-#include <sys/ioctl.h>
|
|
|
-#include <sys/socket.h>
|
|
|
-#include <netinet/in.h>
|
|
|
-#include <net/if.h>
|
|
|
-#include <arpa/inet.h>
|
|
|
-#include <unistd.h>
|
|
|
-
|
|
|
-
|
|
|
-namespace Poco {
|
|
|
-
|
|
|
-
|
|
|
-void UUIDGenerator::getNode()
|
|
|
-{
|
|
|
- struct ifreq ifr;
|
|
|
-
|
|
|
- int s = socket(PF_INET, SOCK_DGRAM, 0);
|
|
|
- if (s == -1) throw SystemException("cannot open socket");
|
|
|
-
|
|
|
- strcpy(ifr.ifr_name, "eth0");
|
|
|
- int rc = ioctl(s, SIOCGIFHWADDR, &ifr);
|
|
|
- close(s);
|
|
|
- if (rc < 0) throw SystemException("cannot get MAC address");
|
|
|
- struct sockaddr* sa = reinterpret_cast<struct sockaddr*>(&ifr.ifr_addr);
|
|
|
- std::memcpy(_node, sa->sa_data, sizeof(_node));
|
|
|
-}
|
|
|
-
|
|
|
-
|
|
|
-} // namespace Poco
|
|
|
-
|
|
|
-
|
|
|
-#elif defined(POCO_OS_FAMILY_UNIX) || defined(POCO_OS_FAMILY_VMS)
|
|
|
-//
|
|
|
-// Unix/VMS
|
|
|
-//
|
|
|
-#if defined(__VMS)
|
|
|
-#include <ioctl.h>
|
|
|
-#else
|
|
|
-#include <sys/ioctl.h>
|
|
|
-#endif
|
|
|
-#if defined(sun) || defined(__sun)
|
|
|
-#include <sys/sockio.h>
|
|
|
-#endif
|
|
|
-#include <sys/socket.h>
|
|
|
-#include <sys/types.h>
|
|
|
-#include <netinet/in.h>
|
|
|
-#include <net/if.h>
|
|
|
-#if defined(__VMS)
|
|
|
-#include <inet.h>
|
|
|
-#else
|
|
|
-#include <arpa/inet.h>
|
|
|
-#endif
|
|
|
-#include <netdb.h>
|
|
|
-#include <net/if.h>
|
|
|
-#include <net/if_arp.h>
|
|
|
-#include <unistd.h>
|
|
|
-
|
|
|
-
|
|
|
-#if defined(__VMS)
|
|
|
-#define MAXHOSTNAMELEN 64
|
|
|
-#endif
|
|
|
-
|
|
|
-
|
|
|
-namespace Poco {
|
|
|
-
|
|
|
-
|
|
|
-void UUIDGenerator::getNode()
|
|
|
-{
|
|
|
- char name[MAXHOSTNAMELEN];
|
|
|
- if (gethostname(name, sizeof(name)))
|
|
|
- throw SystemException("cannot get host name");
|
|
|
-
|
|
|
- struct hostent* pHost = gethostbyname(name);
|
|
|
- if (!pHost) throw SystemException("cannot get host IP address");
|
|
|
-
|
|
|
- int s = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
|
|
|
- if (s == -1) throw SystemException("cannot open socket");
|
|
|
-
|
|
|
- struct arpreq ar;
|
|
|
- std::memset(&ar, 0, sizeof(ar));
|
|
|
- struct sockaddr_in* pAddr = reinterpret_cast<struct sockaddr_in*>(&ar.arp_pa);
|
|
|
- pAddr->sin_family = AF_INET;
|
|
|
- std::memcpy(&pAddr->sin_addr, *pHost->h_addr_list, sizeof(struct in_addr));
|
|
|
- int rc = ioctl(s, SIOCGARP, &ar);
|
|
|
- close(s);
|
|
|
- if (rc < 0) throw SystemException("cannot get MAC address");
|
|
|
- std::memcpy(_node, ar.arp_ha.sa_data, sizeof(_node));
|
|
|
-}
|
|
|
-
|
|
|
-
|
|
|
-} // namespace Poco
|
|
|
-
|
|
|
-
|
|
|
-#endif
|