#pragma once #if MG_ARCH == MG_ARCH_FREERTOS_TCP #include #include #include #include #include #include #include #include #include #include #if MG_ENABLE_STDIO #include #endif #include #include #include #include #define MG_INT64_FMT "%lld" #define MG_DIRSEP '/' // Why FreeRTOS-TCP did not implement a clean BSD API, but its own thing // with FreeRTOS_ prefix, is beyond me #define IPPROTO_TCP FREERTOS_IPPROTO_TCP #define IPPROTO_UDP FREERTOS_IPPROTO_UDP #define AF_INET FREERTOS_AF_INET #define SOCK_STREAM FREERTOS_SOCK_STREAM #define SOCK_DGRAM FREERTOS_SOCK_DGRAM #define SO_BROADCAST 0 #define SO_ERROR 0 #define SOL_SOCKET 0 #define SO_REUSEADDR 0 #define sockaddr_in freertos_sockaddr #define sockaddr freertos_sockaddr #define accept(a, b, c) FreeRTOS_accept((a), (b), (c)) #define connect(a, b, c) FreeRTOS_connect((a), (b), (c)) #define bind(a, b, c) FreeRTOS_bind((a), (b), (c)) #define listen(a, b) FreeRTOS_listen((a), (b)) #define socket(a, b, c) FreeRTOS_socket((a), (b), (c)) #define send(a, b, c, d) FreeRTOS_send((a), (b), (c), (d)) #define recv(a, b, c, d) FreeRTOS_recv((a), (b), (c), (d)) #define setsockopt(a, b, c, d, e) FreeRTOS_setsockopt((a), (b), (c), (d), (e)) #define sendto(a, b, c, d, e, f) FreeRTOS_sendto((a), (b), (c), (d), (e), (f)) #define recvfrom(a, b, c, d, e, f) \ FreeRTOS_recvfrom((a), (b), (c), (d), (e), (f)) #define closesocket(x) FreeRTOS_closesocket(x) #define gethostbyname(x) FreeRTOS_gethostbyname(x) // Re-route calloc/free to the FreeRTOS's functions, don't use stdlib static inline void *mg_calloc(int cnt, size_t size) { void *p = pvPortMalloc(cnt * size); if (p != NULL) memset(p, 0, size); return p; } #define calloc(a, b) mg_calloc((a), (b)) #define free(a) vPortFree(a) #define malloc(a) pvPortMalloc(a) #define gmtime_r(a, b) gmtime(a) #if !defined(__GNUC__) // copied from GCC on ARM; for some reason useconds are signed typedef long suseconds_t; struct timeval { time_t tv_sec; suseconds_t tv_usec; }; #endif #ifndef EINPROGRESS #define EINPROGRESS pdFREERTOS_ERRNO_EINPROGRESS #endif #ifndef EWOULDBLOCK #define EWOULDBLOCK pdFREERTOS_ERRNO_EWOULDBLOCK #endif #ifndef EAGAIN #define EAGAIN pdFREERTOS_ERRNO_EAGAIN #endif #ifndef EINTR #define EINTR pdFREERTOS_ERRNO_EINTR #endif #endif // MG_ARCH == MG_ARCH_FREERTOS_TCP