#ifndef PD_UUID_H_ #define PD_UUID_H_ 1 #include #define PD_UUID_BINLEN 16 #define PD_UUID_STRLEN 36 struct pd_uuid_state { uint64_t timestamp, node; uint16_t clock_sequence; int available; void *rng_state; unsigned char uuid[16]; int (*get_lock)(void *); int (*release_lock)(void *); void *lock_data; int (*read_state)(struct pd_uuid_state *s); int (*save_state)(struct pd_uuid_state *s); /* TODO hook for a random number generator? */ unsigned long (*random_bytes)(void *out, unsigned long outlen, void *prng_state); }; struct pd_uuid { uint8_t data[16]; }; typedef struct pd_uuid pd_uuid_t; int pd_uuid_init_state(struct pd_uuid_state *s); int pd_uuid_init(struct pd_uuid_state *s, int f); int pd_uuid_make_v1(struct pd_uuid_state *s, pd_uuid_t *uuid); int pd_uuid_make_v1mc(struct pd_uuid_state *s, pd_uuid_t *uuid); int pd_uuid_make_v4(struct pd_uuid_state *s, pd_uuid_t *uuid); int pd_uuid_make_v3(struct pd_uuid_state *s, pd_uuid_t *uuid, pd_uuid_t *ns, void *data, int len); int pd_uuid_make_v5(struct pd_uuid_state *s, pd_uuid_t *uuid, pd_uuid_t *ns, void *data, int len); int pd_uuid_copy(pd_uuid_t *src, pd_uuid_t *dst); int pd_uuid_cmp(pd_uuid_t *a, pd_uuid_t *b); int pd_set_uuid_hash(pd_uuid_t *s, void *hash, int version); int pd_uuid_set_string(pd_uuid_t *uuid, char *s); char *pd_uuid_get_string(pd_uuid_t *uuid, char *s); unsigned long pd_uuid_rng_get_bytes(unsigned char *out, unsigned long outlen); pd_uuid_t pd_uuid_ns_x500; pd_uuid_t pd_uuid_ns_url; pd_uuid_t pd_uuid_ns_dns; pd_uuid_t pd_uuid_ns_oid; #endif