|
Packit |
fc16e3 |
#if !defined __UUID_H__
|
|
Packit |
fc16e3 |
# define __UUID_H__
|
|
Packit |
fc16e3 |
|
|
Packit |
fc16e3 |
#include <string.h>
|
|
Packit |
fc16e3 |
#include <stdio.h>
|
|
Packit |
fc16e3 |
#include <stdlib.h>
|
|
Packit |
fc16e3 |
#ifndef _MSC_VER
|
|
Packit |
fc16e3 |
/* No unistd.h in MS VC */
|
|
Packit |
fc16e3 |
#include <unistd.h>
|
|
Packit |
fc16e3 |
#endif
|
|
Packit |
fc16e3 |
#include <time.h>
|
|
Packit |
fc16e3 |
|
|
Packit |
fc16e3 |
#if !defined INT2PTR
|
|
Packit |
fc16e3 |
#if (IVSIZE == PTRSIZE) && (UVSIZE == PTRSIZE)
|
|
Packit |
fc16e3 |
# define PTRV UV
|
|
Packit |
fc16e3 |
# define INT2PTR(any,d) (any)(d)
|
|
Packit |
fc16e3 |
#else
|
|
Packit |
fc16e3 |
# if PTRSIZE == LONGSIZE
|
|
Packit |
fc16e3 |
# define PTRV unsigned long
|
|
Packit |
fc16e3 |
# else
|
|
Packit |
fc16e3 |
# define PTRV unsigned
|
|
Packit |
fc16e3 |
# endif
|
|
Packit |
fc16e3 |
# define INT2PTR(any,d) (any)(PTRV)(d)
|
|
Packit |
fc16e3 |
#endif
|
|
Packit |
fc16e3 |
#define NUM2PTR(any,d) (any)(PTRV)(d)
|
|
Packit |
fc16e3 |
#define PTR2IV(p) INT2PTR(IV,p)
|
|
Packit |
fc16e3 |
#define PTR2UV(p) INT2PTR(UV,p)
|
|
Packit |
fc16e3 |
#define PTR2NV(p) NUM2PTR(NV,p)
|
|
Packit |
fc16e3 |
#if PTRSIZE == LONGSIZE
|
|
Packit |
fc16e3 |
# define PTR2ul(p) (unsigned long)(p)
|
|
Packit |
fc16e3 |
#else
|
|
Packit |
fc16e3 |
# define PTR2ul(p) INT2PTR(unsigned long,p)
|
|
Packit |
fc16e3 |
#endif
|
|
Packit |
fc16e3 |
#endif
|
|
Packit |
fc16e3 |
|
|
Packit |
fc16e3 |
#if defined __cygwin__ || defined __mingw32__ || defined _MSC_VER
|
|
Packit |
fc16e3 |
#include <windows.h>
|
|
Packit |
fc16e3 |
#endif
|
|
Packit |
fc16e3 |
#if defined __darwin__
|
|
Packit |
fc16e3 |
#include <sys/file.h>
|
|
Packit |
fc16e3 |
#endif
|
|
Packit |
fc16e3 |
|
|
Packit |
fc16e3 |
#ifdef _MSC_VER
|
|
Packit |
fc16e3 |
#include <process.h>
|
|
Packit |
fc16e3 |
#endif
|
|
Packit |
fc16e3 |
|
|
Packit |
fc16e3 |
#if !defined _STDIR
|
|
Packit |
fc16e3 |
# define _STDIR "/var/tmp"
|
|
Packit |
fc16e3 |
#endif
|
|
Packit |
fc16e3 |
#if !defined _DEFAULT_UMASK
|
|
Packit |
fc16e3 |
# define _DEFAULT_UMASK 0007
|
|
Packit |
fc16e3 |
#endif
|
|
Packit |
fc16e3 |
|
|
Packit |
fc16e3 |
#define UUID_STATE ".UUID_STATE"
|
|
Packit |
fc16e3 |
#define UUID_NODEID ".UUID_NODEID"
|
|
Packit |
fc16e3 |
#if defined __mingw32__ || (defined _WIN32 && !defined(__cygwin__)) || defined _MSC_VER
|
|
Packit |
fc16e3 |
#define UUID_STATE_NV_STORE _STDIR"\\"UUID_STATE
|
|
Packit |
fc16e3 |
#define UUID_NODEID_NV_STORE _STDIR"\\"UUID_NODEID
|
|
Packit |
fc16e3 |
#else
|
|
Packit |
fc16e3 |
#define UUID_STATE_NV_STORE _STDIR"/"UUID_STATE
|
|
Packit |
fc16e3 |
#define UUID_NODEID_NV_STORE _STDIR"/"UUID_NODEID
|
|
Packit |
fc16e3 |
#endif
|
|
Packit |
fc16e3 |
|
|
Packit |
fc16e3 |
#define UUIDS_PER_TICK 1024
|
|
Packit |
fc16e3 |
#ifdef _MSC_VER
|
|
Packit |
fc16e3 |
#define I64(C) C##i64
|
|
Packit |
fc16e3 |
#else
|
|
Packit |
fc16e3 |
#define I64(C) C##LL
|
|
Packit |
fc16e3 |
#endif
|
|
Packit |
fc16e3 |
|
|
Packit |
fc16e3 |
#define F_BIN 0
|
|
Packit |
fc16e3 |
#define F_STR 1
|
|
Packit |
fc16e3 |
#define F_HEX 2
|
|
Packit |
fc16e3 |
#define F_B64 3
|
|
Packit |
fc16e3 |
|
|
Packit |
fc16e3 |
#define CHECK(f1, f2) if (f1 != f2) RETVAL = f1 < f2 ? -1 : 1;
|
|
Packit |
fc16e3 |
|
|
Packit |
fc16e3 |
typedef unsigned int unsigned32;
|
|
Packit |
fc16e3 |
typedef unsigned short unsigned16;
|
|
Packit |
fc16e3 |
typedef unsigned char unsigned8;
|
|
Packit |
fc16e3 |
typedef unsigned char byte;
|
|
Packit |
fc16e3 |
#ifndef _MSC_VER
|
|
Packit |
fc16e3 |
typedef unsigned long long unsigned64_t;
|
|
Packit |
fc16e3 |
# else
|
|
Packit |
fc16e3 |
typedef __int64 int64_t;
|
|
Packit |
fc16e3 |
typedef unsigned __int64 uint64_t;
|
|
Packit |
fc16e3 |
typedef __int32 int32_t;
|
|
Packit |
fc16e3 |
typedef unsigned __int32 uint32_t;
|
|
Packit |
fc16e3 |
typedef __int16 int16_t;
|
|
Packit |
fc16e3 |
typedef unsigned __int16 uint16_t;
|
|
Packit |
fc16e3 |
typedef __int8 int8_t;
|
|
Packit |
fc16e3 |
typedef unsigned __int8 uint8_t;
|
|
Packit |
fc16e3 |
|
|
Packit |
fc16e3 |
typedef unsigned __int64 unsigned64_t;
|
|
Packit |
fc16e3 |
// http://msdn2.microsoft.com/en-us/library/296az74e.aspx - Integer Limits
|
|
Packit |
fc16e3 |
|
|
Packit |
fc16e3 |
typedef int pid_t;
|
|
Packit |
fc16e3 |
#endif /* _MSC_VER */
|
|
Packit |
fc16e3 |
typedef unsigned64_t perl_uuid_time_t;
|
|
Packit |
fc16e3 |
|
|
Packit |
fc16e3 |
/* Android's lic provides neither lockf nor any of the related constants */
|
|
Packit |
fc16e3 |
#if (defined __solaris__ || defined __linux__) && !defined(__android__)
|
|
Packit |
fc16e3 |
# define LOCK(f) lockf(fileno(f),F_LOCK,0);
|
|
Packit |
fc16e3 |
# define UNLOCK(f) lockf(fileno(f),F_ULOCK,0);
|
|
Packit |
fc16e3 |
#elif defined __darwin__
|
|
Packit |
fc16e3 |
# define LOCK(f) flock(fileno(f),LOCK_EX);
|
|
Packit |
fc16e3 |
# define UNLOCK(f) flock(fileno(f),LOCK_UN);
|
|
Packit |
fc16e3 |
#else
|
|
Packit |
fc16e3 |
# define LOCK(f)
|
|
Packit |
fc16e3 |
# define UNLOCK(f)
|
|
Packit |
fc16e3 |
#endif
|
|
Packit |
fc16e3 |
|
|
Packit |
fc16e3 |
#undef perl_uuid_t
|
|
Packit |
fc16e3 |
|
|
Packit |
fc16e3 |
typedef struct _uuid_node_t {
|
|
Packit |
fc16e3 |
char nodeID[6];
|
|
Packit |
fc16e3 |
} uuid_node_t;
|
|
Packit |
fc16e3 |
|
|
Packit |
fc16e3 |
typedef struct _perl_uuid_t {
|
|
Packit |
fc16e3 |
unsigned32 time_low;
|
|
Packit |
fc16e3 |
unsigned16 time_mid;
|
|
Packit |
fc16e3 |
unsigned16 time_hi_and_version;
|
|
Packit |
fc16e3 |
unsigned8 clock_seq_hi_and_reserved;
|
|
Packit |
fc16e3 |
unsigned8 clock_seq_low;
|
|
Packit |
fc16e3 |
byte node[6];
|
|
Packit |
fc16e3 |
} perl_uuid_t;
|
|
Packit |
fc16e3 |
|
|
Packit |
fc16e3 |
typedef struct _uuid_state_t {
|
|
Packit |
fc16e3 |
perl_uuid_time_t ts;
|
|
Packit |
fc16e3 |
uuid_node_t node;
|
|
Packit |
fc16e3 |
unsigned16 cs;
|
|
Packit |
fc16e3 |
} uuid_state_t;
|
|
Packit |
fc16e3 |
|
|
Packit |
fc16e3 |
typedef struct _uuid_context_t {
|
|
Packit |
fc16e3 |
uuid_state_t state;
|
|
Packit |
fc16e3 |
uuid_node_t nodeid;
|
|
Packit |
fc16e3 |
perl_uuid_time_t next_save;
|
|
Packit |
fc16e3 |
} uuid_context_t;
|
|
Packit |
fc16e3 |
|
|
Packit |
fc16e3 |
static void format_uuid_v1(
|
|
Packit |
fc16e3 |
perl_uuid_t *uuid,
|
|
Packit |
fc16e3 |
unsigned16 clockseq,
|
|
Packit |
fc16e3 |
perl_uuid_time_t timestamp,
|
|
Packit |
fc16e3 |
uuid_node_t node
|
|
Packit |
fc16e3 |
);
|
|
Packit |
fc16e3 |
static void format_uuid_v3(
|
|
Packit |
fc16e3 |
perl_uuid_t *uuid,
|
|
Packit |
fc16e3 |
unsigned char hash[16]
|
|
Packit |
fc16e3 |
);
|
|
Packit |
fc16e3 |
static void get_current_time(perl_uuid_time_t * timestamp);
|
|
Packit |
fc16e3 |
static unsigned16 true_random(void);
|
|
Packit |
fc16e3 |
static void get_system_time(perl_uuid_time_t *perl_uuid_time);
|
|
Packit |
fc16e3 |
static void get_random_info(unsigned char seed[16]);
|
|
Packit |
fc16e3 |
static SV* make_ret(const perl_uuid_t u, int type);
|
|
Packit |
fc16e3 |
static SV* MD5Init(void);
|
|
Packit |
fc16e3 |
static void MD5Update(SV* ctx, SV* data);
|
|
Packit |
fc16e3 |
static void MD5Final(unsigned char hash[16], SV* ctx);
|
|
Packit |
fc16e3 |
|
|
Packit |
fc16e3 |
static const char base64[] =
|
|
Packit |
fc16e3 |
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
|
Packit |
fc16e3 |
|
|
Packit |
fc16e3 |
static unsigned char index64[256] = {
|
|
Packit |
fc16e3 |
255,255,255,255, 255,255,255,255, 255,255,255,255, 255,255,255,255,
|
|
Packit |
fc16e3 |
255,255,255,255, 255,255,255,255, 255,255,255,255, 255,255,255,255,
|
|
Packit |
fc16e3 |
255,255,255,255, 255,255,255,255, 255,255,255,62, 255,255,255,63,
|
|
Packit |
fc16e3 |
52,53,54,55, 56,57,58,59, 60,61,255,255, 255,254,255,255,
|
|
Packit |
fc16e3 |
255, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10, 11,12,13,14,
|
|
Packit |
fc16e3 |
15,16,17,18, 19,20,21,22, 23,24,25,255, 255,255,255,255,
|
|
Packit |
fc16e3 |
255,26,27,28, 29,30,31,32, 33,34,35,36, 37,38,39,40,
|
|
Packit |
fc16e3 |
41,42,43,44, 45,46,47,48, 49,50,51,255, 255,255,255,255,
|
|
Packit |
fc16e3 |
|
|
Packit |
fc16e3 |
255,255,255,255, 255,255,255,255, 255,255,255,255, 255,255,255,255,
|
|
Packit |
fc16e3 |
255,255,255,255, 255,255,255,255, 255,255,255,255, 255,255,255,255,
|
|
Packit |
fc16e3 |
255,255,255,255, 255,255,255,255, 255,255,255,255, 255,255,255,255,
|
|
Packit |
fc16e3 |
255,255,255,255, 255,255,255,255, 255,255,255,255, 255,255,255,255,
|
|
Packit |
fc16e3 |
255,255,255,255, 255,255,255,255, 255,255,255,255, 255,255,255,255,
|
|
Packit |
fc16e3 |
255,255,255,255, 255,255,255,255, 255,255,255,255, 255,255,255,255,
|
|
Packit |
fc16e3 |
255,255,255,255, 255,255,255,255, 255,255,255,255, 255,255,255,255,
|
|
Packit |
fc16e3 |
255,255,255,255, 255,255,255,255, 255,255,255,255, 255,255,255,255,
|
|
Packit |
fc16e3 |
};
|
|
Packit |
fc16e3 |
#endif
|