/* * Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. * Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & * Digital Equipment Corporation, Maynard, Mass. * Copyright (c) 1998 Microsoft. * To anyone who acknowledges that this file is provided "AS IS" * without any express or implied warranty: permission to use, copy, * modify, and distribute this file for any purpose is hereby * granted without fee, provided that the above copyright notices and * this notice appears in all source code copies, and that none of * the names of Open Software Foundation, Inc., Hewlett-Packard * Company, or Digital Equipment Corporation be used in advertising * or publicity pertaining to distribution of the software without * specific, written prior permission. Neither Open Software * Foundation, Inc., Hewlett-Packard Company, Microsoft, nor Digital Equipment * Corporation makes any representations about the suitability of * this software for any purpose. */ /*! * \file */ #include "config.h" #include "sysdep.h" #include "UpnpInet.h" #include #include /*! * \brief System dependent call to get IEEE node ID. * * This sample implementation generates a random node ID. */ void get_ieee_node_identifier(uuid_node_t *node) { unsigned char seed[16]; static int inited = 0; static uuid_node_t saved_node; if (!inited) { get_random_info(seed); seed[0] |= 0x80; memcpy(&saved_node, seed, sizeof(uuid_node_t)); inited = 1; }; *node = saved_node; }; /*! * \brief System dependent call to get the current system time. * * Returned as 100ns ticks since Oct 15, 1582, but resolution may be less * than 100ns. */ #ifdef WIN32 void get_system_time(uuid_time_t *uuid_time) { ULARGE_INTEGER time; GetSystemTimeAsFileTime((FILETIME *) & time); /* NT keeps time in FILETIME format which is 100ns ticks since Jan 1, 1601. UUIDs use time in 100ns ticks since Oct 15, 1582. The difference is 17 Days in Oct + 30 (Nov) + 31 (Dec) + 18 years and 5 leap days. */ time.QuadPart += (unsigned __int64)(1000 * 1000 * 10) /* seconds */ *(unsigned __int64)(60 * 60 * 24) /* days */ *(unsigned __int64)(17 + 30 + 31 + 365 * 18 + 5); /* # of days */ *uuid_time = time.QuadPart; }; void get_random_info(unsigned char seed[16]) { MD5_CTX c; typedef struct { MEMORYSTATUS m; SYSTEM_INFO s; FILETIME t; LARGE_INTEGER pc; DWORD tc; DWORD l; char hostname[MAX_COMPUTERNAME_LENGTH + 1]; } randomness; randomness r; /* Initialize memory area so that valgrind does not complain */ memset(&r, 0, sizeof r); /* memory usage stats */ GlobalMemoryStatus( &r.m ); /* random system stats */ GetSystemInfo( &r.s ); /* 100ns resolution (nominally) time of day */ GetSystemTimeAsFileTime( &r.t ); /* high resolution performance counter */ QueryPerformanceCounter( &r.pc ); /* milliseconds since last boot */ r.tc = GetTickCount(); r.l = MAX_COMPUTERNAME_LENGTH + 1; GetComputerName( r.hostname, &r.l ); /* MD5 it */ MD5Init(&c); MD5Update(&c, (unsigned char *)(&r), sizeof r); MD5Final(seed, &c); }; #else /* WIN32 */ void get_system_time(uuid_time_t *uuid_time) { struct timeval tp; gettimeofday(&tp, (struct timezone *)0); /* Offset between UUID formatted times and Unix formatted times. * UUID UTC base time is October 15, 1582. * Unix base time is January 1, 1970. */ *uuid_time = (uuid_time_t) (tp.tv_sec * 10000000 + tp.tv_usec * 10 + 0x01B21DD213814000LL); }; void get_random_info(unsigned char seed[16]) { MD5_CTX c; typedef struct { /*struct sysinfo s; */ struct timeval t; char hostname[257]; } randomness; randomness r; /* Initialize memory area so that valgrind does not complain. */ memset(&r, 0, sizeof r); /* Get some random stuff. */ gettimeofday(&r.t, (struct timezone *)0); gethostname(r.hostname, 256); /* MD5 it */ MD5Init(&c); MD5Update(&c, (unsigned char *)&r, sizeof r); MD5Final(seed, &c); }; #endif /* WIN32 */