/src/upnp123/upnp/src/uuid/sysdep.c
C | 152 lines | 79 code | 21 blank | 52 comment | 1 complexity | eaafa880e68f760ab6839c3b2e979967 MD5 | raw file
- /*
- * 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 <string.h>
- #include <stdio.h>
- /*!
- * \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 +
- (uuid_time_t)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 */