From 73040e3a8ee02a92e5af53aff3a751533c96c99e Mon Sep 17 00:00:00 2001 From: Tim Duesterhus Date: Mon, 13 Apr 2026 19:37:27 +0200 Subject: [PATCH] MINOR: Add `generate_unique_id()` helper This new function will handle the actual generation of the unique ID according to a format. The caller is responsible to check that no unique ID is stored yet. --- include/haproxy/log.h | 2 ++ src/log.c | 24 ++++++++++++++++++++++++ src/stream.c | 11 +---------- 3 files changed, 27 insertions(+), 10 deletions(-) diff --git a/include/haproxy/log.h b/include/haproxy/log.h index 966bc94f1..98483eee0 100644 --- a/include/haproxy/log.h +++ b/include/haproxy/log.h @@ -196,6 +196,8 @@ char *update_log_hdr(const time_t time); char * get_format_pid_sep1(int format, size_t *len); char * get_format_pid_sep2(int format, size_t *len); +void generate_unique_id(struct ist *dst, struct session *sess, struct stream *strm, struct lf_expr *format); + /* * Builds a log line for the stream (must be valid). */ diff --git a/src/log.c b/src/log.c index ba2d9d183..8d51f0c93 100644 --- a/src/log.c +++ b/src/log.c @@ -3879,6 +3879,30 @@ int lf_expr_dup(const struct lf_expr *orig, struct lf_expr *dest) return 0; } +/* Generates a unique ID based on the given and stores it + * in . must be IST_NULL when this function is called. + * + * If this function fails to allocate memory IST_NULL is stored. + */ +void generate_unique_id(struct ist *dst, struct session *sess, struct stream *strm, struct lf_expr *format) +{ + char *unique_id; + + BUG_ON(isttest(*dst)); + + unique_id = pool_alloc(pool_head_uniqueid); + if (unique_id == NULL) { + *dst = IST_NULL; + return; + } + + /* Initialize to an empty string to prevent infinite + * recursion when the references %[unique-id] or %ID. + */ + *dst = ist2(unique_id, 0); + dst->len = sess_build_logline(sess, strm, unique_id, UNIQUEID_LEN, format); +} + /* Builds a log line in based on , and stops before reaching * characters. Returns the size of the output string in characters, * not counting the trailing zero which is always added if the resulting size diff --git a/src/stream.c b/src/stream.c index eb13cf277..9e026c23d 100644 --- a/src/stream.c +++ b/src/stream.c @@ -3094,16 +3094,7 @@ INITCALL0(STG_INIT, init_stream); struct ist stream_generate_unique_id(struct stream *strm, struct lf_expr *format) { if (!isttest(strm->unique_id)) { - char *unique_id; - - if ((unique_id = pool_alloc(pool_head_uniqueid)) == NULL) - return IST_NULL; - - /* Initialize ->unique_id to an empty string to prevent infinite - * recursion when the references %[unique-id] or %ID. - */ - strm->unique_id = ist2(unique_id, 0); - strm->unique_id.len = build_logline(strm, unique_id, UNIQUEID_LEN, format); + generate_unique_id(&strm->unique_id, strm_sess(strm), strm, format); } return strm->unique_id;