Skip to content

Commit

Permalink
aws_util: add trailing zeros for millisecond and nanoaecond time prec…
Browse files Browse the repository at this point in the history
…ision

fluent#7538
  • Loading branch information
PettitWesley committed Oct 31, 2023
1 parent f71e6c4 commit ec5eaff
Showing 1 changed file with 26 additions and 8 deletions.
34 changes: 26 additions & 8 deletions src/aws/flb_aws_util.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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;
Expand Down Expand Up @@ -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 {
Expand Down

0 comments on commit ec5eaff

Please sign in to comment.