MINOR: tools: add a generic function to generate UUIDs

We currently have two UUID generation functions, one for the sample
fetch and the other one in the SPOE filter. Both were a bit complicated
since they were made to support random() implementations returning an
arbitrary number of bits, and were throwing away 33 bits every 64. Now
we don't need this anymore, so let's have a generic function consuming
64 bits at once and use it as appropriate.
diff --git a/src/flt_spoe.c b/src/flt_spoe.c
index bcdec08..df080d8 100644
--- a/src/flt_spoe.c
+++ b/src/flt_spoe.c
@@ -257,33 +257,8 @@
 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;
 }
 
 
diff --git a/src/sample.c b/src/sample.c
index 088da41..d602887 100644
--- a/src/sample.c
+++ b/src/sample.c
@@ -3328,30 +3328,7 @@
 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;
diff --git a/src/standard.c b/src/standard.c
index 5ccf447..e0ea832 100644
--- a/src/standard.c
+++ b/src/standard.c
@@ -4640,6 +4640,31 @@
 	}
 }
 
+/* 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