Exposing POSIX symbols could break consumer POSIX compatibility code.
* Make renaming of close() and unlink() private to EAL.
* Remove renaming of strncasecmp(), strtok_r(), and sleep()
in favor of using EAL wrappers. Similarly remove PATH_MAX macro.
* Replace index(3p), which is not available on Windows, with strchr(3),
as recommended by POSIX.1-2008. strerror_r() is only used inside EAL,
rename it only where it's needed. Same for asprintf(), it has an
internal EAL wrapper and is removed from public API.
Signed-off-by: Dmitry Kozlyuk <dmitry.kozliuk@gmail.com>
---
doc/guides/rel_notes/release_21_05.rst | 9 ++
lib/librte_eal/common/eal_common_errno.c | 4 +
lib/librte_eal/common/eal_common_options.c | 2 +-
lib/librte_eal/common/eal_private.h | 5 ++
lib/librte_eal/freebsd/include/rte_os.h | 4 +-
lib/librte_eal/linux/include/rte_os.h | 4 +-
lib/librte_eal/windows/include/rte_os.h | 99 ++--------------------
7 files changed, 29 insertions(+), 98 deletions(-)
@@ -84,6 +84,15 @@ API Changes
Also, make sure to start the actual text at the margin.
=======================================================
+* eal/windows: Removed POSIX symbols from EAL headers. Exposing POSIX symbols
+ has been incorrect and could conflict with consumer POSIX implementations.
+ Wrappers are provided for
+ ``strtok_r(3p)`` (``rte_strtok``),
+ ``strncasecmp(3p)`` (``rte_strncasecmp``),
+ ``sleep(3p)`` (``rte_thread_sleep``),
+ ``PATH_MAX`` (``RTE_PATH_MAX``).
+ Removed are ``strerror_r(3p)`` and ``asprintf(3p)``.
+
ABI Changes
-----------
@@ -15,6 +15,10 @@
#include <rte_errno.h>
#include <rte_string_fns.h>
+#ifdef RTE_EXEC_ENV_WINDOWS
+#define strerror_r(a, b, c) strerror_s(b, c, a)
+#endif
+
RTE_DEFINE_PER_LCORE(int, _rte_errno);
const char *
@@ -1936,7 +1936,7 @@ eal_check_common_options(struct internal_config *internal_cfg)
RTE_LOG(ERR, EAL, "Invalid length of --" OPT_MBUF_POOL_OPS_NAME" option\n");
return -1;
}
- if (index(eal_get_hugefile_prefix(), '%') != NULL) {
+ if (strchr(eal_get_hugefile_prefix(), '%') != NULL) {
RTE_LOG(ERR, EAL, "Invalid char, '%%', in --"OPT_FILE_PREFIX" "
"option\n");
return -1;
@@ -756,4 +756,9 @@ int eal_asprintf(char **buffer, const char *format, ...);
#define eal_asprintf asprintf
#endif
+#ifdef RTE_EXEC_ENV_WINDOWS
+#define close _close
+#define unlink _unlink
+#endif
+
#endif /* _EAL_PRIVATE_H_ */
@@ -6,9 +6,9 @@
#define _RTE_OS_H_
/**
- * This is header should contain any function/macro definition
+ * This header should contain any function/macro definition
* which are not supported natively or named differently in the
- * freebsd OS. Functions will be added in future releases.
+ * freebsd OS. It must not define symbols without "rte_" prefix.
*/
#include <pthread_np.h>
@@ -6,9 +6,9 @@
#define _RTE_OS_H_
/**
- * This is header should contain any function/macro definition
+ * This header should contain any function/macro definition
* which are not supported natively or named differently in the
- * linux OS. Functions will be added in future releases.
+ * linux OS. It must not define symbols without "rte_" prefix.
*/
#include <sched.h>
@@ -6,15 +6,11 @@
#define _RTE_OS_H_
/**
- * This is header should contain any function/macro definition
- * which are not supported natively or named differently in the
- * Windows OS. It must not include Windows-specific headers.
+ * This header should contain any function/macro definition
+ * which are not supported natively or named differently in Windows OS.
*/
-#include <stdarg.h>
-#include <stdio.h>
#include <stdlib.h>
-#include <string.h>
#ifdef __cplusplus
extern "C" {
@@ -22,101 +18,18 @@ extern "C" {
#define RTE_PATH_MAX _MAX_PATH
-/* limits.h replacement, value as in <windows.h> */
-#ifndef PATH_MAX
-#define PATH_MAX _MAX_PATH
-#endif
-
-#ifndef sleep
-#define sleep(x) Sleep(1000 * (x))
-#endif
-
-#ifndef strerror_r
-#define strerror_r(a, b, c) strerror_s(b, c, a)
-#endif
-
-#ifndef strdup
-/* strdup is deprecated in Microsoft libc and _strdup is preferred */
-#define strdup(str) _strdup(str)
-#endif
-
-#ifndef strtok_r
-#define strtok_r(str, delim, saveptr) strtok_s(str, delim, saveptr)
-#endif
-
-#ifndef index
-#define index(a, b) strchr(a, b)
-#endif
-
-#ifndef rindex
-#define rindex(a, b) strrchr(a, b)
-#endif
-
-#ifndef strncasecmp
-#define strncasecmp(s1, s2, count) _strnicmp(s1, s2, count)
-#endif
-
-#ifndef close
-#define close _close
-#endif
-
-#ifndef unlink
-#define unlink _unlink
-#endif
-
/* cpu_set macros implementation */
#define RTE_CPU_AND(dst, src1, src2) CPU_AND(dst, src1, src2)
#define RTE_CPU_OR(dst, src1, src2) CPU_OR(dst, src1, src2)
#define RTE_CPU_FILL(set) CPU_FILL(set)
#define RTE_CPU_NOT(dst, src) CPU_NOT(dst, src)
-/* as in <windows.h> */
+/* This is an exception without "rte_" prefix, because Windows does have
+ * ssize_t, but it's defined in <windows.h> which we avoid to expose.
+ * If ssize_t is defined in user code, it necessarily has the same type.
+ */
typedef long long ssize_t;
-#ifndef RTE_TOOLCHAIN_GCC
-
-static inline int
-asprintf(char **buffer, const char *format, ...)
-{
- int size, ret;
- va_list arg;
-
- va_start(arg, format);
- size = vsnprintf(NULL, 0, format, arg);
- va_end(arg);
- if (size < 0)
- return -1;
- size++;
-
- *buffer = (char *)malloc(size);
- if (*buffer == NULL)
- return -1;
-
- va_start(arg, format);
- ret = vsnprintf(*buffer, size, format, arg);
- va_end(arg);
- if (ret != size - 1) {
- free(*buffer);
- return -1;
- }
- return ret;
-}
-
-static inline const char *
-eal_strerror(int code)
-{
- static char buffer[128];
-
- strerror_s(buffer, sizeof(buffer), code);
- return buffer;
-}
-
-#ifndef strerror
-#define strerror eal_strerror
-#endif
-
-#endif /* RTE_TOOLCHAIN_GCC */
-
#ifdef __cplusplus
}
#endif