The newlib glue code uses code originally taken from musl. In musl, the
way to selectively include certain data types from those defined in
types.h is through the use of __NEED_* macros. Newlib uses a different
approach: it provides all definitions as underscored variants via
sys/_types.h, and the header files then typedef them over to the normal
variants as needed, with preprocessor guards around each of them to
provent duplications.
Replace the __NEED macros (which are effectively noops, so none of those
data types ever got properly defined in those headers) with the newlib
_types solution.
Signed-off-by: Florian Schmidt <florian.schmidt@neclab.eu>
Reviewed-by: Felipe Huici <felipe.huici@neclab.eu>
extern "C" {
#endif
-#define __NEED_ino_t
-#define __NEED_off_t
+#include <sys/_types.h>
+
+#ifndef _INO_T_DECLARED
+typedef __ino_t ino_t;
+#define _INO_T_DECLARED
+#endif
+
+#ifndef _OFF_T_DECLARED
+typedef __off_t off_t;
+#define _OFF_T_DECLARED
+#endif
+
#if defined(_BSD_SOURCE) || defined(_GNU_SOURCE)
-#define __NEED_size_t
+#ifndef _SIZE_T_DECLARED
+typedef __size_t size_t;
+#define _SIZE_T_DECLARED
+#endif
#endif
typedef struct __dirstream DIR;
extern "C" {
#endif
+#include <sys/_types.h>
#include <stddef.h>
-#define __NEED_mode_t
-#define __NEED_size_t
-#define __NEED_off_t
+#ifndef _OFF_T_DECLARED
+typedef __off_t off_t;
+#define _OFF_T_DECLARED
+#endif
+
+#ifndef _SIZE_T_DECLARED
+typedef __size_t size_t;
+#define _SIZE_T_DECLARED
+#endif
+
+#ifndef _MODE_T_DECLARED
+typedef __mode_t mode_t;
+#define _MODE_T_DECLARED
+#endif
#if defined(_GNU_SOURCE)
-#define __NEED_ssize_t
+#ifndef _SSIZE_T_DECLARED
+typedef __ssize_t ssize_t;
+#define _SSIZE_T_DECLARED
+#endif
#endif
#define MAP_FAILED ((void *) -1)
extern "C" {
#endif
+#include <sys/_types.h>
#include <sys/time.h>
-#define __NEED_id_t
+#ifndef _ID_T_DECLARED
+typedef __id_t id_t;
+#define _ID_T_DECLARED
+#endif
#ifdef _GNU_SOURCE
-#define __NEED_pid_t
+#ifndef _PID_T_DECLARED
+typedef __pid_t pid_t;
+#define _PID_T_DECLARED
+#endif
#endif
typedef unsigned long long rlim_t;
extern "C" {
#endif
-#define __NEED_fsblkcnt_t
-#define __NEED_fsfilcnt_t
-#include <sys/types.h>
#include <endian.h>
+#include <sys/_types.h>
+
+#ifndef _FSBLKCNT_T_DECLARED
+typedef __fsblkcnt_t fsblkcnt_t;
+#define _FSBLKCNT_T_DECLARED
+#endif
+
+#ifndef _FSFILCNT_T_DECLARED
+typedef __fsfilcnt_t fsfilcnt_t;
+#define _FSFILCNT_T_DECLARED
+#endif
struct statvfs {
unsigned long f_bsize, f_frsize;