1d4afb5ceSopenharmony_ci /* 2d4afb5ceSopenharmony_ci * libwebsockets - small server side websockets and web server implementation 3d4afb5ceSopenharmony_ci * 4d4afb5ceSopenharmony_ci * Copyright (C) 2010 - 2019 Andy Green <andy@warmcat.com> 5d4afb5ceSopenharmony_ci * 6d4afb5ceSopenharmony_ci * Permission is hereby granted, free of charge, to any person obtaining a copy 7d4afb5ceSopenharmony_ci * of this software and associated documentation files (the "Software"), to 8d4afb5ceSopenharmony_ci * deal in the Software without restriction, including without limitation the 9d4afb5ceSopenharmony_ci * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 10d4afb5ceSopenharmony_ci * sell copies of the Software, and to permit persons to whom the Software is 11d4afb5ceSopenharmony_ci * furnished to do so, subject to the following conditions: 12d4afb5ceSopenharmony_ci * 13d4afb5ceSopenharmony_ci * The above copyright notice and this permission notice shall be included in 14d4afb5ceSopenharmony_ci * all copies or substantial portions of the Software. 15d4afb5ceSopenharmony_ci * 16d4afb5ceSopenharmony_ci * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17d4afb5ceSopenharmony_ci * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18d4afb5ceSopenharmony_ci * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19d4afb5ceSopenharmony_ci * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20d4afb5ceSopenharmony_ci * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 21d4afb5ceSopenharmony_ci * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 22d4afb5ceSopenharmony_ci * IN THE SOFTWARE. 23d4afb5ceSopenharmony_ci * 24d4afb5ceSopenharmony_ci * Included from lib/private-lib-core.h if no explicit platform 25d4afb5ceSopenharmony_ci */ 26d4afb5ceSopenharmony_ci 27d4afb5ceSopenharmony_ci#include <fcntl.h> 28d4afb5ceSopenharmony_ci#include <strings.h> 29d4afb5ceSopenharmony_ci#include <unistd.h> 30d4afb5ceSopenharmony_ci 31d4afb5ceSopenharmony_ci#include <netinet/in.h> 32d4afb5ceSopenharmony_ci#include <netinet/tcp.h> 33d4afb5ceSopenharmony_ci#include <arpa/inet.h> 34d4afb5ceSopenharmony_ci#include <poll.h> 35d4afb5ceSopenharmony_ci#include <netdb.h> 36d4afb5ceSopenharmony_ci 37d4afb5ceSopenharmony_ci#ifndef __cplusplus 38d4afb5ceSopenharmony_ci#include <errno.h> 39d4afb5ceSopenharmony_ci#endif 40d4afb5ceSopenharmony_ci#include <netdb.h> 41d4afb5ceSopenharmony_ci#include <signal.h> 42d4afb5ceSopenharmony_ci 43d4afb5ceSopenharmony_ci#include <sys/socket.h> 44d4afb5ceSopenharmony_ci#include <sys/types.h> 45d4afb5ceSopenharmony_ci#include <sys/stat.h> 46d4afb5ceSopenharmony_ci#include <sys/time.h> 47d4afb5ceSopenharmony_ci#include <sys/mman.h> 48d4afb5ceSopenharmony_ci#include <sys/un.h> 49d4afb5ceSopenharmony_ci#if defined(LWS_HAVE_EVENTFD) 50d4afb5ceSopenharmony_ci#include <sys/eventfd.h> 51d4afb5ceSopenharmony_ci#endif 52d4afb5ceSopenharmony_ci 53d4afb5ceSopenharmony_ci#if defined(__APPLE__) 54d4afb5ceSopenharmony_ci#include <machine/endian.h> 55d4afb5ceSopenharmony_ci#endif 56d4afb5ceSopenharmony_ci#if defined(__FreeBSD__) 57d4afb5ceSopenharmony_ci#include <sys/endian.h> 58d4afb5ceSopenharmony_ci#endif 59d4afb5ceSopenharmony_ci#if defined(__linux__) 60d4afb5ceSopenharmony_ci#include <endian.h> 61d4afb5ceSopenharmony_ci#include <linux/if_packet.h> 62d4afb5ceSopenharmony_ci#include <net/if.h> 63d4afb5ceSopenharmony_ci#endif 64d4afb5ceSopenharmony_ci#if defined(__QNX__) 65d4afb5ceSopenharmony_ci #include <gulliver.h> 66d4afb5ceSopenharmony_ci #if defined(__LITTLEENDIAN__) 67d4afb5ceSopenharmony_ci #define BYTE_ORDER __LITTLEENDIAN__ 68d4afb5ceSopenharmony_ci #define LITTLE_ENDIAN __LITTLEENDIAN__ 69d4afb5ceSopenharmony_ci #define BIG_ENDIAN 4321 /* to show byte order (taken from gcc); for suppres warning that BIG_ENDIAN is not defined. */ 70d4afb5ceSopenharmony_ci #endif 71d4afb5ceSopenharmony_ci #if defined(__BIGENDIAN__) 72d4afb5ceSopenharmony_ci #define BYTE_ORDER __BIGENDIAN__ 73d4afb5ceSopenharmony_ci #define LITTLE_ENDIAN 1234 /* to show byte order (taken from gcc); for suppres warning that LITTLE_ENDIAN is not defined. */ 74d4afb5ceSopenharmony_ci #define BIG_ENDIAN __BIGENDIAN__ 75d4afb5ceSopenharmony_ci #endif 76d4afb5ceSopenharmony_ci#endif 77d4afb5ceSopenharmony_ci 78d4afb5ceSopenharmony_ci#if defined(LWS_HAVE_PTHREAD_H) 79d4afb5ceSopenharmony_ci#include <pthread.h> 80d4afb5ceSopenharmony_citypedef pthread_mutex_t lws_mutex_t; 81d4afb5ceSopenharmony_ci#define lws_mutex_init(x) pthread_mutex_init(&(x), NULL) 82d4afb5ceSopenharmony_ci#define lws_mutex_destroy(x) pthread_mutex_destroy(&(x)) 83d4afb5ceSopenharmony_ci#define lws_mutex_lock(x) pthread_mutex_lock(&(x)) 84d4afb5ceSopenharmony_ci#define lws_mutex_unlock(x) pthread_mutex_unlock(&(x)) 85d4afb5ceSopenharmony_ci#endif 86d4afb5ceSopenharmony_ci 87d4afb5ceSopenharmony_ci#if defined(__sun) && defined(__GNUC__) 88d4afb5ceSopenharmony_ci 89d4afb5ceSopenharmony_ci#include <arpa/nameser_compat.h> 90d4afb5ceSopenharmony_ci 91d4afb5ceSopenharmony_ci#if !defined (BYTE_ORDER) 92d4afb5ceSopenharmony_ci#define BYTE_ORDER __BYTE_ORDER__ 93d4afb5ceSopenharmony_ci#endif 94d4afb5ceSopenharmony_ci 95d4afb5ceSopenharmony_ci#if !defined(LITTLE_ENDIAN) 96d4afb5ceSopenharmony_ci#define LITTLE_ENDIAN __ORDER_LITTLE_ENDIAN__ 97d4afb5ceSopenharmony_ci#endif 98d4afb5ceSopenharmony_ci 99d4afb5ceSopenharmony_ci#if !defined(BIG_ENDIAN) 100d4afb5ceSopenharmony_ci#define BIG_ENDIAN __ORDER_BIG_ENDIAN__ 101d4afb5ceSopenharmony_ci#endif 102d4afb5ceSopenharmony_ci 103d4afb5ceSopenharmony_ci#endif /* sun + GNUC */ 104d4afb5ceSopenharmony_ci 105d4afb5ceSopenharmony_ci#if !defined(BYTE_ORDER) 106d4afb5ceSopenharmony_ci#define BYTE_ORDER __BYTE_ORDER 107d4afb5ceSopenharmony_ci#endif 108d4afb5ceSopenharmony_ci#if !defined(LITTLE_ENDIAN) 109d4afb5ceSopenharmony_ci#define LITTLE_ENDIAN __LITTLE_ENDIAN 110d4afb5ceSopenharmony_ci#endif 111d4afb5ceSopenharmony_ci#if !defined(BIG_ENDIAN) 112d4afb5ceSopenharmony_ci#define BIG_ENDIAN __BIG_ENDIAN 113d4afb5ceSopenharmony_ci#endif 114d4afb5ceSopenharmony_ci 115d4afb5ceSopenharmony_ci#if defined(LWS_BUILTIN_GETIFADDRS) 116d4afb5ceSopenharmony_ci#include "./misc/getifaddrs.h" 117d4afb5ceSopenharmony_ci#else 118d4afb5ceSopenharmony_ci 119d4afb5ceSopenharmony_ci#if defined(__HAIKU__) 120d4afb5ceSopenharmony_ci#define _BSD_SOURCE 121d4afb5ceSopenharmony_ci#endif 122d4afb5ceSopenharmony_ci#include <ifaddrs.h> 123d4afb5ceSopenharmony_ci 124d4afb5ceSopenharmony_ci#endif 125d4afb5ceSopenharmony_ci 126d4afb5ceSopenharmony_ci#if defined (__sun) || defined(__HAIKU__) || defined(__QNX__) || defined(__ANDROID__) 127d4afb5ceSopenharmony_ci#include <syslog.h> 128d4afb5ceSopenharmony_ci 129d4afb5ceSopenharmony_ci#if defined(__ANDROID__) 130d4afb5ceSopenharmony_ci#include <sys/resource.h> 131d4afb5ceSopenharmony_ci#endif 132d4afb5ceSopenharmony_ci 133d4afb5ceSopenharmony_ci#else 134d4afb5ceSopenharmony_ci#include <sys/syslog.h> 135d4afb5ceSopenharmony_ci#endif 136d4afb5ceSopenharmony_ci 137d4afb5ceSopenharmony_ci#ifdef __QNX__ 138d4afb5ceSopenharmony_ci# include "netinet/tcp_var.h" 139d4afb5ceSopenharmony_ci# define TCP_KEEPINTVL TCPCTL_KEEPINTVL 140d4afb5ceSopenharmony_ci# define TCP_KEEPIDLE TCPCTL_KEEPIDLE 141d4afb5ceSopenharmony_ci# define TCP_KEEPCNT TCPCTL_KEEPCNT 142d4afb5ceSopenharmony_ci#endif 143d4afb5ceSopenharmony_ci 144d4afb5ceSopenharmony_ci#define LWS_ERRNO errno 145d4afb5ceSopenharmony_ci#define LWS_EAGAIN EAGAIN 146d4afb5ceSopenharmony_ci#define LWS_EALREADY EALREADY 147d4afb5ceSopenharmony_ci#define LWS_EINPROGRESS EINPROGRESS 148d4afb5ceSopenharmony_ci#define LWS_EINTR EINTR 149d4afb5ceSopenharmony_ci#define LWS_EISCONN EISCONN 150d4afb5ceSopenharmony_ci#define LWS_ENOTCONN ENOTCONN 151d4afb5ceSopenharmony_ci#define LWS_EWOULDBLOCK EWOULDBLOCK 152d4afb5ceSopenharmony_ci#define LWS_EADDRINUSE EADDRINUSE 153d4afb5ceSopenharmony_ci#define lws_set_blocking_send(wsi) 154d4afb5ceSopenharmony_ci#define LWS_SOCK_INVALID (-1) 155d4afb5ceSopenharmony_ci 156d4afb5ceSopenharmony_cistruct lws_context; 157d4afb5ceSopenharmony_ci 158d4afb5ceSopenharmony_cistruct lws * 159d4afb5ceSopenharmony_ciwsi_from_fd(const struct lws_context *context, int fd); 160d4afb5ceSopenharmony_ci 161d4afb5ceSopenharmony_ciint 162d4afb5ceSopenharmony_ciinsert_wsi(const struct lws_context *context, struct lws *wsi); 163d4afb5ceSopenharmony_ci 164d4afb5ceSopenharmony_cistruct lws_dhcpc_ifstate; 165d4afb5ceSopenharmony_ciint 166d4afb5ceSopenharmony_cilws_plat_ifconfig(int fd, struct lws_dhcpc_ifstate *is); 167d4afb5ceSopenharmony_ci 168d4afb5ceSopenharmony_civoid 169d4afb5ceSopenharmony_cidelete_from_fd(const struct lws_context *context, int fd); 170d4afb5ceSopenharmony_ci 171d4afb5ceSopenharmony_ci#ifndef LWS_NO_FORK 172d4afb5ceSopenharmony_ci#ifdef LWS_HAVE_SYS_PRCTL_H 173d4afb5ceSopenharmony_ci#include <sys/prctl.h> 174d4afb5ceSopenharmony_ci#endif 175d4afb5ceSopenharmony_ci#endif 176d4afb5ceSopenharmony_ci 177d4afb5ceSopenharmony_ci#define compatible_close(x) close(x) 178d4afb5ceSopenharmony_ci#define compatible_file_close(fd) close(fd) 179d4afb5ceSopenharmony_ci#define lws_plat_socket_offset() (0) 180d4afb5ceSopenharmony_ci 181d4afb5ceSopenharmony_ci/* 182d4afb5ceSopenharmony_ci * Mac OSX as well as iOS do not define the MSG_NOSIGNAL flag, 183d4afb5ceSopenharmony_ci * but happily have something equivalent in the SO_NOSIGPIPE flag. 184d4afb5ceSopenharmony_ci */ 185d4afb5ceSopenharmony_ci#ifdef __APPLE__ 186d4afb5ceSopenharmony_ci/* iOS SDK 12+ seems to define it, undef it for compatibility both ways */ 187d4afb5ceSopenharmony_ci#undef MSG_NOSIGNAL 188d4afb5ceSopenharmony_ci#define MSG_NOSIGNAL SO_NOSIGPIPE 189d4afb5ceSopenharmony_ci#endif 190d4afb5ceSopenharmony_ci 191d4afb5ceSopenharmony_ci/* 192d4afb5ceSopenharmony_ci * Solaris 11.X only supports POSIX 2001, MSG_NOSIGNAL appears in 193d4afb5ceSopenharmony_ci * POSIX 2008. 194d4afb5ceSopenharmony_ci */ 195d4afb5ceSopenharmony_ci#if defined(__sun) && !defined(MSG_NOSIGNAL) 196d4afb5ceSopenharmony_ci #define MSG_NOSIGNAL 0 197d4afb5ceSopenharmony_ci#endif 198d4afb5ceSopenharmony_ci 199d4afb5ceSopenharmony_ciint 200d4afb5ceSopenharmony_cilws_plat_rawudp_broadcast(uint8_t *p, const uint8_t *canned, size_t canned_len, 201d4afb5ceSopenharmony_ci size_t n, int fd, const char *iface); 202d4afb5ceSopenharmony_ci 203d4afb5ceSopenharmony_ciint 204d4afb5ceSopenharmony_cilws_plat_if_up(const char *ifname, int fd, int up); 205