pespin has submitted this change. ( https://gerrit.osmocom.org/c/libosmocore/+/41931?usp=email )
Change subject: socket_compat.h improvements to always have struct osmo_sockaddr available ......................................................................
socket_compat.h improvements to always have struct osmo_sockaddr available
Having a #if (!EMBEDDED) based on compiler defined variable is not a good idea. Instead, add minimal sys/socket.h and netient/in.h to always have the definition of struct osmo_sockaddr available.
Change-Id: I5b10e09770727c72812af15360ab3385b957509b --- M configure.ac M include/osmocom/core/Makefile.am M include/osmocom/core/socket.h M include/osmocom/core/socket_compat.h.tpl 4 files changed, 73 insertions(+), 15 deletions(-)
Approvals: laforge: Looks good to me, but someone else must approve Jenkins Builder: Verified osmith: Looks good to me, but someone else must approve pespin: Looks good to me, approved
diff --git a/configure.ac b/configure.ac index 7cb8727..ee779ea 100644 --- a/configure.ac +++ b/configure.ac @@ -75,6 +75,7 @@ dnl checks for header files AC_HEADER_STDC AC_CHECK_HEADERS(arpa/inet.h execinfo.h poll.h sys/select.h sys/socket.h sys/signalfd.h sys/eventfd.h sys/timerfd.h ctype.h netinet/tcp.h netinet/in.h) +AC_CHECK_DECL(HAVE_NETINET_IN_H, AC_SUBST(HAVE_NETINET_IN_H, 1), AC_SUBST(HAVE_NETINET_IN_H, 0)) AC_CHECK_DECL(HAVE_SYS_SOCKET_H, AC_SUBST(HAVE_SYS_SOCKET_H, 1), AC_SUBST(HAVE_SYS_SOCKET_H, 0)) # for src/conv.c AC_FUNC_ALLOCA diff --git a/include/osmocom/core/Makefile.am b/include/osmocom/core/Makefile.am index 9a949ae..18ee283 100644 --- a/include/osmocom/core/Makefile.am +++ b/include/osmocom/core/Makefile.am @@ -100,7 +100,9 @@
socket_compat.h: socket_compat.h.tpl $(AM_V_GEN)$(MKDIR_P) $(dir $@) - $(AM_V_GEN)sed -e's/XX/$(HAVE_SYS_SOCKET_H)/g' $< > $@ + $(AM_V_GEN)sed -e's/__LIBOSMOCORE_HAVE_SYS_SOCKET_H XX/__LIBOSMOCORE_HAVE_SYS_SOCKET_H $(HAVE_SYS_SOCKET_H)/g' \ + -e's/__LIBOSMOCORE_HAVE_NETINET_IN_H XX/__LIBOSMOCORE_HAVE_NETINET_IN_H $(HAVE_NETINET_IN_H)/g' \ + $< > $@
version.h: version.h.tpl $(AM_V_GEN)$(MKDIR_P) $(dir $@) diff --git a/include/osmocom/core/socket.h b/include/osmocom/core/socket.h index 845efd7..726e0d5 100644 --- a/include/osmocom/core/socket.h +++ b/include/osmocom/core/socket.h @@ -2,7 +2,6 @@ * Osmocom socket convenience functions. */
#pragma once -#if (!EMBEDDED)
/*! \defgroup socket Socket convenience functions * @{ @@ -12,9 +11,8 @@ #include <stdbool.h> #include <stddef.h>
-#include <netinet/in.h> - #include <osmocom/core/defs.h> +#include <osmocom/core/socket_compat.h>
/*! maximum number of local or remote addresses supported by an osmo_sock instance */ #define OSMO_SOCK_MAX_ADDRS 32 @@ -29,9 +27,6 @@ /*! maximum length of a multia-address socket name ("r=(::2|1.2.3.4):123<->l=(5.6.7.8|::9):987") */ #define OSMO_SOCK_MULTIADDR_NAME_MAXLEN (OSMO_SOCK_MULTIADDR_PEER_STR_MAXLEN + 7)
- -struct sockaddr_in; -struct sockaddr; struct osmo_fd; struct sctp_paddrinfo;
@@ -59,7 +54,7 @@ { if (!addr) return 0; - +#if __LIBOSMOCORE_HAVE_SYS_SOCKET_H switch (addr->u.sa.sa_family) { case AF_INET: return sizeof(struct sockaddr_in); @@ -68,6 +63,9 @@ default: return sizeof(struct osmo_sockaddr); } +#else + return 0; +#endif /* if __LIBOSMOCORE_HAVE_SYS_SOCKET_H */ }
unsigned int osmo_sockaddr_to_str_and_uint(char *addr, unsigned int addr_len, uint16_t *port, @@ -224,5 +222,4 @@
int osmo_sock_sctp_get_peer_addr_info(int fd, struct sctp_paddrinfo *pinfo, size_t *pinfo_cnt);
-#endif /* (!EMBEDDED) */ /*! @} */ diff --git a/include/osmocom/core/socket_compat.h.tpl b/include/osmocom/core/socket_compat.h.tpl index 43bee9e..4254d68 100644 --- a/include/osmocom/core/socket_compat.h.tpl +++ b/include/osmocom/core/socket_compat.h.tpl @@ -1,10 +1,68 @@ -#define HAVE_STRUCT_SOCKADDR_STORAGE XX +#define __LIBOSMOCORE_HAVE_SYS_SOCKET_H XX +#define __LIBOSMOCORE_HAVE_NETINET_IN_H XX
-#if HAVE_STRUCT_SOCKADDR_STORAGE +#if __LIBOSMOCORE_HAVE_SYS_SOCKET_H #include <sys/socket.h> #else -struct sockaddr_storage { - unsigned short ss_family; - char __data[128 - sizeof(unsigned short)]; +/* Minimal netinet/in.h as per POSIX https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/sys_socket.h.html */ +#include <stdint.h> +typedef uint32_t socklen_t; +typedef unsigned short sa_family_t; + +struct sockaddr { + sa_family_t sa_family; + char sa_data[14]; }; -#endif + +struct sockaddr_storage { + sa_family_t ss_family; + char __data[128 - sizeof(sa_family_t)]; +}; +#endif /* if __LIBOSMOCORE_HAVE_SYS_SOCKET_H */ + +#if __LIBOSMOCORE_HAVE_NETINET_IN_H + #include <netinet/in.h> +#else +/* Minimal netinet/in.h as per POSIX https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/netinet_in.h.html */ +#include <stdint.h> + +typedef uint32_t in_addr_t; +struct in_addr { + in_addr_t s_addr; +}; + +typedef uint16_t in_port_t; + +struct in6_addr { + union { + uint8_t __u6_addr8[16]; + uint16_t __u6_addr16[8]; + uint32_t __u6_addr32[4]; + } __in6_u; + #define s6_addr __in6_u.__u6_addr8 + #define s6_addr16 __in6_u.__u6_addr16 + #define s6_addr32 __in6_u.__u6_addr32 +}; + +#define INET_ADDRSTRLEN 16 +#define INET6_ADDRSTRLEN 46 + +struct sockaddr_in { + sa_family_t sin_family; + in_port_t sin_port; + struct in_addr sin_addr; + unsigned char sin_zero[sizeof (struct sockaddr) + - sizeof (sa_family_t) + - sizeof (in_port_t) + - sizeof (struct in_addr)]; +}; + +struct sockaddr_in6 { + sa_family_t sin6_family; + in_port_t sin6_port; + uint32_t sin6_flowinfo; + struct in6_addr sin6_addr; + uint32_t sin6_scope_id; +}; + +#endif /* if __LIBOSMOCORE_HAVE_NETINET_IN_H */