mirror of
http://git.haproxy.org/git/haproxy.git/
synced 2025-01-21 05:00:42 +00:00
MINOR: spoe: Improve generation of the engine-id
Use the same algo than the sample fetch uuid(). This one was added recently. So it is better to use the same way to generate UUIDs. This patch may be backported to older versions.
This commit is contained in:
parent
d87b1a56d5
commit
09bd9aa412
@ -256,30 +256,32 @@ static const char *spoe_appctx_state_str[SPOE_APPCTX_ST_END+1] = {
|
||||
static char *
|
||||
generate_pseudo_uuid()
|
||||
{
|
||||
static int init = 0;
|
||||
|
||||
const char uuid_fmt[] = "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx";
|
||||
const char uuid_chr[] = "0123456789ABCDEF-";
|
||||
char *uuid;
|
||||
int i;
|
||||
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, sizeof(uuid_fmt))) == NULL)
|
||||
if ((uuid = calloc(1, 37)) == NULL)
|
||||
return NULL;
|
||||
|
||||
if (!init) {
|
||||
srand(now_ms * pid);
|
||||
init = 1;
|
||||
}
|
||||
|
||||
for (i = 0; i < sizeof(uuid_fmt)-1; i++) {
|
||||
int r = rand () % 16;
|
||||
|
||||
switch (uuid_fmt[i]) {
|
||||
case 'x' : uuid[i] = uuid_chr[r]; break;
|
||||
case 'y' : uuid[i] = uuid_chr[(r & 0x03) | 0x08]; break;
|
||||
default : uuid[i] = uuid_fmt[i]; break;
|
||||
while (byte < 4) {
|
||||
while (bits < 32) {
|
||||
last |= (uint64_t)random() << bits;
|
||||
bits += rand_max_bits;
|
||||
}
|
||||
rnd[byte++] = last;
|
||||
last >>= 32u;
|
||||
bits -= 32;
|
||||
}
|
||||
snprintf(uuid, 36, "%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;
|
||||
}
|
||||
|
||||
@ -3120,6 +3122,7 @@ spoe_init_per_thread(struct proxy *p, struct flt_conf *fconf)
|
||||
struct spoe_agent *agent = conf->agent;
|
||||
|
||||
if (agent->engine_id == NULL) {
|
||||
srandom(now_ms * pid);
|
||||
agent->engine_id = generate_pseudo_uuid();
|
||||
if (agent->engine_id == NULL)
|
||||
return -1;
|
||||
|
Loading…
Reference in New Issue
Block a user