/* * libwebsockets - small server side websockets and web server implementation * * Copyright (C) 2010-2018 Andy Green * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation: * version 2.1 of the License. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301 USA */ /** @file */ #ifndef LIBWEBSOCKET_H_3060898B846849FF9F88F5DB59B5950C #define LIBWEBSOCKET_H_3060898B846849FF9F88F5DB59B5950C #ifdef __cplusplus #include #include extern "C" { #else #include #endif #include #include #include "lws_config.h" /* * CARE: everything using cmake defines needs to be below here */ #if defined(LWS_HAS_INTPTR_T) #include #define lws_intptr_t intptr_t #else typedef unsigned long long lws_intptr_t; #endif #if defined(WIN32) || defined(_WIN32) #ifndef WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN #endif #include #include #include #include #include #ifndef _WIN32_WCE #include #else #define _O_RDONLY 0x0000 #define O_RDONLY _O_RDONLY #endif #define LWS_INLINE __inline #define LWS_VISIBLE #define LWS_WARN_UNUSED_RESULT #define LWS_WARN_DEPRECATED #define LWS_FORMAT(string_index) #if !defined(LWS_EXTERN) #ifdef LWS_DLL #ifdef LWS_INTERNAL #define LWS_EXTERN extern __declspec(dllexport) #else #define LWS_EXTERN extern __declspec(dllimport) #endif #else #define LWS_EXTERN #endif #endif #define LWS_INVALID_FILE INVALID_HANDLE_VALUE #define LWS_O_RDONLY _O_RDONLY #define LWS_O_WRONLY _O_WRONLY #define LWS_O_CREAT _O_CREAT #define LWS_O_TRUNC _O_TRUNC #ifndef __func__ #define __func__ __FUNCTION__ #endif #else /* NOT WIN32 */ #include #if defined(LWS_HAVE_SYS_CAPABILITY_H) && defined(LWS_HAVE_LIBCAP) #include #endif #if defined(__NetBSD__) || defined(__FreeBSD__) || defined(__QNX__) || defined(__OpenBSD__) #include #include #endif #define LWS_INLINE inline #define LWS_O_RDONLY O_RDONLY #define LWS_O_WRONLY O_WRONLY #define LWS_O_CREAT O_CREAT #define LWS_O_TRUNC O_TRUNC #if !defined(LWS_PLAT_OPTEE) && !defined(OPTEE_TA) && !defined(LWS_WITH_ESP32) #include #include #define LWS_INVALID_FILE -1 #else #define getdtablesize() (30) #if defined(LWS_WITH_ESP32) #define LWS_INVALID_FILE NULL #else #define LWS_INVALID_FILE NULL #endif #endif #if defined(__GNUC__) /* warn_unused_result attribute only supported by GCC 3.4 or later */ #if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) #define LWS_WARN_UNUSED_RESULT __attribute__((warn_unused_result)) #else #define LWS_WARN_UNUSED_RESULT #endif #define LWS_VISIBLE __attribute__((visibility("default"))) #define LWS_WARN_DEPRECATED __attribute__ ((deprecated)) #define LWS_FORMAT(string_index) __attribute__ ((format(printf, string_index, string_index+1))) #else #define LWS_VISIBLE #define LWS_WARN_UNUSED_RESULT #define LWS_WARN_DEPRECATED #define LWS_FORMAT(string_index) #endif #if defined(__ANDROID__) #include #include #define getdtablesize() sysconf(_SC_OPEN_MAX) #endif #endif #if defined(LWS_WITH_LIBEV) #include #endif /* LWS_WITH_LIBEV */ #ifdef LWS_WITH_LIBUV #include #ifdef LWS_HAVE_UV_VERSION_H #include #endif #ifdef LWS_HAVE_NEW_UV_VERSION_H #include #endif #endif /* LWS_WITH_LIBUV */ #if defined(LWS_WITH_LIBEVENT) #include #endif /* LWS_WITH_LIBEVENT */ #ifndef LWS_EXTERN #define LWS_EXTERN extern #endif #ifdef _WIN32 #define random rand #else #if !defined(OPTEE_TA) #include #include #endif #endif #if defined(LWS_WITH_TLS) #ifdef USE_WOLFSSL #ifdef USE_OLD_CYASSL #ifdef _WIN32 /* * Include user-controlled settings for windows from * /IDE/WIN/user_settings.h */ #include #include #else #include #endif #include #include #else #ifdef _WIN32 /* * Include user-controlled settings for windows from * /IDE/WIN/user_settings.h */ #include #include #else #include #endif #include #include #endif /* not USE_OLD_CYASSL */ #else #if defined(LWS_WITH_MBEDTLS) #if defined(LWS_WITH_ESP32) /* this filepath is passed to us but without quotes or <> */ #undef MBEDTLS_CONFIG_FILE #define MBEDTLS_CONFIG_FILE #endif #include #else #include #if !defined(LWS_WITH_MBEDTLS) #include #endif #endif #endif /* not USE_WOLFSSL */ #endif /* * Helpers for pthread mutex in user code... if lws is built for * multiple service threads, these resolve to pthread mutex * operations. In the case LWS_MAX_SMP is 1 (the default), they * are all NOPs and no pthread type or api is referenced. */ #if LWS_MAX_SMP > 1 #include #define lws_pthread_mutex(name) pthread_mutex_t name; static LWS_INLINE void lws_pthread_mutex_init(pthread_mutex_t *lock) { pthread_mutex_init(lock, NULL); } static LWS_INLINE void lws_pthread_mutex_destroy(pthread_mutex_t *lock) { pthread_mutex_destroy(lock); } static LWS_INLINE void lws_pthread_mutex_lock(pthread_mutex_t *lock) { pthread_mutex_lock(lock); } static LWS_INLINE void lws_pthread_mutex_unlock(pthread_mutex_t *lock) { pthread_mutex_unlock(lock); } #else #define lws_pthread_mutex(name) #define lws_pthread_mutex_init(_a) #define lws_pthread_mutex_destroy(_a) #define lws_pthread_mutex_lock(_a) #define lws_pthread_mutex_unlock(_a) #endif #define CONTEXT_PORT_NO_LISTEN -1 #define CONTEXT_PORT_NO_LISTEN_SERVER -2 #include #include #ifndef lws_container_of #define lws_container_of(P,T,M) ((T *)((char *)(P) - offsetof(T, M))) #endif struct lws; typedef int64_t lws_usec_t; /* api change list for user code to test against */ #define LWS_FEATURE_SERVE_HTTP_FILE_HAS_OTHER_HEADERS_ARG /* the struct lws_protocols has the id field present */ #define LWS_FEATURE_PROTOCOLS_HAS_ID_FIELD /* you can call lws_get_peer_write_allowance */ #define LWS_FEATURE_PROTOCOLS_HAS_PEER_WRITE_ALLOWANCE /* extra parameter introduced in 917f43ab821 */ #define LWS_FEATURE_SERVE_HTTP_FILE_HAS_OTHER_HEADERS_LEN /* File operations stuff exists */ #define LWS_FEATURE_FOPS #if defined(_WIN32) #if !defined(LWS_WIN32_HANDLE_TYPES) typedef SOCKET lws_sockfd_type; typedef HANDLE lws_filefd_type; #endif struct lws_pollfd { lws_sockfd_type fd; /**< file descriptor */ SHORT events; /**< which events to respond to */ SHORT revents; /**< which events happened */ }; #define LWS_POLLHUP (FD_CLOSE) #define LWS_POLLIN (FD_READ | FD_ACCEPT) #define LWS_POLLOUT (FD_WRITE) #else #if defined(LWS_WITH_ESP32) #include #else typedef int lws_sockfd_type; typedef int lws_filefd_type; #endif #define lws_pollfd pollfd #define LWS_POLLHUP (POLLHUP|POLLERR) #define LWS_POLLIN (POLLIN) #define LWS_POLLOUT (POLLOUT) #endif #if (defined(WIN32) || defined(_WIN32)) && !defined(__MINGW32__) /* ... */ #define ssize_t SSIZE_T #endif #if defined(WIN32) && defined(LWS_HAVE__STAT32I64) #include #include #endif #if defined(LWS_HAVE_STDINT_H) #include #else #if defined(WIN32) || defined(_WIN32) /* !!! >:-[ */ typedef unsigned __int32 uint32_t; typedef unsigned __int16 uint16_t; typedef unsigned __int8 uint8_t; #else typedef unsigned int uint32_t; typedef unsigned short uint16_t; typedef unsigned char uint8_t; #endif #endif typedef unsigned long long lws_filepos_t; typedef long long lws_fileofs_t; typedef uint32_t lws_fop_flags_t; /** struct lws_pollargs - argument structure for all external poll related calls * passed in via 'in' */ struct lws_pollargs { lws_sockfd_type fd; /**< applicable socket descriptor */ int events; /**< the new event mask */ int prev_events; /**< the previous event mask */ }; struct lws_extension; /* needed even with ws exts disabled for create context */ struct lws_token_limits; struct lws_context; struct lws_tokens; struct lws_vhost; struct lws; #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #if defined(LWS_WITH_TLS) #if defined(LWS_WITH_MBEDTLS) #include #include #include #endif #include #include #include #include #endif #ifdef __cplusplus } #endif #endif