mirror of
https://github.com/moparisthebest/wget
synced 2024-07-03 16:38:41 -04:00
warc.c: native uuid generation on Windows
* warc.c (windows_uuid_str) [WINDOWS]: New function specific to MS-Windows. (warc_uuid_str) [WINDOWS]: If windows_uuid_str succeeds, use its result; otherwise use the fallback method.
This commit is contained in:
parent
9df2250f4c
commit
33c5d979ce
66
src/warc.c
66
src/warc.c
@ -60,7 +60,8 @@ as that of the covered work. */
|
|||||||
|
|
||||||
#ifdef WINDOWS
|
#ifdef WINDOWS
|
||||||
/* we need this on Windows to have O_TEMPORARY defined */
|
/* we need this on Windows to have O_TEMPORARY defined */
|
||||||
#include <fcntl.h>
|
# include <fcntl.h>
|
||||||
|
# include <rpc.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef O_TEMPORARY
|
#ifndef O_TEMPORARY
|
||||||
@ -632,6 +633,61 @@ warc_uuid_str (char *urn_str)
|
|||||||
xfree (uuid_str);
|
xfree (uuid_str);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
|
# ifdef WINDOWS
|
||||||
|
|
||||||
|
typedef RPC_STATUS (RPC_ENTRY * UuidCreate_proc) (UUID *);
|
||||||
|
typedef RPC_STATUS (RPC_ENTRY * UuidToString_proc) (UUID *, unsigned char **);
|
||||||
|
typedef RPC_STATUS (RPC_ENTRY * RpcStringFree_proc) (unsigned char **);
|
||||||
|
|
||||||
|
static int
|
||||||
|
windows_uuid_str (char *urn_str)
|
||||||
|
{
|
||||||
|
static UuidCreate_proc pfn_UuidCreate = NULL;
|
||||||
|
static UuidToString_proc pfn_UuidToString = NULL;
|
||||||
|
static RpcStringFree_proc pfn_RpcStringFree = NULL;
|
||||||
|
static int rpc_uuid_avail = -1;
|
||||||
|
|
||||||
|
/* Rpcrt4.dll is not available on older versions of Windows, so we
|
||||||
|
need to test its availability at run time. */
|
||||||
|
if (rpc_uuid_avail == -1)
|
||||||
|
{
|
||||||
|
HMODULE hm_rpcrt4 = LoadLibrary ("Rpcrt4.dll");
|
||||||
|
|
||||||
|
if (hm_rpcrt4)
|
||||||
|
{
|
||||||
|
pfn_UuidCreate =
|
||||||
|
(UuidCreate_proc) GetProcAddress (hm_rpcrt4, "UuidCreate");
|
||||||
|
pfn_UuidToString =
|
||||||
|
(UuidToString_proc) GetProcAddress (hm_rpcrt4, "UuidToStringA");
|
||||||
|
pfn_RpcStringFree =
|
||||||
|
(RpcStringFree_proc) GetProcAddress (hm_rpcrt4, "RpcStringFreeA");
|
||||||
|
if (pfn_UuidCreate && pfn_UuidToString && pfn_RpcStringFree)
|
||||||
|
rpc_uuid_avail = 1;
|
||||||
|
else
|
||||||
|
rpc_uuid_avail = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
rpc_uuid_avail = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (rpc_uuid_avail)
|
||||||
|
{
|
||||||
|
BYTE *uuid_str;
|
||||||
|
UUID uuid;
|
||||||
|
|
||||||
|
if (pfn_UuidCreate (&uuid) == RPC_S_OK)
|
||||||
|
{
|
||||||
|
if (pfn_UuidToString (&uuid, &uuid_str) == RPC_S_OK)
|
||||||
|
{
|
||||||
|
sprintf (urn_str, "<urn:uuid:%s>", uuid_str);
|
||||||
|
pfn_RpcStringFree (&uuid_str);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
/* Fills urn_str with a UUID based on random numbers in the format
|
/* Fills urn_str with a UUID based on random numbers in the format
|
||||||
required for the WARC-Record-Id header.
|
required for the WARC-Record-Id header.
|
||||||
(See RFC 4122, UUID version 4.)
|
(See RFC 4122, UUID version 4.)
|
||||||
@ -647,6 +703,14 @@ warc_uuid_str (char *urn_str)
|
|||||||
|
|
||||||
unsigned char uuid_data[16];
|
unsigned char uuid_data[16];
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
#ifdef WINDOWS
|
||||||
|
/* If the native method fails (expected on older Windows versions),
|
||||||
|
use the fallback below. */
|
||||||
|
if (windows_uuid_str (urn_str))
|
||||||
|
return;
|
||||||
|
#endif
|
||||||
|
|
||||||
for (i=0; i<16; i++)
|
for (i=0; i<16; i++)
|
||||||
uuid_data[i] = random_number (255);
|
uuid_data[i] = random_number (255);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user