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