From ec5eaff46da8384967abd2c618f5abe153691ad5 Mon Sep 17 00:00:00 2001 From: Wesley Pettit Date: Thu, 19 Oct 2023 20:10:40 -0700 Subject: [PATCH] aws_util: add trailing zeros for millisecond and nanoaecond time precision https://github.com/fluent/fluent-bit/issues/7538 --- src/aws/flb_aws_util.c | 34 ++++++++++++++++++++++++++-------- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/src/aws/flb_aws_util.c b/src/aws/flb_aws_util.c index 231e9aeb7ff..6408a32d8bd 100644 --- a/src/aws/flb_aws_util.c +++ b/src/aws/flb_aws_util.c @@ -957,6 +957,20 @@ flb_sds_t flb_get_s3_key(const char *format, time_t time, const char *tag, return NULL; } + +static void decimal_with_leading_zeros(char *dst, char *src, int expected_len) +{ + int src_len = strlen(src); + int zero_len = expected_len - src_len; + int i; + + for (i = 0; i < zero_len; i++) { + dst[i] = '0'; + } + + strncat(dst + zero_len, src, src_len); +} + /* * This function is an extension to strftime which can support milliseconds with %3N, * support nanoseconds with %9N or %L. The return value is the length of formatted @@ -967,6 +981,8 @@ size_t flb_aws_strftime_precision(char **out_buf, const char *time_format, { char millisecond_str[FLB_AWS_MILLISECOND_FORMATTER_LENGTH+1]; char nanosecond_str[FLB_AWS_NANOSECOND_FORMATTER_LENGTH+1]; + char millisecond_tmp_str[FLB_AWS_MILLISECOND_FORMATTER_LENGTH+1]; + char nanosecond_tmp_str[FLB_AWS_NANOSECOND_FORMATTER_LENGTH+1]; char *tmp_parsed_time_str; char *buf; size_t out_size; @@ -1002,24 +1018,26 @@ size_t flb_aws_strftime_precision(char **out_buf, const char *time_format, } /* Replace %3N to millisecond, %9N and %L to nanosecond in time_format. */ - snprintf(millisecond_str, FLB_AWS_MILLISECOND_FORMATTER_LENGTH+1, + snprintf(millisecond_tmp_str, FLB_AWS_MILLISECOND_FORMATTER_LENGTH+1, "%" PRIu64, (uint64_t) tms->tm.tv_nsec / 1000000); - snprintf(nanosecond_str, FLB_AWS_NANOSECOND_FORMATTER_LENGTH+1, + snprintf(nanosecond_tmp_str, FLB_AWS_NANOSECOND_FORMATTER_LENGTH+1, "%" PRIu64, (uint64_t) tms->tm.tv_nsec); + + for (i = 0; i < time_format_len; i++) { if (strncmp(time_format+i, FLB_AWS_MILLISECOND_FORMATTER, 3) == 0) { - strncat(tmp_parsed_time_str, millisecond_str, - FLB_AWS_MILLISECOND_FORMATTER_LENGTH+1); + decimal_with_leading_zeros(tmp_parsed_time_str, millisecond_str, + FLB_AWS_MILLISECOND_FORMATTER_LENGTH); i += 2; } else if (strncmp(time_format+i, FLB_AWS_NANOSECOND_FORMATTER_N, 3) == 0) { - strncat(tmp_parsed_time_str, nanosecond_str, - FLB_AWS_NANOSECOND_FORMATTER_LENGTH+1); + decimal_with_leading_zeros(tmp_parsed_time_str, nanosecond_str, + FLB_AWS_NANOSECOND_FORMATTER_LENGTH); i += 2; } else if (strncmp(time_format+i, FLB_AWS_NANOSECOND_FORMATTER_L, 2) == 0) { - strncat(tmp_parsed_time_str, nanosecond_str, - FLB_AWS_NANOSECOND_FORMATTER_LENGTH+1); + decimal_with_leading_zeros(tmp_parsed_time_str, nanosecond_str, + FLB_AWS_NANOSECOND_FORMATTER_LENGTH); i += 1; } else {