int parse_dotted_uints(const char *s, unsigned int **nums, size_t *sz);
/* PRNG */
+void ha_generate_uuid(struct buffer *output);
void ha_random_seed(const unsigned char *seed, size_t len);
void ha_random_jump96(uint32_t dist);
uint64_t ha_random64();
static char *
generate_pseudo_uuid()
{
- char *uuid;
- uint32_t rnd[4] = { 0, 0, 0, 0 };
- uint64_t last = 0;
- int byte = 0;
- uint8_t bits = 0;
- unsigned int rand_max_bits = my_flsl(RAND_MAX);
-
- if ((uuid = calloc(1, 37)) == NULL)
- return NULL;
-
- while (byte < 4) {
- while (bits < 32) {
- last |= (uint64_t)ha_random() << bits;
- bits += rand_max_bits;
- }
- rnd[byte++] = last;
- last >>= 32u;
- bits -= 32;
- }
- snprintf(uuid, 37, "%8.8x-%4.4x-%4.4x-%4.4x-%12.12llx",
- rnd[0],
- rnd[1] & 0xFFFF,
- ((rnd[1] >> 16u) & 0xFFF) | 0x4000, // highest 4 bits indicate the uuid version
- (rnd[2] & 0x3FFF) | 0x8000, // the highest 2 bits indicate the UUID variant (10),
- (long long)((rnd[2] >> 14u) | ((uint64_t) rnd[3] << 18u)) & 0xFFFFFFFFFFFFull
- );
- return uuid;
+ ha_generate_uuid(&trash);
+ return trash.area;
}
static int smp_fetch_uuid(const struct arg *args, struct sample *smp, const char *kw, void *private)
{
if (args[0].data.sint == 4 || !args[0].type) {
- uint32_t rnd[4] = { 0, 0, 0, 0 };
- uint64_t last = 0;
- int byte = 0;
- uint8_t bits = 0;
- unsigned int rand_max_bits = my_flsl(RAND_MAX);
-
- while (byte < 4) {
- while (bits < 32) {
- last |= (uint64_t)ha_random() << bits;
- bits += rand_max_bits;
- }
- rnd[byte++] = last;
- last >>= 32u;
- bits -= 32;
- }
-
- chunk_printf(&trash, "%8.8x-%4.4x-%4.4x-%4.4x-%12.12llx",
- rnd[0],
- rnd[1] & 0xFFFF,
- ((rnd[1] >> 16u) & 0xFFF) | 0x4000, // highest 4 bits indicate the uuid version
- (rnd[2] & 0x3FFF) | 0x8000, // the highest 2 bits indicate the UUID variant (10),
- (long long)((rnd[2] >> 14u) | ((uint64_t) rnd[3] << 18u)) & 0xFFFFFFFFFFFFull
- );
-
+ ha_generate_uuid(&trash);
smp->data.type = SMP_T_STR;
smp->flags = SMP_F_VOL_TEST | SMP_F_MAY_CHANGE;
smp->data.u.str = trash;
}
}
+/* Generates an RFC4122 UUID into chunk <output> which must be at least 37
+ * bytes large.
+ */
+void ha_generate_uuid(struct buffer *output)
+{
+ uint32_t rnd[4];
+ uint64_t last;
+
+ last = ha_random64();
+ rnd[0] = last;
+ rnd[1] = last >> 32;
+
+ last = ha_random64();
+ rnd[2] = last;
+ rnd[3] = last >> 32;
+
+ chunk_printf(output, "%8.8x-%4.4x-%4.4x-%4.4x-%12.12llx",
+ rnd[0],
+ rnd[1] & 0xFFFF,
+ ((rnd[1] >> 16u) & 0xFFF) | 0x4000, // highest 4 bits indicate the uuid version
+ (rnd[2] & 0x3FFF) | 0x8000, // the highest 2 bits indicate the UUID variant (10),
+ (long long)((rnd[2] >> 14u) | ((uint64_t) rnd[3] << 18u)) & 0xFFFFFFFFFFFFull);
+}
+
+
/*
* Local variables:
* c-indent-level: 8