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