eal: add asprintf() function for Windows

Message ID 1746495789-14101-1-git-send-email-andremue@linux.microsoft.com (mailing list archive)
State Not Applicable
Delegated to: Thomas Monjalon
Headers
Series eal: add asprintf() function for Windows |

Checks

Context Check Description
ci/checkpatch warning coding style issues
ci/loongarch-compilation success Compilation OK
ci/loongarch-unit-testing success Unit Testing PASS
ci/Intel-compilation success Compilation OK
ci/github-robot: build success github build: passed
ci/iol-marvell-Functional success Functional Testing PASS
ci/iol-intel-Functional success Functional Testing PASS
ci/iol-unit-amd64-testing pending Testing pending
ci/iol-mellanox-Performance success Performance Testing PASS
ci/iol-compile-arm64-testing success Testing PASS
ci/iol-intel-Performance success Performance Testing PASS
ci/iol-broadcom-Performance success Performance Testing PASS
ci/iol-compile-amd64-testing success Testing PASS
ci/iol-sample-apps-testing success Testing PASS
ci/aws-unit-testing success Unit Testing PASS
ci/intel-Testing success Testing PASS
ci/intel-Functional success Functional PASS

Commit Message

Andre Muezerie May 6, 2025, 1:43 a.m. UTC
The asprintf function is not part of the C standard library but is a
GNU extension commonly available in Unix-like systems. It dynamically
allocates memory to store the formatted output string, similar to
sprintf, but avoids buffer overflow issues by automatically sizing
the buffer.

Instead of rewriting it or coming up with some other replacement, this
patch makes use of the implementation provided by Neved4.

Signed-off-by: Andre Muezerie <andremue@linux.microsoft.com>
---
 lib/eal/windows/asprintf.c         | 48 ++++++++++++++++++++++++++++++
 lib/eal/windows/include/asprintf.h | 21 +++++++++++++
 lib/eal/windows/meson.build        |  1 +
 license/exceptions.txt             |  2 ++
 4 files changed, 72 insertions(+)
 create mode 100644 lib/eal/windows/asprintf.c
 create mode 100644 lib/eal/windows/include/asprintf.h
  

Comments

Thomas Monjalon June 12, 2025, 12:41 a.m. UTC | #1
06/05/2025 03:43, Andre Muezerie:
> The asprintf function is not part of the C standard library but is a
> GNU extension commonly available in Unix-like systems. It dynamically
> allocates memory to store the formatted output string, similar to
> sprintf, but avoids buffer overflow issues by automatically sizing
> the buffer.
> 
> Instead of rewriting it or coming up with some other replacement, this
> patch makes use of the implementation provided by Neved4.

Why not using eal_asprintf()?
  
Andre Muezerie June 12, 2025, 2:46 p.m. UTC | #2
On Thu, Jun 12, 2025 at 02:41:05AM +0200, Thomas Monjalon wrote:
> 06/05/2025 03:43, Andre Muezerie:
> > The asprintf function is not part of the C standard library but is a
> > GNU extension commonly available in Unix-like systems. It dynamically
> > allocates memory to store the formatted output string, similar to
> > sprintf, but avoids buffer overflow issues by automatically sizing
> > the buffer.
> > 
> > Instead of rewriting it or coming up with some other replacement, this
> > patch makes use of the implementation provided by Neved4.
> 
> Why not using eal_asprintf()?
> 

There are many calls being made directly to asprintf() which made me
believe there wasn’t an equivalent available for Windows yet.

Thanks for pointing out that is not the case.

I’ll make the necessary changes to call eal_asprintf() instead.
  

Patch

diff --git a/lib/eal/windows/asprintf.c b/lib/eal/windows/asprintf.c
new file mode 100644
index 0000000000..6ebc9d0f0a
--- /dev/null
+++ b/lib/eal/windows/asprintf.c
@@ -0,0 +1,48 @@ 
+/* SPDX-License-Identifier: MIT
+ * Copyright(C) 2023 - 2025 Neved4
+ * https://github.com/Neved4/asprintf/tree/main
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "asprintf.h"
+
+#ifndef RTE_TOOLCHAIN_GCC
+int vasprintf(char **strp, const char *fmt, va_list ap)
+{
+	int size, res;
+	va_list cp;
+
+	va_copy(cp, ap);
+	size = vsnprintf(NULL, 0, fmt, cp);
+	va_end(cp);
+
+	if (size < 0)
+		return -1;
+
+	*strp = malloc(size + 1);
+	if (*strp == NULL)
+		return -1;
+
+	res = vsnprintf(*strp, size + 1, fmt, ap);
+	if (res < 0) {
+		free(*strp);
+		return -1;
+	}
+
+	return res;
+}
+
+int asprintf(char **s, const char *fmt, ...)
+{
+	int ret;
+	va_list ap;
+
+	va_start(ap, fmt);
+	ret = vasprintf(s, fmt, ap);
+	va_end(ap);
+
+	return ret;
+}
+#endif
diff --git a/lib/eal/windows/include/asprintf.h b/lib/eal/windows/include/asprintf.h
new file mode 100644
index 0000000000..36d052b808
--- /dev/null
+++ b/lib/eal/windows/include/asprintf.h
@@ -0,0 +1,21 @@ 
+/* SPDX-License-Identifier: MIT
+ * Copyright(C) 2023 - 2025 Neved4
+ * https://github.com/Neved4/asprintf/tree/main
+ */
+
+/**
+ * @file
+ * asprintf compat.
+ *
+ * This module provides asprintf() and vasprintf().
+ */
+
+#pragma once
+
+#include <stdarg.h>
+
+#ifndef RTE_TOOLCHAIN_GCC
+int vasprintf(char **strp, const char *fmt, va_list ap);
+
+int asprintf(char **s, const char *fmt, ...);
+#endif
diff --git a/lib/eal/windows/meson.build b/lib/eal/windows/meson.build
index 7756d417be..06b25a3a09 100644
--- a/lib/eal/windows/meson.build
+++ b/lib/eal/windows/meson.build
@@ -4,6 +4,7 @@ 
 subdir('include')
 
 sources += files(
+        'asprintf.c',
         'eal.c',
         'eal_alarm.c',
         'eal_debug.c',
diff --git a/license/exceptions.txt b/license/exceptions.txt
index d12fac2034..5ea0de5308 100644
--- a/license/exceptions.txt
+++ b/license/exceptions.txt
@@ -16,4 +16,6 @@  MIT                  | 10/23/2019       | 02/10/2020       | lib/eal/windows/inc
 BSD-2-Clause         | 10/23/2019       | 12/18/2019       | lib/eal/windows/include/getopt.h
 ISC AND BSD-2-Clause | 10/23/2019       | 12/18/2019       | lib/eal/windows/getopt.c
 MIT                  | 10/19/2022       | 10/18/2022       | drivers/net/gve/base/*
+MIT                  | XX/XX/XXXX       | XX/XX/XXXX       | lib/eal/windows/include/asprintf.h
+MIT                  | XX/XX/XXXX       | XX/XX/XXXX       | lib/eal/windows/asprintf.c
 ---------------------------------------------------------------------------------------------------