Removed even more C++ style comments.
[obnox/wireshark/wip.git] / packaging / u3 / tools / sysdep.c
1 /* sysdep.c
2  * UUID system dependent routines 
3  *
4  * $Id$
5  *
6  * Wireshark - Network traffic analyzer
7  * By Gerald Combs <gerald@wireshark.org>
8  * Copyright 1998 Gerald Combs
9  *
10  * This program is free software; you can redistribute it and/or
11  * modify it under the terms of the GNU General Public License
12  * as published by the Free Software Foundation; either version 2
13  * of the License, or (at your option) any later version.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU General Public License for more details.
19  *
20  * You should have received a copy of the GNU General Public License
21  * along with this program; if not, write to the Free Software
22  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
23  */
24
25 /*
26 ** Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.
27 ** Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. &
28 ** Digital Equipment Corporation, Maynard, Mass.
29 ** Copyright (c) 1998 Microsoft.
30 ** To anyone who acknowledges that this file is provided "AS IS"
31 ** without any express or implied warranty: permission to use, copy,
32 ** modify, and distribute this file for any purpose is hereby
33 ** granted without fee, provided that the above copyright notices and
34 ** this notice appears in all source code copies, and that none of
35 ** the names of Open Software Foundation, Inc., Hewlett-Packard
36 ** Company, Microsoft, or Digital Equipment Corporation be used in
37 ** advertising or publicity pertaining to distribution of the software
38 ** without specific, written prior permission. Neither Open Software
39 ** Foundation, Inc., Hewlett-Packard Company, Microsoft, nor Digital
40 ** Equipment Corporation makes any representations about the
41 ** suitability of this software for any purpose.
42 */
43
44 #include <stdio.h>
45 #include "sysdep.h"
46
47 /* system dependent call to get IEEE node ID.
48    This sample implementation generates a random node ID. */
49 void get_ieee_node_identifier(uuid_node_t *node)
50 {
51     static inited = 0;
52     static uuid_node_t saved_node;
53     char seed[16];
54     FILE *fp;
55
56     if (!inited) {
57         fp = fopen("nodeid", "rb");
58         if (fp) {
59             fread(&saved_node, sizeof saved_node, 1, fp);
60             fclose(fp);
61         }
62         else {
63             get_random_info(seed);
64             seed[0] |= 0x01;
65             memcpy(&saved_node, seed, sizeof saved_node);
66             fp = fopen("nodeid", "wb");
67             if (fp) {
68                 fwrite(&saved_node, sizeof saved_node, 1, fp);
69                 fclose(fp);
70             }
71         }
72         inited = 1;
73     }
74
75     *node = saved_node;
76 }
77
78 /* system dependent call to get the current system time. Returned as
79    100ns ticks since UUID epoch, but resolution may be less than
80    100ns. */
81 #ifdef _WINDOWS_
82
83 void get_system_time(uuid_time_t *uuid_time)
84 {
85     ULARGE_INTEGER time;
86
87     /* NT keeps time in FILETIME format which is 100ns ticks since
88        Jan 1, 1601. UUIDs use time in 100ns ticks since Oct 15, 1582.
89        The difference is 17 Days in Oct + 30 (Nov) + 31 (Dec)
90        + 18 years and 5 leap days. */
91     GetSystemTimeAsFileTime((FILETIME *)&time);
92     time.QuadPart +=
93
94           (unsigned __int64) (1000*1000*10)       /* seconds */
95         * (unsigned __int64) (60 * 60 * 24)       /* days */
96         * (unsigned __int64) (17+30+31+365*18+5); /* # of days */
97     *uuid_time = time.QuadPart;
98 }
99
100 /* Sample code, not for use in production; see RFC 1750 */
101 void get_random_info(char seed[16])
102 {
103     MD5_CTX c;
104     struct {
105         MEMORYSTATUS m;
106         SYSTEM_INFO s;
107         FILETIME t;
108         LARGE_INTEGER pc;
109         DWORD tc;
110         DWORD l;
111         char hostname[MAX_COMPUTERNAME_LENGTH + 1];
112     } r;
113
114     MD5Init(&c);
115     GlobalMemoryStatus(&r.m);
116     GetSystemInfo(&r.s);
117     GetSystemTimeAsFileTime(&r.t);
118     QueryPerformanceCounter(&r.pc);
119     r.tc = GetTickCount();
120     r.l = MAX_COMPUTERNAME_LENGTH + 1;
121     GetComputerNameA(r.hostname, &r.l);
122     MD5Update(&c, &r, sizeof r);
123     MD5Final(seed, &c);
124 }
125
126 #else
127
128 void get_system_time(uuid_time_t *uuid_time)
129 {
130     struct timeval tp;
131
132     gettimeofday(&tp, (struct timezone *)0);
133
134     /* Offset between UUID formatted times and Unix formatted times.
135        UUID UTC base time is October 15, 1582.
136        Unix base time is January 1, 1970.*/
137     *uuid_time = ((unsigned64)tp.tv_sec * 10000000)
138         + ((unsigned64)tp.tv_usec * 10)
139         + I64(0x01B21DD213814000);
140 }
141
142 /* Sample code, not for use in production; see RFC 1750 */
143 void get_random_info(char seed[16])
144 {
145     MD5_CTX c;
146     struct {
147         struct sysinfo s;
148         struct timeval t;
149         char hostname[257];
150     } r;
151
152     MD5Init(&c);
153     sysinfo(&r.s);
154     gettimeofday(&r.t, (struct timezone *)0);
155     gethostname(r.hostname, 256);
156     MD5Update(&c, &r, sizeof r);
157     MD5Final(seed, &c);
158 }
159
160 #endif