forked from osmocom/wireshark
161 lines
4.8 KiB
C
161 lines
4.8 KiB
C
|
/* sysdep.c
|
||
|
* UUID system dependent routines
|
||
|
*
|
||
|
* $Id$
|
||
|
*
|
||
|
* Wireshark - Network traffic analyzer
|
||
|
* By Gerald Combs <gerald@wireshark.org>
|
||
|
* Copyright 1998 Gerald Combs
|
||
|
*
|
||
|
* This program is free software; you can redistribute it and/or
|
||
|
* modify it under the terms of the GNU General Public License
|
||
|
* as published by the Free Software Foundation; either version 2
|
||
|
* of the License, or (at your option) any later version.
|
||
|
*
|
||
|
* This program is distributed in the hope that it will be useful,
|
||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
|
* GNU General Public License for more details.
|
||
|
*
|
||
|
* You should have received a copy of the GNU General Public License
|
||
|
* along with this program; if not, write to the Free Software
|
||
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||
|
*/
|
||
|
|
||
|
/*
|
||
|
** 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, Microsoft, 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.
|
||
|
*/
|
||
|
|
||
|
#include <stdio.h>
|
||
|
#include "sysdep.h"
|
||
|
|
||
|
/* 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)
|
||
|
{
|
||
|
static inited = 0;
|
||
|
static uuid_node_t saved_node;
|
||
|
char seed[16];
|
||
|
FILE *fp;
|
||
|
|
||
|
if (!inited) {
|
||
|
fp = fopen("nodeid", "rb");
|
||
|
if (fp) {
|
||
|
fread(&saved_node, sizeof saved_node, 1, fp);
|
||
|
fclose(fp);
|
||
|
}
|
||
|
else {
|
||
|
get_random_info(seed);
|
||
|
seed[0] |= 0x01;
|
||
|
memcpy(&saved_node, seed, sizeof saved_node);
|
||
|
fp = fopen("nodeid", "wb");
|
||
|
if (fp) {
|
||
|
fwrite(&saved_node, sizeof saved_node, 1, fp);
|
||
|
fclose(fp);
|
||
|
}
|
||
|
}
|
||
|
inited = 1;
|
||
|
}
|
||
|
|
||
|
*node = saved_node;
|
||
|
}
|
||
|
|
||
|
/* system dependent call to get the current system time. Returned as
|
||
|
100ns ticks since UUID epoch, but resolution may be less than
|
||
|
100ns. */
|
||
|
#ifdef _WINDOWS_
|
||
|
|
||
|
void get_system_time(uuid_time_t *uuid_time)
|
||
|
{
|
||
|
ULARGE_INTEGER 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. */
|
||
|
GetSystemTimeAsFileTime((FILETIME *)&time);
|
||
|
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;
|
||
|
}
|
||
|
|
||
|
/* Sample code, not for use in production; see RFC 1750 */
|
||
|
void get_random_info(char seed[16])
|
||
|
{
|
||
|
MD5_CTX c;
|
||
|
struct {
|
||
|
MEMORYSTATUS m;
|
||
|
SYSTEM_INFO s;
|
||
|
FILETIME t;
|
||
|
LARGE_INTEGER pc;
|
||
|
DWORD tc;
|
||
|
DWORD l;
|
||
|
char hostname[MAX_COMPUTERNAME_LENGTH + 1];
|
||
|
} r;
|
||
|
|
||
|
MD5Init(&c);
|
||
|
GlobalMemoryStatus(&r.m);
|
||
|
GetSystemInfo(&r.s);
|
||
|
GetSystemTimeAsFileTime(&r.t);
|
||
|
QueryPerformanceCounter(&r.pc);
|
||
|
r.tc = GetTickCount();
|
||
|
r.l = MAX_COMPUTERNAME_LENGTH + 1;
|
||
|
GetComputerNameA(r.hostname, &r.l);
|
||
|
MD5Update(&c, &r, sizeof r);
|
||
|
MD5Final(seed, &c);
|
||
|
}
|
||
|
|
||
|
#else
|
||
|
|
||
|
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 = ((unsigned64)tp.tv_sec * 10000000)
|
||
|
+ ((unsigned64)tp.tv_usec * 10)
|
||
|
+ I64(0x01B21DD213814000);
|
||
|
}
|
||
|
|
||
|
/* Sample code, not for use in production; see RFC 1750 */
|
||
|
void get_random_info(char seed[16])
|
||
|
{
|
||
|
MD5_CTX c;
|
||
|
struct {
|
||
|
struct sysinfo s;
|
||
|
struct timeval t;
|
||
|
char hostname[257];
|
||
|
} r;
|
||
|
|
||
|
MD5Init(&c);
|
||
|
sysinfo(&r.s);
|
||
|
gettimeofday(&r.t, (struct timezone *)0);
|
||
|
gethostname(r.hostname, 256);
|
||
|
MD5Update(&c, &r, sizeof r);
|
||
|
MD5Final(seed, &c);
|
||
|
}
|
||
|
|
||
|
#endif
|