#include <sys/cdefs.h>
#include <stdint.h>
#include <string.h>
#include "endian.h"
#include "image.h"
#include "mkimg.h"
static void osdep_uuidgen(mkimg_uuid_t *);
#ifdef __APPLE__
#include <uuid/uuid.h>
static void
osdep_uuidgen(mkimg_uuid_t *uuid)
{
uuid_generate_time((void *)uuid);
}
#endif
#if defined(__linux__) || defined(__FreeBSD__)
#include <sys/time.h>
#include <stdlib.h>
static void
osdep_uuidgen(mkimg_uuid_t *uuid)
{
struct timeval tv;
uint64_t time = 0x01B21DD213814000LL;
u_int i;
uint16_t seq;
if (timestamp != (time_t)-1) {
tv.tv_sec = timestamp;
tv.tv_usec = 0;
} else if (gettimeofday(&tv, NULL) == -1)
abort();
time += (uint64_t)tv.tv_sec * 10000000LL;
time += tv.tv_usec * 10;
uuid->time_low = (uint32_t)time;
uuid->time_mid = (uint16_t)(time >> 32);
uuid->time_hi_and_version = (uint16_t)(time >> 48) & 0xfff;
uuid->time_hi_and_version |= 1 << 12;
seq = random();
uuid->clock_seq_hi_and_reserved = (uint8_t)(seq >> 8) & 0x3f;
uuid->clock_seq_low = (uint8_t)seq;
for (i = 0; i < 6; i++)
uuid->node[i] = (uint8_t)random();
uuid->node[0] |= 0x01;
}
#endif
void
mkimg_uuid(mkimg_uuid_t *uuid)
{
static uint8_t gen[sizeof(mkimg_uuid_t)];
u_int i;
if (!unit_testing) {
osdep_uuidgen(uuid);
return;
}
for (i = 0; i < sizeof(gen); i++)
gen[i]++;
memcpy(uuid, gen, sizeof(*uuid));
}
void
mkimg_uuid_enc(void *buf, const mkimg_uuid_t *uuid)
{
uint8_t *p = buf;
u_int i;
le32enc(p, uuid->time_low);
le16enc(p + 4, uuid->time_mid);
le16enc(p + 6, uuid->time_hi_and_version);
p[8] = uuid->clock_seq_hi_and_reserved;
p[9] = uuid->clock_seq_low;
for (i = 0; i < 6; i++)
p[10 + i] = uuid->node[i];
}