From a496700b3a67ccb494385bfb22ebab0027af6e60 Mon Sep 17 00:00:00 2001 From: Andy Green Date: Thu, 15 Sep 2016 02:22:57 +0800 Subject: [PATCH] lws_snprintf Thanks to Fabrice Gilot for reporting the problem that led to uncovering this. Due to a misunderstanding of the return value of snprintf (it is not truncated according to the max size passed in) in several places relying on snprintf to truncate the length overflows are possible. This patch wraps snprintf with a new lws_snprintf() which does truncate its length to allow the buffer limiting scheme to work properly. All users should update with these fixes. --- doc/html/globals_func.html | 3 + doc/html/globals_l.html | 3 + doc/html/group__misc.html | 53 +++++++++++ doc/html/group__misc.js | 1 + doc/html/group__smtp.html | 18 ++-- doc/html/libwebsockets_8h.html | 2 + doc/html/libwebsockets_8h.js | 1 + doc/html/libwebsockets_8h_source.html | 69 +++++++------- doc/html/navtreedata.js | 6 +- doc/html/navtreeindex0.js | 12 +-- doc/html/navtreeindex1.js | 36 ++++---- doc/html/navtreeindex2.js | 50 +++++----- doc/html/navtreeindex3.js | 16 ++-- doc/html/navtreeindex4.js | 14 +-- lib/client-handshake.c | 26 +++--- lib/lejp-conf.c | 18 ++-- lib/libuv.c | 10 +- lib/libwebsockets.c | 92 +++++++++++-------- lib/libwebsockets.h | 16 +++- lib/lws-plat-esp8266.c | 2 +- lib/lws-plat-unix.c | 6 +- lib/private-libwebsockets.h | 2 +- lib/server.c | 12 +-- plugins/generic-sessions/handlers.c | 42 ++++----- .../protocol_generic_sessions.c | 20 ++-- .../protocol_lws_messageboard.c | 12 +-- plugins/generic-sessions/utils.c | 24 ++--- .../generic-table/protocol_table_dirlisting.c | 42 ++++----- plugins/protocol_dumb_increment.c | 2 +- plugins/protocol_lws_status.c | 4 +- plugins/protocol_post_demo.c | 6 +- test-server/test-fraggle.c | 2 +- test-server/test-ping.c | 2 +- test-server/test-server-http.c | 6 +- test-server/test-server-status.c | 4 +- 35 files changed, 367 insertions(+), 267 deletions(-) diff --git a/doc/html/globals_func.html b/doc/html/globals_func.html index 0dec7474..d3ca228d 100644 --- a/doc/html/globals_func.html +++ b/doc/html/globals_func.html @@ -354,6 +354,9 @@ $(document).ready(function(){initNavTree('globals_func.html','');});
  • lws_SHA1() : libwebsockets.h
  • +
  • lws_snprintf() +: libwebsockets.h +
  • lws_spa_create() : libwebsockets.h
  • diff --git a/doc/html/globals_l.html b/doc/html/globals_l.html index 8a8324ba..69efae18 100644 --- a/doc/html/globals_l.html +++ b/doc/html/globals_l.html @@ -628,6 +628,9 @@ $(document).ready(function(){initNavTree('globals_l.html','');});
  • lws_SHA1() : libwebsockets.h
  • +
  • lws_snprintf() +: libwebsockets.h +
  • lws_spa_create() : libwebsockets.h
  • diff --git a/doc/html/group__misc.html b/doc/html/group__misc.html index 205bb2e4..b772a654 100644 --- a/doc/html/group__misc.html +++ b/doc/html/group__misc.html @@ -70,6 +70,8 @@ $(document).ready(function(){initNavTree('group__misc.html','');}); + + @@ -391,6 +393,57 @@ LWS_VISIBLE LWS_EXTERN int 

    sent the session quit

    Functions

    LWS_VISIBLE LWS_EXTERN int lws_snprintf (char *str, size_t size, const char *format,...)
     
    LWS_VISIBLE LWS_EXTERN int lws_get_random (struct lws_context *context, void *buf, int len)
     
    LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT lws_daemonize (const char *_lock_path)
    + + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    LWS_VISIBLE LWS_EXTERN int lws_snprintf (char * str,
    size_t size,
    const char * format,
     ... 
    )
    +
    + +

    #include <lib/libwebsockets.h>

    +

    lws_snprintf(): snprintf that truncates the returned length too

    +
    Parameters
    + + + + + +
    strdestination buffer
    sizebytes left in destination buffer
    formatformat string
    ...args for format
    +
    +
    +

    This lets you correctly truncate buffers by concatenating lengths, if you reach the limit the reported length doesn't exceed the limit.

    +
    diff --git a/doc/html/group__misc.js b/doc/html/group__misc.js index de8f7d03..c9fd40e1 100644 --- a/doc/html/group__misc.js +++ b/doc/html/group__misc.js @@ -10,5 +10,6 @@ var group__misc = [ "lws_now_secs", "group__misc.html#ga33bf2635033710b25f931b57ed663e1e", null ], [ "lws_parse_uri", "group__misc.html#ga1ec0d9faac5d3a5824d765c287c043aa", null ], [ "lws_set_allocator", "group__misc.html#gab321ed812f46f6dc7ef9e3ca6f00cf1b", null ], + [ "lws_snprintf", "group__misc.html#ga9f37d0e357de2ab4170723fcdb665d21", null ], [ "lws_wsi_user", "group__misc.html#gaa194584fff9698f3b280658f770ccd0f", null ] ]; \ No newline at end of file diff --git a/doc/html/group__smtp.html b/doc/html/group__smtp.html index 311eecee..ef58f054 100644 --- a/doc/html/group__smtp.html +++ b/doc/html/group__smtp.html @@ -157,15 +157,15 @@ Functions
    -
    4047  {
    4048  LGSSMTP_IDLE,
    4053  LGSSMTP_SENT_TO,
    4057 };
    Definition: libwebsockets.h:4050
    -
    Definition: libwebsockets.h:4055
    -
    Definition: libwebsockets.h:4048
    -
    Definition: libwebsockets.h:4049
    -
    Definition: libwebsockets.h:4053
    -
    Definition: libwebsockets.h:4052
    -
    Definition: libwebsockets.h:4056
    -
    Definition: libwebsockets.h:4051
    -
    Definition: libwebsockets.h:4054
    +
    4061  {
    4062  LGSSMTP_IDLE,
    4067  LGSSMTP_SENT_TO,
    4071 };
    Definition: libwebsockets.h:4064
    +
    Definition: libwebsockets.h:4069
    +
    Definition: libwebsockets.h:4062
    +
    Definition: libwebsockets.h:4063
    +
    Definition: libwebsockets.h:4067
    +
    Definition: libwebsockets.h:4066
    +
    Definition: libwebsockets.h:4070
    +
    Definition: libwebsockets.h:4065
    +
    Definition: libwebsockets.h:4068
    diff --git a/doc/html/libwebsockets_8h.html b/doc/html/libwebsockets_8h.html index a65c4d5e..15899ed0 100644 --- a/doc/html/libwebsockets_8h.html +++ b/doc/html/libwebsockets_8h.html @@ -868,6 +868,8 @@ LWS_VISIBLE LWS_EXTERN int   LWS_VISIBLE LWS_EXTERN int lws_interface_to_sa (int ipv6, const char *ifname, struct sockaddr_in *addr, size_t addrlen)   +LWS_VISIBLE LWS_EXTERN int lws_snprintf (char *str, size_t size, const char *format,...) +  LWS_VISIBLE LWS_EXTERN int lws_get_random (struct lws_context *context, void *buf, int len)   LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT lws_daemonize (const char *_lock_path) diff --git a/doc/html/libwebsockets_8h.js b/doc/html/libwebsockets_8h.js index e3dd549e..a94b0641 100644 --- a/doc/html/libwebsockets_8h.js +++ b/doc/html/libwebsockets_8h.js @@ -484,6 +484,7 @@ var libwebsockets_8h = [ "lws_set_proxy", "group__context-and-vhost.html#ga7e9d5405547a457d86e0b4f0ae2bb1c4", null ], [ "lws_set_timeout", "group__timeout.html#gaced9f9237f6172fed9f730a2af51345a", null ], [ "lws_SHA1", "group__sha.html#ga7b09ab74646266f0b555103b3bb8dfe5", null ], + [ "lws_snprintf", "group__misc.html#ga9f37d0e357de2ab4170723fcdb665d21", null ], [ "lws_spa_create", "group__form-parsing.html#ga162f86762173a2bc8c28497941d74815", null ], [ "lws_spa_destroy", "group__form-parsing.html#gaaa482f07dad3f04b391cccf0a814e13b", null ], [ "lws_spa_finalize", "group__form-parsing.html#ga83835bf250ee3d4a60f36a182f2b8d24", null ], diff --git a/doc/html/libwebsockets_8h_source.html b/doc/html/libwebsockets_8h_source.html index 0377a07c..a536f350 100644 --- a/doc/html/libwebsockets_8h_source.html +++ b/doc/html/libwebsockets_8h_source.html @@ -71,9 +71,9 @@ $(document).ready(function(){initNavTree('libwebsockets_8h_source.html','');});
    libwebsockets.h
    -Go to the documentation of this file.
    1 /*
    2  * libwebsockets - small server side websockets and web server implementation
    3  *
    4  * Copyright (C) 2010-2016 Andy Green <andy@warmcat.com>
    5  *
    6  * This library is free software; you can redistribute it and/or
    7  * modify it under the terms of the GNU Lesser General Public
    8  * License as published by the Free Software Foundation:
    9  * version 2.1 of the License.
    10  *
    11  * This library is distributed in the hope that it will be useful,
    12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
    13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
    14  * Lesser General Public License for more details.
    15  *
    16  * You should have received a copy of the GNU Lesser General Public
    17  * License along with this library; if not, write to the Free Software
    18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
    19  * MA 02110-1301 USA
    20  */
    21 
    24 #ifndef LIBWEBSOCKET_H_3060898B846849FF9F88F5DB59B5950C
    25 #define LIBWEBSOCKET_H_3060898B846849FF9F88F5DB59B5950C
    26 
    27 #ifdef __cplusplus
    28 #include <cstddef>
    29 #include <cstdarg>
    30 #ifdef MBED_OPERATORS
    31 #include "mbed-drivers/mbed.h"
    32 #include "sal-iface-eth/EthernetInterface.h"
    33 #include "sockets/TCPListener.h"
    34 #include "sal-stack-lwip/lwipv4_init.h"
    35 
    36 namespace {
    37 }
    38 using namespace mbed::Sockets::v0;
    39 
    40 
    41 struct sockaddr_in;
    42 struct lws;
    43 
    44 class lws_conn {
    45  public:
    46  lws_conn():
    47  ts(NULL),
    48  wsi(NULL),
    49  writeable(1),
    50  awaiting_on_writeable(0)
    51  {
    52  }
    53 
    54 public:
    55  void set_wsi(struct lws *_wsi) { wsi = _wsi; }
    56  int actual_onRX(Socket *s);
    57  void onRX(Socket *s);
    58  void onError(Socket *s, socket_error_t err);
    59  void onDisconnect(TCPStream *s);
    60  void onSent(Socket *s, uint16_t len);
    61  void serialized_writeable(struct lws *wsi);
    62 
    63 public:
    64  TCPStream *ts;
    65 
    66 public:
    67  struct lws *wsi;
    68  char writeable;
    69  char awaiting_on_writeable;
    70 };
    71 
    73 public:
    75  srv(SOCKET_STACK_LWIP_IPV4)
    76  {
    77  srv.setOnError(TCPStream::ErrorHandler_t(this,
    79  }
    80 
    81  void start(const uint16_t port);
    83 protected:
    84  void onRX(Socket *s);
    85  void onError(Socket *s, socket_error_t err);
    86  void onIncoming(TCPListener *s, void *impl);
    87  void onDisconnect(TCPStream *s);
    89 public:
    90  TCPListener srv;
    91 };
    92 
    93 #endif
    94 
    95 extern "C" {
    96 #else
    97 #include <stdarg.h>
    98 #endif
    99 
    100 #if defined(MBED_OPERATORS) || defined(LWS_WITH_ESP8266)
    101 struct sockaddr_in;
    102 #define LWS_POSIX 0
    103 #else
    104 #define LWS_POSIX 1
    105 #endif
    106 
    107 #include "lws_config.h"
    108 
    109 #if defined(WIN32) || defined(_WIN32)
    110 #ifndef WIN32_LEAN_AND_MEAN
    111 #define WIN32_LEAN_AND_MEAN
    112 #endif
    113 
    114 #include <winsock2.h>
    115 #include <ws2tcpip.h>
    116 #include <stddef.h>
    117 #include <basetsd.h>
    118 #ifndef _WIN32_WCE
    119 #include <fcntl.h>
    120 #else
    121 #define _O_RDONLY 0x0000
    122 #define O_RDONLY _O_RDONLY
    123 #endif
    124 
    125 // Visual studio older than 2015 and WIN_CE has only _stricmp
    126 #if (defined(_MSC_VER) && _MSC_VER < 1900) || defined(_WIN32_WCE)
    127 #define strcasecmp _stricmp
    128 #else
    129 #define strcasecmp stricmp
    130 #endif
    131 #define getdtablesize() 30000
    132 
    133 #define LWS_INLINE __inline
    134 #define LWS_VISIBLE
    135 #define LWS_WARN_UNUSED_RESULT
    136 #define LWS_WARN_DEPRECATED
    137 
    138 #ifdef LWS_DLL
    139 #ifdef LWS_INTERNAL
    140 #define LWS_EXTERN extern __declspec(dllexport)
    141 #else
    142 #define LWS_EXTERN extern __declspec(dllimport)
    143 #endif
    144 #else
    145 #define LWS_EXTERN
    146 #endif
    147 
    148 #define LWS_INVALID_FILE INVALID_HANDLE_VALUE
    149 #define LWS_O_RDONLY _O_RDONLY
    150 
    151 #if !defined(_MSC_VER) || _MSC_VER < 1900 /* Visual Studio 2015 already defines this in <stdio.h> */
    152 #define snprintf _snprintf
    153 #endif
    154 
    155 #ifndef __func__
    156 #define __func__ __FUNCTION__
    157 #endif
    158 
    159 #else /* NOT WIN32 */
    160 #include <unistd.h>
    161 
    162 #if defined(__NetBSD__) || defined(__FreeBSD__)
    163 #include <netinet/in.h>
    164 #endif
    165 
    166 #define LWS_INLINE inline
    167 #define LWS_O_RDONLY O_RDONLY
    168 
    169 #if !defined(MBED_OPERATORS) && !defined(LWS_WITH_ESP8266)
    170 #include <poll.h>
    171 #include <netdb.h>
    172 #define LWS_INVALID_FILE -1
    173 #else
    174 #define getdtablesize() (20)
    175 #define LWS_INVALID_FILE NULL
    176 #endif
    177 
    178 #if defined(__GNUC__)
    179 
    180 /* warn_unused_result attribute only supported by GCC 3.4 or later */
    181 #if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
    182 #define LWS_WARN_UNUSED_RESULT __attribute__((warn_unused_result))
    183 #else
    184 #define LWS_WARN_UNUSED_RESULT
    185 #endif
    186 
    187 #define LWS_VISIBLE __attribute__((visibility("default")))
    188 #define LWS_WARN_DEPRECATED __attribute__ ((deprecated))
    189 #else
    190 #define LWS_VISIBLE
    191 #define LWS_WARN_UNUSED_RESULT
    192 #define LWS_WARN_DEPRECATED
    193 #endif
    194 
    195 #if defined(__ANDROID__)
    196 #include <unistd.h>
    197 #define getdtablesize() sysconf(_SC_OPEN_MAX)
    198 #endif
    199 
    200 #endif
    201 
    202 #ifdef LWS_USE_LIBEV
    203 #include <ev.h>
    204 #endif /* LWS_USE_LIBEV */
    205 #ifdef LWS_USE_LIBUV
    206 #include <uv.h>
    207 #endif /* LWS_USE_LIBUV */
    208 
    209 #ifndef LWS_EXTERN
    210 #define LWS_EXTERN extern
    211 #endif
    212 
    213 #ifdef _WIN32
    214 #define random rand
    215 #else
    216 #include <sys/time.h>
    217 #include <unistd.h>
    218 #endif
    219 
    220 #ifdef LWS_OPENSSL_SUPPORT
    221 
    222 #ifdef USE_WOLFSSL
    223 #ifdef USE_OLD_CYASSL
    224 #include <cyassl/openssl/ssl.h>
    225 #include <cyassl/error-ssl.h>
    226 #else
    227 #include <wolfssl/openssl/ssl.h>
    228 #include <wolfssl/error-ssl.h>
    229 #endif /* not USE_OLD_CYASSL */
    230 #else
    231 #if defined(LWS_USE_POLARSSL)
    232 #include <polarssl/ssl.h>
    234  x509_crt ca;
    235  x509_crt certificate;
    236  rsa_context key;
    237 };
    238 typedef struct lws_polarssl_context SSL_CTX;
    239 typedef ssl_context SSL;
    240 #else
    241 #if defined(LWS_USE_MBEDTLS)
    242 #include <mbedtls/ssl.h>
    243 #else
    244 #include <openssl/ssl.h>
    245 #include <openssl/err.h>
    246 #endif /* not USE_MBEDTLS */
    247 #endif /* not USE_POLARSSL */
    248 #endif /* not USE_WOLFSSL */
    249 #endif
    250 
    251 
    252 #define CONTEXT_PORT_NO_LISTEN -1
    253 
    264 
    266 enum lws_log_levels {
    267  LLL_ERR = 1 << 0,
    268  LLL_WARN = 1 << 1,
    269  LLL_NOTICE = 1 << 2,
    270  LLL_INFO = 1 << 3,
    271  LLL_DEBUG = 1 << 4,
    272  LLL_PARSER = 1 << 5,
    273  LLL_HEADER = 1 << 6,
    274  LLL_EXT = 1 << 7,
    275  LLL_CLIENT = 1 << 8,
    276  LLL_LATENCY = 1 << 9,
    277 
    278  LLL_COUNT = 10 /* set to count of valid flags */
    279 };
    280 
    281 LWS_VISIBLE LWS_EXTERN void _lws_log(int filter, const char *format, ...);
    282 LWS_VISIBLE LWS_EXTERN void _lws_logv(int filter, const char *format, va_list vl);
    292 LWS_VISIBLE LWS_EXTERN int
    293 lwsl_timestamp(int level, char *p, int len);
    294 
    295 #define lwsl_err(...) _lws_log(LLL_ERR, __VA_ARGS__)
    296 
    297 #if !defined(LWS_WITH_NO_LOGS)
    298 /* notice, warn and log are always compiled in */
    299 #define lwsl_warn(...) _lws_log(LLL_WARN, __VA_ARGS__)
    300 #define lwsl_notice(...) _lws_log(LLL_NOTICE, __VA_ARGS__)
    301 #endif
    302 /*
    303  * weaker logging can be deselected at configure time using --disable-debug
    304  * that gets rid of the overhead of checking while keeping _warn and _err
    305  * active
    306  */
    307 
    308 #if defined(LWS_WITH_ESP8266)
    309 #undef _DEBUG
    310 #endif
    311 
    312 #ifdef _DEBUG
    313 #if defined(LWS_WITH_NO_LOGS)
    314 /* notice, warn and log are always compiled in */
    315 //#define lwsl_err(...) _lws_log(LLL_ERR, __VA_ARGS__)
    316 #define lwsl_warn(...) _lws_log(LLL_WARN, __VA_ARGS__)
    317 #define lwsl_notice(...) _lws_log(LLL_NOTICE, __VA_ARGS__)
    318 #endif
    319 #define lwsl_info(...) _lws_log(LLL_INFO, __VA_ARGS__)
    320 #define lwsl_debug(...) _lws_log(LLL_DEBUG, __VA_ARGS__)
    321 #define lwsl_parser(...) _lws_log(LLL_PARSER, __VA_ARGS__)
    322 #define lwsl_header(...) _lws_log(LLL_HEADER, __VA_ARGS__)
    323 #define lwsl_ext(...) _lws_log(LLL_EXT, __VA_ARGS__)
    324 #define lwsl_client(...) _lws_log(LLL_CLIENT, __VA_ARGS__)
    325 #define lwsl_latency(...) _lws_log(LLL_LATENCY, __VA_ARGS__)
    326 
    332 LWS_VISIBLE LWS_EXTERN void lwsl_hexdump(void *buf, size_t len);
    333 
    334 #else /* no debug */
    335 #if defined(LWS_WITH_NO_LOGS)
    336 //#define lwsl_err(...) do {} while(0)
    337 #define lwsl_warn(...) do {} while(0)
    338 #define lwsl_notice(...) do {} while(0)
    339 #endif
    340 #define lwsl_info(...) do {} while(0)
    341 #define lwsl_debug(...) do {} while(0)
    342 #define lwsl_parser(...) do {} while(0)
    343 #define lwsl_header(...) do {} while(0)
    344 #define lwsl_ext(...) do {} while(0)
    345 #define lwsl_client(...) do {} while(0)
    346 #define lwsl_latency(...) do {} while(0)
    347 #define lwsl_hexdump(a, b)
    348 
    349 #endif
    350 
    361 LWS_VISIBLE LWS_EXTERN void
    362 lws_set_log_level(int level,
    363  void (*log_emit_function)(int level, const char *line));
    364 
    374 LWS_VISIBLE LWS_EXTERN void
    375 lwsl_emit_syslog(int level, const char *line);
    376 
    378 
    379 
    380 #include <stddef.h>
    381 
    382 #ifndef lws_container_of
    383 #define lws_container_of(P,T,M) ((T *)((char *)(P) - offsetof(T, M)))
    384 #endif
    385 
    386 
    387 struct lws;
    388 #ifndef ARRAY_SIZE
    389 #define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0]))
    390 #endif
    391 
    392 /* api change list for user code to test against */
    393 
    394 #define LWS_FEATURE_SERVE_HTTP_FILE_HAS_OTHER_HEADERS_ARG
    395 
    396 /* the struct lws_protocols has the id field present */
    397 #define LWS_FEATURE_PROTOCOLS_HAS_ID_FIELD
    398 
    399 /* you can call lws_get_peer_write_allowance */
    400 #define LWS_FEATURE_PROTOCOLS_HAS_PEER_WRITE_ALLOWANCE
    401 
    402 /* extra parameter introduced in 917f43ab821 */
    403 #define LWS_FEATURE_SERVE_HTTP_FILE_HAS_OTHER_HEADERS_LEN
    404 
    405 /* File operations stuff exists */
    406 #define LWS_FEATURE_FOPS
    407 
    408 
    409 #if defined(_WIN32)
    410 typedef SOCKET lws_sockfd_type;
    411 typedef HANDLE lws_filefd_type;
    412 #define lws_sockfd_valid(sfd) (!!sfd)
    413 struct lws_pollfd {
    414  lws_sockfd_type fd;
    415  SHORT events;
    416  SHORT revents;
    417 };
    418 #define LWS_POLLHUP (FD_CLOSE)
    419 #define LWS_POLLIN (FD_READ | FD_ACCEPT)
    420 #define LWS_POLLOUT (FD_WRITE)
    421 #else
    422 
    423 #if defined(MBED_OPERATORS)
    424 /* it's a class lws_conn * */
    425 typedef void * lws_sockfd_type;
    426 typedef void * lws_filefd_type;
    427 #define lws_sockfd_valid(sfd) (!!sfd)
    428 struct pollfd {
    429  lws_sockfd_type fd;
    430  short events;
    431  short revents;
    432 };
    433 #define POLLIN 0x0001
    434 #define POLLPRI 0x0002
    435 #define POLLOUT 0x0004
    436 #define POLLERR 0x0008
    437 #define POLLHUP 0x0010
    438 #define POLLNVAL 0x0020
    439 
    440 struct lws;
    441 
    442 void * mbed3_create_tcp_stream_socket(void);
    443 void mbed3_delete_tcp_stream_socket(void *sockfd);
    444 void mbed3_tcp_stream_bind(void *sock, int port, struct lws *);
    445 void mbed3_tcp_stream_accept(void *sock, struct lws *);
    446 #else
    447 #if defined(LWS_WITH_ESP8266)
    448 
    449 #include <user_interface.h>
    450 #include <espconn.h>
    451 
    452 typedef struct espconn * lws_sockfd_type;
    453 typedef void * lws_filefd_type;
    454 #define lws_sockfd_valid(sfd) (!!sfd)
    455 struct pollfd {
    456  lws_sockfd_type fd;
    457  short events;
    458  short revents;
    459 };
    460 #define POLLIN 0x0001
    461 #define POLLPRI 0x0002
    462 #define POLLOUT 0x0004
    463 #define POLLERR 0x0008
    464 #define POLLHUP 0x0010
    465 #define POLLNVAL 0x0020
    466 
    467 struct lws_vhost;
    468 
    469 lws_sockfd_type esp8266_create_tcp_listen_socket(struct lws_vhost *vh);
    470 void esp8266_tcp_stream_accept(lws_sockfd_type fd, struct lws *wsi);
    471 
    472 #include <os_type.h>
    473 #include <osapi.h>
    474 #include "ets_sys.h"
    475 
    476 int ets_snprintf(char *str, size_t size, const char *format, ...);
    477 #define snprintf ets_snprintf
    478 
    479 typedef os_timer_t uv_timer_t;
    480 typedef void uv_cb_t(uv_timer_t *);
    481 
    482 void os_timer_disarm(void *);
    483 void os_timer_setfn(os_timer_t *, os_timer_func_t *, void *);
    484 
    485 void ets_timer_arm_new(os_timer_t *, int, int, int);
    486 
    487 //void os_timer_arm(os_timer_t *, int, int);
    488 
    489 #define UV_VERSION_MAJOR 1
    490 
    491 #define lws_uv_getloop(a, b) (NULL)
    492 
    493 static inline void uv_timer_init(void *l, uv_timer_t *t)
    494 {
    495  (void)l;
    496  memset(t, 0, sizeof(*t));
    497  os_timer_disarm(t);
    498 }
    499 
    500 static inline void uv_timer_start(uv_timer_t *t, uv_cb_t *cb, int first, int rep)
    501 {
    502  os_timer_setfn(t, (os_timer_func_t *)cb, t);
    503  /* ms, repeat */
    504  os_timer_arm(t, first, !!rep);
    505 }
    506 
    507 static inline void uv_timer_stop(uv_timer_t *t)
    508 {
    509  os_timer_disarm(t);
    510 }
    511 
    512 #else
    513 typedef int lws_sockfd_type;
    514 typedef int lws_filefd_type;
    515 #define lws_sockfd_valid(sfd) (sfd >= 0)
    516 #endif
    517 #endif
    518 
    519 #define lws_pollfd pollfd
    520 #define LWS_POLLHUP (POLLHUP|POLLERR)
    521 #define LWS_POLLIN (POLLIN)
    522 #define LWS_POLLOUT (POLLOUT)
    523 #endif
    524 
    527 struct lws_pollargs {
    528  lws_sockfd_type fd;
    529  int events;
    531 };
    532 
    533 struct lws_tokens;
    534 struct lws_token_limits;
    535 
    543 
    545 /*
    546  * NOTE: These public enums are part of the abi. If you want to add one,
    547  * add it at where specified so existing users are unaffected.
    548  */
    551  LWS_CLOSE_STATUS_NOSTATUS = 0,
    613  /****** add new things just above ---^ ******/
    614 
    615  LWS_CLOSE_STATUS_NOSTATUS_CONTEXT_DESTROY = 9999,
    616 };
    617 
    630 LWS_VISIBLE LWS_EXTERN void
    631 lws_close_reason(struct lws *wsi, enum lws_close_status status,
    632  unsigned char *buf, size_t len);
    633 
    635 
    636 struct lws;
    637 struct lws_context;
    638 /* needed even with extensions disabled for create context */
    639 struct lws_extension;
    640 
    652 
    654 
    655 /*
    656  * NOTE: These public enums are part of the abi. If you want to add one,
    657  * add it at where specified so existing users are unaffected.
    658  */
    902  /* external poll() management support */
    965  LWS_CALLBACK_WS_EXT_DEFAULTS = 39,
    968  LWS_CALLBACK_CGI = 40,
    970  LWS_CALLBACK_CGI_TERMINATED = 41,
    972  LWS_CALLBACK_CGI_STDIN_DATA = 42,
    974  LWS_CALLBACK_CGI_STDIN_COMPLETED = 43,
    976  LWS_CALLBACK_ESTABLISHED_CLIENT_HTTP = 44,
    978  LWS_CALLBACK_CLOSED_CLIENT_HTTP = 45,
    980  LWS_CALLBACK_RECEIVE_CLIENT_HTTP = 46,
    982  LWS_CALLBACK_COMPLETED_CLIENT_HTTP = 47,
    984  LWS_CALLBACK_RECEIVE_CLIENT_HTTP_READ = 48,
    986  LWS_CALLBACK_HTTP_BIND_PROTOCOL = 49,
    988  LWS_CALLBACK_HTTP_DROP_PROTOCOL = 50,
    990  LWS_CALLBACK_CHECK_ACCESS_RIGHTS = 51,
    992  LWS_CALLBACK_PROCESS_HTML = 52,
    994  LWS_CALLBACK_ADD_HEADERS = 53,
    996  LWS_CALLBACK_SESSION_INFO = 54,
    999  LWS_CALLBACK_GS_EVENT = 55,
    1016  /****** add new things just above ---^ ******/
    1017 
    1020 };
    1021 
    1022 
    1023 
    1039 typedef int
    1040 lws_callback_function(struct lws *wsi, enum lws_callback_reasons reason,
    1041  void *user, void *in, size_t len);
    1043 
    1053 
    1055 /*
    1056  * NOTE: These public enums are part of the abi. If you want to add one,
    1057  * add it at where specified so existing users are unaffected.
    1058  */
    1059 enum lws_extension_callback_reasons {
    1060  LWS_EXT_CB_SERVER_CONTEXT_CONSTRUCT = 0,
    1061  LWS_EXT_CB_CLIENT_CONTEXT_CONSTRUCT = 1,
    1062  LWS_EXT_CB_SERVER_CONTEXT_DESTRUCT = 2,
    1063  LWS_EXT_CB_CLIENT_CONTEXT_DESTRUCT = 3,
    1064  LWS_EXT_CB_CONSTRUCT = 4,
    1065  LWS_EXT_CB_CLIENT_CONSTRUCT = 5,
    1066  LWS_EXT_CB_CHECK_OK_TO_REALLY_CLOSE = 6,
    1067  LWS_EXT_CB_CHECK_OK_TO_PROPOSE_EXTENSION = 7,
    1068  LWS_EXT_CB_DESTROY = 8,
    1069  LWS_EXT_CB_DESTROY_ANY_WSI_CLOSING = 9,
    1070  LWS_EXT_CB_ANY_WSI_ESTABLISHED = 10,
    1071  LWS_EXT_CB_PACKET_RX_PREPARSE = 11,
    1072  LWS_EXT_CB_PACKET_TX_PRESEND = 12,
    1073  LWS_EXT_CB_PACKET_TX_DO_SEND = 13,
    1074  LWS_EXT_CB_HANDSHAKE_REPLY_TX = 14,
    1075  LWS_EXT_CB_FLUSH_PENDING_TX = 15,
    1076  LWS_EXT_CB_EXTENDED_PAYLOAD_RX = 16,
    1077  LWS_EXT_CB_CAN_PROXY_CLIENT_CONNECTION = 17,
    1078  LWS_EXT_CB_1HZ = 18,
    1079  LWS_EXT_CB_REQUEST_ON_WRITEABLE = 19,
    1080  LWS_EXT_CB_IS_WRITEABLE = 20,
    1081  LWS_EXT_CB_PAYLOAD_TX = 21,
    1082  LWS_EXT_CB_PAYLOAD_RX = 22,
    1083  LWS_EXT_CB_OPTION_DEFAULT = 23,
    1084  LWS_EXT_CB_OPTION_SET = 24,
    1085  LWS_EXT_CB_OPTION_CONFIRM = 25,
    1086  LWS_EXT_CB_NAMED_OPTION_SET = 26,
    1087 
    1088  /****** add new things just above ---^ ******/
    1089 };
    1090 
    1097  /* Add new things just above here ---^
    1098  * This is part of the ABI, don't needlessly break compatibility */
    1099 };
    1100 
    1106  const char *name;
    1109  /* Add new things just above here ---^
    1110  * This is part of the ABI, don't needlessly break compatibility */
    1111 };
    1112 
    1115  const char *option_name;
    1117  const char *start;
    1118  int len;
    1119 };
    1120 
    1181 typedef int
    1182 lws_extension_callback_function(struct lws_context *context,
    1183  const struct lws_extension *ext, struct lws *wsi,
    1184  enum lws_extension_callback_reasons reason,
    1185  void *user, void *in, size_t len);
    1186 
    1189  const char *name;
    1191  const char *client_offer;
    1193  /* Add new things just above here ---^
    1194  * This is part of the ABI, don't needlessly break compatibility */
    1195 };
    1196 
    1205 LWS_VISIBLE LWS_EXTERN int
    1206 lws_set_extension_option(struct lws *wsi, const char *ext_name,
    1207  const char *opt_name, const char *opt_val);
    1208 
    1209 #ifndef LWS_NO_EXTENSIONS
    1210 /* lws_get_internal_extensions() - DEPRECATED
    1211  *
    1212  * \Deprecated There is no longer a set internal extensions table. The table is provided
    1213  * by user code along with application-specific settings. See the test
    1214  * client and server for how to do.
    1215  */
    1216 static LWS_INLINE LWS_WARN_DEPRECATED const struct lws_extension *
    1217 lws_get_internal_extensions() { return NULL; }
    1218 
    1229 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
    1230 lws_ext_parse_options(const struct lws_extension *ext, struct lws *wsi,
    1231  void *ext_user, const struct lws_ext_options *opts,
    1232  const char *o, int len);
    1233 #endif
    1234 
    1247 LWS_EXTERN
    1249  struct lws_context *context, const struct lws_extension *ext,
    1250  struct lws *wsi, enum lws_extension_callback_reasons reason,
    1251  void *user, void *in, size_t len);
    1252 
    1253 /*
    1254  * The internal exts are part of the public abi
    1255  * If we add more extensions, publish the callback here ------v
    1256  */
    1258 
    1274 
    1279  const char *name;
    1300  unsigned int id;
    1307  void *user;
    1310  /* Add new things just above here ---^
    1311  * This is part of the ABI, don't needlessly break compatibility */
    1312 };
    1313 
    1314 struct lws_vhost;
    1315 
    1324 LWS_VISIBLE LWS_EXTERN const struct lws_protocols *
    1325 lws_vhost_name_to_protocol(struct lws_vhost *vh, const char *name);
    1326 
    1336 LWS_VISIBLE LWS_EXTERN const struct lws_protocols *
    1337 lws_get_protocol(struct lws *wsi);
    1338 
    1340 LWS_VISIBLE LWS_EXTERN const struct lws_protocols *
    1341 lws_protocol_get(struct lws *wsi) LWS_WARN_DEPRECATED;
    1342 
    1353 LWS_VISIBLE LWS_EXTERN void *
    1354 lws_protocol_vh_priv_zalloc(struct lws_vhost *vhost, const struct lws_protocols *prot,
    1355  int size);
    1356 
    1366 LWS_VISIBLE LWS_EXTERN void *
    1367 lws_protocol_vh_priv_get(struct lws_vhost *vhost, const struct lws_protocols *prot);
    1368 
    1377 LWS_VISIBLE LWS_EXTERN int
    1378 lws_finalize_startup(struct lws_context *context);
    1379 
    1380 #ifdef LWS_WITH_PLUGINS
    1381 
    1382 /* PLUGINS implies LIBUV */
    1383 
    1384 #define LWS_PLUGIN_API_MAGIC 180
    1385 
    1388  unsigned int api_magic;
    1389  const struct lws_protocols *protocols;
    1391  const struct lws_extension *extensions;
    1393 };
    1394 
    1395 typedef int (*lws_plugin_init_func)(struct lws_context *,
    1396  struct lws_plugin_capability *);
    1397 typedef int (*lws_plugin_destroy_func)(struct lws_context *);
    1398 
    1400 struct lws_plugin {
    1401  struct lws_plugin *list;
    1402 #if (UV_VERSION_MAJOR > 0)
    1403  uv_lib_t lib;
    1404 #else
    1405  void *l;
    1406 #endif
    1407  char name[64];
    1409 };
    1410 
    1411 #endif
    1412 
    1414 
    1415 
    1424 
    1426 #define LWSGS_EMAIL_CONTENT_SIZE 16384
    1427 
    1429 /* SHA-1 binary and hexified versions */
    1431 typedef struct { unsigned char bin[20]; } lwsgw_hash_bin;
    1433 typedef struct { char id[41]; } lwsgw_hash;
    1434 
    1441 };
    1442 
    1445  char username[32];
    1446  char email[100];
    1447  char ip[72];
    1448  unsigned int mask;
    1450  char session[42];
    1451 };
    1452 
    1457 };
    1458 
    1461  enum lws_gs_event event;
    1462  const char *username;
    1463  const char *email;
    1464 };
    1465 
    1467 
    1468 
    1482 
    1484 /*
    1485  * NOTE: These public enums are part of the abi. If you want to add one,
    1486  * add it at where specified so existing users are unaffected.
    1487  */
    1488 
    1492  (1 << 12),
    1499  (1 << 12),
    1515  (1 << 12),
    1520  (1 << 12),
    1544  /****** add new things just above ---^ ******/
    1545 };
    1546 
    1547 #define lws_check_opt(c, f) (((c) & (f)) == (f))
    1548 
    1559  int port;
    1564  const char *iface;
    1571  const struct lws_protocols *protocols;
    1575  const struct lws_extension *extensions;
    1583  const char *ssl_cert_filepath;
    1593  const char *ssl_ca_filepath;
    1595  const char *ssl_cipher_list;
    1599  const char *http_proxy_address;
    1602  unsigned int http_proxy_port;
    1604  int gid;
    1606  int uid;
    1608  unsigned int options;
    1610  void *user;
    1613  int ka_time;
    1623 #ifdef LWS_OPENSSL_SUPPORT
    1629 #else /* maintain structure layout either way */
    1631 #endif
    1632 
    1643  unsigned int count_threads;
    1645  unsigned int fd_limit_per_thread;
    1649  unsigned int timeout_secs;
    1654  const char *ecdh_curve;
    1656  const char *vhost_name;
    1660  const char * const *plugin_dirs;
    1669  const char *log_filepath;
    1672  const struct lws_http_mount *mounts;
    1674  const char *server_string;
    1677  unsigned int pt_serv_buf_size;
    1692  unsigned short ws_ping_pong_interval;
    1708  /* Add new things just above here ---^
    1709  * This is part of the ABI, don't needlessly break compatibility
    1710  *
    1711  * The below is to ensure later library versions with new
    1712  * members added above will see 0 (default) even if the app
    1713  * was not built against the newer headers.
    1714  */
    1715 
    1716  void *_unused[8];
    1717 };
    1718 
    1753 LWS_VISIBLE LWS_EXTERN struct lws_context *
    1755 
    1764 LWS_VISIBLE LWS_EXTERN void
    1765 lws_context_destroy(struct lws_context *context);
    1766 
    1784 LWS_VISIBLE LWS_EXTERN int
    1785 lws_set_proxy(struct lws_vhost *vhost, const char *proxy);
    1786 
    1787 
    1788 struct lws_vhost;
    1789 
    1799 LWS_EXTERN LWS_VISIBLE struct lws_vhost *
    1800 lws_create_vhost(struct lws_context *context,
    1801  struct lws_context_creation_info *info);
    1802 
    1817 LWS_VISIBLE LWS_EXTERN int
    1818 lwsws_get_config_globals(struct lws_context_creation_info *info, const char *d,
    1819  char **config_strings, int *len);
    1820 
    1836 LWS_VISIBLE LWS_EXTERN int
    1837 lwsws_get_config_vhosts(struct lws_context *context,
    1838  struct lws_context_creation_info *info, const char *d,
    1839  char **config_strings, int *len);
    1840 
    1842 LWS_VISIBLE LWS_EXTERN struct lws_vhost *
    1843 lws_vhost_get(struct lws *wsi) LWS_WARN_DEPRECATED;
    1844 
    1850 LWS_VISIBLE LWS_EXTERN struct lws_vhost *
    1851 lws_get_vhost(struct lws *wsi);
    1852 
    1860 LWS_VISIBLE LWS_EXTERN int
    1861 lws_json_dump_vhost(const struct lws_vhost *vh, char *buf, int len);
    1862 
    1870 LWS_VISIBLE LWS_EXTERN int
    1871 lws_json_dump_context(const struct lws_context *context, char *buf, int len);
    1872 
    1882 LWS_VISIBLE LWS_EXTERN void *
    1883 lws_context_user(struct lws_context *context);
    1884 
    1890 
    1900  const char *name;
    1901  const char *value;
    1902 };
    1903 
    1916 };
    1917 
    1925  const char *mountpoint;
    1927  const char *origin;
    1929  const char *def;
    1931  const char *protocol;
    1947  unsigned int auth_mask;
    1950  unsigned int cache_reusable:1;
    1951  unsigned int cache_revalidate:1;
    1952  unsigned int cache_intermediaries:1;
    1954  unsigned char origin_protocol;
    1955  unsigned char mountpoint_len;
    1956 };
    1959 
    1965 
    1973  LCCSCF_USE_SSL = (1 << 0),
    1974  LCCSCF_ALLOW_SELFSIGNED = (1 << 1),
    1975  LCCSCF_SKIP_SERVER_CERT_HOSTNAME_CHECK = (1 << 2)
    1976 };
    1977 
    1982  struct lws_context *context;
    1984  const char *address;
    1986  int port;
    1990  const char *path;
    1992  const char *host;
    1994  const char *origin;
    1996  const char *protocol;
    2000  void *userdata;
    2004  const char *method;
    2007  struct lws *parent_wsi;
    2011  const char *uri_replace_from;
    2014  const char *uri_replace_to;
    2016  struct lws_vhost *vhost;
    2018  struct lws **pwsi;
    2030  /* Add new things just above here ---^
    2031  * This is part of the ABI, don't needlessly break compatibility
    2032  *
    2033  * The below is to ensure later library versions with new
    2034  * members added above will see 0 (default) even if the app
    2035  * was not built against the newer headers.
    2036  */
    2037 
    2038  void *_unused[4];
    2039 };
    2040 
    2048 LWS_VISIBLE LWS_EXTERN struct lws *
    2050 
    2071 /* deprecated, use lws_client_connect_via_info() */
    2072 LWS_VISIBLE LWS_EXTERN struct lws * LWS_WARN_UNUSED_RESULT
    2073 lws_client_connect(struct lws_context *clients, const char *address,
    2074  int port, int ssl_connection, const char *path,
    2075  const char *host, const char *origin, const char *protocol,
    2076  int ietf_version_or_minus_one) LWS_WARN_DEPRECATED;
    2077 /* deprecated, use lws_client_connect_via_info() */
    2098 LWS_VISIBLE LWS_EXTERN struct lws * LWS_WARN_UNUSED_RESULT
    2099 lws_client_connect_extended(struct lws_context *clients, const char *address,
    2100  int port, int ssl_connection, const char *path,
    2101  const char *host, const char *origin,
    2102  const char *protocol, int ietf_version_or_minus_one,
    2103  void *userdata) LWS_WARN_DEPRECATED;
    2104 
    2130 LWS_VISIBLE LWS_EXTERN int
    2132  struct lws_vhost *vhost);
    2133 
    2134 LWS_VISIBLE LWS_EXTERN int
    2135 lws_http_client_read(struct lws *wsi, char **buf, int *len);
    2136 
    2137 LWS_VISIBLE LWS_EXTERN void
    2138 lws_client_http_body_pending(struct lws *wsi, int something_left_to_send);
    2139 
    2160 
    2169 
    2202 LWS_VISIBLE LWS_EXTERN int
    2203 lws_service(struct lws_context *context, int timeout_ms);
    2204 
    2216 LWS_VISIBLE LWS_EXTERN int
    2217 lws_service_tsi(struct lws_context *context, int timeout_ms, int tsi);
    2218 
    2234 LWS_VISIBLE LWS_EXTERN void
    2235 lws_cancel_service_pt(struct lws *wsi);
    2236 
    2248 LWS_VISIBLE LWS_EXTERN void
    2249 lws_cancel_service(struct lws_context *context);
    2250 
    2273 LWS_VISIBLE LWS_EXTERN int
    2274 lws_service_fd(struct lws_context *context, struct lws_pollfd *pollfd);
    2275 
    2285 LWS_VISIBLE LWS_EXTERN int
    2286 lws_service_fd_tsi(struct lws_context *context, struct lws_pollfd *pollfd,
    2287  int tsi);
    2288 
    2290 
    2296 
    2303 
    2315 LWS_VISIBLE LWS_EXTERN const char *
    2316 lws_get_mimetype(const char *file, const struct lws_http_mount *m);
    2317 
    2336 LWS_VISIBLE LWS_EXTERN int
    2337 lws_serve_http_file(struct lws *wsi, const char *file, const char *content_type,
    2338  const char *other_headers, int other_headers_len);
    2339 LWS_VISIBLE LWS_EXTERN int
    2340 lws_serve_http_file_fragment(struct lws *wsi);
    2342 
    2353 
    2354 enum http_status {
    2355  HTTP_STATUS_OK = 200,
    2356  HTTP_STATUS_NO_CONTENT = 204,
    2357 
    2358  HTTP_STATUS_MOVED_PERMANENTLY = 301,
    2359  HTTP_STATUS_FOUND = 302,
    2360  HTTP_STATUS_SEE_OTHER = 303,
    2361 
    2362  HTTP_STATUS_BAD_REQUEST = 400,
    2363  HTTP_STATUS_UNAUTHORIZED,
    2364  HTTP_STATUS_PAYMENT_REQUIRED,
    2365  HTTP_STATUS_FORBIDDEN,
    2366  HTTP_STATUS_NOT_FOUND,
    2367  HTTP_STATUS_METHOD_NOT_ALLOWED,
    2368  HTTP_STATUS_NOT_ACCEPTABLE,
    2369  HTTP_STATUS_PROXY_AUTH_REQUIRED,
    2370  HTTP_STATUS_REQUEST_TIMEOUT,
    2371  HTTP_STATUS_CONFLICT,
    2372  HTTP_STATUS_GONE,
    2373  HTTP_STATUS_LENGTH_REQUIRED,
    2374  HTTP_STATUS_PRECONDITION_FAILED,
    2375  HTTP_STATUS_REQ_ENTITY_TOO_LARGE,
    2376  HTTP_STATUS_REQ_URI_TOO_LONG,
    2377  HTTP_STATUS_UNSUPPORTED_MEDIA_TYPE,
    2378  HTTP_STATUS_REQ_RANGE_NOT_SATISFIABLE,
    2379  HTTP_STATUS_EXPECTATION_FAILED,
    2380 
    2381  HTTP_STATUS_INTERNAL_SERVER_ERROR = 500,
    2382  HTTP_STATUS_NOT_IMPLEMENTED,
    2383  HTTP_STATUS_BAD_GATEWAY,
    2384  HTTP_STATUS_SERVICE_UNAVAILABLE,
    2385  HTTP_STATUS_GATEWAY_TIMEOUT,
    2386  HTTP_STATUS_HTTP_VERSION_NOT_SUPPORTED,
    2387 };
    2388 
    2390  char *p;
    2391  int len;
    2392  int max_len;
    2393  int final;
    2394 };
    2395 
    2396 typedef const char *(*lws_process_html_state_cb)(void *data, int index);
    2397 
    2399  char *start;
    2400  char swallow[16];
    2401  int pos;
    2402  void *data;
    2403  const char * const *vars;
    2406  lws_process_html_state_cb replace;
    2407 };
    2408 
    2413 LWS_VISIBLE LWS_EXTERN int
    2415  struct lws_process_html_state *s);
    2417 
    2450 
    2458 struct lws_tokens {
    2459  char *token;
    2461 };
    2462 
    2463 /* enum lws_token_indexes
    2464  * these have to be kept in sync with lextable.h / minilex.c
    2465  *
    2466  * NOTE: These public enums are part of the abi. If you want to add one,
    2467  * add it at where specified so existing users are unaffected.
    2468  */
    2469 enum lws_token_indexes {
    2470  WSI_TOKEN_GET_URI = 0,
    2471  WSI_TOKEN_POST_URI = 1,
    2472  WSI_TOKEN_OPTIONS_URI = 2,
    2473  WSI_TOKEN_HOST = 3,
    2474  WSI_TOKEN_CONNECTION = 4,
    2475  WSI_TOKEN_UPGRADE = 5,
    2476  WSI_TOKEN_ORIGIN = 6,
    2477  WSI_TOKEN_DRAFT = 7,
    2478  WSI_TOKEN_CHALLENGE = 8,
    2479  WSI_TOKEN_EXTENSIONS = 9,
    2480  WSI_TOKEN_KEY1 = 10,
    2481  WSI_TOKEN_KEY2 = 11,
    2482  WSI_TOKEN_PROTOCOL = 12,
    2483  WSI_TOKEN_ACCEPT = 13,
    2484  WSI_TOKEN_NONCE = 14,
    2485  WSI_TOKEN_HTTP = 15,
    2486  WSI_TOKEN_HTTP2_SETTINGS = 16,
    2487  WSI_TOKEN_HTTP_ACCEPT = 17,
    2488  WSI_TOKEN_HTTP_AC_REQUEST_HEADERS = 18,
    2489  WSI_TOKEN_HTTP_IF_MODIFIED_SINCE = 19,
    2490  WSI_TOKEN_HTTP_IF_NONE_MATCH = 20,
    2491  WSI_TOKEN_HTTP_ACCEPT_ENCODING = 21,
    2492  WSI_TOKEN_HTTP_ACCEPT_LANGUAGE = 22,
    2493  WSI_TOKEN_HTTP_PRAGMA = 23,
    2494  WSI_TOKEN_HTTP_CACHE_CONTROL = 24,
    2495  WSI_TOKEN_HTTP_AUTHORIZATION = 25,
    2496  WSI_TOKEN_HTTP_COOKIE = 26,
    2497  WSI_TOKEN_HTTP_CONTENT_LENGTH = 27,
    2498  WSI_TOKEN_HTTP_CONTENT_TYPE = 28,
    2499  WSI_TOKEN_HTTP_DATE = 29,
    2500  WSI_TOKEN_HTTP_RANGE = 30,
    2501  WSI_TOKEN_HTTP_REFERER = 31,
    2502  WSI_TOKEN_KEY = 32,
    2503  WSI_TOKEN_VERSION = 33,
    2504  WSI_TOKEN_SWORIGIN = 34,
    2505 
    2506  WSI_TOKEN_HTTP_COLON_AUTHORITY = 35,
    2507  WSI_TOKEN_HTTP_COLON_METHOD = 36,
    2508  WSI_TOKEN_HTTP_COLON_PATH = 37,
    2509  WSI_TOKEN_HTTP_COLON_SCHEME = 38,
    2510  WSI_TOKEN_HTTP_COLON_STATUS = 39,
    2511 
    2512  WSI_TOKEN_HTTP_ACCEPT_CHARSET = 40,
    2513  WSI_TOKEN_HTTP_ACCEPT_RANGES = 41,
    2514  WSI_TOKEN_HTTP_ACCESS_CONTROL_ALLOW_ORIGIN = 42,
    2515  WSI_TOKEN_HTTP_AGE = 43,
    2516  WSI_TOKEN_HTTP_ALLOW = 44,
    2517  WSI_TOKEN_HTTP_CONTENT_DISPOSITION = 45,
    2518  WSI_TOKEN_HTTP_CONTENT_ENCODING = 46,
    2519  WSI_TOKEN_HTTP_CONTENT_LANGUAGE = 47,
    2520  WSI_TOKEN_HTTP_CONTENT_LOCATION = 48,
    2521  WSI_TOKEN_HTTP_CONTENT_RANGE = 49,
    2522  WSI_TOKEN_HTTP_ETAG = 50,
    2523  WSI_TOKEN_HTTP_EXPECT = 51,
    2524  WSI_TOKEN_HTTP_EXPIRES = 52,
    2525  WSI_TOKEN_HTTP_FROM = 53,
    2526  WSI_TOKEN_HTTP_IF_MATCH = 54,
    2527  WSI_TOKEN_HTTP_IF_RANGE = 55,
    2528  WSI_TOKEN_HTTP_IF_UNMODIFIED_SINCE = 56,
    2529  WSI_TOKEN_HTTP_LAST_MODIFIED = 57,
    2530  WSI_TOKEN_HTTP_LINK = 58,
    2531  WSI_TOKEN_HTTP_LOCATION = 59,
    2532  WSI_TOKEN_HTTP_MAX_FORWARDS = 60,
    2533  WSI_TOKEN_HTTP_PROXY_AUTHENTICATE = 61,
    2534  WSI_TOKEN_HTTP_PROXY_AUTHORIZATION = 62,
    2535  WSI_TOKEN_HTTP_REFRESH = 63,
    2536  WSI_TOKEN_HTTP_RETRY_AFTER = 64,
    2537  WSI_TOKEN_HTTP_SERVER = 65,
    2538  WSI_TOKEN_HTTP_SET_COOKIE = 66,
    2539  WSI_TOKEN_HTTP_STRICT_TRANSPORT_SECURITY = 67,
    2540  WSI_TOKEN_HTTP_TRANSFER_ENCODING = 68,
    2541  WSI_TOKEN_HTTP_USER_AGENT = 69,
    2542  WSI_TOKEN_HTTP_VARY = 70,
    2543  WSI_TOKEN_HTTP_VIA = 71,
    2544  WSI_TOKEN_HTTP_WWW_AUTHENTICATE = 72,
    2545 
    2546  WSI_TOKEN_PATCH_URI = 73,
    2547  WSI_TOKEN_PUT_URI = 74,
    2548  WSI_TOKEN_DELETE_URI = 75,
    2549 
    2550  WSI_TOKEN_HTTP_URI_ARGS = 76,
    2551  WSI_TOKEN_PROXY = 77,
    2552  WSI_TOKEN_HTTP_X_REAL_IP = 78,
    2553  WSI_TOKEN_HTTP1_0 = 79,
    2554 
    2555  /****** add new things just above ---^ ******/
    2556 
    2557  /* use token storage to stash these internally, not for
    2558  * user use */
    2559 
    2560  _WSI_TOKEN_CLIENT_SENT_PROTOCOLS,
    2561  _WSI_TOKEN_CLIENT_PEER_ADDRESS,
    2562  _WSI_TOKEN_CLIENT_URI,
    2563  _WSI_TOKEN_CLIENT_HOST,
    2564  _WSI_TOKEN_CLIENT_ORIGIN,
    2565  _WSI_TOKEN_CLIENT_METHOD,
    2566 
    2567  /* always last real token index*/
    2568  WSI_TOKEN_COUNT,
    2569 
    2570  /* parser state additions, no storage associated */
    2571  WSI_TOKEN_NAME_PART,
    2572  WSI_TOKEN_SKIPPING,
    2573  WSI_TOKEN_SKIPPING_SAW_CR,
    2574  WSI_PARSING_COMPLETE,
    2575  WSI_INIT_TOKEN_MUXURL,
    2576 };
    2577 
    2579  unsigned short token_limit[WSI_TOKEN_COUNT];
    2580 };
    2581 
    2587 LWS_VISIBLE LWS_EXTERN const unsigned char *
    2588 lws_token_to_string(enum lws_token_indexes token);
    2589 
    2590 
    2599 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
    2600 lws_hdr_total_length(struct lws *wsi, enum lws_token_indexes h);
    2601 
    2611 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
    2612 lws_hdr_fragment_length(struct lws *wsi, enum lws_token_indexes h, int frag_idx);
    2613 
    2627 LWS_VISIBLE LWS_EXTERN int
    2628 lws_hdr_copy(struct lws *wsi, char *dest, int len, enum lws_token_indexes h);
    2629 
    2647 LWS_VISIBLE LWS_EXTERN int
    2648 lws_hdr_copy_fragment(struct lws *wsi, char *dest, int len,
    2649  enum lws_token_indexes h, int frag_idx);
    2650 
    2661 LWS_VISIBLE LWS_EXTERN const char *
    2662 lws_get_urlarg_by_name(struct lws *wsi, const char *name, char *buf, int len);
    2664 
    2679 
    2690 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
    2691 lws_add_http_header_status(struct lws *wsi,
    2692  unsigned int code, unsigned char **p,
    2693  unsigned char *end);
    2706 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
    2707 lws_add_http_header_by_name(struct lws *wsi, const unsigned char *name,
    2708  const unsigned char *value, int length,
    2709  unsigned char **p, unsigned char *end);
    2723 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
    2724 lws_add_http_header_by_token(struct lws *wsi, enum lws_token_indexes token,
    2725  const unsigned char *value, int length,
    2726  unsigned char **p, unsigned char *end);
    2737 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
    2738 lws_add_http_header_content_length(struct lws *wsi,
    2739  unsigned long content_length,
    2740  unsigned char **p, unsigned char *end);
    2750 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
    2751 lws_finalize_http_header(struct lws *wsi, unsigned char **p,
    2752  unsigned char *end);
    2754 
    2773 
    2783 };
    2784 
    2798 typedef int (*lws_spa_fileupload_cb)(void *data, const char *name,
    2799  const char *filename, char *buf, int len,
    2800  enum lws_spa_fileupload_states state);
    2801 
    2804 struct lws_spa;
    2805 
    2824 LWS_VISIBLE LWS_EXTERN struct lws_spa *
    2825 lws_spa_create(struct lws *wsi, const char * const *param_names,
    2826  int count_params, int max_storage, lws_spa_fileupload_cb opt_cb,
    2827  void *opt_data);
    2828 
    2836 LWS_VISIBLE LWS_EXTERN int
    2837 lws_spa_process(struct lws_spa *spa, const char *in, int len);
    2838 
    2844 LWS_VISIBLE LWS_EXTERN int
    2845 lws_spa_finalize(struct lws_spa *spa);
    2846 
    2853 LWS_VISIBLE LWS_EXTERN int
    2854 lws_spa_get_length(struct lws_spa *spa, int n);
    2855 
    2861 LWS_VISIBLE LWS_EXTERN const char *
    2862 lws_spa_get_string(struct lws_spa *spa, int n);
    2863 
    2869 LWS_VISIBLE LWS_EXTERN int
    2870 lws_spa_destroy(struct lws_spa *spa);
    2872 
    2883 
    2894 LWS_VISIBLE LWS_EXTERN const char *
    2895 lws_urlencode(char *escaped, const char *string, int len);
    2896 
    2897 /*
    2898  * URLDECODE 1 / 2
    2899  *
    2900  * This simple urldecode only operates until the first '\0' and requires the
    2901  * data to exist all at once
    2902  */
    2915 LWS_VISIBLE LWS_EXTERN int
    2916 lws_urldecode(char *string, const char *escaped, int len);
    2918 
    2927 LWS_VISIBLE LWS_EXTERN int
    2928 lws_return_http_status(struct lws *wsi, unsigned int code,
    2929  const char *html_body);
    2930 
    2941 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
    2942 lws_http_redirect(struct lws *wsi, int code, const unsigned char *loc, int len,
    2943  unsigned char **p, unsigned char *end);
    2944 
    2953 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
    2954 lws_http_transaction_completed(struct lws *wsi);
    2956 
    2964 
    2975 LWS_VISIBLE LWS_EXTERN const char *
    2976 lws_sql_purify(char *escaped, const char *string, int len);
    2977 
    2988 LWS_VISIBLE LWS_EXTERN const char *
    2989 lws_json_purify(char *escaped, const char *string, int len);
    2991 
    2998 
    3000 #ifdef LWS_USE_LIBEV
    3001 typedef void (lws_ev_signal_cb_t)(EV_P_ struct ev_signal *w, int revents);
    3002 
    3003 LWS_VISIBLE LWS_EXTERN int
    3004 lws_ev_sigint_cfg(struct lws_context *context, int use_ev_sigint,
    3005  lws_ev_signal_cb_t *cb);
    3006 
    3007 LWS_VISIBLE LWS_EXTERN int
    3008 lws_ev_initloop(struct lws_context *context, struct ev_loop *loop, int tsi);
    3009 
    3010 LWS_VISIBLE LWS_EXTERN void
    3011 lws_ev_sigint_cb(struct ev_loop *loop, struct ev_signal *watcher, int revents);
    3012 #endif /* LWS_USE_LIBEV */
    3013 
    3015 
    3022 #ifdef LWS_USE_LIBUV
    3024 LWS_VISIBLE LWS_EXTERN int
    3025 lws_uv_sigint_cfg(struct lws_context *context, int use_uv_sigint,
    3026  uv_signal_cb cb);
    3027 
    3028 LWS_VISIBLE LWS_EXTERN void
    3029 lws_libuv_run(const struct lws_context *context, int tsi);
    3030 
    3031 LWS_VISIBLE LWS_EXTERN void
    3032 lws_libuv_stop(struct lws_context *context);
    3033 
    3034 LWS_VISIBLE LWS_EXTERN int
    3035 lws_uv_initloop(struct lws_context *context, uv_loop_t *loop, int tsi);
    3036 
    3037 LWS_VISIBLE LWS_EXTERN uv_loop_t *
    3038 lws_uv_getloop(struct lws_context *context, int tsi);
    3039 
    3040 LWS_VISIBLE LWS_EXTERN void
    3041 lws_uv_sigint_cb(uv_signal_t *watcher, int signum);
    3042 #endif /* LWS_USE_LIBUV */
    3043 
    3050 
    3051 /*
    3052  * NOTE: These public enums are part of the abi. If you want to add one,
    3053  * add it at where specified so existing users are unaffected.
    3054  */
    3055 enum pending_timeout {
    3056  NO_PENDING_TIMEOUT = 0,
    3057  PENDING_TIMEOUT_AWAITING_PROXY_RESPONSE = 1,
    3058  PENDING_TIMEOUT_AWAITING_CONNECT_RESPONSE = 2,
    3059  PENDING_TIMEOUT_ESTABLISH_WITH_SERVER = 3,
    3060  PENDING_TIMEOUT_AWAITING_SERVER_RESPONSE = 4,
    3061  PENDING_TIMEOUT_AWAITING_PING = 5,
    3062  PENDING_TIMEOUT_CLOSE_ACK = 6,
    3063  PENDING_TIMEOUT_AWAITING_EXTENSION_CONNECT_RESPONSE = 7,
    3064  PENDING_TIMEOUT_SENT_CLIENT_HANDSHAKE = 8,
    3065  PENDING_TIMEOUT_SSL_ACCEPT = 9,
    3066  PENDING_TIMEOUT_HTTP_CONTENT = 10,
    3067  PENDING_TIMEOUT_AWAITING_CLIENT_HS_SEND = 11,
    3068  PENDING_FLUSH_STORED_SEND_BEFORE_CLOSE = 12,
    3069  PENDING_TIMEOUT_SHUTDOWN_FLUSH = 13,
    3070  PENDING_TIMEOUT_CGI = 14,
    3071  PENDING_TIMEOUT_HTTP_KEEPALIVE_IDLE = 15,
    3072  PENDING_TIMEOUT_WS_PONG_CHECK_SEND_PING = 16,
    3073  PENDING_TIMEOUT_WS_PONG_CHECK_GET_PONG = 17,
    3074  PENDING_TIMEOUT_CLIENT_ISSUE_PAYLOAD = 18,
    3075 
    3076  /****** add new things just above ---^ ******/
    3077 };
    3078 
    3088 LWS_VISIBLE LWS_EXTERN void
    3089 lws_set_timeout(struct lws *wsi, enum pending_timeout reason, int secs);
    3091 
    3097 #if !defined(LWS_SIZEOFPTR)
    3098 #define LWS_SIZEOFPTR (sizeof (void *))
    3099 #endif
    3100 #if !defined(u_int64_t)
    3101 #define u_int64_t unsigned long long
    3102 #endif
    3103 
    3104 #if defined(__x86_64__)
    3105 #define _LWS_PAD_SIZE 16 /* Intel recommended for best performance */
    3106 #else
    3107 #define _LWS_PAD_SIZE LWS_SIZEOFPTR /* Size of a pointer on the target arch */
    3108 #endif
    3109 #define _LWS_PAD(n) (((n) % _LWS_PAD_SIZE) ? \
    3110  ((n) + (_LWS_PAD_SIZE - ((n) % _LWS_PAD_SIZE))) : (n))
    3111 #define LWS_PRE _LWS_PAD(4 + 10)
    3112 /* used prior to 1.7 and retained for backward compatibility */
    3113 #define LWS_SEND_BUFFER_PRE_PADDING LWS_PRE
    3114 #define LWS_SEND_BUFFER_POST_PADDING 0
    3115 
    3116 /*
    3117  * NOTE: These public enums are part of the abi. If you want to add one,
    3118  * add it at where specified so existing users are unaffected.
    3119  */
    3134  /* LWS_WRITE_CLOSE is handled by lws_close_reason() */
    3135  LWS_WRITE_PING = 5,
    3136  LWS_WRITE_PONG = 6,
    3137 
    3138  /* Same as write_http but we know this write ends the transaction */
    3139  LWS_WRITE_HTTP_FINAL = 7,
    3140 
    3141  /* HTTP2 */
    3142 
    3150  /****** add new things just above ---^ ******/
    3151 
    3152  /* flags */
    3153 
    3161 };
    3162 
    3163 
    3235 LWS_VISIBLE LWS_EXTERN int
    3236 lws_write(struct lws *wsi, unsigned char *buf, size_t len,
    3237  enum lws_write_protocol protocol);
    3238 
    3239 /* helper for case where buffer may be const */
    3240 #define lws_write_http(wsi, buf, len) \
    3241  lws_write(wsi, (unsigned char *)(buf), len, LWS_WRITE_HTTP)
    3242 
    3244 
    3263 
    3276 LWS_VISIBLE LWS_EXTERN int
    3277 lws_callback_on_writable(struct lws *wsi);
    3278 
    3292 LWS_VISIBLE LWS_EXTERN int
    3293 lws_callback_on_writable_all_protocol(const struct lws_context *context,
    3294  const struct lws_protocols *protocol);
    3295 
    3309 LWS_VISIBLE LWS_EXTERN int
    3310 lws_callback_on_writable_all_protocol_vhost(const struct lws_vhost *vhost,
    3311  const struct lws_protocols *protocol);
    3312 
    3325 LWS_VISIBLE LWS_EXTERN int
    3326 lws_callback_all_protocol(struct lws_context *context,
    3327  const struct lws_protocols *protocol, int reason);
    3328 
    3341 LWS_VISIBLE LWS_EXTERN int
    3342 lws_callback_all_protocol_vhost(struct lws_vhost *vh,
    3343  const struct lws_protocols *protocol, int reason);
    3344 
    3358 LWS_VISIBLE LWS_EXTERN int
    3359 lws_callback_vhost_protocols(struct lws *wsi, int reason, void *in, int len);
    3360 
    3361 LWS_VISIBLE LWS_EXTERN int
    3362 lws_callback_http_dummy(struct lws *wsi, enum lws_callback_reasons reason,
    3363  void *user, void *in, size_t len);
    3364 
    3372 LWS_VISIBLE LWS_EXTERN int
    3373 lws_get_socket_fd(struct lws *wsi);
    3374 
    3396 LWS_VISIBLE LWS_EXTERN size_t
    3397 lws_get_peer_write_allowance(struct lws *wsi);
    3399 
    3410 LWS_VISIBLE LWS_EXTERN int
    3411 lws_rx_flow_control(struct lws *wsi, int enable);
    3412 
    3422 LWS_VISIBLE LWS_EXTERN void
    3423 lws_rx_flow_allow_all_protocol(const struct lws_context *context,
    3424  const struct lws_protocols *protocol);
    3425 
    3442 LWS_VISIBLE LWS_EXTERN size_t
    3443 lws_remaining_packet_payload(struct lws *wsi);
    3444 
    3445 
    3454 
    3467 LWS_VISIBLE LWS_EXTERN struct lws *
    3468 lws_adopt_socket(struct lws_context *context, lws_sockfd_type accept_fd);
    3491 LWS_VISIBLE LWS_EXTERN struct lws *
    3492 lws_adopt_socket_readbuf(struct lws_context *context, lws_sockfd_type accept_fd,
    3493  const char *readbuf, size_t len);
    3495 
    3501 
    3512 LWS_VISIBLE LWS_EXTERN const char * LWS_WARN_UNUSED_RESULT
    3513 lws_canonical_hostname(struct lws_context *context);
    3514 
    3529 LWS_VISIBLE LWS_EXTERN void
    3530 lws_get_peer_addresses(struct lws *wsi, lws_sockfd_type fd, char *name,
    3531  int name_len, char *rip, int rip_len);
    3532 
    3543 LWS_VISIBLE LWS_EXTERN const char *
    3544 lws_get_peer_simple(struct lws *wsi, char *name, int namelen);
    3545 #ifndef LWS_WITH_ESP8266
    3546 
    3557 LWS_VISIBLE LWS_EXTERN int
    3558 lws_interface_to_sa(int ipv6, const char *ifname, struct sockaddr_in *addr,
    3559  size_t addrlen);
    3561 #endif
    3562 
    3568 
    3581 LWS_VISIBLE LWS_EXTERN int
    3582 lws_get_random(struct lws_context *context, void *buf, int len);
    3590 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
    3591 lws_daemonize(const char *_lock_path);
    3597 LWS_VISIBLE LWS_EXTERN const char * LWS_WARN_UNUSED_RESULT
    3599 
    3606 LWS_VISIBLE LWS_EXTERN void *
    3607 lws_wsi_user(struct lws *wsi);
    3608 
    3620 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
    3621 lws_parse_uri(char *p, const char **prot, const char **ads, int *port,
    3622  const char **path);
    3623 
    3627 LWS_VISIBLE LWS_EXTERN unsigned long
    3628 lws_now_secs(void);
    3629 
    3639 LWS_VISIBLE LWS_EXTERN struct lws_context * LWS_WARN_UNUSED_RESULT
    3640 lws_get_context(const struct lws *wsi);
    3641 
    3651 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
    3652 lws_get_count_threads(struct lws_context *context);
    3653 
    3661 LWS_VISIBLE LWS_EXTERN struct lws * LWS_WARN_UNUSED_RESULT
    3662 lws_get_parent(const struct lws *wsi);
    3663 
    3670 LWS_VISIBLE LWS_EXTERN struct lws * LWS_WARN_UNUSED_RESULT
    3671 lws_get_child(const struct lws *wsi);
    3672 
    3673 
    3674 /*
    3675  * \deprecated DEPRECATED Note: this is not normally needed as a user api.
    3676  * It's provided in case it is
    3677  * useful when integrating with other app poll loop service code.
    3678  */
    3679 LWS_VISIBLE LWS_EXTERN int
    3680 lws_read(struct lws *wsi, unsigned char *buf, size_t len);
    3681 
    3689 LWS_VISIBLE LWS_EXTERN void
    3690 lws_set_allocator(void *(*realloc)(void *ptr, size_t size));
    3692 
    3698 
    3705 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
    3706 lws_send_pipe_choked(struct lws *wsi);
    3707 
    3712 LWS_VISIBLE LWS_EXTERN int
    3713 lws_is_final_fragment(struct lws *wsi);
    3714 
    3719 LWS_VISIBLE LWS_EXTERN unsigned char
    3720 lws_get_reserved_bits(struct lws *wsi);
    3721 
    3738 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
    3739 lws_partial_buffered(struct lws *wsi);
    3740 
    3750 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
    3751 lws_frame_is_binary(struct lws *wsi);
    3752 
    3761 LWS_VISIBLE LWS_EXTERN int
    3762 lws_is_ssl(struct lws *wsi);
    3767 LWS_VISIBLE LWS_EXTERN int
    3768 lws_is_cgi(struct lws *wsi);
    3770 
    3771 
    3777 #ifdef LWS_SHA1_USE_OPENSSL_NAME
    3779 #define lws_SHA1 SHA1
    3780 #else
    3781 
    3790 LWS_VISIBLE LWS_EXTERN unsigned char *
    3791 lws_SHA1(const unsigned char *d, size_t n, unsigned char *md);
    3792 #endif
    3793 
    3803 LWS_VISIBLE LWS_EXTERN int
    3804 lws_b64_encode_string(const char *in, int in_len, char *out, int out_size);
    3814 LWS_VISIBLE LWS_EXTERN int
    3815 lws_b64_decode_string(const char *in, char *out, int out_size);
    3817 
    3818 
    3828 #ifdef LWS_WITH_CGI
    3829 enum lws_enum_stdinouterr {
    3830  LWS_STDIN = 0,
    3831  LWS_STDOUT = 1,
    3832  LWS_STDERR = 2,
    3833 };
    3834 
    3835 enum lws_cgi_hdr_state {
    3836  LCHS_HEADER,
    3837  LCHS_CR1,
    3838  LCHS_LF1,
    3839  LCHS_CR2,
    3840  LCHS_LF2,
    3841  LHCS_PAYLOAD,
    3842  LCHS_SINGLE_0A,
    3843 };
    3844 
    3846  struct lws **stdwsi;
    3847  enum lws_enum_stdinouterr ch;
    3848  unsigned char *data;
    3849  enum lws_cgi_hdr_state hdr_state;
    3850  int len;
    3851 };
    3852 
    3853 
    3863 LWS_VISIBLE LWS_EXTERN int
    3864 lws_cgi(struct lws *wsi, const char * const *exec_array,
    3865  int script_uri_path_len, int timeout_secs,
    3866  const struct lws_protocol_vhost_options *mp_cgienv);
    3867 
    3873 LWS_VISIBLE LWS_EXTERN int
    3874 lws_cgi_write_split_stdout_headers(struct lws *wsi);
    3875 
    3881 LWS_VISIBLE LWS_EXTERN int
    3882 lws_cgi_kill(struct lws *wsi);
    3883 #endif
    3884 
    3886 
    3903 
    3910  lws_filefd_type (*open)(struct lws *wsi, const char *filename,
    3911  unsigned long *filelen, int flags);
    3915  int (*close)(struct lws *wsi, lws_filefd_type fd);
    3917  unsigned long (*seek_cur)(struct lws *wsi, lws_filefd_type fd,
    3918  long offset_from_cur_pos);
    3920  int (*read)(struct lws *wsi, lws_filefd_type fd, unsigned long *amount,
    3921  unsigned char *buf, unsigned long len);
    3923  int (*write)(struct lws *wsi, lws_filefd_type fd, unsigned long *amount,
    3924  unsigned char *buf, unsigned long len);
    3927  /* Add new things just above here ---^
    3928  * This is part of the ABI, don't needlessly break compatibility */
    3929 };
    3930 
    3936 LWS_VISIBLE LWS_EXTERN struct lws_plat_file_ops * LWS_WARN_UNUSED_RESULT
    3937 lws_get_fops(struct lws_context *context);
    3938 
    3947 static LWS_INLINE lws_filefd_type LWS_WARN_UNUSED_RESULT
    3948 lws_plat_file_open(struct lws *wsi, const char *filename,
    3949  unsigned long *filelen, int flags)
    3950 {
    3951  return lws_get_fops(lws_get_context(wsi))->open(wsi, filename,
    3952  filelen, flags);
    3953 }
    3954 
    3961 static LWS_INLINE int
    3962 lws_plat_file_close(struct lws *wsi, lws_filefd_type fd)
    3963 {
    3964  return lws_get_fops(lws_get_context(wsi))->close(wsi, fd);
    3965 }
    3966 
    3974 static LWS_INLINE unsigned long
    3975 lws_plat_file_seek_cur(struct lws *wsi, lws_filefd_type fd, long offset)
    3976 {
    3977  return lws_get_fops(lws_get_context(wsi))->seek_cur(wsi, fd, offset);
    3978 }
    3988 static LWS_INLINE int LWS_WARN_UNUSED_RESULT
    3989 lws_plat_file_read(struct lws *wsi, lws_filefd_type fd, unsigned long *amount,
    3990  unsigned char *buf, unsigned long len)
    3991 {
    3992  return lws_get_fops(lws_get_context(wsi))->read(wsi, fd, amount, buf,
    3993  len);
    3994 }
    4004 static LWS_INLINE int LWS_WARN_UNUSED_RESULT
    4005 lws_plat_file_write(struct lws *wsi, lws_filefd_type fd, unsigned long *amount,
    4006  unsigned char *buf, unsigned long len)
    4007 {
    4008  return lws_get_fops(lws_get_context(wsi))->write(wsi, fd, amount, buf,
    4009  len);
    4010 }
    4012 
    4044 #ifdef LWS_WITH_SMTP
    4045 
    4057 };
    4058 
    4060 struct lws_email {
    4061  void *data;
    4063  uv_loop_t *loop;
    4066  char email_smtp_ip[32];
    4067  char email_helo[32];
    4068  char email_from[100];
    4069  char email_to[100];
    4071  unsigned int max_content_size;
    4074  /* Fill all the callbacks before init */
    4075 
    4076  int (*on_next)(struct lws_email *email);
    4081  int (*on_sent)(struct lws_email *email);
    4086  int (*on_get_body)(struct lws_email *email, char *buf, int len);
    4092  /* private things */
    4093  uv_timer_t timeout_email;
    4095  uv_connect_t email_connect_req;
    4096  uv_tcp_t email_client;
    4098  char email_buf[256];
    4099  char *content;
    4100 };
    4101 
    4111 LWS_VISIBLE LWS_EXTERN int
    4112 lws_email_init(struct lws_email *email, uv_loop_t *loop, int max_content);
    4113 
    4122 LWS_VISIBLE LWS_EXTERN void
    4123 lws_email_check(struct lws_email *email);
    4131 LWS_VISIBLE LWS_EXTERN void
    4132 lws_email_destroy(struct lws_email *email);
    4133 
    4134 #endif
    4135 
    4136 
    4137 #ifdef __cplusplus
    4138 }
    4139 #endif
    4140 
    4141 #endif
    LWS_VISIBLE LWS_EXTERN int lws_spa_destroy(struct lws_spa *spa)
    +Go to the documentation of this file.
    1 /*
    2  * libwebsockets - small server side websockets and web server implementation
    3  *
    4  * Copyright (C) 2010-2016 Andy Green <andy@warmcat.com>
    5  *
    6  * This library is free software; you can redistribute it and/or
    7  * modify it under the terms of the GNU Lesser General Public
    8  * License as published by the Free Software Foundation:
    9  * version 2.1 of the License.
    10  *
    11  * This library is distributed in the hope that it will be useful,
    12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
    13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
    14  * Lesser General Public License for more details.
    15  *
    16  * You should have received a copy of the GNU Lesser General Public
    17  * License along with this library; if not, write to the Free Software
    18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
    19  * MA 02110-1301 USA
    20  */
    21 
    24 #ifndef LIBWEBSOCKET_H_3060898B846849FF9F88F5DB59B5950C
    25 #define LIBWEBSOCKET_H_3060898B846849FF9F88F5DB59B5950C
    26 
    27 #ifdef __cplusplus
    28 #include <cstddef>
    29 #include <cstdarg>
    30 #ifdef MBED_OPERATORS
    31 #include "mbed-drivers/mbed.h"
    32 #include "sal-iface-eth/EthernetInterface.h"
    33 #include "sockets/TCPListener.h"
    34 #include "sal-stack-lwip/lwipv4_init.h"
    35 
    36 namespace {
    37 }
    38 using namespace mbed::Sockets::v0;
    39 
    40 
    41 struct sockaddr_in;
    42 struct lws;
    43 
    44 class lws_conn {
    45  public:
    46  lws_conn():
    47  ts(NULL),
    48  wsi(NULL),
    49  writeable(1),
    50  awaiting_on_writeable(0)
    51  {
    52  }
    53 
    54 public:
    55  void set_wsi(struct lws *_wsi) { wsi = _wsi; }
    56  int actual_onRX(Socket *s);
    57  void onRX(Socket *s);
    58  void onError(Socket *s, socket_error_t err);
    59  void onDisconnect(TCPStream *s);
    60  void onSent(Socket *s, uint16_t len);
    61  void serialized_writeable(struct lws *wsi);
    62 
    63 public:
    64  TCPStream *ts;
    65 
    66 public:
    67  struct lws *wsi;
    68  char writeable;
    69  char awaiting_on_writeable;
    70 };
    71 
    73 public:
    75  srv(SOCKET_STACK_LWIP_IPV4)
    76  {
    77  srv.setOnError(TCPStream::ErrorHandler_t(this,
    79  }
    80 
    81  void start(const uint16_t port);
    83 protected:
    84  void onRX(Socket *s);
    85  void onError(Socket *s, socket_error_t err);
    86  void onIncoming(TCPListener *s, void *impl);
    87  void onDisconnect(TCPStream *s);
    89 public:
    90  TCPListener srv;
    91 };
    92 
    93 #endif
    94 
    95 extern "C" {
    96 #else
    97 #include <stdarg.h>
    98 #endif
    99 
    100 #if defined(MBED_OPERATORS) || defined(LWS_WITH_ESP8266)
    101 struct sockaddr_in;
    102 #define LWS_POSIX 0
    103 #else
    104 #define LWS_POSIX 1
    105 #endif
    106 
    107 #include "lws_config.h"
    108 
    109 #if defined(WIN32) || defined(_WIN32)
    110 #ifndef WIN32_LEAN_AND_MEAN
    111 #define WIN32_LEAN_AND_MEAN
    112 #endif
    113 
    114 #include <winsock2.h>
    115 #include <ws2tcpip.h>
    116 #include <stddef.h>
    117 #include <basetsd.h>
    118 #ifndef _WIN32_WCE
    119 #include <fcntl.h>
    120 #else
    121 #define _O_RDONLY 0x0000
    122 #define O_RDONLY _O_RDONLY
    123 #endif
    124 
    125 // Visual studio older than 2015 and WIN_CE has only _stricmp
    126 #if (defined(_MSC_VER) && _MSC_VER < 1900) || defined(_WIN32_WCE)
    127 #define strcasecmp _stricmp
    128 #else
    129 #define strcasecmp stricmp
    130 #endif
    131 #define getdtablesize() 30000
    132 
    133 #define LWS_INLINE __inline
    134 #define LWS_VISIBLE
    135 #define LWS_WARN_UNUSED_RESULT
    136 #define LWS_WARN_DEPRECATED
    137 
    138 #ifdef LWS_DLL
    139 #ifdef LWS_INTERNAL
    140 #define LWS_EXTERN extern __declspec(dllexport)
    141 #else
    142 #define LWS_EXTERN extern __declspec(dllimport)
    143 #endif
    144 #else
    145 #define LWS_EXTERN
    146 #endif
    147 
    148 #define LWS_INVALID_FILE INVALID_HANDLE_VALUE
    149 #define LWS_O_RDONLY _O_RDONLY
    150 
    151 #if !defined(_MSC_VER) || _MSC_VER < 1900 /* Visual Studio 2015 already defines this in <stdio.h> */
    152 #define lws_snprintf _snprintf
    153 #endif
    154 
    155 #ifndef __func__
    156 #define __func__ __FUNCTION__
    157 #endif
    158 
    159 #else /* NOT WIN32 */
    160 #include <unistd.h>
    161 
    162 #if defined(__NetBSD__) || defined(__FreeBSD__)
    163 #include <netinet/in.h>
    164 #endif
    165 
    166 #define LWS_INLINE inline
    167 #define LWS_O_RDONLY O_RDONLY
    168 
    169 #if !defined(MBED_OPERATORS) && !defined(LWS_WITH_ESP8266)
    170 #include <poll.h>
    171 #include <netdb.h>
    172 #define LWS_INVALID_FILE -1
    173 #else
    174 #define getdtablesize() (20)
    175 #define LWS_INVALID_FILE NULL
    176 #endif
    177 
    178 #if defined(__GNUC__)
    179 
    180 /* warn_unused_result attribute only supported by GCC 3.4 or later */
    181 #if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
    182 #define LWS_WARN_UNUSED_RESULT __attribute__((warn_unused_result))
    183 #else
    184 #define LWS_WARN_UNUSED_RESULT
    185 #endif
    186 
    187 #define LWS_VISIBLE __attribute__((visibility("default")))
    188 #define LWS_WARN_DEPRECATED __attribute__ ((deprecated))
    189 #else
    190 #define LWS_VISIBLE
    191 #define LWS_WARN_UNUSED_RESULT
    192 #define LWS_WARN_DEPRECATED
    193 #endif
    194 
    195 #if defined(__ANDROID__)
    196 #include <unistd.h>
    197 #define getdtablesize() sysconf(_SC_OPEN_MAX)
    198 #endif
    199 
    200 #endif
    201 
    202 #ifdef LWS_USE_LIBEV
    203 #include <ev.h>
    204 #endif /* LWS_USE_LIBEV */
    205 #ifdef LWS_USE_LIBUV
    206 #include <uv.h>
    207 #endif /* LWS_USE_LIBUV */
    208 
    209 #ifndef LWS_EXTERN
    210 #define LWS_EXTERN extern
    211 #endif
    212 
    213 #ifdef _WIN32
    214 #define random rand
    215 #else
    216 #include <sys/time.h>
    217 #include <unistd.h>
    218 #endif
    219 
    220 #ifdef LWS_OPENSSL_SUPPORT
    221 
    222 #ifdef USE_WOLFSSL
    223 #ifdef USE_OLD_CYASSL
    224 #include <cyassl/openssl/ssl.h>
    225 #include <cyassl/error-ssl.h>
    226 #else
    227 #include <wolfssl/openssl/ssl.h>
    228 #include <wolfssl/error-ssl.h>
    229 #endif /* not USE_OLD_CYASSL */
    230 #else
    231 #if defined(LWS_USE_POLARSSL)
    232 #include <polarssl/ssl.h>
    234  x509_crt ca;
    235  x509_crt certificate;
    236  rsa_context key;
    237 };
    238 typedef struct lws_polarssl_context SSL_CTX;
    239 typedef ssl_context SSL;
    240 #else
    241 #if defined(LWS_USE_MBEDTLS)
    242 #include <mbedtls/ssl.h>
    243 #else
    244 #include <openssl/ssl.h>
    245 #include <openssl/err.h>
    246 #endif /* not USE_MBEDTLS */
    247 #endif /* not USE_POLARSSL */
    248 #endif /* not USE_WOLFSSL */
    249 #endif
    250 
    251 
    252 #define CONTEXT_PORT_NO_LISTEN -1
    253 
    264 
    266 enum lws_log_levels {
    267  LLL_ERR = 1 << 0,
    268  LLL_WARN = 1 << 1,
    269  LLL_NOTICE = 1 << 2,
    270  LLL_INFO = 1 << 3,
    271  LLL_DEBUG = 1 << 4,
    272  LLL_PARSER = 1 << 5,
    273  LLL_HEADER = 1 << 6,
    274  LLL_EXT = 1 << 7,
    275  LLL_CLIENT = 1 << 8,
    276  LLL_LATENCY = 1 << 9,
    277 
    278  LLL_COUNT = 10 /* set to count of valid flags */
    279 };
    280 
    281 LWS_VISIBLE LWS_EXTERN void _lws_log(int filter, const char *format, ...);
    282 LWS_VISIBLE LWS_EXTERN void _lws_logv(int filter, const char *format, va_list vl);
    292 LWS_VISIBLE LWS_EXTERN int
    293 lwsl_timestamp(int level, char *p, int len);
    294 
    295 #define lwsl_err(...) _lws_log(LLL_ERR, __VA_ARGS__)
    296 
    297 #if !defined(LWS_WITH_NO_LOGS)
    298 /* notice, warn and log are always compiled in */
    299 #define lwsl_warn(...) _lws_log(LLL_WARN, __VA_ARGS__)
    300 #define lwsl_notice(...) _lws_log(LLL_NOTICE, __VA_ARGS__)
    301 #endif
    302 /*
    303  * weaker logging can be deselected at configure time using --disable-debug
    304  * that gets rid of the overhead of checking while keeping _warn and _err
    305  * active
    306  */
    307 
    308 #if defined(LWS_WITH_ESP8266)
    309 #undef _DEBUG
    310 #endif
    311 
    312 #ifdef _DEBUG
    313 #if defined(LWS_WITH_NO_LOGS)
    314 /* notice, warn and log are always compiled in */
    315 //#define lwsl_err(...) _lws_log(LLL_ERR, __VA_ARGS__)
    316 #define lwsl_warn(...) _lws_log(LLL_WARN, __VA_ARGS__)
    317 #define lwsl_notice(...) _lws_log(LLL_NOTICE, __VA_ARGS__)
    318 #endif
    319 #define lwsl_info(...) _lws_log(LLL_INFO, __VA_ARGS__)
    320 #define lwsl_debug(...) _lws_log(LLL_DEBUG, __VA_ARGS__)
    321 #define lwsl_parser(...) _lws_log(LLL_PARSER, __VA_ARGS__)
    322 #define lwsl_header(...) _lws_log(LLL_HEADER, __VA_ARGS__)
    323 #define lwsl_ext(...) _lws_log(LLL_EXT, __VA_ARGS__)
    324 #define lwsl_client(...) _lws_log(LLL_CLIENT, __VA_ARGS__)
    325 #define lwsl_latency(...) _lws_log(LLL_LATENCY, __VA_ARGS__)
    326 
    332 LWS_VISIBLE LWS_EXTERN void lwsl_hexdump(void *buf, size_t len);
    333 
    334 #else /* no debug */
    335 #if defined(LWS_WITH_NO_LOGS)
    336 //#define lwsl_err(...) do {} while(0)
    337 #define lwsl_warn(...) do {} while(0)
    338 #define lwsl_notice(...) do {} while(0)
    339 #endif
    340 #define lwsl_info(...) do {} while(0)
    341 #define lwsl_debug(...) do {} while(0)
    342 #define lwsl_parser(...) do {} while(0)
    343 #define lwsl_header(...) do {} while(0)
    344 #define lwsl_ext(...) do {} while(0)
    345 #define lwsl_client(...) do {} while(0)
    346 #define lwsl_latency(...) do {} while(0)
    347 #define lwsl_hexdump(a, b)
    348 
    349 #endif
    350 
    361 LWS_VISIBLE LWS_EXTERN void
    362 lws_set_log_level(int level,
    363  void (*log_emit_function)(int level, const char *line));
    364 
    374 LWS_VISIBLE LWS_EXTERN void
    375 lwsl_emit_syslog(int level, const char *line);
    376 
    378 
    379 
    380 #include <stddef.h>
    381 
    382 #ifndef lws_container_of
    383 #define lws_container_of(P,T,M) ((T *)((char *)(P) - offsetof(T, M)))
    384 #endif
    385 
    386 
    387 struct lws;
    388 #ifndef ARRAY_SIZE
    389 #define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0]))
    390 #endif
    391 
    392 /* api change list for user code to test against */
    393 
    394 #define LWS_FEATURE_SERVE_HTTP_FILE_HAS_OTHER_HEADERS_ARG
    395 
    396 /* the struct lws_protocols has the id field present */
    397 #define LWS_FEATURE_PROTOCOLS_HAS_ID_FIELD
    398 
    399 /* you can call lws_get_peer_write_allowance */
    400 #define LWS_FEATURE_PROTOCOLS_HAS_PEER_WRITE_ALLOWANCE
    401 
    402 /* extra parameter introduced in 917f43ab821 */
    403 #define LWS_FEATURE_SERVE_HTTP_FILE_HAS_OTHER_HEADERS_LEN
    404 
    405 /* File operations stuff exists */
    406 #define LWS_FEATURE_FOPS
    407 
    408 
    409 #if defined(_WIN32)
    410 typedef SOCKET lws_sockfd_type;
    411 typedef HANDLE lws_filefd_type;
    412 #define lws_sockfd_valid(sfd) (!!sfd)
    413 struct lws_pollfd {
    414  lws_sockfd_type fd;
    415  SHORT events;
    416  SHORT revents;
    417 };
    418 #define LWS_POLLHUP (FD_CLOSE)
    419 #define LWS_POLLIN (FD_READ | FD_ACCEPT)
    420 #define LWS_POLLOUT (FD_WRITE)
    421 #else
    422 
    423 #if defined(MBED_OPERATORS)
    424 /* it's a class lws_conn * */
    425 typedef void * lws_sockfd_type;
    426 typedef void * lws_filefd_type;
    427 #define lws_sockfd_valid(sfd) (!!sfd)
    428 struct pollfd {
    429  lws_sockfd_type fd;
    430  short events;
    431  short revents;
    432 };
    433 #define POLLIN 0x0001
    434 #define POLLPRI 0x0002
    435 #define POLLOUT 0x0004
    436 #define POLLERR 0x0008
    437 #define POLLHUP 0x0010
    438 #define POLLNVAL 0x0020
    439 
    440 struct lws;
    441 
    442 void * mbed3_create_tcp_stream_socket(void);
    443 void mbed3_delete_tcp_stream_socket(void *sockfd);
    444 void mbed3_tcp_stream_bind(void *sock, int port, struct lws *);
    445 void mbed3_tcp_stream_accept(void *sock, struct lws *);
    446 #else
    447 #if defined(LWS_WITH_ESP8266)
    448 
    449 #include <user_interface.h>
    450 #include <espconn.h>
    451 
    452 typedef struct espconn * lws_sockfd_type;
    453 typedef void * lws_filefd_type;
    454 #define lws_sockfd_valid(sfd) (!!sfd)
    455 struct pollfd {
    456  lws_sockfd_type fd;
    457  short events;
    458  short revents;
    459 };
    460 #define POLLIN 0x0001
    461 #define POLLPRI 0x0002
    462 #define POLLOUT 0x0004
    463 #define POLLERR 0x0008
    464 #define POLLHUP 0x0010
    465 #define POLLNVAL 0x0020
    466 
    467 struct lws_vhost;
    468 
    469 lws_sockfd_type esp8266_create_tcp_listen_socket(struct lws_vhost *vh);
    470 void esp8266_tcp_stream_accept(lws_sockfd_type fd, struct lws *wsi);
    471 
    472 #include <os_type.h>
    473 #include <osapi.h>
    474 #include "ets_sys.h"
    475 
    476 int ets_snprintf(char *str, size_t size, const char *format, ...);
    477 #define snprintf ets_snprintf
    478 
    479 typedef os_timer_t uv_timer_t;
    480 typedef void uv_cb_t(uv_timer_t *);
    481 
    482 void os_timer_disarm(void *);
    483 void os_timer_setfn(os_timer_t *, os_timer_func_t *, void *);
    484 
    485 void ets_timer_arm_new(os_timer_t *, int, int, int);
    486 
    487 //void os_timer_arm(os_timer_t *, int, int);
    488 
    489 #define UV_VERSION_MAJOR 1
    490 
    491 #define lws_uv_getloop(a, b) (NULL)
    492 
    493 static inline void uv_timer_init(void *l, uv_timer_t *t)
    494 {
    495  (void)l;
    496  memset(t, 0, sizeof(*t));
    497  os_timer_disarm(t);
    498 }
    499 
    500 static inline void uv_timer_start(uv_timer_t *t, uv_cb_t *cb, int first, int rep)
    501 {
    502  os_timer_setfn(t, (os_timer_func_t *)cb, t);
    503  /* ms, repeat */
    504  os_timer_arm(t, first, !!rep);
    505 }
    506 
    507 static inline void uv_timer_stop(uv_timer_t *t)
    508 {
    509  os_timer_disarm(t);
    510 }
    511 
    512 #else
    513 typedef int lws_sockfd_type;
    514 typedef int lws_filefd_type;
    515 #define lws_sockfd_valid(sfd) (sfd >= 0)
    516 #endif
    517 #endif
    518 
    519 #define lws_pollfd pollfd
    520 #define LWS_POLLHUP (POLLHUP|POLLERR)
    521 #define LWS_POLLIN (POLLIN)
    522 #define LWS_POLLOUT (POLLOUT)
    523 #endif
    524 
    527 struct lws_pollargs {
    528  lws_sockfd_type fd;
    529  int events;
    531 };
    532 
    533 struct lws_tokens;
    534 struct lws_token_limits;
    535 
    543 
    545 /*
    546  * NOTE: These public enums are part of the abi. If you want to add one,
    547  * add it at where specified so existing users are unaffected.
    548  */
    551  LWS_CLOSE_STATUS_NOSTATUS = 0,
    613  /****** add new things just above ---^ ******/
    614 
    615  LWS_CLOSE_STATUS_NOSTATUS_CONTEXT_DESTROY = 9999,
    616 };
    617 
    630 LWS_VISIBLE LWS_EXTERN void
    631 lws_close_reason(struct lws *wsi, enum lws_close_status status,
    632  unsigned char *buf, size_t len);
    633 
    635 
    636 struct lws;
    637 struct lws_context;
    638 /* needed even with extensions disabled for create context */
    639 struct lws_extension;
    640 
    652 
    654 
    655 /*
    656  * NOTE: These public enums are part of the abi. If you want to add one,
    657  * add it at where specified so existing users are unaffected.
    658  */
    902  /* external poll() management support */
    965  LWS_CALLBACK_WS_EXT_DEFAULTS = 39,
    968  LWS_CALLBACK_CGI = 40,
    970  LWS_CALLBACK_CGI_TERMINATED = 41,
    972  LWS_CALLBACK_CGI_STDIN_DATA = 42,
    974  LWS_CALLBACK_CGI_STDIN_COMPLETED = 43,
    976  LWS_CALLBACK_ESTABLISHED_CLIENT_HTTP = 44,
    978  LWS_CALLBACK_CLOSED_CLIENT_HTTP = 45,
    980  LWS_CALLBACK_RECEIVE_CLIENT_HTTP = 46,
    982  LWS_CALLBACK_COMPLETED_CLIENT_HTTP = 47,
    984  LWS_CALLBACK_RECEIVE_CLIENT_HTTP_READ = 48,
    986  LWS_CALLBACK_HTTP_BIND_PROTOCOL = 49,
    988  LWS_CALLBACK_HTTP_DROP_PROTOCOL = 50,
    990  LWS_CALLBACK_CHECK_ACCESS_RIGHTS = 51,
    992  LWS_CALLBACK_PROCESS_HTML = 52,
    994  LWS_CALLBACK_ADD_HEADERS = 53,
    996  LWS_CALLBACK_SESSION_INFO = 54,
    999  LWS_CALLBACK_GS_EVENT = 55,
    1016  /****** add new things just above ---^ ******/
    1017 
    1020 };
    1021 
    1022 
    1023 
    1039 typedef int
    1040 lws_callback_function(struct lws *wsi, enum lws_callback_reasons reason,
    1041  void *user, void *in, size_t len);
    1043 
    1053 
    1055 /*
    1056  * NOTE: These public enums are part of the abi. If you want to add one,
    1057  * add it at where specified so existing users are unaffected.
    1058  */
    1059 enum lws_extension_callback_reasons {
    1060  LWS_EXT_CB_SERVER_CONTEXT_CONSTRUCT = 0,
    1061  LWS_EXT_CB_CLIENT_CONTEXT_CONSTRUCT = 1,
    1062  LWS_EXT_CB_SERVER_CONTEXT_DESTRUCT = 2,
    1063  LWS_EXT_CB_CLIENT_CONTEXT_DESTRUCT = 3,
    1064  LWS_EXT_CB_CONSTRUCT = 4,
    1065  LWS_EXT_CB_CLIENT_CONSTRUCT = 5,
    1066  LWS_EXT_CB_CHECK_OK_TO_REALLY_CLOSE = 6,
    1067  LWS_EXT_CB_CHECK_OK_TO_PROPOSE_EXTENSION = 7,
    1068  LWS_EXT_CB_DESTROY = 8,
    1069  LWS_EXT_CB_DESTROY_ANY_WSI_CLOSING = 9,
    1070  LWS_EXT_CB_ANY_WSI_ESTABLISHED = 10,
    1071  LWS_EXT_CB_PACKET_RX_PREPARSE = 11,
    1072  LWS_EXT_CB_PACKET_TX_PRESEND = 12,
    1073  LWS_EXT_CB_PACKET_TX_DO_SEND = 13,
    1074  LWS_EXT_CB_HANDSHAKE_REPLY_TX = 14,
    1075  LWS_EXT_CB_FLUSH_PENDING_TX = 15,
    1076  LWS_EXT_CB_EXTENDED_PAYLOAD_RX = 16,
    1077  LWS_EXT_CB_CAN_PROXY_CLIENT_CONNECTION = 17,
    1078  LWS_EXT_CB_1HZ = 18,
    1079  LWS_EXT_CB_REQUEST_ON_WRITEABLE = 19,
    1080  LWS_EXT_CB_IS_WRITEABLE = 20,
    1081  LWS_EXT_CB_PAYLOAD_TX = 21,
    1082  LWS_EXT_CB_PAYLOAD_RX = 22,
    1083  LWS_EXT_CB_OPTION_DEFAULT = 23,
    1084  LWS_EXT_CB_OPTION_SET = 24,
    1085  LWS_EXT_CB_OPTION_CONFIRM = 25,
    1086  LWS_EXT_CB_NAMED_OPTION_SET = 26,
    1087 
    1088  /****** add new things just above ---^ ******/
    1089 };
    1090 
    1097  /* Add new things just above here ---^
    1098  * This is part of the ABI, don't needlessly break compatibility */
    1099 };
    1100 
    1106  const char *name;
    1109  /* Add new things just above here ---^
    1110  * This is part of the ABI, don't needlessly break compatibility */
    1111 };
    1112 
    1115  const char *option_name;
    1117  const char *start;
    1118  int len;
    1119 };
    1120 
    1181 typedef int
    1182 lws_extension_callback_function(struct lws_context *context,
    1183  const struct lws_extension *ext, struct lws *wsi,
    1184  enum lws_extension_callback_reasons reason,
    1185  void *user, void *in, size_t len);
    1186 
    1189  const char *name;
    1191  const char *client_offer;
    1193  /* Add new things just above here ---^
    1194  * This is part of the ABI, don't needlessly break compatibility */
    1195 };
    1196 
    1205 LWS_VISIBLE LWS_EXTERN int
    1206 lws_set_extension_option(struct lws *wsi, const char *ext_name,
    1207  const char *opt_name, const char *opt_val);
    1208 
    1209 #ifndef LWS_NO_EXTENSIONS
    1210 /* lws_get_internal_extensions() - DEPRECATED
    1211  *
    1212  * \Deprecated There is no longer a set internal extensions table. The table is provided
    1213  * by user code along with application-specific settings. See the test
    1214  * client and server for how to do.
    1215  */
    1216 static LWS_INLINE LWS_WARN_DEPRECATED const struct lws_extension *
    1217 lws_get_internal_extensions() { return NULL; }
    1218 
    1229 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
    1230 lws_ext_parse_options(const struct lws_extension *ext, struct lws *wsi,
    1231  void *ext_user, const struct lws_ext_options *opts,
    1232  const char *o, int len);
    1233 #endif
    1234 
    1247 LWS_EXTERN
    1249  struct lws_context *context, const struct lws_extension *ext,
    1250  struct lws *wsi, enum lws_extension_callback_reasons reason,
    1251  void *user, void *in, size_t len);
    1252 
    1253 /*
    1254  * The internal exts are part of the public abi
    1255  * If we add more extensions, publish the callback here ------v
    1256  */
    1258 
    1274 
    1279  const char *name;
    1300  unsigned int id;
    1307  void *user;
    1310  /* Add new things just above here ---^
    1311  * This is part of the ABI, don't needlessly break compatibility */
    1312 };
    1313 
    1314 struct lws_vhost;
    1315 
    1324 LWS_VISIBLE LWS_EXTERN const struct lws_protocols *
    1325 lws_vhost_name_to_protocol(struct lws_vhost *vh, const char *name);
    1326 
    1336 LWS_VISIBLE LWS_EXTERN const struct lws_protocols *
    1337 lws_get_protocol(struct lws *wsi);
    1338 
    1340 LWS_VISIBLE LWS_EXTERN const struct lws_protocols *
    1341 lws_protocol_get(struct lws *wsi) LWS_WARN_DEPRECATED;
    1342 
    1353 LWS_VISIBLE LWS_EXTERN void *
    1354 lws_protocol_vh_priv_zalloc(struct lws_vhost *vhost, const struct lws_protocols *prot,
    1355  int size);
    1356 
    1366 LWS_VISIBLE LWS_EXTERN void *
    1367 lws_protocol_vh_priv_get(struct lws_vhost *vhost, const struct lws_protocols *prot);
    1368 
    1377 LWS_VISIBLE LWS_EXTERN int
    1378 lws_finalize_startup(struct lws_context *context);
    1379 
    1380 #ifdef LWS_WITH_PLUGINS
    1381 
    1382 /* PLUGINS implies LIBUV */
    1383 
    1384 #define LWS_PLUGIN_API_MAGIC 180
    1385 
    1388  unsigned int api_magic;
    1389  const struct lws_protocols *protocols;
    1391  const struct lws_extension *extensions;
    1393 };
    1394 
    1395 typedef int (*lws_plugin_init_func)(struct lws_context *,
    1396  struct lws_plugin_capability *);
    1397 typedef int (*lws_plugin_destroy_func)(struct lws_context *);
    1398 
    1400 struct lws_plugin {
    1401  struct lws_plugin *list;
    1402 #if (UV_VERSION_MAJOR > 0)
    1403  uv_lib_t lib;
    1404 #else
    1405  void *l;
    1406 #endif
    1407  char name[64];
    1409 };
    1410 
    1411 #endif
    1412 
    1414 
    1415 
    1424 
    1426 #define LWSGS_EMAIL_CONTENT_SIZE 16384
    1427 
    1429 /* SHA-1 binary and hexified versions */
    1431 typedef struct { unsigned char bin[20]; } lwsgw_hash_bin;
    1433 typedef struct { char id[41]; } lwsgw_hash;
    1434 
    1441 };
    1442 
    1445  char username[32];
    1446  char email[100];
    1447  char ip[72];
    1448  unsigned int mask;
    1450  char session[42];
    1451 };
    1452 
    1457 };
    1458 
    1461  enum lws_gs_event event;
    1462  const char *username;
    1463  const char *email;
    1464 };
    1465 
    1467 
    1468 
    1482 
    1484 /*
    1485  * NOTE: These public enums are part of the abi. If you want to add one,
    1486  * add it at where specified so existing users are unaffected.
    1487  */
    1488 
    1492  (1 << 12),
    1499  (1 << 12),
    1515  (1 << 12),
    1520  (1 << 12),
    1544  /****** add new things just above ---^ ******/
    1545 };
    1546 
    1547 #define lws_check_opt(c, f) (((c) & (f)) == (f))
    1548 
    1559  int port;
    1564  const char *iface;
    1571  const struct lws_protocols *protocols;
    1575  const struct lws_extension *extensions;
    1583  const char *ssl_cert_filepath;
    1593  const char *ssl_ca_filepath;
    1595  const char *ssl_cipher_list;
    1599  const char *http_proxy_address;
    1602  unsigned int http_proxy_port;
    1604  int gid;
    1606  int uid;
    1608  unsigned int options;
    1610  void *user;
    1613  int ka_time;
    1623 #ifdef LWS_OPENSSL_SUPPORT
    1629 #else /* maintain structure layout either way */
    1631 #endif
    1632 
    1643  unsigned int count_threads;
    1645  unsigned int fd_limit_per_thread;
    1649  unsigned int timeout_secs;
    1654  const char *ecdh_curve;
    1656  const char *vhost_name;
    1660  const char * const *plugin_dirs;
    1669  const char *log_filepath;
    1672  const struct lws_http_mount *mounts;
    1674  const char *server_string;
    1677  unsigned int pt_serv_buf_size;
    1692  unsigned short ws_ping_pong_interval;
    1708  /* Add new things just above here ---^
    1709  * This is part of the ABI, don't needlessly break compatibility
    1710  *
    1711  * The below is to ensure later library versions with new
    1712  * members added above will see 0 (default) even if the app
    1713  * was not built against the newer headers.
    1714  */
    1715 
    1716  void *_unused[8];
    1717 };
    1718 
    1753 LWS_VISIBLE LWS_EXTERN struct lws_context *
    1755 
    1764 LWS_VISIBLE LWS_EXTERN void
    1765 lws_context_destroy(struct lws_context *context);
    1766 
    1784 LWS_VISIBLE LWS_EXTERN int
    1785 lws_set_proxy(struct lws_vhost *vhost, const char *proxy);
    1786 
    1787 
    1788 struct lws_vhost;
    1789 
    1799 LWS_EXTERN LWS_VISIBLE struct lws_vhost *
    1800 lws_create_vhost(struct lws_context *context,
    1801  struct lws_context_creation_info *info);
    1802 
    1817 LWS_VISIBLE LWS_EXTERN int
    1818 lwsws_get_config_globals(struct lws_context_creation_info *info, const char *d,
    1819  char **config_strings, int *len);
    1820 
    1836 LWS_VISIBLE LWS_EXTERN int
    1837 lwsws_get_config_vhosts(struct lws_context *context,
    1838  struct lws_context_creation_info *info, const char *d,
    1839  char **config_strings, int *len);
    1840 
    1842 LWS_VISIBLE LWS_EXTERN struct lws_vhost *
    1843 lws_vhost_get(struct lws *wsi) LWS_WARN_DEPRECATED;
    1844 
    1850 LWS_VISIBLE LWS_EXTERN struct lws_vhost *
    1851 lws_get_vhost(struct lws *wsi);
    1852 
    1860 LWS_VISIBLE LWS_EXTERN int
    1861 lws_json_dump_vhost(const struct lws_vhost *vh, char *buf, int len);
    1862 
    1870 LWS_VISIBLE LWS_EXTERN int
    1871 lws_json_dump_context(const struct lws_context *context, char *buf, int len);
    1872 
    1882 LWS_VISIBLE LWS_EXTERN void *
    1883 lws_context_user(struct lws_context *context);
    1884 
    1890 
    1900  const char *name;
    1901  const char *value;
    1902 };
    1903 
    1916 };
    1917 
    1925  const char *mountpoint;
    1927  const char *origin;
    1929  const char *def;
    1931  const char *protocol;
    1947  unsigned int auth_mask;
    1950  unsigned int cache_reusable:1;
    1951  unsigned int cache_revalidate:1;
    1952  unsigned int cache_intermediaries:1;
    1954  unsigned char origin_protocol;
    1955  unsigned char mountpoint_len;
    1956 };
    1959 
    1965 
    1973  LCCSCF_USE_SSL = (1 << 0),
    1974  LCCSCF_ALLOW_SELFSIGNED = (1 << 1),
    1975  LCCSCF_SKIP_SERVER_CERT_HOSTNAME_CHECK = (1 << 2)
    1976 };
    1977 
    1982  struct lws_context *context;
    1984  const char *address;
    1986  int port;
    1990  const char *path;
    1992  const char *host;
    1994  const char *origin;
    1996  const char *protocol;
    2000  void *userdata;
    2004  const char *method;
    2007  struct lws *parent_wsi;
    2011  const char *uri_replace_from;
    2014  const char *uri_replace_to;
    2016  struct lws_vhost *vhost;
    2018  struct lws **pwsi;
    2030  /* Add new things just above here ---^
    2031  * This is part of the ABI, don't needlessly break compatibility
    2032  *
    2033  * The below is to ensure later library versions with new
    2034  * members added above will see 0 (default) even if the app
    2035  * was not built against the newer headers.
    2036  */
    2037 
    2038  void *_unused[4];
    2039 };
    2040 
    2048 LWS_VISIBLE LWS_EXTERN struct lws *
    2050 
    2071 /* deprecated, use lws_client_connect_via_info() */
    2072 LWS_VISIBLE LWS_EXTERN struct lws * LWS_WARN_UNUSED_RESULT
    2073 lws_client_connect(struct lws_context *clients, const char *address,
    2074  int port, int ssl_connection, const char *path,
    2075  const char *host, const char *origin, const char *protocol,
    2076  int ietf_version_or_minus_one) LWS_WARN_DEPRECATED;
    2077 /* deprecated, use lws_client_connect_via_info() */
    2098 LWS_VISIBLE LWS_EXTERN struct lws * LWS_WARN_UNUSED_RESULT
    2099 lws_client_connect_extended(struct lws_context *clients, const char *address,
    2100  int port, int ssl_connection, const char *path,
    2101  const char *host, const char *origin,
    2102  const char *protocol, int ietf_version_or_minus_one,
    2103  void *userdata) LWS_WARN_DEPRECATED;
    2104 
    2130 LWS_VISIBLE LWS_EXTERN int
    2132  struct lws_vhost *vhost);
    2133 
    2134 LWS_VISIBLE LWS_EXTERN int
    2135 lws_http_client_read(struct lws *wsi, char **buf, int *len);
    2136 
    2137 LWS_VISIBLE LWS_EXTERN void
    2138 lws_client_http_body_pending(struct lws *wsi, int something_left_to_send);
    2139 
    2160 
    2169 
    2202 LWS_VISIBLE LWS_EXTERN int
    2203 lws_service(struct lws_context *context, int timeout_ms);
    2204 
    2216 LWS_VISIBLE LWS_EXTERN int
    2217 lws_service_tsi(struct lws_context *context, int timeout_ms, int tsi);
    2218 
    2234 LWS_VISIBLE LWS_EXTERN void
    2235 lws_cancel_service_pt(struct lws *wsi);
    2236 
    2248 LWS_VISIBLE LWS_EXTERN void
    2249 lws_cancel_service(struct lws_context *context);
    2250 
    2273 LWS_VISIBLE LWS_EXTERN int
    2274 lws_service_fd(struct lws_context *context, struct lws_pollfd *pollfd);
    2275 
    2285 LWS_VISIBLE LWS_EXTERN int
    2286 lws_service_fd_tsi(struct lws_context *context, struct lws_pollfd *pollfd,
    2287  int tsi);
    2288 
    2290 
    2296 
    2303 
    2315 LWS_VISIBLE LWS_EXTERN const char *
    2316 lws_get_mimetype(const char *file, const struct lws_http_mount *m);
    2317 
    2336 LWS_VISIBLE LWS_EXTERN int
    2337 lws_serve_http_file(struct lws *wsi, const char *file, const char *content_type,
    2338  const char *other_headers, int other_headers_len);
    2339 LWS_VISIBLE LWS_EXTERN int
    2340 lws_serve_http_file_fragment(struct lws *wsi);
    2342 
    2353 
    2354 enum http_status {
    2355  HTTP_STATUS_OK = 200,
    2356  HTTP_STATUS_NO_CONTENT = 204,
    2357 
    2358  HTTP_STATUS_MOVED_PERMANENTLY = 301,
    2359  HTTP_STATUS_FOUND = 302,
    2360  HTTP_STATUS_SEE_OTHER = 303,
    2361 
    2362  HTTP_STATUS_BAD_REQUEST = 400,
    2363  HTTP_STATUS_UNAUTHORIZED,
    2364  HTTP_STATUS_PAYMENT_REQUIRED,
    2365  HTTP_STATUS_FORBIDDEN,
    2366  HTTP_STATUS_NOT_FOUND,
    2367  HTTP_STATUS_METHOD_NOT_ALLOWED,
    2368  HTTP_STATUS_NOT_ACCEPTABLE,
    2369  HTTP_STATUS_PROXY_AUTH_REQUIRED,
    2370  HTTP_STATUS_REQUEST_TIMEOUT,
    2371  HTTP_STATUS_CONFLICT,
    2372  HTTP_STATUS_GONE,
    2373  HTTP_STATUS_LENGTH_REQUIRED,
    2374  HTTP_STATUS_PRECONDITION_FAILED,
    2375  HTTP_STATUS_REQ_ENTITY_TOO_LARGE,
    2376  HTTP_STATUS_REQ_URI_TOO_LONG,
    2377  HTTP_STATUS_UNSUPPORTED_MEDIA_TYPE,
    2378  HTTP_STATUS_REQ_RANGE_NOT_SATISFIABLE,
    2379  HTTP_STATUS_EXPECTATION_FAILED,
    2380 
    2381  HTTP_STATUS_INTERNAL_SERVER_ERROR = 500,
    2382  HTTP_STATUS_NOT_IMPLEMENTED,
    2383  HTTP_STATUS_BAD_GATEWAY,
    2384  HTTP_STATUS_SERVICE_UNAVAILABLE,
    2385  HTTP_STATUS_GATEWAY_TIMEOUT,
    2386  HTTP_STATUS_HTTP_VERSION_NOT_SUPPORTED,
    2387 };
    2388 
    2390  char *p;
    2391  int len;
    2392  int max_len;
    2393  int final;
    2394 };
    2395 
    2396 typedef const char *(*lws_process_html_state_cb)(void *data, int index);
    2397 
    2399  char *start;
    2400  char swallow[16];
    2401  int pos;
    2402  void *data;
    2403  const char * const *vars;
    2406  lws_process_html_state_cb replace;
    2407 };
    2408 
    2413 LWS_VISIBLE LWS_EXTERN int
    2415  struct lws_process_html_state *s);
    2417 
    2450 
    2458 struct lws_tokens {
    2459  char *token;
    2461 };
    2462 
    2463 /* enum lws_token_indexes
    2464  * these have to be kept in sync with lextable.h / minilex.c
    2465  *
    2466  * NOTE: These public enums are part of the abi. If you want to add one,
    2467  * add it at where specified so existing users are unaffected.
    2468  */
    2469 enum lws_token_indexes {
    2470  WSI_TOKEN_GET_URI = 0,
    2471  WSI_TOKEN_POST_URI = 1,
    2472  WSI_TOKEN_OPTIONS_URI = 2,
    2473  WSI_TOKEN_HOST = 3,
    2474  WSI_TOKEN_CONNECTION = 4,
    2475  WSI_TOKEN_UPGRADE = 5,
    2476  WSI_TOKEN_ORIGIN = 6,
    2477  WSI_TOKEN_DRAFT = 7,
    2478  WSI_TOKEN_CHALLENGE = 8,
    2479  WSI_TOKEN_EXTENSIONS = 9,
    2480  WSI_TOKEN_KEY1 = 10,
    2481  WSI_TOKEN_KEY2 = 11,
    2482  WSI_TOKEN_PROTOCOL = 12,
    2483  WSI_TOKEN_ACCEPT = 13,
    2484  WSI_TOKEN_NONCE = 14,
    2485  WSI_TOKEN_HTTP = 15,
    2486  WSI_TOKEN_HTTP2_SETTINGS = 16,
    2487  WSI_TOKEN_HTTP_ACCEPT = 17,
    2488  WSI_TOKEN_HTTP_AC_REQUEST_HEADERS = 18,
    2489  WSI_TOKEN_HTTP_IF_MODIFIED_SINCE = 19,
    2490  WSI_TOKEN_HTTP_IF_NONE_MATCH = 20,
    2491  WSI_TOKEN_HTTP_ACCEPT_ENCODING = 21,
    2492  WSI_TOKEN_HTTP_ACCEPT_LANGUAGE = 22,
    2493  WSI_TOKEN_HTTP_PRAGMA = 23,
    2494  WSI_TOKEN_HTTP_CACHE_CONTROL = 24,
    2495  WSI_TOKEN_HTTP_AUTHORIZATION = 25,
    2496  WSI_TOKEN_HTTP_COOKIE = 26,
    2497  WSI_TOKEN_HTTP_CONTENT_LENGTH = 27,
    2498  WSI_TOKEN_HTTP_CONTENT_TYPE = 28,
    2499  WSI_TOKEN_HTTP_DATE = 29,
    2500  WSI_TOKEN_HTTP_RANGE = 30,
    2501  WSI_TOKEN_HTTP_REFERER = 31,
    2502  WSI_TOKEN_KEY = 32,
    2503  WSI_TOKEN_VERSION = 33,
    2504  WSI_TOKEN_SWORIGIN = 34,
    2505 
    2506  WSI_TOKEN_HTTP_COLON_AUTHORITY = 35,
    2507  WSI_TOKEN_HTTP_COLON_METHOD = 36,
    2508  WSI_TOKEN_HTTP_COLON_PATH = 37,
    2509  WSI_TOKEN_HTTP_COLON_SCHEME = 38,
    2510  WSI_TOKEN_HTTP_COLON_STATUS = 39,
    2511 
    2512  WSI_TOKEN_HTTP_ACCEPT_CHARSET = 40,
    2513  WSI_TOKEN_HTTP_ACCEPT_RANGES = 41,
    2514  WSI_TOKEN_HTTP_ACCESS_CONTROL_ALLOW_ORIGIN = 42,
    2515  WSI_TOKEN_HTTP_AGE = 43,
    2516  WSI_TOKEN_HTTP_ALLOW = 44,
    2517  WSI_TOKEN_HTTP_CONTENT_DISPOSITION = 45,
    2518  WSI_TOKEN_HTTP_CONTENT_ENCODING = 46,
    2519  WSI_TOKEN_HTTP_CONTENT_LANGUAGE = 47,
    2520  WSI_TOKEN_HTTP_CONTENT_LOCATION = 48,
    2521  WSI_TOKEN_HTTP_CONTENT_RANGE = 49,
    2522  WSI_TOKEN_HTTP_ETAG = 50,
    2523  WSI_TOKEN_HTTP_EXPECT = 51,
    2524  WSI_TOKEN_HTTP_EXPIRES = 52,
    2525  WSI_TOKEN_HTTP_FROM = 53,
    2526  WSI_TOKEN_HTTP_IF_MATCH = 54,
    2527  WSI_TOKEN_HTTP_IF_RANGE = 55,
    2528  WSI_TOKEN_HTTP_IF_UNMODIFIED_SINCE = 56,
    2529  WSI_TOKEN_HTTP_LAST_MODIFIED = 57,
    2530  WSI_TOKEN_HTTP_LINK = 58,
    2531  WSI_TOKEN_HTTP_LOCATION = 59,
    2532  WSI_TOKEN_HTTP_MAX_FORWARDS = 60,
    2533  WSI_TOKEN_HTTP_PROXY_AUTHENTICATE = 61,
    2534  WSI_TOKEN_HTTP_PROXY_AUTHORIZATION = 62,
    2535  WSI_TOKEN_HTTP_REFRESH = 63,
    2536  WSI_TOKEN_HTTP_RETRY_AFTER = 64,
    2537  WSI_TOKEN_HTTP_SERVER = 65,
    2538  WSI_TOKEN_HTTP_SET_COOKIE = 66,
    2539  WSI_TOKEN_HTTP_STRICT_TRANSPORT_SECURITY = 67,
    2540  WSI_TOKEN_HTTP_TRANSFER_ENCODING = 68,
    2541  WSI_TOKEN_HTTP_USER_AGENT = 69,
    2542  WSI_TOKEN_HTTP_VARY = 70,
    2543  WSI_TOKEN_HTTP_VIA = 71,
    2544  WSI_TOKEN_HTTP_WWW_AUTHENTICATE = 72,
    2545 
    2546  WSI_TOKEN_PATCH_URI = 73,
    2547  WSI_TOKEN_PUT_URI = 74,
    2548  WSI_TOKEN_DELETE_URI = 75,
    2549 
    2550  WSI_TOKEN_HTTP_URI_ARGS = 76,
    2551  WSI_TOKEN_PROXY = 77,
    2552  WSI_TOKEN_HTTP_X_REAL_IP = 78,
    2553  WSI_TOKEN_HTTP1_0 = 79,
    2554 
    2555  /****** add new things just above ---^ ******/
    2556 
    2557  /* use token storage to stash these internally, not for
    2558  * user use */
    2559 
    2560  _WSI_TOKEN_CLIENT_SENT_PROTOCOLS,
    2561  _WSI_TOKEN_CLIENT_PEER_ADDRESS,
    2562  _WSI_TOKEN_CLIENT_URI,
    2563  _WSI_TOKEN_CLIENT_HOST,
    2564  _WSI_TOKEN_CLIENT_ORIGIN,
    2565  _WSI_TOKEN_CLIENT_METHOD,
    2566 
    2567  /* always last real token index*/
    2568  WSI_TOKEN_COUNT,
    2569 
    2570  /* parser state additions, no storage associated */
    2571  WSI_TOKEN_NAME_PART,
    2572  WSI_TOKEN_SKIPPING,
    2573  WSI_TOKEN_SKIPPING_SAW_CR,
    2574  WSI_PARSING_COMPLETE,
    2575  WSI_INIT_TOKEN_MUXURL,
    2576 };
    2577 
    2579  unsigned short token_limit[WSI_TOKEN_COUNT];
    2580 };
    2581 
    2587 LWS_VISIBLE LWS_EXTERN const unsigned char *
    2588 lws_token_to_string(enum lws_token_indexes token);
    2589 
    2590 
    2599 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
    2600 lws_hdr_total_length(struct lws *wsi, enum lws_token_indexes h);
    2601 
    2611 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
    2612 lws_hdr_fragment_length(struct lws *wsi, enum lws_token_indexes h, int frag_idx);
    2613 
    2627 LWS_VISIBLE LWS_EXTERN int
    2628 lws_hdr_copy(struct lws *wsi, char *dest, int len, enum lws_token_indexes h);
    2629 
    2647 LWS_VISIBLE LWS_EXTERN int
    2648 lws_hdr_copy_fragment(struct lws *wsi, char *dest, int len,
    2649  enum lws_token_indexes h, int frag_idx);
    2650 
    2661 LWS_VISIBLE LWS_EXTERN const char *
    2662 lws_get_urlarg_by_name(struct lws *wsi, const char *name, char *buf, int len);
    2664 
    2679 
    2690 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
    2691 lws_add_http_header_status(struct lws *wsi,
    2692  unsigned int code, unsigned char **p,
    2693  unsigned char *end);
    2706 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
    2707 lws_add_http_header_by_name(struct lws *wsi, const unsigned char *name,
    2708  const unsigned char *value, int length,
    2709  unsigned char **p, unsigned char *end);
    2723 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
    2724 lws_add_http_header_by_token(struct lws *wsi, enum lws_token_indexes token,
    2725  const unsigned char *value, int length,
    2726  unsigned char **p, unsigned char *end);
    2737 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
    2738 lws_add_http_header_content_length(struct lws *wsi,
    2739  unsigned long content_length,
    2740  unsigned char **p, unsigned char *end);
    2750 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
    2751 lws_finalize_http_header(struct lws *wsi, unsigned char **p,
    2752  unsigned char *end);
    2754 
    2773 
    2783 };
    2784 
    2798 typedef int (*lws_spa_fileupload_cb)(void *data, const char *name,
    2799  const char *filename, char *buf, int len,
    2800  enum lws_spa_fileupload_states state);
    2801 
    2804 struct lws_spa;
    2805 
    2824 LWS_VISIBLE LWS_EXTERN struct lws_spa *
    2825 lws_spa_create(struct lws *wsi, const char * const *param_names,
    2826  int count_params, int max_storage, lws_spa_fileupload_cb opt_cb,
    2827  void *opt_data);
    2828 
    2836 LWS_VISIBLE LWS_EXTERN int
    2837 lws_spa_process(struct lws_spa *spa, const char *in, int len);
    2838 
    2844 LWS_VISIBLE LWS_EXTERN int
    2845 lws_spa_finalize(struct lws_spa *spa);
    2846 
    2853 LWS_VISIBLE LWS_EXTERN int
    2854 lws_spa_get_length(struct lws_spa *spa, int n);
    2855 
    2861 LWS_VISIBLE LWS_EXTERN const char *
    2862 lws_spa_get_string(struct lws_spa *spa, int n);
    2863 
    2869 LWS_VISIBLE LWS_EXTERN int
    2870 lws_spa_destroy(struct lws_spa *spa);
    2872 
    2883 
    2894 LWS_VISIBLE LWS_EXTERN const char *
    2895 lws_urlencode(char *escaped, const char *string, int len);
    2896 
    2897 /*
    2898  * URLDECODE 1 / 2
    2899  *
    2900  * This simple urldecode only operates until the first '\0' and requires the
    2901  * data to exist all at once
    2902  */
    2915 LWS_VISIBLE LWS_EXTERN int
    2916 lws_urldecode(char *string, const char *escaped, int len);
    2918 
    2927 LWS_VISIBLE LWS_EXTERN int
    2928 lws_return_http_status(struct lws *wsi, unsigned int code,
    2929  const char *html_body);
    2930 
    2941 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
    2942 lws_http_redirect(struct lws *wsi, int code, const unsigned char *loc, int len,
    2943  unsigned char **p, unsigned char *end);
    2944 
    2953 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
    2954 lws_http_transaction_completed(struct lws *wsi);
    2956 
    2964 
    2975 LWS_VISIBLE LWS_EXTERN const char *
    2976 lws_sql_purify(char *escaped, const char *string, int len);
    2977 
    2988 LWS_VISIBLE LWS_EXTERN const char *
    2989 lws_json_purify(char *escaped, const char *string, int len);
    2991 
    2998 
    3000 #ifdef LWS_USE_LIBEV
    3001 typedef void (lws_ev_signal_cb_t)(EV_P_ struct ev_signal *w, int revents);
    3002 
    3003 LWS_VISIBLE LWS_EXTERN int
    3004 lws_ev_sigint_cfg(struct lws_context *context, int use_ev_sigint,
    3005  lws_ev_signal_cb_t *cb);
    3006 
    3007 LWS_VISIBLE LWS_EXTERN int
    3008 lws_ev_initloop(struct lws_context *context, struct ev_loop *loop, int tsi);
    3009 
    3010 LWS_VISIBLE LWS_EXTERN void
    3011 lws_ev_sigint_cb(struct ev_loop *loop, struct ev_signal *watcher, int revents);
    3012 #endif /* LWS_USE_LIBEV */
    3013 
    3015 
    3022 #ifdef LWS_USE_LIBUV
    3024 LWS_VISIBLE LWS_EXTERN int
    3025 lws_uv_sigint_cfg(struct lws_context *context, int use_uv_sigint,
    3026  uv_signal_cb cb);
    3027 
    3028 LWS_VISIBLE LWS_EXTERN void
    3029 lws_libuv_run(const struct lws_context *context, int tsi);
    3030 
    3031 LWS_VISIBLE LWS_EXTERN void
    3032 lws_libuv_stop(struct lws_context *context);
    3033 
    3034 LWS_VISIBLE LWS_EXTERN int
    3035 lws_uv_initloop(struct lws_context *context, uv_loop_t *loop, int tsi);
    3036 
    3037 LWS_VISIBLE LWS_EXTERN uv_loop_t *
    3038 lws_uv_getloop(struct lws_context *context, int tsi);
    3039 
    3040 LWS_VISIBLE LWS_EXTERN void
    3041 lws_uv_sigint_cb(uv_signal_t *watcher, int signum);
    3042 #endif /* LWS_USE_LIBUV */
    3043 
    3050 
    3051 /*
    3052  * NOTE: These public enums are part of the abi. If you want to add one,
    3053  * add it at where specified so existing users are unaffected.
    3054  */
    3055 enum pending_timeout {
    3056  NO_PENDING_TIMEOUT = 0,
    3057  PENDING_TIMEOUT_AWAITING_PROXY_RESPONSE = 1,
    3058  PENDING_TIMEOUT_AWAITING_CONNECT_RESPONSE = 2,
    3059  PENDING_TIMEOUT_ESTABLISH_WITH_SERVER = 3,
    3060  PENDING_TIMEOUT_AWAITING_SERVER_RESPONSE = 4,
    3061  PENDING_TIMEOUT_AWAITING_PING = 5,
    3062  PENDING_TIMEOUT_CLOSE_ACK = 6,
    3063  PENDING_TIMEOUT_AWAITING_EXTENSION_CONNECT_RESPONSE = 7,
    3064  PENDING_TIMEOUT_SENT_CLIENT_HANDSHAKE = 8,
    3065  PENDING_TIMEOUT_SSL_ACCEPT = 9,
    3066  PENDING_TIMEOUT_HTTP_CONTENT = 10,
    3067  PENDING_TIMEOUT_AWAITING_CLIENT_HS_SEND = 11,
    3068  PENDING_FLUSH_STORED_SEND_BEFORE_CLOSE = 12,
    3069  PENDING_TIMEOUT_SHUTDOWN_FLUSH = 13,
    3070  PENDING_TIMEOUT_CGI = 14,
    3071  PENDING_TIMEOUT_HTTP_KEEPALIVE_IDLE = 15,
    3072  PENDING_TIMEOUT_WS_PONG_CHECK_SEND_PING = 16,
    3073  PENDING_TIMEOUT_WS_PONG_CHECK_GET_PONG = 17,
    3074  PENDING_TIMEOUT_CLIENT_ISSUE_PAYLOAD = 18,
    3075 
    3076  /****** add new things just above ---^ ******/
    3077 };
    3078 
    3088 LWS_VISIBLE LWS_EXTERN void
    3089 lws_set_timeout(struct lws *wsi, enum pending_timeout reason, int secs);
    3091 
    3097 #if !defined(LWS_SIZEOFPTR)
    3098 #define LWS_SIZEOFPTR (sizeof (void *))
    3099 #endif
    3100 #if !defined(u_int64_t)
    3101 #define u_int64_t unsigned long long
    3102 #endif
    3103 
    3104 #if defined(__x86_64__)
    3105 #define _LWS_PAD_SIZE 16 /* Intel recommended for best performance */
    3106 #else
    3107 #define _LWS_PAD_SIZE LWS_SIZEOFPTR /* Size of a pointer on the target arch */
    3108 #endif
    3109 #define _LWS_PAD(n) (((n) % _LWS_PAD_SIZE) ? \
    3110  ((n) + (_LWS_PAD_SIZE - ((n) % _LWS_PAD_SIZE))) : (n))
    3111 #define LWS_PRE _LWS_PAD(4 + 10)
    3112 /* used prior to 1.7 and retained for backward compatibility */
    3113 #define LWS_SEND_BUFFER_PRE_PADDING LWS_PRE
    3114 #define LWS_SEND_BUFFER_POST_PADDING 0
    3115 
    3116 /*
    3117  * NOTE: These public enums are part of the abi. If you want to add one,
    3118  * add it at where specified so existing users are unaffected.
    3119  */
    3134  /* LWS_WRITE_CLOSE is handled by lws_close_reason() */
    3135  LWS_WRITE_PING = 5,
    3136  LWS_WRITE_PONG = 6,
    3137 
    3138  /* Same as write_http but we know this write ends the transaction */
    3139  LWS_WRITE_HTTP_FINAL = 7,
    3140 
    3141  /* HTTP2 */
    3142 
    3150  /****** add new things just above ---^ ******/
    3151 
    3152  /* flags */
    3153 
    3161 };
    3162 
    3163 
    3235 LWS_VISIBLE LWS_EXTERN int
    3236 lws_write(struct lws *wsi, unsigned char *buf, size_t len,
    3237  enum lws_write_protocol protocol);
    3238 
    3239 /* helper for case where buffer may be const */
    3240 #define lws_write_http(wsi, buf, len) \
    3241  lws_write(wsi, (unsigned char *)(buf), len, LWS_WRITE_HTTP)
    3242 
    3244 
    3263 
    3276 LWS_VISIBLE LWS_EXTERN int
    3277 lws_callback_on_writable(struct lws *wsi);
    3278 
    3292 LWS_VISIBLE LWS_EXTERN int
    3293 lws_callback_on_writable_all_protocol(const struct lws_context *context,
    3294  const struct lws_protocols *protocol);
    3295 
    3309 LWS_VISIBLE LWS_EXTERN int
    3310 lws_callback_on_writable_all_protocol_vhost(const struct lws_vhost *vhost,
    3311  const struct lws_protocols *protocol);
    3312 
    3325 LWS_VISIBLE LWS_EXTERN int
    3326 lws_callback_all_protocol(struct lws_context *context,
    3327  const struct lws_protocols *protocol, int reason);
    3328 
    3341 LWS_VISIBLE LWS_EXTERN int
    3342 lws_callback_all_protocol_vhost(struct lws_vhost *vh,
    3343  const struct lws_protocols *protocol, int reason);
    3344 
    3358 LWS_VISIBLE LWS_EXTERN int
    3359 lws_callback_vhost_protocols(struct lws *wsi, int reason, void *in, int len);
    3360 
    3361 LWS_VISIBLE LWS_EXTERN int
    3362 lws_callback_http_dummy(struct lws *wsi, enum lws_callback_reasons reason,
    3363  void *user, void *in, size_t len);
    3364 
    3372 LWS_VISIBLE LWS_EXTERN int
    3373 lws_get_socket_fd(struct lws *wsi);
    3374 
    3396 LWS_VISIBLE LWS_EXTERN size_t
    3397 lws_get_peer_write_allowance(struct lws *wsi);
    3399 
    3410 LWS_VISIBLE LWS_EXTERN int
    3411 lws_rx_flow_control(struct lws *wsi, int enable);
    3412 
    3422 LWS_VISIBLE LWS_EXTERN void
    3423 lws_rx_flow_allow_all_protocol(const struct lws_context *context,
    3424  const struct lws_protocols *protocol);
    3425 
    3442 LWS_VISIBLE LWS_EXTERN size_t
    3443 lws_remaining_packet_payload(struct lws *wsi);
    3444 
    3445 
    3454 
    3467 LWS_VISIBLE LWS_EXTERN struct lws *
    3468 lws_adopt_socket(struct lws_context *context, lws_sockfd_type accept_fd);
    3491 LWS_VISIBLE LWS_EXTERN struct lws *
    3492 lws_adopt_socket_readbuf(struct lws_context *context, lws_sockfd_type accept_fd,
    3493  const char *readbuf, size_t len);
    3495 
    3501 
    3512 LWS_VISIBLE LWS_EXTERN const char * LWS_WARN_UNUSED_RESULT
    3513 lws_canonical_hostname(struct lws_context *context);
    3514 
    3529 LWS_VISIBLE LWS_EXTERN void
    3530 lws_get_peer_addresses(struct lws *wsi, lws_sockfd_type fd, char *name,
    3531  int name_len, char *rip, int rip_len);
    3532 
    3543 LWS_VISIBLE LWS_EXTERN const char *
    3544 lws_get_peer_simple(struct lws *wsi, char *name, int namelen);
    3545 #ifndef LWS_WITH_ESP8266
    3546 
    3557 LWS_VISIBLE LWS_EXTERN int
    3558 lws_interface_to_sa(int ipv6, const char *ifname, struct sockaddr_in *addr,
    3559  size_t addrlen);
    3561 #endif
    3562 
    3568 
    3581 LWS_VISIBLE LWS_EXTERN int
    3582 lws_snprintf(char *str, size_t size, const char *format, ...);
    3583 
    3595 LWS_VISIBLE LWS_EXTERN int
    3596 lws_get_random(struct lws_context *context, void *buf, int len);
    3604 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
    3605 lws_daemonize(const char *_lock_path);
    3611 LWS_VISIBLE LWS_EXTERN const char * LWS_WARN_UNUSED_RESULT
    3613 
    3620 LWS_VISIBLE LWS_EXTERN void *
    3621 lws_wsi_user(struct lws *wsi);
    3622 
    3634 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
    3635 lws_parse_uri(char *p, const char **prot, const char **ads, int *port,
    3636  const char **path);
    3637 
    3641 LWS_VISIBLE LWS_EXTERN unsigned long
    3642 lws_now_secs(void);
    3643 
    3653 LWS_VISIBLE LWS_EXTERN struct lws_context * LWS_WARN_UNUSED_RESULT
    3654 lws_get_context(const struct lws *wsi);
    3655 
    3665 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
    3666 lws_get_count_threads(struct lws_context *context);
    3667 
    3675 LWS_VISIBLE LWS_EXTERN struct lws * LWS_WARN_UNUSED_RESULT
    3676 lws_get_parent(const struct lws *wsi);
    3677 
    3684 LWS_VISIBLE LWS_EXTERN struct lws * LWS_WARN_UNUSED_RESULT
    3685 lws_get_child(const struct lws *wsi);
    3686 
    3687 
    3688 /*
    3689  * \deprecated DEPRECATED Note: this is not normally needed as a user api.
    3690  * It's provided in case it is
    3691  * useful when integrating with other app poll loop service code.
    3692  */
    3693 LWS_VISIBLE LWS_EXTERN int
    3694 lws_read(struct lws *wsi, unsigned char *buf, size_t len);
    3695 
    3703 LWS_VISIBLE LWS_EXTERN void
    3704 lws_set_allocator(void *(*realloc)(void *ptr, size_t size));
    3706 
    3712 
    3719 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
    3720 lws_send_pipe_choked(struct lws *wsi);
    3721 
    3726 LWS_VISIBLE LWS_EXTERN int
    3727 lws_is_final_fragment(struct lws *wsi);
    3728 
    3733 LWS_VISIBLE LWS_EXTERN unsigned char
    3734 lws_get_reserved_bits(struct lws *wsi);
    3735 
    3752 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
    3753 lws_partial_buffered(struct lws *wsi);
    3754 
    3764 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
    3765 lws_frame_is_binary(struct lws *wsi);
    3766 
    3775 LWS_VISIBLE LWS_EXTERN int
    3776 lws_is_ssl(struct lws *wsi);
    3781 LWS_VISIBLE LWS_EXTERN int
    3782 lws_is_cgi(struct lws *wsi);
    3784 
    3785 
    3791 #ifdef LWS_SHA1_USE_OPENSSL_NAME
    3793 #define lws_SHA1 SHA1
    3794 #else
    3795 
    3804 LWS_VISIBLE LWS_EXTERN unsigned char *
    3805 lws_SHA1(const unsigned char *d, size_t n, unsigned char *md);
    3806 #endif
    3807 
    3817 LWS_VISIBLE LWS_EXTERN int
    3818 lws_b64_encode_string(const char *in, int in_len, char *out, int out_size);
    3828 LWS_VISIBLE LWS_EXTERN int
    3829 lws_b64_decode_string(const char *in, char *out, int out_size);
    3831 
    3832 
    3842 #ifdef LWS_WITH_CGI
    3843 enum lws_enum_stdinouterr {
    3844  LWS_STDIN = 0,
    3845  LWS_STDOUT = 1,
    3846  LWS_STDERR = 2,
    3847 };
    3848 
    3849 enum lws_cgi_hdr_state {
    3850  LCHS_HEADER,
    3851  LCHS_CR1,
    3852  LCHS_LF1,
    3853  LCHS_CR2,
    3854  LCHS_LF2,
    3855  LHCS_PAYLOAD,
    3856  LCHS_SINGLE_0A,
    3857 };
    3858 
    3860  struct lws **stdwsi;
    3861  enum lws_enum_stdinouterr ch;
    3862  unsigned char *data;
    3863  enum lws_cgi_hdr_state hdr_state;
    3864  int len;
    3865 };
    3866 
    3867 
    3877 LWS_VISIBLE LWS_EXTERN int
    3878 lws_cgi(struct lws *wsi, const char * const *exec_array,
    3879  int script_uri_path_len, int timeout_secs,
    3880  const struct lws_protocol_vhost_options *mp_cgienv);
    3881 
    3887 LWS_VISIBLE LWS_EXTERN int
    3888 lws_cgi_write_split_stdout_headers(struct lws *wsi);
    3889 
    3895 LWS_VISIBLE LWS_EXTERN int
    3896 lws_cgi_kill(struct lws *wsi);
    3897 #endif
    3898 
    3900 
    3917 
    3924  lws_filefd_type (*open)(struct lws *wsi, const char *filename,
    3925  unsigned long *filelen, int flags);
    3929  int (*close)(struct lws *wsi, lws_filefd_type fd);
    3931  unsigned long (*seek_cur)(struct lws *wsi, lws_filefd_type fd,
    3932  long offset_from_cur_pos);
    3934  int (*read)(struct lws *wsi, lws_filefd_type fd, unsigned long *amount,
    3935  unsigned char *buf, unsigned long len);
    3937  int (*write)(struct lws *wsi, lws_filefd_type fd, unsigned long *amount,
    3938  unsigned char *buf, unsigned long len);
    3941  /* Add new things just above here ---^
    3942  * This is part of the ABI, don't needlessly break compatibility */
    3943 };
    3944 
    3950 LWS_VISIBLE LWS_EXTERN struct lws_plat_file_ops * LWS_WARN_UNUSED_RESULT
    3951 lws_get_fops(struct lws_context *context);
    3952 
    3961 static LWS_INLINE lws_filefd_type LWS_WARN_UNUSED_RESULT
    3962 lws_plat_file_open(struct lws *wsi, const char *filename,
    3963  unsigned long *filelen, int flags)
    3964 {
    3965  return lws_get_fops(lws_get_context(wsi))->open(wsi, filename,
    3966  filelen, flags);
    3967 }
    3968 
    3975 static LWS_INLINE int
    3976 lws_plat_file_close(struct lws *wsi, lws_filefd_type fd)
    3977 {
    3978  return lws_get_fops(lws_get_context(wsi))->close(wsi, fd);
    3979 }
    3980 
    3988 static LWS_INLINE unsigned long
    3989 lws_plat_file_seek_cur(struct lws *wsi, lws_filefd_type fd, long offset)
    3990 {
    3991  return lws_get_fops(lws_get_context(wsi))->seek_cur(wsi, fd, offset);
    3992 }
    4002 static LWS_INLINE int LWS_WARN_UNUSED_RESULT
    4003 lws_plat_file_read(struct lws *wsi, lws_filefd_type fd, unsigned long *amount,
    4004  unsigned char *buf, unsigned long len)
    4005 {
    4006  return lws_get_fops(lws_get_context(wsi))->read(wsi, fd, amount, buf,
    4007  len);
    4008 }
    4018 static LWS_INLINE int LWS_WARN_UNUSED_RESULT
    4019 lws_plat_file_write(struct lws *wsi, lws_filefd_type fd, unsigned long *amount,
    4020  unsigned char *buf, unsigned long len)
    4021 {
    4022  return lws_get_fops(lws_get_context(wsi))->write(wsi, fd, amount, buf,
    4023  len);
    4024 }
    4026 
    4058 #ifdef LWS_WITH_SMTP
    4059 
    4071 };
    4072 
    4074 struct lws_email {
    4075  void *data;
    4077  uv_loop_t *loop;
    4080  char email_smtp_ip[32];
    4081  char email_helo[32];
    4082  char email_from[100];
    4083  char email_to[100];
    4085  unsigned int max_content_size;
    4088  /* Fill all the callbacks before init */
    4089 
    4090  int (*on_next)(struct lws_email *email);
    4095  int (*on_sent)(struct lws_email *email);
    4100  int (*on_get_body)(struct lws_email *email, char *buf, int len);
    4106  /* private things */
    4107  uv_timer_t timeout_email;
    4109  uv_connect_t email_connect_req;
    4110  uv_tcp_t email_client;
    4112  char email_buf[256];
    4113  char *content;
    4114 };
    4115 
    4125 LWS_VISIBLE LWS_EXTERN int
    4126 lws_email_init(struct lws_email *email, uv_loop_t *loop, int max_content);
    4127 
    4136 LWS_VISIBLE LWS_EXTERN void
    4137 lws_email_check(struct lws_email *email);
    4145 LWS_VISIBLE LWS_EXTERN void
    4146 lws_email_destroy(struct lws_email *email);
    4147 
    4148 #endif
    4149 
    4150 
    4151 #ifdef __cplusplus
    4152 }
    4153 #endif
    4154 
    4155 #endif
    LWS_VISIBLE LWS_EXTERN int lws_spa_destroy(struct lws_spa *spa)
    LWS_VISIBLE LWS_EXTERN const char * lws_json_purify(char *escaped, const char *string, int len)
    -
    Definition: libwebsockets.h:3845
    +
    Definition: libwebsockets.h:3859
    size_t rx_buffer_size
    Definition: libwebsockets.h:1291
    LWS_VISIBLE LWS_EXTERN struct lws_spa * lws_spa_create(struct lws *wsi, const char *const *param_names, int count_params, int max_storage, lws_spa_fileupload_cb opt_cb, void *opt_data)
    LWS_VISIBLE LWS_EXTERN struct lws_vhost * lws_vhost_get(struct lws *wsi) LWS_WARN_DEPRECATED
    @@ -83,14 +83,14 @@ $(document).ready(function(){initNavTree('libwebsockets_8h_source.html','');});
    LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT lws_daemonize(const char *_lock_path)
    Definition: libwebsockets.h:1912
    Definition: libwebsockets.h:3131
    -
    Definition: libwebsockets.h:4050
    +
    Definition: libwebsockets.h:4064
    LWS_VISIBLE LWS_EXTERN struct lws * lws_adopt_socket_readbuf(struct lws_context *context, lws_sockfd_type accept_fd, const char *readbuf, size_t len)
    Definition: libwebsockets.h:233
    unsigned int auth_mask
    Definition: libwebsockets.h:1947
    Definition: libwebsockets.h:3154
    -
    void * data
    Definition: libwebsockets.h:4061
    +
    void * data
    Definition: libwebsockets.h:4075
    const char * uri_replace_from
    Definition: libwebsockets.h:2011
    -
    int(* write)(struct lws *wsi, lws_filefd_type fd, unsigned long *amount, unsigned char *buf, unsigned long len)
    Definition: libwebsockets.h:3923
    +
    int(* write)(struct lws *wsi, lws_filefd_type fd, unsigned long *amount, unsigned char *buf, unsigned long len)
    Definition: libwebsockets.h:3937
    lws_callback_reasons
    Definition: libwebsockets.h:660
    LWS_VISIBLE LWS_EXTERN int lws_hdr_copy_fragment(struct lws *wsi, char *dest, int len, enum lws_token_indexes h, int frag_idx)
    @@ -109,7 +109,7 @@ $(document).ready(function(){initNavTree('libwebsockets_8h_source.html','');});
    LWS_VISIBLE LWS_EXTERN size_t lws_get_peer_write_allowance(struct lws *wsi)
    Definition: libwebsockets.h:744
    LWS_VISIBLE LWS_EXTERN const char *LWS_WARN_UNUSED_RESULT lws_get_library_version(void)
    -
    int(* on_sent)(struct lws_email *email)
    Definition: libwebsockets.h:4081
    +
    int(* on_sent)(struct lws_email *email)
    Definition: libwebsockets.h:4095
    Definition: libwebsockets.h:1431
    struct lws ** pwsi
    Definition: libwebsockets.h:2018
    Definition: libwebsockets.h:778
    @@ -118,7 +118,7 @@ $(document).ready(function(){initNavTree('libwebsockets_8h_source.html','');});
    Definition: libwebsockets.h:579
    Definition: libwebsockets.h:1387
    LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT lws_ext_parse_options(const struct lws_extension *ext, struct lws *wsi, void *ext_user, const struct lws_ext_options *opts, const char *o, int len)
    -
    time_t email_connect_started
    Definition: libwebsockets.h:4097
    +
    time_t email_connect_started
    Definition: libwebsockets.h:4111
    lws_close_status
    Definition: libwebsockets.h:550
    LWS_VISIBLE LWS_EXTERN int lws_callback_all_protocol(struct lws_context *context, const struct lws_protocols *protocol, int reason)
    Definition: libwebsockets.h:590
    @@ -129,11 +129,11 @@ $(document).ready(function(){initNavTree('libwebsockets_8h_source.html','');});
    LWS_VISIBLE LWS_EXTERN struct lws_context *LWS_WARN_UNUSED_RESULT lws_get_context(const struct lws *wsi)
    const char * value
    Definition: libwebsockets.h:1901
    Definition: libwebsockets.h:2779
    -
    Definition: libwebsockets.h:4055
    +
    Definition: libwebsockets.h:4069
    const char * username
    Definition: libwebsockets.h:1462
    LWS_VISIBLE LWS_EXTERN struct lws * lws_client_connect_via_info(struct lws_client_connect_info *ccinfo)
    const char * protocol
    Definition: libwebsockets.h:1931
    -
    struct lws ** stdwsi
    Definition: libwebsockets.h:3846
    +
    struct lws ** stdwsi
    Definition: libwebsockets.h:3860
    LWS_VISIBLE LWS_EXTERN int lws_json_dump_vhost(const struct lws_vhost *vh, char *buf, int len)
    Definition: libwebsockets.h:865
    LWS_VISIBLE LWS_EXTERN const char * lws_get_mimetype(const char *file, const struct lws_http_mount *m)
    @@ -168,7 +168,7 @@ $(document).ready(function(){initNavTree('libwebsockets_8h_source.html','');});
    Definition: libwebsockets.h:1439
    int ietf_version_or_minus_one
    Definition: libwebsockets.h:1998
    LWS_VISIBLE LWS_EXTERN int lws_callback_all_protocol_vhost(struct lws_vhost *vh, const struct lws_protocols *protocol, int reason)
    -
    Definition: libwebsockets.h:4048
    +
    Definition: libwebsockets.h:4062
    Definition: libwebsockets.h:1897
    LWS_VISIBLE LWS_EXTERN int lws_callback_on_writable(struct lws *wsi)
    const char *const * vars
    Definition: libwebsockets.h:2403
    @@ -200,13 +200,13 @@ $(document).ready(function(){initNavTree('libwebsockets_8h_source.html','');});
    Definition: libwebsockets.h:716
    Definition: libwebsockets.h:903
    LWS_VISIBLE LWS_EXTERN int lws_service_tsi(struct lws_context *context, int timeout_ms, int tsi)
    -
    unsigned char * data
    Definition: libwebsockets.h:3848
    +
    unsigned char * data
    Definition: libwebsockets.h:3862
    const struct lws_protocol_vhost_options * extra_mimetypes
    Definition: libwebsockets.h:1938
    LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT lws_finalize_http_header(struct lws *wsi, unsigned char **p, unsigned char *end)
    Definition: libwebsockets.h:709
    LWS_VISIBLE LWS_EXTERN const char * lws_urlencode(char *escaped, const char *string, int len)
    Definition: libwebsockets.h:790
    -
    uv_loop_t * loop
    Definition: libwebsockets.h:4063
    +
    uv_loop_t * loop
    Definition: libwebsockets.h:4077
    Definition: libwebsockets.h:888
    Definition: libwebsockets.h:72
    Definition: libwebsockets.h:3157
    @@ -234,7 +234,7 @@ $(document).ready(function(){initNavTree('libwebsockets_8h_source.html','');});
    unsigned char origin_protocol
    Definition: libwebsockets.h:1954
    const char * log_filepath
    Definition: libwebsockets.h:1669
    Definition: libwebsockets.h:765
    -
    unsigned int max_content_size
    Definition: libwebsockets.h:4071
    +
    unsigned int max_content_size
    Definition: libwebsockets.h:4085
    int option_index
    Definition: libwebsockets.h:1116
    LWS_VISIBLE LWS_EXTERN struct lws *LWS_WARN_UNUSED_RESULT lws_get_child(const struct lws *wsi)
    LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT lws_add_http_header_by_token(struct lws *wsi, enum lws_token_indexes token, const unsigned char *value, int length, unsigned char **p, unsigned char *end)
    @@ -242,7 +242,7 @@ $(document).ready(function(){initNavTree('libwebsockets_8h_source.html','');});
    const char * uri_replace_to
    Definition: libwebsockets.h:2014
    struct lws * parent_wsi
    Definition: libwebsockets.h:2007
    LWS_VISIBLE LWS_EXTERN int lws_b64_decode_string(const char *in, char *out, int out_size)
    -
    enum lwsgs_smtp_states estate
    Definition: libwebsockets.h:4094
    +
    enum lwsgs_smtp_states estate
    Definition: libwebsockets.h:4108
    LWS_VISIBLE LWS_EXTERN int lws_spa_finalize(struct lws_spa *spa)
    Definition: libwebsockets.h:661
    LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT lws_get_count_threads(struct lws_context *context)
    @@ -250,14 +250,14 @@ $(document).ready(function(){initNavTree('libwebsockets_8h_source.html','');});
    char name[64]
    Definition: libwebsockets.h:1407
    LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT lws_hdr_fragment_length(struct lws *wsi, enum lws_token_indexes h, int frag_idx)
    LWS_VISIBLE LWS_EXTERN int lws_cgi_kill(struct lws *wsi)
    -
    char email_buf[256]
    Definition: libwebsockets.h:4098
    +
    char email_buf[256]
    Definition: libwebsockets.h:4112
    LWS_VISIBLE LWS_EXTERN int lws_is_ssl(struct lws *wsi)
    Definition: libwebsockets.h:1496
    -
    int(* close)(struct lws *wsi, lws_filefd_type fd)
    Definition: libwebsockets.h:3915
    +
    int(* close)(struct lws *wsi, lws_filefd_type fd)
    Definition: libwebsockets.h:3929
    uv_lib_t lib
    Definition: libwebsockets.h:1403
    x509_crt certificate
    Definition: libwebsockets.h:235
    LWS_VISIBLE LWS_EXTERN void lws_get_peer_addresses(struct lws *wsi, lws_sockfd_type fd, char *name, int name_len, char *rip, int rip_len)
    -
    Definition: libwebsockets.h:4049
    +
    Definition: libwebsockets.h:4063
    LWS_VISIBLE LWS_EXTERN int lws_is_cgi(struct lws *wsi)
    int ssl_connection
    Definition: libwebsockets.h:1988
    Definition: libwebsockets.h:1455
    @@ -311,7 +311,7 @@ $(document).ready(function(){initNavTree('libwebsockets_8h_source.html','');});
    LWS_VISIBLE LWS_EXTERN int lwsl_timestamp(int level, char *p, int len)
    Definition: libwebsockets.h:1001
    Definition: libwebsockets.h:1535
    -
    uv_timer_t timeout_email
    Definition: libwebsockets.h:4093
    +
    uv_timer_t timeout_email
    Definition: libwebsockets.h:4107
    Definition: libwebsockets.h:1505
    short max_http_header_pool
    Definition: libwebsockets.h:1636
    LWS_VISIBLE LWS_EXTERN int lws_chunked_html_process(struct lws_process_html_args *args, struct lws_process_html_state *s)
    @@ -319,9 +319,10 @@ $(document).ready(function(){initNavTree('libwebsockets_8h_source.html','');});
    x509_crt ca
    Definition: libwebsockets.h:234
    size_t per_session_data_size
    Definition: libwebsockets.h:1286
    Definition: libwebsockets.h:568
    -
    lwsgs_smtp_states
    Definition: libwebsockets.h:4047
    +
    lwsgs_smtp_states
    Definition: libwebsockets.h:4061
    Definition: libwebsockets.h:1517
    Definition: libwebsockets.h:841
    +
    LWS_VISIBLE LWS_EXTERN int lws_snprintf(char *str, size_t size, const char *format,...)
    Definition: libwebsockets.h:727
    Definition: libwebsockets.h:1278
    Definition: libwebsockets.h:573
    @@ -330,7 +331,7 @@ $(document).ready(function(){initNavTree('libwebsockets_8h_source.html','');});
    const char * email
    Definition: libwebsockets.h:1463
    LWS_VISIBLE LWS_EXTERN int lws_get_random(struct lws_context *context, void *buf, int len)
    Definition: libwebsockets.h:555
    -
    uv_connect_t email_connect_req
    Definition: libwebsockets.h:4095
    +
    uv_connect_t email_connect_req
    Definition: libwebsockets.h:4109
    const char * server_string
    Definition: libwebsockets.h:1674
    Definition: libwebsockets.h:1528
    SHORT events
    Definition: libwebsockets.h:415
    @@ -353,7 +354,7 @@ $(document).ready(function(){initNavTree('libwebsockets_8h_source.html','');});
    LWS_VISIBLE LWS_EXTERN void * lws_context_user(struct lws_context *context)
    const char * name
    Definition: libwebsockets.h:1279
    LWS_VISIBLE LWS_EXTERN int lws_init_vhost_client_ssl(const struct lws_context_creation_info *info, struct lws_vhost *vhost)
    -
    Definition: libwebsockets.h:4053
    +
    Definition: libwebsockets.h:4067
    unsigned int http_proxy_port
    Definition: libwebsockets.h:1602
    LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT lws_partial_buffered(struct lws *wsi)
    unsigned int timeout_secs
    Definition: libwebsockets.h:1649
    @@ -374,10 +375,10 @@ $(document).ready(function(){initNavTree('libwebsockets_8h_source.html','');});
    Definition: libwebsockets.h:1114
    Definition: libwebsockets.h:594
    LWS_VISIBLE LWS_EXTERN const struct lws_protocols * lws_vhost_name_to_protocol(struct lws_vhost *vh, const char *name)
    -
    int len
    Definition: libwebsockets.h:3850
    +
    int len
    Definition: libwebsockets.h:3864
    LWS_VISIBLE LWS_EXTERN const char * lws_get_urlarg_by_name(struct lws *wsi, const char *name, char *buf, int len)
    const char * iface
    Definition: libwebsockets.h:1564
    -
    Definition: libwebsockets.h:3909
    +
    Definition: libwebsockets.h:3923
    LWS_VISIBLE LWS_EXTERN void lwsl_hexdump(void *buf, size_t len)
    Definition: libwebsockets.h:1006
    lws_spa_fileupload_states
    Definition: libwebsockets.h:2776
    @@ -387,14 +388,14 @@ $(document).ready(function(){initNavTree('libwebsockets_8h_source.html','');});
    Definition: libwebsockets.h:552
    Definition: libwebsockets.h:561
    LWS_VISIBLE LWS_EXTERN const char * lws_sql_purify(char *escaped, const char *string, int len)
    -
    uv_tcp_t email_client
    Definition: libwebsockets.h:4096
    +
    uv_tcp_t email_client
    Definition: libwebsockets.h:4110
    LWS_VISIBLE LWS_EXTERN int lws_json_dump_context(const struct lws_context *context, char *buf, int len)
    Definition: libwebsockets.h:413
    Definition: libwebsockets.h:665
    -
    lws_filefd_type(* open)(struct lws *wsi, const char *filename, unsigned long *filelen, int flags)
    Definition: libwebsockets.h:3910
    +
    lws_filefd_type(* open)(struct lws *wsi, const char *filename, unsigned long *filelen, int flags)
    Definition: libwebsockets.h:3924
    lws_write_protocol
    Definition: libwebsockets.h:3120
    const char * client_offer
    Definition: libwebsockets.h:1191
    -
    int(* read)(struct lws *wsi, lws_filefd_type fd, unsigned long *amount, unsigned char *buf, unsigned long len)
    Definition: libwebsockets.h:3920
    +
    int(* read)(struct lws *wsi, lws_filefd_type fd, unsigned long *amount, unsigned char *buf, unsigned long len)
    Definition: libwebsockets.h:3934
    LWS_VISIBLE LWS_EXTERN void lws_cancel_service(struct lws_context *context)
    Definition: libwebsockets.h:2777
    Definition: libwebsockets.h:566
    @@ -407,7 +408,7 @@ $(document).ready(function(){initNavTree('libwebsockets_8h_source.html','');});
    LWS_VISIBLE LWS_EXTERN int lws_hdr_copy(struct lws *wsi, char *dest, int len, enum lws_token_indexes h)
    Definition: libwebsockets.h:742
    const char * name
    Definition: libwebsockets.h:1189
    -
    Definition: libwebsockets.h:4052
    +
    Definition: libwebsockets.h:4066
    short revents
    Definition: libwebsockets.h:431
    lws_extension_callback_function * callback
    Definition: libwebsockets.h:1190
    long ssl_options_set
    Definition: libwebsockets.h:1688
    @@ -433,19 +434,19 @@ $(document).ready(function(){initNavTree('libwebsockets_8h_source.html','');});
    LWS_VISIBLE LWS_EXTERN struct lws_context * lws_create_context(struct lws_context_creation_info *info)
    Definition: libwebsockets.h:721
    void * data
    Definition: libwebsockets.h:2402
    -
    char * content
    Definition: libwebsockets.h:4099
    +
    char * content
    Definition: libwebsockets.h:4113
    LWS_VISIBLE LWS_EXTERN int lws_interface_to_sa(int ipv6, const char *ifname, struct sockaddr_in *addr, size_t addrlen)
    const struct lws_token_limits * token_limits
    Definition: libwebsockets.h:1578
    lws_process_html_state_cb replace
    Definition: libwebsockets.h:2406
    -
    Definition: libwebsockets.h:4060
    +
    Definition: libwebsockets.h:4074
    const char * address
    Definition: libwebsockets.h:1984
    -
    unsigned long(* seek_cur)(struct lws *wsi, lws_filefd_type fd, long offset_from_cur_pos)
    Definition: libwebsockets.h:3917
    +
    unsigned long(* seek_cur)(struct lws *wsi, lws_filefd_type fd, long offset_from_cur_pos)
    Definition: libwebsockets.h:3931
    void * user
    Definition: libwebsockets.h:1307
    int events
    Definition: libwebsockets.h:529
    -
    int(* on_get_body)(struct lws_email *email, char *buf, int len)
    Definition: libwebsockets.h:4086
    +
    int(* on_get_body)(struct lws_email *email, char *buf, int len)
    Definition: libwebsockets.h:4100
    Definition: libwebsockets.h:1915
    void * user
    Definition: libwebsockets.h:1610
    -
    Definition: libwebsockets.h:4056
    +
    Definition: libwebsockets.h:4070
    Definition: libwebsockets.h:3143
    char * token
    Definition: libwebsockets.h:2459
    LWS_VISIBLE LWS_EXTERN void * lws_protocol_vh_priv_get(struct lws_vhost *vhost, const struct lws_protocols *prot)
    @@ -468,11 +469,11 @@ $(document).ready(function(){initNavTree('libwebsockets_8h_source.html','');});
    LWS_VISIBLE LWS_EXTERN void lws_cancel_service_pt(struct lws *wsi)
    Definition: libwebsockets.h:1530
    Definition: libwebsockets.h:602
    -
    Definition: libwebsockets.h:4051
    +
    Definition: libwebsockets.h:4065
    unsigned int api_magic
    Definition: libwebsockets.h:1388
    Definition: libwebsockets.h:1533
    LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT lws_send_pipe_choked(struct lws *wsi)
    -
    Definition: libwebsockets.h:4054
    +
    Definition: libwebsockets.h:4068
    int(* lws_spa_fileupload_cb)(void *data, const char *name, const char *filename, char *buf, int len, enum lws_spa_fileupload_states state)
    Definition: libwebsockets.h:2798
    diff --git a/doc/html/navtreedata.js b/doc/html/navtreedata.js index 5fcaba46..e91b071f 100644 --- a/doc/html/navtreedata.js +++ b/doc/html/navtreedata.js @@ -133,9 +133,9 @@ var NAVTREEINDEX = [ "annotated.html", "group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5aa0158b4e85420811e6b0f1378c6ded0f", -"group__sha.html", -"libwebsockets_8h.html#a17f5fc891b31d2920bd18b0d66d6cb25", -"structlws__plat__file__ops.html#a01f483807a9862736b17ba9ed5110c40" +"group__service.html#gaf95bd0c663d6516a0c80047d9b1167a8", +"libwebsockets_8h.html", +"structlws__http__mount.html#ae90d1efe7178199fad39de2926902ee4" ]; var SYNCONMSG = 'click to disable panel synchronisation'; diff --git a/doc/html/navtreeindex0.js b/doc/html/navtreeindex0.js index 6b34d181..54b7b48f 100644 --- a/doc/html/navtreeindex0.js +++ b/doc/html/navtreeindex0.js @@ -48,7 +48,7 @@ var NAVTREEINDEX0 = "group__HTTP-headers-create.html#gaf74adb761b22566ad70004882712dce1":[9,6,3,1], "group__HTTP-headers-create.html#gaf74adb761b22566ad70004882712dce1":[11,0,0,0,46], "group__HTTP-headers-read.html":[9,6,4], -"group__HTTP-headers-read.html#ga2c0597b2ef1d2cee35736c338bcbd17b":[11,0,0,0,152], +"group__HTTP-headers-read.html#ga2c0597b2ef1d2cee35736c338bcbd17b":[11,0,0,0,153], "group__HTTP-headers-read.html#ga2c0597b2ef1d2cee35736c338bcbd17b":[9,6,4,7], "group__HTTP-headers-read.html#ga594f3d0ece5b09c2ccf9f98ea533bb4e":[9,6,4,5], "group__HTTP-headers-read.html#ga594f3d0ece5b09c2ccf9f98ea533bb4e":[11,0,0,0,106], @@ -156,7 +156,7 @@ var NAVTREEINDEX0 = "group__Protocols-and-Plugins.html":[9,10], "group__Protocols-and-Plugins.html#ga106b37ae9c247e84d191ab09441adc43":[9,10,4], "group__Protocols-and-Plugins.html#ga106b37ae9c247e84d191ab09441adc43":[11,0,0,0,86], -"group__Protocols-and-Plugins.html#ga25754726d97c5f519d313e691a9fe29d":[11,0,0,0,160], +"group__Protocols-and-Plugins.html#ga25754726d97c5f519d313e691a9fe29d":[11,0,0,0,161], "group__Protocols-and-Plugins.html#ga25754726d97c5f519d313e691a9fe29d":[9,10,9], "group__Protocols-and-Plugins.html#ga40994491e1567f91f579d2b444775266":[11,0,0,0,13], "group__Protocols-and-Plugins.html#ga72ad550786ca7976463589d347e62112":[9,10,5], @@ -208,26 +208,26 @@ var NAVTREEINDEX0 = "group__context-and-vhost.html#ga06e77ce2916f8bc9826ef8d9d68e3932":[11,0,0,0,103], "group__context-and-vhost.html#ga0c54c667ccd9b8b3dddcd123ca72f87c":[9,4,7], "group__context-and-vhost.html#ga0c54c667ccd9b8b3dddcd123ca72f87c":[11,0,0,0,75], -"group__context-and-vhost.html#ga341064721add2618ae1b29717493a212":[11,0,0,0,167], +"group__context-and-vhost.html#ga341064721add2618ae1b29717493a212":[11,0,0,0,168], "group__context-and-vhost.html#ga341064721add2618ae1b29717493a212":[9,4,14], "group__context-and-vhost.html#ga41c2d763f78cc248df3b9f8645dbd2a5":[11,0,0,0,26], "group__context-and-vhost.html#ga41c2d763f78cc248df3b9f8645dbd2a5":[9,4,3], "group__context-and-vhost.html#ga7e9d5405547a457d86e0b4f0ae2bb1c4":[11,0,0,0,142], "group__context-and-vhost.html#ga7e9d5405547a457d86e0b4f0ae2bb1c4":[9,4,11], -"group__context-and-vhost.html#ga8db03e19a372e34ac25cf21af894a02c":[11,0,0,0,159], +"group__context-and-vhost.html#ga8db03e19a372e34ac25cf21af894a02c":[11,0,0,0,160], "group__context-and-vhost.html#ga8db03e19a372e34ac25cf21af894a02c":[9,4,12], "group__context-and-vhost.html#ga8ee0314028755f1ddfa9428e09b4fddb":[11,0,0,0,72], "group__context-and-vhost.html#ga8ee0314028755f1ddfa9428e09b4fddb":[9,4,4], "group__context-and-vhost.html#ga94e6cc2223c4eec316b13bcebc3628b6":[9,4,10], "group__context-and-vhost.html#ga94e6cc2223c4eec316b13bcebc3628b6":[11,0,0,0,117], -"group__context-and-vhost.html#ga98d88c9080fd89c37114363a6474ea73":[11,0,0,0,166], +"group__context-and-vhost.html#ga98d88c9080fd89c37114363a6474ea73":[11,0,0,0,167], "group__context-and-vhost.html#ga98d88c9080fd89c37114363a6474ea73":[9,4,13], "group__context-and-vhost.html#gae2134657cdd2ea7a59e13ad314e4c50d":[9,4,9], "group__context-and-vhost.html#gae2134657cdd2ea7a59e13ad314e4c50d":[11,0,0,0,116], "group__context-and-vhost.html#gaeb12f934bfd178bd2132a9e73fc641da":[11,0,0,0,73], "group__context-and-vhost.html#gaeb12f934bfd178bd2132a9e73fc641da":[9,4,5], -"group__context-and-vhost.html#gaf2fff58562caab7510c41eeac85a8648":[11,0,0,0,74], "group__context-and-vhost.html#gaf2fff58562caab7510c41eeac85a8648":[9,4,6], +"group__context-and-vhost.html#gaf2fff58562caab7510c41eeac85a8648":[11,0,0,0,74], "group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a1b2f8bde0f62adc7ebe81b2043f34c0c":[11,0,0,0,26,8], "group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a1b2f8bde0f62adc7ebe81b2043f34c0c":[9,4,3,8], "group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a1cc4562d05cba52a6dfa0697a65ade0d":[11,0,0,0,26,2], diff --git a/doc/html/navtreeindex1.js b/doc/html/navtreeindex1.js index 88adb979..dbe4fd76 100644 --- a/doc/html/navtreeindex1.js +++ b/doc/html/navtreeindex1.js @@ -68,22 +68,22 @@ var NAVTREEINDEX1 = "group__fops.html#gac08aef64c4c34647ed699b24759b6b0e":[9,20,1], "group__fops.html#gac08aef64c4c34647ed699b24759b6b0e":[11,0,0,0,91], "group__form-parsing.html":[9,6,0], -"group__form-parsing.html#ga162f86762173a2bc8c28497941d74815":[11,0,0,0,145], +"group__form-parsing.html#ga162f86762173a2bc8c28497941d74815":[11,0,0,0,146], "group__form-parsing.html#ga162f86762173a2bc8c28497941d74815":[9,6,0,2], -"group__form-parsing.html#ga2da476217166da02704b90d3a8d4f3cd":[11,0,0,0,149], +"group__form-parsing.html#ga2da476217166da02704b90d3a8d4f3cd":[11,0,0,0,150], "group__form-parsing.html#ga2da476217166da02704b90d3a8d4f3cd":[9,6,0,6], -"group__form-parsing.html#ga3fbe378632f85ec9a14cc2c1687bf05f":[11,0,0,0,148], +"group__form-parsing.html#ga3fbe378632f85ec9a14cc2c1687bf05f":[11,0,0,0,149], "group__form-parsing.html#ga3fbe378632f85ec9a14cc2c1687bf05f":[9,6,0,5], "group__form-parsing.html#ga41a74a822771d3dce89751aa3bce28ae":[9,6,0,1], "group__form-parsing.html#ga41a74a822771d3dce89751aa3bce28ae":[11,0,0,0,33], "group__form-parsing.html#ga5a70527c0861c2ffa3d29333a6aa7f8e":[9,6,0,0], "group__form-parsing.html#ga5a70527c0861c2ffa3d29333a6aa7f8e":[11,0,0,0,16], -"group__form-parsing.html#ga83835bf250ee3d4a60f36a182f2b8d24":[11,0,0,0,147], +"group__form-parsing.html#ga83835bf250ee3d4a60f36a182f2b8d24":[11,0,0,0,148], "group__form-parsing.html#ga83835bf250ee3d4a60f36a182f2b8d24":[9,6,0,4], -"group__form-parsing.html#ga9ad9ebf5ea1a7108415ed7e04cb231d2":[11,0,0,0,150], +"group__form-parsing.html#ga9ad9ebf5ea1a7108415ed7e04cb231d2":[11,0,0,0,151], "group__form-parsing.html#ga9ad9ebf5ea1a7108415ed7e04cb231d2":[9,6,0,7], -"group__form-parsing.html#gaaa482f07dad3f04b391cccf0a814e13b":[11,0,0,0,146], "group__form-parsing.html#gaaa482f07dad3f04b391cccf0a814e13b":[9,6,0,3], +"group__form-parsing.html#gaaa482f07dad3f04b391cccf0a814e13b":[11,0,0,0,147], "group__form-parsing.html#gga41a74a822771d3dce89751aa3bce28aea2d25de44865bd44e5a3903a2bab9ca83":[9,6,0,1,2], "group__form-parsing.html#gga41a74a822771d3dce89751aa3bce28aea2d25de44865bd44e5a3903a2bab9ca83":[11,0,0,0,33,2], "group__form-parsing.html#gga41a74a822771d3dce89751aa3bce28aea6ce2a55a4c3695cdb640c893d95bd3a7":[9,6,0,1,1], @@ -158,12 +158,12 @@ var NAVTREEINDEX1 = "group__log.html#ga14542b84d2c76efa7814124bb10f9c5f":[11,0,0,0,31], "group__log.html#ga244647f9e1bf0097ccdde66d74f41e26":[11,0,0,0,141], "group__log.html#ga244647f9e1bf0097ccdde66d74f41e26":[9,7,0], -"group__log.html#ga42e39775c6b69b7251bdbf5a2cdd5dcd":[11,0,0,0,165], +"group__log.html#ga42e39775c6b69b7251bdbf5a2cdd5dcd":[11,0,0,0,166], "group__log.html#ga42e39775c6b69b7251bdbf5a2cdd5dcd":[9,7,3], "group__log.html#ga74eb146969f0595e12ea835851b4588e":[11,0,0,0,40], -"group__log.html#ga898b1f03872ad019f507d4e35bbefa90":[11,0,0,0,164], +"group__log.html#ga898b1f03872ad019f507d4e35bbefa90":[11,0,0,0,165], "group__log.html#ga898b1f03872ad019f507d4e35bbefa90":[9,7,2], -"group__log.html#gab7c0fc936cc9f1eb58e2bb234c15147c":[11,0,0,0,163], +"group__log.html#gab7c0fc936cc9f1eb58e2bb234c15147c":[11,0,0,0,164], "group__log.html#gab7c0fc936cc9f1eb58e2bb234c15147c":[9,7,1], "group__log.html#gaf5f07837692b2f231a79da8a058288aa":[11,0,0,0,39], "group__log.html#gga14542b84d2c76efa7814124bb10f9c5fa083a44e71966a0e768426e477e1bc358":[11,0,0,0,31,8], @@ -181,8 +181,8 @@ var NAVTREEINDEX1 = "group__misc.html#ga0af4f7d2dd375aeedcfa7eb0e1101c4b":[9,8,2], "group__misc.html#ga0af4f7d2dd375aeedcfa7eb0e1101c4b":[11,0,0,0,89], "group__misc.html#ga0e705d498e8c8500649a26ba30a1e106":[11,0,0,0,127], -"group__misc.html#ga1ec0d9faac5d3a5824d765c287c043aa":[9,8,8], "group__misc.html#ga1ec0d9faac5d3a5824d765c287c043aa":[11,0,0,0,122], +"group__misc.html#ga1ec0d9faac5d3a5824d765c287c043aa":[9,8,8], "group__misc.html#ga33bf2635033710b25f931b57ed663e1e":[9,8,7], "group__misc.html#ga33bf2635033710b25f931b57ed663e1e":[11,0,0,0,121], "group__misc.html#ga58f906c6be0ca80efd813f694569dd4a":[9,8,6], @@ -191,8 +191,10 @@ var NAVTREEINDEX1 = "group__misc.html#ga629f48268fd1856b54b11172991b97d9":[11,0,0,0,90], "group__misc.html#ga8930fe36a3f3eefe4a6a4fd499d8e899":[9,8,5], "group__misc.html#ga8930fe36a3f3eefe4a6a4fd499d8e899":[11,0,0,0,94], -"group__misc.html#gaa194584fff9698f3b280658f770ccd0f":[11,0,0,0,162], -"group__misc.html#gaa194584fff9698f3b280658f770ccd0f":[9,8,10], +"group__misc.html#ga9f37d0e357de2ab4170723fcdb665d21":[11,0,0,0,145], +"group__misc.html#ga9f37d0e357de2ab4170723fcdb665d21":[9,8,10], +"group__misc.html#gaa194584fff9698f3b280658f770ccd0f":[11,0,0,0,163], +"group__misc.html#gaa194584fff9698f3b280658f770ccd0f":[9,8,11], "group__misc.html#gab321ed812f46f6dc7ef9e3ca6f00cf1b":[11,0,0,0,139], "group__misc.html#gab321ed812f46f6dc7ef9e3ca6f00cf1b":[9,8,9], "group__misc.html#gac6abfc0b2bd5b2f09281a4432bb2f5f0":[9,8,4], @@ -211,14 +213,14 @@ var NAVTREEINDEX1 = "group__net.html#gad0df22db2be9fc65a667a1e83f9a92a4":[9,9,0], "group__net.html#gad0df22db2be9fc65a667a1e83f9a92a4":[11,0,0,0,62], "group__pur.html":[9,12], -"group__pur.html#ga9cc82f06e5ae7e71458626d7a39a5865":[11,0,0,0,151], +"group__pur.html#ga9cc82f06e5ae7e71458626d7a39a5865":[11,0,0,0,152], "group__pur.html#ga9cc82f06e5ae7e71458626d7a39a5865":[9,12,1], "group__pur.html#gab15187efcfa256b7c928562c182b92a3":[9,12,0], "group__pur.html#gab15187efcfa256b7c928562c182b92a3":[11,0,0,0,118], "group__sending-data.html":[9,13], "group__sending-data.html#ga98b099cf8c1c7e38ad78501f270e193d":[9,13,0], "group__sending-data.html#ga98b099cf8c1c7e38ad78501f270e193d":[11,0,0,0,35], -"group__sending-data.html#gafd5fdd285a0e25ba7e3e1051deec1001":[11,0,0,0,161], +"group__sending-data.html#gafd5fdd285a0e25ba7e3e1051deec1001":[11,0,0,0,162], "group__sending-data.html#gafd5fdd285a0e25ba7e3e1051deec1001":[9,13,1], "group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193da10047eb05b5e1c298151dc47a5b44826":[9,13,0,2], "group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193da10047eb05b5e1c298151dc47a5b44826":[11,0,0,0,35,2], @@ -230,8 +232,8 @@ var NAVTREEINDEX1 = "group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193da80e8f169fda236c56bfb795ed62903db":[9,13,0,0], "group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193da80e8f169fda236c56bfb795ed62903db":[11,0,0,0,35,0], "group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193dab7e7a62cf6f456c09c21dff24dad9039":[11,0,0,0,35,5], -"group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193dabb6705e1d1327cdda5025be28f07712e":[11,0,0,0,35,3], "group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193dabb6705e1d1327cdda5025be28f07712e":[9,13,0,3], +"group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193dabb6705e1d1327cdda5025be28f07712e":[11,0,0,0,35,3], "group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193dae7d8a025a65524652fe9e24c2654c935":[11,0,0,0,35,6], "group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193daf6486c0dba50c44198100717721d9ab2":[9,13,0,1], "group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193daf6486c0dba50c44198100717721d9ab2":[11,0,0,0,35,1], @@ -247,7 +249,5 @@ var NAVTREEINDEX1 = "group__service.html#gad82efa5466d14a9f05aa06416375b28d":[11,0,0,0,136], "group__service.html#gad82efa5466d14a9f05aa06416375b28d":[9,0,3], "group__service.html#gaebf426eda371ba23642fc11d8e0ace6b":[11,0,0,0,137], -"group__service.html#gaebf426eda371ba23642fc11d8e0ace6b":[9,0,4], -"group__service.html#gaf95bd0c663d6516a0c80047d9b1167a8":[11,0,0,0,135], -"group__service.html#gaf95bd0c663d6516a0c80047d9b1167a8":[9,0,2] +"group__service.html#gaebf426eda371ba23642fc11d8e0ace6b":[9,0,4] }; diff --git a/doc/html/navtreeindex2.js b/doc/html/navtreeindex2.js index 9a79adc4..696b2d6a 100644 --- a/doc/html/navtreeindex2.js +++ b/doc/html/navtreeindex2.js @@ -1,8 +1,10 @@ var NAVTREEINDEX2 = { +"group__service.html#gaf95bd0c663d6516a0c80047d9b1167a8":[11,0,0,0,135], +"group__service.html#gaf95bd0c663d6516a0c80047d9b1167a8":[9,0,2], "group__sha.html":[9,11], -"group__sha.html#ga66316e6a5a0644a09d5a10e919dfdd8d":[11,0,0,0,51], "group__sha.html#ga66316e6a5a0644a09d5a10e919dfdd8d":[9,11,0], +"group__sha.html#ga66316e6a5a0644a09d5a10e919dfdd8d":[11,0,0,0,51], "group__sha.html#ga7b09ab74646266f0b555103b3bb8dfe5":[11,0,0,0,144], "group__sha.html#ga7b09ab74646266f0b555103b3bb8dfe5":[9,11,2], "group__sha.html#gaf39765e4a3b413efb65e4698b2ec3575":[9,11,1], @@ -10,8 +12,8 @@ var NAVTREEINDEX2 = "group__smtp.html":[9,14], "group__smtp.html#ga116be79bf44f9dc2a97f46e051fe4dc0":[9,14,1], "group__smtp.html#ga116be79bf44f9dc2a97f46e051fe4dc0":[11,0,0,0,37], -"group__smtp.html#ga25298a5afc1074e13b2d5711a86432b2":[9,14,3], "group__smtp.html#ga25298a5afc1074e13b2d5711a86432b2":[11,0,0,0,78], +"group__smtp.html#ga25298a5afc1074e13b2d5711a86432b2":[9,14,3], "group__smtp.html#ga5e535e346d92a9daf00be33abf79d4eb":[11,0,0,0,77], "group__smtp.html#ga5e535e346d92a9daf00be33abf79d4eb":[9,14,2], "group__smtp.html#ga77fc9b56a1bb39484844981ec375fc29":[9,14,4], @@ -28,10 +30,10 @@ var NAVTREEINDEX2 = "group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a85e3c452950c09a79086bff4b9be5c14":[9,14,1,6], "group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a929bb4623ff3f585108aba2a1b047fab":[9,14,1,4], "group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a929bb4623ff3f585108aba2a1b047fab":[11,0,0,0,37,4], -"group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0aae20a0cb95b97a70f6b45d0ed2d5be83":[9,14,1,5], "group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0aae20a0cb95b97a70f6b45d0ed2d5be83":[11,0,0,0,37,5], -"group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0ab61778f70ecac007b334bb14942eb41d":[11,0,0,0,37,2], +"group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0aae20a0cb95b97a70f6b45d0ed2d5be83":[9,14,1,5], "group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0ab61778f70ecac007b334bb14942eb41d":[9,14,1,2], +"group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0ab61778f70ecac007b334bb14942eb41d":[11,0,0,0,37,2], "group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0ab89442b7a3ca2b94c3cdcf33756eb933":[9,14,1,1], "group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0ab89442b7a3ca2b94c3cdcf33756eb933":[11,0,0,0,37,1], "group__sock-adopt.html":[9,15], @@ -63,9 +65,9 @@ var NAVTREEINDEX2 = "group__timeout.html#gga2c0aa4b9c3c55bae7b35cbfac3246c87ad7ebebb506afd30c48e1e5e3a578cd30":[11,0,0,0,38,1], "group__timeout.html#gga2c0aa4b9c3c55bae7b35cbfac3246c87ae8b3de955cec5da5ea52fe040f914501":[11,0,0,0,38,10], "group__urlendec.html":[9,6,5], -"group__urlendec.html#gaa373a9c16acdd96c395af61ab915ece3":[11,0,0,0,153], +"group__urlendec.html#gaa373a9c16acdd96c395af61ab915ece3":[11,0,0,0,154], "group__urlendec.html#gaa373a9c16acdd96c395af61ab915ece3":[9,6,5,0], -"group__urlendec.html#gabc2888476e50e001c875c1a8abf455b7":[11,0,0,0,154], +"group__urlendec.html#gabc2888476e50e001c875c1a8abf455b7":[11,0,0,0,155], "group__urlendec.html#gabc2888476e50e001c875c1a8abf455b7":[9,6,5,1], "group__usercb.html":[9,16], "group__usercb.html#gad4fcb82e68d60ffacca61a3f783a0a2f":[11,0,0,0,8], @@ -89,8 +91,8 @@ var NAVTREEINDEX2 = "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a23b90b5e5146e760bc3123ae1fd2a6e5":[11,0,0,0,22,40], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a24d39bf1cfc0bad9d92da9ac1717e439":[9,16,1,0], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a24d39bf1cfc0bad9d92da9ac1717e439":[11,0,0,0,22,0], -"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a2db02fc6e1c17ab62b52109d1aa9d738":[9,16,1,7], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a2db02fc6e1c17ab62b52109d1aa9d738":[11,0,0,0,22,7], +"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a2db02fc6e1c17ab62b52109d1aa9d738":[9,16,1,7], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a2fce9a8608220f32abbf1422a5498804":[11,0,0,0,22,14], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a2fce9a8608220f32abbf1422a5498804":[9,16,1,14], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a390da3639296660a78cc1a5dcb19037e":[11,0,0,0,22,25], @@ -110,8 +112,8 @@ var NAVTREEINDEX2 = "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a7e12418eec9bce85735e6460176ab604":[11,0,0,0,22,3], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a7ec8e2e9557ee02a4fc9f7dec7e2babc":[11,0,0,0,22,11], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a7ec8e2e9557ee02a4fc9f7dec7e2babc":[9,16,1,11], -"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a838b18d255c1b94a533287ba302a2eba":[9,16,1,5], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a838b18d255c1b94a533287ba302a2eba":[11,0,0,0,22,5], +"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a838b18d255c1b94a533287ba302a2eba":[9,16,1,5], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a8909732521d379179003d97ab7a05428":[11,0,0,0,22,35], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a8909732521d379179003d97ab7a05428":[9,16,1,35], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a89862929a72bff65257ca1d51a0fce4d":[11,0,0,0,22,52], @@ -123,8 +125,8 @@ var NAVTREEINDEX2 = "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a982579753e70e59a9ea13ce628ac891a":[9,16,1,41], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aa46f705dcf97502e95627ffde614f98b":[11,0,0,0,22,37], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aa46f705dcf97502e95627ffde614f98b":[9,16,1,37], -"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aa536e574a642ff3ab9e12bff7ba2c6a2":[9,16,1,2], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aa536e574a642ff3ab9e12bff7ba2c6a2":[11,0,0,0,22,2], +"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aa536e574a642ff3ab9e12bff7ba2c6a2":[9,16,1,2], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aa5cc921b7697743017a533822a3d556a":[11,0,0,0,22,56], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aa5cc921b7697743017a533822a3d556a":[9,16,1,39], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aa627548e1296e654fcfab463ec3c9587":[11,0,0,0,22,15], @@ -157,16 +159,16 @@ var NAVTREEINDEX2 = "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ad8c6207b0c4e732f3d507f0fb79370e8":[11,0,0,0,22,1], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7adfb41c92e2522712207ef7f2462b5e34":[11,0,0,0,22,31], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7adfb41c92e2522712207ef7f2462b5e34":[9,16,1,31], -"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ae4986291b7a810fe290851d73bebeb1c":[11,0,0,0,22,21], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ae4986291b7a810fe290851d73bebeb1c":[9,16,1,21], +"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ae4986291b7a810fe290851d73bebeb1c":[11,0,0,0,22,21], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ae5ad65d779b7eab32ab67ceff91a3bac":[11,0,0,0,22,23], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ae5ad65d779b7eab32ab67ceff91a3bac":[9,16,1,23], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ae8d1de0bb56e03aa58cb4d44b18edd2e":[11,0,0,0,22,12], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ae8d1de0bb56e03aa58cb4d44b18edd2e":[9,16,1,12], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ae9734e1d7af2abf291665ce9e4a728d3":[11,0,0,0,22,19], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ae9734e1d7af2abf291665ce9e4a728d3":[9,16,1,19], -"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aeb0cec65ec82a713cd01e9ca9aeeb5e6":[11,0,0,0,22,57], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aeb0cec65ec82a713cd01e9ca9aeeb5e6":[9,16,1,40], +"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aeb0cec65ec82a713cd01e9ca9aeeb5e6":[11,0,0,0,22,57], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7af6cf80e57aae8ba0a57a5c456b1fe026":[11,0,0,0,22,55], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7afc4b2f72cc9e424a750b506ce0cc4310":[11,0,0,0,22,51], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7afd8fd77a1cc9405fcb4f26915d7f2d01":[11,0,0,0,22,29], @@ -176,15 +178,15 @@ var NAVTREEINDEX2 = "group__uv.html":[9,22], "group__uv.html#ga097c89497824d4de225a85a00661fc89":[11,0,0,0,119], "group__uv.html#ga3c75cd6ec3f80fc0a0c8ead4c4e71a15":[11,0,0,0,120], -"group__uv.html#ga99099e045993383f251a8026e1e40414":[11,0,0,0,158], -"group__uv.html#gaa5e3593c94f91910d9d928dfa0c18f6c":[11,0,0,0,155], -"group__uv.html#gac5f60dba13a45e5d554b4fb7df7b9610":[11,0,0,0,157], -"group__uv.html#gad85ce3bfc53ff754988d36bf5de39e21":[11,0,0,0,156], +"group__uv.html#ga99099e045993383f251a8026e1e40414":[11,0,0,0,159], +"group__uv.html#gaa5e3593c94f91910d9d928dfa0c18f6c":[11,0,0,0,156], +"group__uv.html#gac5f60dba13a45e5d554b4fb7df7b9610":[11,0,0,0,158], +"group__uv.html#gad85ce3bfc53ff754988d36bf5de39e21":[11,0,0,0,157], "group__vhost-mounts.html":[9,4,0], "group__vhost-mounts.html#ga31eca18e50cb4357480f2fcad36ff437":[9,4,0,2], "group__vhost-mounts.html#ga31eca18e50cb4357480f2fcad36ff437":[11,0,0,0,32], -"group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437a13ab58b01ac6e05f595977f1e0f0db69":[9,4,0,2,3], "group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437a13ab58b01ac6e05f595977f1e0f0db69":[11,0,0,0,32,3], +"group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437a13ab58b01ac6e05f595977f1e0f0db69":[9,4,0,2,3], "group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437a1e9f0842b0e85db50fe648ed4ba9a4b0":[9,4,0,2,0], "group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437a1e9f0842b0e85db50fe648ed4ba9a4b0":[11,0,0,0,32,0], "group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437a42f2361cfe76cd287fa8fcfc502357e2":[9,4,0,2,2], @@ -204,8 +206,8 @@ var NAVTREEINDEX2 = "group__wsclose.html#gae399c571df32ba532c0ca67da9284985":[9,17,0], "group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a1bb501d212fa4d57053db681b1dfab98":[11,0,0,0,25,3], "group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a1bb501d212fa4d57053db681b1dfab98":[9,17,0,2], -"group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a2e1f0113494a58e762eed3d22e7080d8":[11,0,0,0,25,10], "group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a2e1f0113494a58e762eed3d22e7080d8":[9,17,0,9], +"group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a2e1f0113494a58e762eed3d22e7080d8":[11,0,0,0,25,10], "group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a32c38edab10d1379febac0c479ab2e9c":[11,0,0,0,25,14], "group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a3ffa38d5081b85fb739e02a747ccf2c4":[11,0,0,0,25,1], "group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a3ffa38d5081b85fb739e02a747ccf2c4":[9,17,0,0], @@ -215,8 +217,8 @@ var NAVTREEINDEX2 = "group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a4b8a3b7ce6f731e5248e4b0fb64a5044":[9,17,0,5], "group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a68b3d34bebd88547dcfa5cadba0acd6c":[11,0,0,0,25,7], "group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a68b3d34bebd88547dcfa5cadba0acd6c":[9,17,0,6], -"group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a7aef2da0062da606eeb35aaca5cf9050":[11,0,0,0,25,8], "group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a7aef2da0062da606eeb35aaca5cf9050":[9,17,0,7], +"group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a7aef2da0062da606eeb35aaca5cf9050":[11,0,0,0,25,8], "group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a9737a68759e739856b150ff9dfa30218":[11,0,0,0,25,2], "group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a9737a68759e739856b150ff9dfa30218":[9,17,0,1], "group__wsclose.html#ggae399c571df32ba532c0ca67da9284985ac6a161822783ee873be1c66f48d14e0e":[9,17,0,10], @@ -226,8 +228,8 @@ var NAVTREEINDEX2 = "group__wsclose.html#ggae399c571df32ba532c0ca67da9284985ad0869604d79e13700ae5d196a431b350":[11,0,0,0,25,12], "group__wsclose.html#ggae399c571df32ba532c0ca67da9284985ad09e68295eabdddcba4e332fbea70ae5":[11,0,0,0,25,9], "group__wsclose.html#ggae399c571df32ba532c0ca67da9284985ad09e68295eabdddcba4e332fbea70ae5":[9,17,0,8], -"group__wsclose.html#ggae399c571df32ba532c0ca67da9284985ad2b477a91c8445bf34ecd43977f9b390":[9,17,0,12], "group__wsclose.html#ggae399c571df32ba532c0ca67da9284985ad2b477a91c8445bf34ecd43977f9b390":[11,0,0,0,25,13], +"group__wsclose.html#ggae399c571df32ba532c0ca67da9284985ad2b477a91c8445bf34ecd43977f9b390":[9,17,0,12], "group__wsclose.html#ggae399c571df32ba532c0ca67da9284985af90cb98d983ad3d4c79df9b6f3d4a4d2":[11,0,0,0,25,5], "group__wsclose.html#ggae399c571df32ba532c0ca67da9284985af90cb98d983ad3d4c79df9b6f3d4a4d2":[9,17,0,4], "group__wsstatus.html":[9,18], @@ -239,15 +241,13 @@ var NAVTREEINDEX2 = "group__wsstatus.html#ga2bb3655329b4651cd06f79ee3a764421":[11,0,0,0,132], "group__wsstatus.html#ga3df5045656dfb6b0e63a38de2dca79d2":[9,18,1], "group__wsstatus.html#ga3df5045656dfb6b0e63a38de2dca79d2":[11,0,0,0,100], -"group__wsstatus.html#ga4ad226d5e01024b4046f4a5a37199aa1":[9,18,2], "group__wsstatus.html#ga4ad226d5e01024b4046f4a5a37199aa1":[11,0,0,0,113], -"group__wsstatus.html#gaccd9c59336efad8af0554f79cc5966fd":[9,18,0], +"group__wsstatus.html#ga4ad226d5e01024b4046f4a5a37199aa1":[9,18,2], "group__wsstatus.html#gaccd9c59336efad8af0554f79cc5966fd":[11,0,0,0,87], -"group__wsstatus.html#gaeca4afc94b1f026034f99cbba37e2f85":[9,18,5], +"group__wsstatus.html#gaccd9c59336efad8af0554f79cc5966fd":[9,18,0], "group__wsstatus.html#gaeca4afc94b1f026034f99cbba37e2f85":[11,0,0,0,123], +"group__wsstatus.html#gaeca4afc94b1f026034f99cbba37e2f85":[9,18,5], "hierarchy.html":[10,2], -"index.html":[0], "index.html":[], -"libwebsockets_8h.html":[11,0,0,0], -"libwebsockets_8h.html#a0b056fdcf949a838ff82209b4a627dd9":[11,0,0,0,168] +"index.html":[0] }; diff --git a/doc/html/navtreeindex3.js b/doc/html/navtreeindex3.js index 84cc34d8..acec6db7 100644 --- a/doc/html/navtreeindex3.js +++ b/doc/html/navtreeindex3.js @@ -1,6 +1,8 @@ var NAVTREEINDEX3 = { -"libwebsockets_8h.html#a17f5fc891b31d2920bd18b0d66d6cb25":[11,0,0,0,173], +"libwebsockets_8h.html":[11,0,0,0], +"libwebsockets_8h.html#a0b056fdcf949a838ff82209b4a627dd9":[11,0,0,0,169], +"libwebsockets_8h.html#a17f5fc891b31d2920bd18b0d66d6cb25":[11,0,0,0,174], "libwebsockets_8h.html#a1b12016562c728eb306c7f954c804bef":[11,0,0,0,20], "libwebsockets_8h.html#a2271141d8be8d72b47ba327130b4905f":[11,0,0,0,27], "libwebsockets_8h.html#a2271141d8be8d72b47ba327130b4905fa7741c12fc97574fa73a810fedae2be76":[11,0,0,0,27,1], @@ -21,16 +23,16 @@ var NAVTREEINDEX3 = "libwebsockets_8h.html#a5e627dbf1db48170ef486edbaf268672":[11,0,0,0,130], "libwebsockets_8h.html#a72fe65e83b8bb03f904a1a256c673536":[11,0,0,0,128], "libwebsockets_8h.html#a75e9827318684877deb4189121a8cd2a":[11,0,0,0,43], -"libwebsockets_8h.html#a863bdd5bca33bcbaa424c42fb7b2fc96":[11,0,0,0,172], -"libwebsockets_8h.html#a9032a3062641d334161c29adcc4fa15d":[11,0,0,0,170], +"libwebsockets_8h.html#a863bdd5bca33bcbaa424c42fb7b2fc96":[11,0,0,0,173], +"libwebsockets_8h.html#a9032a3062641d334161c29adcc4fa15d":[11,0,0,0,171], "libwebsockets_8h.html#a9b1bfc6f34319188d2aa40500d825bab":[11,0,0,0,42], "libwebsockets_8h.html#a9b878fb94f4596226c982eef4f42a607":[11,0,0,0,44], -"libwebsockets_8h.html#a9f2a8506fd963db95a5103823c60fb0a":[11,0,0,0,171], +"libwebsockets_8h.html#a9f2a8506fd963db95a5103823c60fb0a":[11,0,0,0,172], "libwebsockets_8h.html#abddb8d337fb2692586d892b494739003":[11,0,0,0,18], "libwebsockets_8h.html#ac3abb8b7e6d29a0292797230e4031681":[11,0,0,0,17], "libwebsockets_8h.html#adedbc79528b71a5c7f27cde87100c9aa":[11,0,0,0,15], "libwebsockets_8h.html#adf4abd01e8c43f07c6e498ce13590c3e":[11,0,0,0,131], -"libwebsockets_8h.html#aefb2f20fe5bb29d79701a399838ef4ce":[11,0,0,0,169], +"libwebsockets_8h.html#aefb2f20fe5bb29d79701a399838ef4ce":[11,0,0,0,170], "libwebsockets_8h.html#af52923473c59e643a974d65e12290831":[11,0,0,0,63], "libwebsockets_8h.html#aff42d53861afdc1a6edfb999ba688ecb":[11,0,0,0,11], "libwebsockets_8h_source.html":[11,0,0,0], @@ -247,7 +249,5 @@ var NAVTREEINDEX3 = "structlws__http__mount.html#aabec1a326780aafe11b977000983be0c":[9,4,0,1,1], "structlws__http__mount.html#ac8489b60b8f969eb19c9abbdeac90743":[9,4,0,1,12], "structlws__http__mount.html#ae137203040c6153694bd88a708da5395":[9,4,0,1,4], -"structlws__http__mount.html#ae7b5c0f4c5408061e6ea3a8d281f45af":[9,4,0,1,6], -"structlws__http__mount.html#ae90d1efe7178199fad39de2926902ee4":[9,4,0,1,7], -"structlws__plat__file__ops.html":[9,20,0] +"structlws__http__mount.html#ae7b5c0f4c5408061e6ea3a8d281f45af":[9,4,0,1,6] }; diff --git a/doc/html/navtreeindex4.js b/doc/html/navtreeindex4.js index 7524df53..956b252d 100644 --- a/doc/html/navtreeindex4.js +++ b/doc/html/navtreeindex4.js @@ -1,5 +1,7 @@ var NAVTREEINDEX4 = { +"structlws__http__mount.html#ae90d1efe7178199fad39de2926902ee4":[9,4,0,1,7], +"structlws__plat__file__ops.html":[9,20,0], "structlws__plat__file__ops.html#a01f483807a9862736b17ba9ed5110c40":[9,20,0,2], "structlws__plat__file__ops.html#a034ec96f2fbaf52b4aa3e82d20795f7b":[9,20,0,0], "structlws__plat__file__ops.html#a1fae8330ee94649a3551e31a30809793":[9,20,0,4], @@ -42,16 +44,16 @@ var NAVTREEINDEX4 = "structlws__process__html__state.html#adcafd17704775b4bbeea9561fb340968":[9,6,1,1,0], "structlws__process__html__state.html#af0732884ef891e24fe5fa237ebaa21a3":[9,6,1,1,4], "structlws__process__html__state.html#af21119890fdfebe28fb5c4dabfc1bdf5":[9,6,1,1,1], -"structlws__protocol__vhost__options.html":[9,4,2], "structlws__protocol__vhost__options.html":[9,4,0,0], -"structlws__protocol__vhost__options.html#a0640a92513c70ee6b9b295a9ad1658e7":[9,4,0,0,3], +"structlws__protocol__vhost__options.html":[9,4,2], "structlws__protocol__vhost__options.html#a0640a92513c70ee6b9b295a9ad1658e7":[9,4,2,3], -"structlws__protocol__vhost__options.html#abc714ddb4171756fc8196e9823a1e21c":[9,4,2,1], +"structlws__protocol__vhost__options.html#a0640a92513c70ee6b9b295a9ad1658e7":[9,4,0,0,3], "structlws__protocol__vhost__options.html#abc714ddb4171756fc8196e9823a1e21c":[9,4,0,0,1], -"structlws__protocol__vhost__options.html#acf9db77f8eb64cd4e314be9b43d8a8b9":[9,4,2,0], +"structlws__protocol__vhost__options.html#abc714ddb4171756fc8196e9823a1e21c":[9,4,2,1], "structlws__protocol__vhost__options.html#acf9db77f8eb64cd4e314be9b43d8a8b9":[9,4,0,0,0], -"structlws__protocol__vhost__options.html#afd99fbc90be51ea2465b550c2ec47822":[9,4,0,0,2], +"structlws__protocol__vhost__options.html#acf9db77f8eb64cd4e314be9b43d8a8b9":[9,4,2,0], "structlws__protocol__vhost__options.html#afd99fbc90be51ea2465b550c2ec47822":[9,4,2,2], +"structlws__protocol__vhost__options.html#afd99fbc90be51ea2465b550c2ec47822":[9,4,0,0,2], "structlws__protocols.html":[9,10,1], "structlws__protocols.html#a0d1d4996d81b2f5e125bcec981e461c5":[9,10,1,4], "structlws__protocols.html#a0e63edb457a613c3fa4271e0a8f19624":[9,10,1,2], @@ -67,8 +69,8 @@ var NAVTREEINDEX4 = "structlws__session__info.html#afb924864b70f40372920688a5c1c895e":[9,10,0,2,2], "structlws__token__limits.html":[9,6,4,1], "structlws__token__limits.html#a6ec712306cbf8585bce7a56758a3ceff":[9,6,4,1,0], -"structlws__tokens.html":[9,6,6], "structlws__tokens.html":[9,6,4,0], +"structlws__tokens.html":[9,6,6], "structlws__tokens.html#a855b7375d1d58516c0ecd4b60e9a7766":[9,6,6,1], "structlws__tokens.html#a855b7375d1d58516c0ecd4b60e9a7766":[9,6,4,0,1], "structlws__tokens.html#a9f3635412bc71a5cb78e9862b55f10cd":[9,6,6,0], diff --git a/lib/client-handshake.c b/lib/client-handshake.c index 254ccc19..278bb8d5 100644 --- a/lib/client-handshake.c +++ b/lib/client-handshake.c @@ -380,7 +380,7 @@ html_parser_cb(const hubbub_token *token, void *pw) switch (token->type) { case HUBBUB_TOKEN_DOCTYPE: - p += snprintf(p, end - p, "data.doctype.name.len, token->data.doctype.name.ptr, token->data.doctype.force_quirks ? @@ -389,20 +389,20 @@ html_parser_cb(const hubbub_token *token, void *pw) if (token->data.doctype.public_missing) printf("\tpublic: missing\n"); else - p += snprintf(p, end - p, "PUBLIC \"%.*s\"\n", + p += lws_snprintf(p, end - p, "PUBLIC \"%.*s\"\n", (int) token->data.doctype.public_id.len, token->data.doctype.public_id.ptr); if (token->data.doctype.system_missing) printf("\tsystem: missing\n"); else - p += snprintf(p, end - p, " \"%.*s\">\n", + p += lws_snprintf(p, end - p, " \"%.*s\">\n", (int) token->data.doctype.system_id.len, token->data.doctype.system_id.ptr); break; case HUBBUB_TOKEN_START_TAG: - p += snprintf(p, end - p, "<%.*s", (int)token->data.tag.name.len, + p += lws_snprintf(p, end - p, "<%.*s", (int)token->data.tag.name.len, token->data.tag.name.ptr); /* (token->data.tag.self_closing) ? @@ -422,23 +422,23 @@ html_parser_cb(const hubbub_token *token, void *pw) pp += r->from_len; plen -= r->from_len; } - p += snprintf(p, end - p, " %.*s=\"%s/%.*s\"", + p += lws_snprintf(p, end - p, " %.*s=\"%s/%.*s\"", (int) token->data.tag.attributes[i].name.len, token->data.tag.attributes[i].name.ptr, r->to, plen, pp); } else - p += snprintf(p, end - p, " %.*s=\"%.*s\"", + p += lws_snprintf(p, end - p, " %.*s=\"%.*s\"", (int) token->data.tag.attributes[i].name.len, token->data.tag.attributes[i].name.ptr, (int) token->data.tag.attributes[i].value.len, token->data.tag.attributes[i].value.ptr); } - p += snprintf(p, end - p, ">\n"); + p += lws_snprintf(p, end - p, ">\n"); break; case HUBBUB_TOKEN_END_TAG: - p += snprintf(p, end - p, "data.tag.name.len, + p += lws_snprintf(p, end - p, "data.tag.name.len, token->data.tag.name.ptr); /* (token->data.tag.self_closing) ? @@ -447,25 +447,25 @@ html_parser_cb(const hubbub_token *token, void *pw) "attributes:" : ""); */ for (i = 0; i < token->data.tag.n_attributes; i++) { - p += snprintf(p, end - p, " %.*s='%.*s'\n", + p += lws_snprintf(p, end - p, " %.*s='%.*s'\n", (int) token->data.tag.attributes[i].name.len, token->data.tag.attributes[i].name.ptr, (int) token->data.tag.attributes[i].value.len, token->data.tag.attributes[i].value.ptr); } - p += snprintf(p, end - p, ">\n"); + p += lws_snprintf(p, end - p, ">\n"); break; case HUBBUB_TOKEN_COMMENT: - p += snprintf(p, end - p, "\n", + p += lws_snprintf(p, end - p, "\n", (int) token->data.comment.len, token->data.comment.ptr); break; case HUBBUB_TOKEN_CHARACTER: - p += snprintf(p, end - p, "%.*s", (int) token->data.character.len, + p += lws_snprintf(p, end - p, "%.*s", (int) token->data.character.len, token->data.character.ptr); break; case HUBBUB_TOKEN_EOF: - p += snprintf(p, end - p, "\n"); + p += lws_snprintf(p, end - p, "\n"); break; } diff --git a/lib/lejp-conf.c b/lib/lejp-conf.c index 46866ee8..2b0a889c 100644 --- a/lib/lejp-conf.c +++ b/lib/lejp-conf.c @@ -247,7 +247,7 @@ lejp_globals_cb(struct lejp_ctx *ctx, char reason) return 0; } - a->p += snprintf(a->p, a->end - a->p, "%s", ctx->buf); + a->p += lws_snprintf(a->p, a->end - a->p, "%s", ctx->buf); *(a->p)++ = '\0'; return 0; @@ -613,11 +613,11 @@ dostring: n = a->end - a->p; strncpy(a->p, p, n); a->p += n; - a->p += snprintf(a->p, a->end - a->p, "%s", LWS_INSTALL_DATADIR); + a->p += lws_snprintf(a->p, a->end - a->p, "%s", LWS_INSTALL_DATADIR); p += n + strlen(ESC_INSTALL_DATADIR); } - a->p += snprintf(a->p, a->end - a->p, "%s", p); + a->p += lws_snprintf(a->p, a->end - a->p, "%s", p); *(a->p)++ = '\0'; return 0; @@ -684,7 +684,7 @@ lwsws_get_config_d(void *user, const char *d, const char * const *paths, } while (uv_fs_scandir_next(&req, &dent) != UV_EOF) { - snprintf(path, sizeof(path) - 1, "%s/%s", d, dent.name); + lws_snprintf(path, sizeof(path) - 1, "%s/%s", d, dent.name); ret = lwsws_get_config(user, path, paths, count_paths, cb); if (ret) goto bail; @@ -724,7 +724,7 @@ lwsws_get_config_d(void *user, const char *d, const char * const *paths, } for (i = 0; i < n; i++) { - snprintf(path, sizeof(path) - 1, "%s/%s", d, + lws_snprintf(path, sizeof(path) - 1, "%s/%s", d, namelist[i]->d_name); ret = lwsws_get_config(user, path, paths, count_paths, cb); if (ret) { @@ -773,11 +773,11 @@ lwsws_get_config_globals(struct lws_context_creation_info *info, const char *d, old++; } - snprintf(dd, sizeof(dd) - 1, "%s/conf", d); + lws_snprintf(dd, sizeof(dd) - 1, "%s/conf", d); if (lwsws_get_config(&a, dd, paths_global, ARRAY_SIZE(paths_global), lejp_globals_cb) > 1) return 1; - snprintf(dd, sizeof(dd) - 1, "%s/conf.d", d); + lws_snprintf(dd, sizeof(dd) - 1, "%s/conf.d", d); if (lwsws_get_config_d(&a, dd, paths_global, ARRAY_SIZE(paths_global), lejp_globals_cb) > 1) return 1; @@ -808,11 +808,11 @@ lwsws_get_config_vhosts(struct lws_context *context, a.protocols = info->protocols; a.extensions = info->extensions; - snprintf(dd, sizeof(dd) - 1, "%s/conf", d); + lws_snprintf(dd, sizeof(dd) - 1, "%s/conf", d); if (lwsws_get_config(&a, dd, paths_vhosts, ARRAY_SIZE(paths_vhosts), lejp_vhosts_cb) > 1) return 1; - snprintf(dd, sizeof(dd) - 1, "%s/conf.d", d); + lws_snprintf(dd, sizeof(dd) - 1, "%s/conf.d", d); if (lwsws_get_config_d(&a, dd, paths_vhosts, ARRAY_SIZE(paths_vhosts), lejp_vhosts_cb) > 1) return 1; diff --git a/lib/libuv.c b/lib/libuv.c index 44689dc8..c12353bf 100644 --- a/lib/libuv.c +++ b/lib/libuv.c @@ -492,7 +492,7 @@ lws_plat_plugins_init(struct lws_context * context, const char * const *d) lwsl_notice(" %s\n", dent.name); - snprintf(path, sizeof(path) - 1, "%s/%s", *d, dent.name); + lws_snprintf(path, sizeof(path) - 1, "%s/%s", *d, dent.name); if (uv_dlopen(path, &lib)) { uv_dlerror(&lib); lwsl_err("Error loading DSO: %s\n", lib.errmsg); @@ -500,11 +500,11 @@ lws_plat_plugins_init(struct lws_context * context, const char * const *d) } /* we could open it, can we get his init function? */ #if !defined(WIN32) - m = snprintf(path, sizeof(path) - 1, "init_%s", + m = lws_snprintf(path, sizeof(path) - 1, "init_%s", dent.name + 3 /* snip lib... */); path[m - 3] = '\0'; /* snip the .so */ #else - m = snprintf(path, sizeof(path) - 1, "init_%s", + m = lws_snprintf(path, sizeof(path) - 1, "init_%s", dent.name); path[m - 4] = '\0'; /* snip the .dll */ #endif @@ -569,10 +569,10 @@ lws_plat_plugins_destroy(struct lws_context * context) while (plugin) { p = plugin; #if !defined(WIN32) - m = snprintf(path, sizeof(path) - 1, "destroy_%s", plugin->name + 3); + m = lws_snprintf(path, sizeof(path) - 1, "destroy_%s", plugin->name + 3); path[m - 3] = '\0'; #else - m = snprintf(path, sizeof(path) - 1, "destroy_%s", plugin->name); + m = lws_snprintf(path, sizeof(path) - 1, "destroy_%s", plugin->name); path[m - 4] = '\0'; #endif diff --git a/lib/libwebsockets.c b/lib/libwebsockets.c index 79aee0ee..752fe345 100755 --- a/lib/libwebsockets.c +++ b/lib/libwebsockets.c @@ -1124,7 +1124,7 @@ lwsl_timestamp(int level, char *p, int len) continue; now = time_in_microseconds() / 100; if (ptm) - n = snprintf(p, len, + n = lws_snprintf(p, len, "[%04d/%02d/%02d %02d:%02d:%02d:%04d] %s: ", ptm->tm_year + 1900, ptm->tm_mon + 1, @@ -1134,7 +1134,7 @@ lwsl_timestamp(int level, char *p, int len) ptm->tm_sec, (int)(now % 10000), log_level_names[n]); else - n = snprintf(p, len, "[%llu:%04d] %s: ", + n = lws_snprintf(p, len, "[%llu:%04d] %s: ", (unsigned long long) now / 10000, (int)(now % 10000), log_level_names[n]); return n; @@ -1717,6 +1717,26 @@ lws_finalize_startup(struct lws_context *context) return 0; } +int +lws_snprintf(char *str, size_t size, const char *format, ...) +{ + va_list ap; + int n; + + if (!size) + return 0; + + va_start(ap, format); + n = vsnprintf(str, size, format, ap); + va_end(ap); + + if (n >= size) + return size; + + return n; +} + + LWS_VISIBLE LWS_EXTERN int lws_is_cgi(struct lws *wsi) { #ifdef LWS_WITH_CGI @@ -1910,18 +1930,18 @@ lws_cgi(struct lws *wsi, const char * const *exec_array, int script_uri_path_len if (uritok < 0) goto bail3; - snprintf(cgi_path, sizeof(cgi_path) - 1, "REQUEST_URI=%s", + lws_snprintf(cgi_path, sizeof(cgi_path) - 1, "REQUEST_URI=%s", lws_hdr_simple_ptr(wsi, uritok)); cgi_path[sizeof(cgi_path) - 1] = '\0'; env_array[n++] = cgi_path; env_array[n++] = p; - p += snprintf(p, end - p, "REQUEST_METHOD=%s", + p += lws_snprintf(p, end - p, "REQUEST_METHOD=%s", meth_names[m]); p++; env_array[n++] = p; - p += snprintf(p, end - p, "QUERY_STRING="); + p += lws_snprintf(p, end - p, "QUERY_STRING="); /* dump the individual URI Arg parameters */ m = 0; while (1) { @@ -1946,55 +1966,55 @@ lws_cgi(struct lws *wsi, const char * const *exec_array, int script_uri_path_len *p++ = '\0'; env_array[n++] = p; - p += snprintf(p, end - p, "PATH_INFO=%s", + p += lws_snprintf(p, end - p, "PATH_INFO=%s", lws_hdr_simple_ptr(wsi, uritok) + script_uri_path_len); p++; } if (lws_hdr_total_length(wsi, WSI_TOKEN_HTTP_REFERER)) { env_array[n++] = p; - p += snprintf(p, end - p, "HTTP_REFERER=%s", + p += lws_snprintf(p, end - p, "HTTP_REFERER=%s", lws_hdr_simple_ptr(wsi, WSI_TOKEN_HTTP_REFERER)); p++; } if (lws_hdr_total_length(wsi, WSI_TOKEN_HOST)) { env_array[n++] = p; - p += snprintf(p, end - p, "HTTP_HOST=%s", + p += lws_snprintf(p, end - p, "HTTP_HOST=%s", lws_hdr_simple_ptr(wsi, WSI_TOKEN_HOST)); p++; } if (lws_hdr_total_length(wsi, WSI_TOKEN_HTTP_COOKIE)) { env_array[n++] = p; - p += snprintf(p, end - p, "HTTP_COOKIE=%s", + p += lws_snprintf(p, end - p, "HTTP_COOKIE=%s", lws_hdr_simple_ptr(wsi, WSI_TOKEN_HTTP_COOKIE)); p++; } if (lws_hdr_total_length(wsi, WSI_TOKEN_HTTP_USER_AGENT)) { env_array[n++] = p; - p += snprintf(p, end - p, "USER_AGENT=%s", + p += lws_snprintf(p, end - p, "USER_AGENT=%s", lws_hdr_simple_ptr(wsi, WSI_TOKEN_HTTP_USER_AGENT)); p++; } if (uritok == WSI_TOKEN_POST_URI) { if (lws_hdr_total_length(wsi, WSI_TOKEN_HTTP_CONTENT_TYPE)) { env_array[n++] = p; - p += snprintf(p, end - p, "CONTENT_TYPE=%s", + p += lws_snprintf(p, end - p, "CONTENT_TYPE=%s", lws_hdr_simple_ptr(wsi, WSI_TOKEN_HTTP_CONTENT_TYPE)); p++; } if (lws_hdr_total_length(wsi, WSI_TOKEN_HTTP_CONTENT_LENGTH)) { env_array[n++] = p; - p += snprintf(p, end - p, "CONTENT_LENGTH=%s", + p += lws_snprintf(p, end - p, "CONTENT_LENGTH=%s", lws_hdr_simple_ptr(wsi, WSI_TOKEN_HTTP_CONTENT_LENGTH)); p++; } } env_array[n++] = p; - p += snprintf(p, end - p, "SCRIPT_PATH=%s", exec_array[0]) + 1; + p += lws_snprintf(p, end - p, "SCRIPT_PATH=%s", exec_array[0]) + 1; while (mp_cgienv) { env_array[n++] = p; - p += snprintf(p, end - p, "%s=%s", mp_cgienv->name, + p += lws_snprintf(p, end - p, "%s=%s", mp_cgienv->name, mp_cgienv->value); lwsl_debug(" Applying mount-specific cgi env '%s'\n", env_array[n - 1]); @@ -2431,7 +2451,7 @@ lws_access_log(struct lws *wsi) if (!p) p = ""; - l = snprintf(ass, sizeof(ass) - 1, "%s %d %lu %s\n", + l = lws_snprintf(ass, sizeof(ass) - 1, "%s %d %lu %s\n", wsi->access_log.header_log, wsi->access_log.response, wsi->access_log.sent, p); @@ -2475,7 +2495,7 @@ lws_json_dump_vhost(const struct lws_vhost *vh, char *buf, int len) if (len < 100) return 0; - buf += snprintf(buf, end - buf, + buf += lws_snprintf(buf, end - buf, "{\n \"name\":\"%s\",\n" " \"port\":\"%d\",\n" " \"use_ssl\":\"%d\",\n" @@ -2501,11 +2521,11 @@ lws_json_dump_vhost(const struct lws_vhost *vh, char *buf, int len) if (vh->mount_list) { const struct lws_http_mount *m = vh->mount_list; - buf += snprintf(buf, end - buf, ",\n \"mounts\":["); + buf += lws_snprintf(buf, end - buf, ",\n \"mounts\":["); while (m) { if (!first) - buf += snprintf(buf, end - buf, ","); - buf += snprintf(buf, end - buf, + buf += lws_snprintf(buf, end - buf, ","); + buf += lws_snprintf(buf, end - buf, "\n {\n \"mountpoint\":\"%s\",\n" " \"origin\":\"%s%s\",\n" " \"cache_max_age\":\"%d\",\n" @@ -2521,25 +2541,25 @@ lws_json_dump_vhost(const struct lws_vhost *vh, char *buf, int len) m->cache_revalidate, m->cache_intermediaries); if (m->def) - buf += snprintf(buf, end - buf, + buf += lws_snprintf(buf, end - buf, ",\n \"default\":\"%s\"", m->def); - buf += snprintf(buf, end - buf, "\n }"); + buf += lws_snprintf(buf, end - buf, "\n }"); first = 0; m = m->mount_next; } - buf += snprintf(buf, end - buf, "\n ]"); + buf += lws_snprintf(buf, end - buf, "\n ]"); } if (vh->protocols) { n = 0; first = 1; - buf += snprintf(buf, end - buf, ",\n \"ws-protocols\":["); + buf += lws_snprintf(buf, end - buf, ",\n \"ws-protocols\":["); while (n < vh->count_protocols) { if (!first) - buf += snprintf(buf, end - buf, ","); - buf += snprintf(buf, end - buf, + buf += lws_snprintf(buf, end - buf, ","); + buf += lws_snprintf(buf, end - buf, "\n {\n \"%s\":{\n" " \"status\":\"ok\"\n }\n }" , @@ -2547,10 +2567,10 @@ lws_json_dump_vhost(const struct lws_vhost *vh, char *buf, int len) first = 0; n++; } - buf += snprintf(buf, end - buf, "\n ]"); + buf += lws_snprintf(buf, end - buf, "\n ]"); } - buf += snprintf(buf, end - buf, "\n}"); + buf += lws_snprintf(buf, end - buf, "\n}"); return buf - orig; } @@ -2569,7 +2589,7 @@ lws_json_dump_context(const struct lws_context *context, char *buf, int len) time_t t = time(NULL); int listening = 0, cgi_count = 0, n; - buf += snprintf(buf, end - buf, "{ " + buf += lws_snprintf(buf, end - buf, "{ " "\"version\":\"%s\",\n" "\"uptime\":\"%ld\",\n" "\"cgi_spawned\":\"%d\",\n" @@ -2589,19 +2609,19 @@ lws_json_dump_context(const struct lws_context *context, char *buf, int len) m = getloadavg(d, 3); for (n = 0; n < m; n++) { - buf += snprintf(buf, end - buf, + buf += lws_snprintf(buf, end - buf, "\"l%d\":\"%.2f\",\n", n + 1, d[n]); } } #endif - buf += snprintf(buf, end - buf, "\"pt\":[\n "); + buf += lws_snprintf(buf, end - buf, "\"pt\":[\n "); for (n = 0; n < context->count_threads; n++) { pt = &context->pt[n]; if (n) - buf += snprintf(buf, end - buf, ","); - buf += snprintf(buf, end - buf, + buf += lws_snprintf(buf, end - buf, ","); + buf += lws_snprintf(buf, end - buf, "\n {\n" " \"fds_count\":\"%d\",\n" " \"ah_pool_inuse\":\"%d\",\n" @@ -2612,7 +2632,7 @@ lws_json_dump_context(const struct lws_context *context, char *buf, int len) pt->ah_wait_list_length); } - buf += snprintf(buf, end - buf, "], \"vhosts\":[\n "); + buf += lws_snprintf(buf, end - buf, "], \"vhosts\":[\n "); while (vh) { if (!first) @@ -2625,7 +2645,7 @@ lws_json_dump_context(const struct lws_context *context, char *buf, int len) vh = vh->vhost_next; } - buf += snprintf(buf, end - buf, "],\n\"listen_wsi\":\"%d\"", + buf += lws_snprintf(buf, end - buf, "],\n\"listen_wsi\":\"%d\"", listening); #ifdef LWS_WITH_CGI @@ -2640,10 +2660,10 @@ lws_json_dump_context(const struct lws_context *context, char *buf, int len) } } #endif - buf += snprintf(buf, end - buf, ",\n \"cgi_alive\":\"%d\"\n ", + buf += lws_snprintf(buf, end - buf, ",\n \"cgi_alive\":\"%d\"\n ", cgi_count); - buf += snprintf(buf, end - buf, "}\n "); + buf += lws_snprintf(buf, end - buf, "}\n "); return buf - orig; } diff --git a/lib/libwebsockets.h b/lib/libwebsockets.h index d19c899c..6a5f078a 100644 --- a/lib/libwebsockets.h +++ b/lib/libwebsockets.h @@ -149,7 +149,7 @@ struct sockaddr_in; #define LWS_O_RDONLY _O_RDONLY #if !defined(_MSC_VER) || _MSC_VER < 1900 /* Visual Studio 2015 already defines this in */ -#define snprintf _snprintf +#define lws_snprintf _snprintf #endif #ifndef __func__ @@ -3567,6 +3567,20 @@ lws_interface_to_sa(int ipv6, const char *ifname, struct sockaddr_in *addr, */ ///@{ +/** + * lws_snprintf(): snprintf that truncates the returned length too + * + * \param str: destination buffer + * \param size: bytes left in destination buffer + * \param format: format string + * \param ...: args for format + * + * This lets you correctly truncate buffers by concatenating lengths, if you + * reach the limit the reported length doesn't exceed the limit. + */ +LWS_VISIBLE LWS_EXTERN int +lws_snprintf(char *str, size_t size, const char *format, ...); + /** * lws_get_random(): fill a buffer with platform random data * diff --git a/lib/lws-plat-esp8266.c b/lib/lws-plat-esp8266.c index ba36e347..cb6c686d 100644 --- a/lib/lws-plat-esp8266.c +++ b/lib/lws-plat-esp8266.c @@ -249,7 +249,7 @@ lws_plat_get_peer_simple(struct lws *wsi, char *name, int namelen) { unsigned char *p = wsi->sock->proto.tcp->remote_ip; - snprintf(name, namelen, "%u.%u.%u.%u", p[0], p[1], p[2], p[3]); + lws_snprintf(name, namelen, "%u.%u.%u.%u", p[0], p[1], p[2], p[3]); return name; } diff --git a/lib/lws-plat-unix.c b/lib/lws-plat-unix.c index c3e58947..ee30d0f2 100644 --- a/lib/lws-plat-unix.c +++ b/lib/lws-plat-unix.c @@ -327,7 +327,7 @@ lws_plat_plugins_init(struct lws_context * context, const char * const *d) lwsl_notice(" %s\n", namelist[i]->d_name); - snprintf(path, sizeof(path) - 1, "%s/%s", *d, + lws_snprintf(path, sizeof(path) - 1, "%s/%s", *d, namelist[i]->d_name); l = dlopen(path, RTLD_NOW); if (!l) { @@ -337,7 +337,7 @@ lws_plat_plugins_init(struct lws_context * context, const char * const *d) goto bail; } /* we could open it, can we get his init function? */ - m = snprintf(path, sizeof(path) - 1, "init_%s", + m = lws_snprintf(path, sizeof(path) - 1, "init_%s", namelist[i]->d_name + 3 /* snip lib... */); path[m - 3] = '\0'; /* snip the .so */ initfunc = dlsym(l, path); @@ -402,7 +402,7 @@ lws_plat_plugins_destroy(struct lws_context * context) while (plugin) { p = plugin; - m = snprintf(path, sizeof(path) - 1, "destroy_%s", plugin->name + 3); + m = lws_snprintf(path, sizeof(path) - 1, "destroy_%s", plugin->name + 3); path[m - 3] = '\0'; func = dlsym(plugin->l, path); if (!func) { diff --git a/lib/private-libwebsockets.h b/lib/private-libwebsockets.h index 2d2e672d..f475a378 100644 --- a/lib/private-libwebsockets.h +++ b/lib/private-libwebsockets.h @@ -141,7 +141,7 @@ char *ets_strchr(const char *s, int c); #endif #ifdef LWS_HAVE__SNPRINTF -#define snprintf _snprintf +#define lws_snprintf _snprintf #endif #else /* not windows --> */ diff --git a/lib/server.c b/lib/server.c index 3dad2e27..c8a8b4cc 100644 --- a/lib/server.c +++ b/lib/server.c @@ -356,7 +356,7 @@ lws_http_serve(struct lws *wsi, char *uri, const char *origin, #endif int n; - snprintf(path, sizeof(path) - 1, "%s/%s", origin, uri); + lws_snprintf(path, sizeof(path) - 1, "%s/%s", origin, uri); #if !defined(_WIN32_WCE) && !defined(LWS_WITH_ESP8266) do { @@ -377,12 +377,12 @@ lws_http_serve(struct lws *wsi, char *uri, const char *origin, } sym[len] = '\0'; lwsl_debug("symlink %s -> %s\n", path, sym); - snprintf(path, sizeof(path) - 1, "%s", sym); + lws_snprintf(path, sizeof(path) - 1, "%s", sym); } #endif if ((S_IFMT & st.st_mode) == S_IFDIR) { lwsl_debug("default filename append to dir\n"); - snprintf(path, sizeof(path) - 1, "%s/%s/index.html", + lws_snprintf(path, sizeof(path) - 1, "%s/%s/index.html", origin, uri); } @@ -729,7 +729,7 @@ lws_http_action(struct lws *wsi) else me = "unknown"; - snprintf(wsi->access_log.header_log, l, + lws_snprintf(wsi->access_log.header_log, l, "%s - - [%s] \"%s %s %s\"", pa, da, me, uri_ptr, hver[wsi->u.http.request_version]); @@ -818,11 +818,11 @@ lws_http_action(struct lws *wsi) /* > at start indicates deal with by redirect */ if (hit->origin_protocol == LWSMPRO_REDIR_HTTP || hit->origin_protocol == LWSMPRO_REDIR_HTTPS) - n = snprintf((char *)end, 256, "%s%s", + n = lws_snprintf((char *)end, 256, "%s%s", oprot[hit->origin_protocol & 1], hit->origin); else - n = snprintf((char *)end, 256, + n = lws_snprintf((char *)end, 256, "%s%s%s/", oprot[lws_is_ssl(wsi)], lws_hdr_simple_ptr(wsi, WSI_TOKEN_HOST), uri_ptr); diff --git a/plugins/generic-sessions/handlers.c b/plugins/generic-sessions/handlers.c index 108983cc..ccea5446 100644 --- a/plugins/generic-sessions/handlers.c +++ b/plugins/generic-sessions/handlers.c @@ -39,7 +39,7 @@ lwsgs_handler_confirm(struct per_vhost_data__gs *vhd, struct lws *wsi, goto verf_fail; u.username[0] = '\0'; - snprintf(s, sizeof(s) - 1, + lws_snprintf(s, sizeof(s) - 1, "select username,email,verified from users where token = '%s';", lws_sql_purify(esc, &cookie[6], sizeof(esc) - 1)); if (sqlite3_exec(vhd->pdb, s, lwsgs_lookup_callback_user, &u, NULL) != @@ -55,7 +55,7 @@ lwsgs_handler_confirm(struct per_vhost_data__gs *vhd, struct lws *wsi, } lwsl_notice("Verifying %s\n", u.username); - snprintf(s, sizeof(s) - 1, + lws_snprintf(s, sizeof(s) - 1, "update users set verified=%d where username='%s';", LWSGS_VERIFIED_ACCEPTED, lws_sql_purify(esc, u.username, sizeof(esc) - 1)); @@ -74,7 +74,7 @@ lwsgs_handler_confirm(struct per_vhost_data__gs *vhd, struct lws *wsi, a.email = u.email; lws_callback_vhost_protocols(wsi, LWS_CALLBACK_GS_EVENT, &a, 0); - snprintf(pss->onward, sizeof(pss->onward), + lws_snprintf(pss->onward, sizeof(pss->onward), "%s/post-verify-ok.html", vhd->email_confirm_url); pss->login_expires = lws_now_secs() + vhd->timeout_absolute_secs; @@ -98,7 +98,7 @@ verf_fail: lwsgs_get_sid_from_wsi(wsi, &pss->delete_session); pss->login_expires = 0; - snprintf(pss->onward, sizeof(pss->onward), "%s/post-verify-fail.html", + lws_snprintf(pss->onward, sizeof(pss->onward), "%s/post-verify-fail.html", vhd->email_confirm_url); return 1; @@ -119,7 +119,7 @@ lwsgs_handler_forgot(struct per_vhost_data__gs *vhd, struct lws *wsi, goto forgot_fail; u.username[0] = '\0'; - snprintf(s, sizeof(s) - 1, + lws_snprintf(s, sizeof(s) - 1, "select username,verified from users where verified=%d and " "token = '%s' and token_time != 0;", LWSGS_VERIFIED_ACCEPTED, @@ -140,7 +140,7 @@ lwsgs_handler_forgot(struct per_vhost_data__gs *vhd, struct lws *wsi, /* mark user as having validated forgot flow just now */ - snprintf(s, sizeof(s) - 1, + lws_snprintf(s, sizeof(s) - 1, "update users set token_time=0,last_forgot_validated=%lu " "where username='%s';", (unsigned long)lws_now_secs(), @@ -157,7 +157,7 @@ lwsgs_handler_forgot(struct per_vhost_data__gs *vhd, struct lws *wsi, if (!a) a = "broken-forget-post-good-url"; - snprintf(pss->onward, sizeof(pss->onward), + lws_snprintf(pss->onward, sizeof(pss->onward), "%s/%s", vhd->email_confirm_url, a); pss->login_expires = lws_now_secs() + vhd->timeout_absolute_secs; @@ -185,7 +185,7 @@ forgot_fail: if (!a) a = "broken-forget-post-bad-url"; - snprintf(pss->onward, sizeof(pss->onward), "%s/%s", + lws_snprintf(pss->onward, sizeof(pss->onward), "%s/%s", vhd->email_confirm_url, a); return 1; @@ -227,7 +227,7 @@ lwsgs_handler_check(struct per_vhost_data__gs *vhd, goto reply; } - snprintf(s, sizeof(s) - 1, + lws_snprintf(s, sizeof(s) - 1, "select username, email from users where %s = '%s';", colname[n], lws_sql_purify(esc, pc, sizeof(esc) - 1)); if (sqlite3_exec(vhd->pdb, s, lwsgs_lookup_callback_user, &u, NULL) != @@ -320,7 +320,7 @@ lwsgs_handler_change_password(struct per_vhost_data__gs *vhd, struct lws *wsi, a.email = ""; lws_callback_vhost_protocols(wsi, LWS_CALLBACK_GS_EVENT, &a, 0); - snprintf(s, sizeof(s) - 1, + lws_snprintf(s, sizeof(s) - 1, "delete from users where username='%s';" "delete from sessions where username='%s';", lws_sql_purify(esc, u.username, sizeof(esc) - 1), @@ -333,7 +333,7 @@ lwsgs_handler_change_password(struct per_vhost_data__gs *vhd, struct lws *wsi, lwsl_notice("updating password hash\n"); - snprintf(s, sizeof(s) - 1, + lws_snprintf(s, sizeof(s) - 1, "update users set pwhash='%s', pwsalt='%s', " "last_forgot_validated=0 where username='%s';", u.pwhash.id, u.pwsalt.id, @@ -385,13 +385,13 @@ lwsgs_handler_forgot_pw_form(struct per_vhost_data__gs *vhd, u.username[0] = '\0'; if (lws_spa_get_string(pss->spa, FGS_USERNAME)) - snprintf(s, sizeof(s) - 1, + lws_snprintf(s, sizeof(s) - 1, "select username,email " "from users where username = '%s';", lws_sql_purify(esc, lws_spa_get_string(pss->spa, FGS_USERNAME), sizeof(esc) - 1)); else - snprintf(s, sizeof(s) - 1, + lws_snprintf(s, sizeof(s) - 1, "select username,email " "from users where email = '%s';", lws_sql_purify(esc, lws_spa_get_string(pss->spa, FGS_EMAIL), sizeof(esc) - 1)); @@ -414,7 +414,7 @@ lwsgs_handler_forgot_pw_form(struct per_vhost_data__gs *vhd, return 1; } sha1_to_lwsgw_hash(sid_rand, &hash); - n = snprintf(s, sizeof(s), + n = lws_snprintf(s, sizeof(s), "From: Forgot Password Assistant Noreply <%s>\n" "To: %s <%s>\n" "Subject: Password reset request\n" @@ -427,7 +427,7 @@ lwsgs_handler_forgot_pw_form(struct per_vhost_data__gs *vhd, lws_sql_purify(esc2, u.email, sizeof(esc2) - 1), lws_sql_purify(esc3, u.username, sizeof(esc3) - 1), lws_sql_purify(esc4, pss->ip, sizeof(esc4) - 1)); - snprintf(s + n, sizeof(s) -n, + lws_snprintf(s + n, sizeof(s) -n, "%s/lwsgs-forgot?token=%s" "&good=%s" "&bad=%s\n\n" @@ -446,7 +446,7 @@ lwsgs_handler_forgot_pw_form(struct per_vhost_data__gs *vhd, sizeof(esc3) - 1), vhd->email_contact_person); - snprintf((char *)buffer, sizeof(buffer) - 1, + lws_snprintf((char *)buffer, sizeof(buffer) - 1, "insert into email(username, content)" " values ('%s', '%s');", lws_sql_purify(esc, u.username, sizeof(esc) - 1), s); @@ -457,7 +457,7 @@ lwsgs_handler_forgot_pw_form(struct per_vhost_data__gs *vhd, return 1; } - snprintf(s, sizeof(s) - 1, + lws_snprintf(s, sizeof(s) - 1, "update users set token='%s',token_time='%ld' where username='%s';", hash.id, (long)lws_now_secs(), lws_sql_purify(esc, u.username, sizeof(esc) - 1)); @@ -513,7 +513,7 @@ lwsgs_handler_register_form(struct per_vhost_data__gs *vhd, } u.username[0] = '\0'; - snprintf(s, sizeof(s) - 1, "select username, email from users where email = '%s';", + lws_snprintf(s, sizeof(s) - 1, "select username, email from users where email = '%s';", lws_sql_purify(esc, lws_spa_get_string(pss->spa, FGS_EMAIL), sizeof(esc) - 1)); @@ -543,7 +543,7 @@ lwsgs_handler_register_form(struct per_vhost_data__gs *vhd, } sha1_to_lwsgw_hash(sid_rand, &hash); - snprintf((char *)buffer, sizeof(buffer) - 1, + lws_snprintf((char *)buffer, sizeof(buffer) - 1, "insert into users(username," " creation_time, ip, email, verified," " pwhash, pwsalt, token, last_forgot_validated)" @@ -561,7 +561,7 @@ lwsgs_handler_register_form(struct per_vhost_data__gs *vhd, return 1; } - snprintf(s, sizeof(s), + lws_snprintf(s, sizeof(s), "From: Noreply <%s>\n" "To: %s <%s>\n" "Subject: Registration verification\n" @@ -584,7 +584,7 @@ lwsgs_handler_register_form(struct per_vhost_data__gs *vhd, vhd->email_confirm_url, hash.id, vhd->email_contact_person); - snprintf((char *)buffer, sizeof(buffer) - 1, + lws_snprintf((char *)buffer, sizeof(buffer) - 1, "insert into email(username, content) values ('%s', '%s');", lws_sql_purify(esc, lws_spa_get_string(pss->spa, FGS_USERNAME), sizeof(esc) - 1), s); diff --git a/plugins/generic-sessions/protocol_generic_sessions.c b/plugins/generic-sessions/protocol_generic_sessions.c index 7dc31b28..a828c209 100644 --- a/plugins/generic-sessions/protocol_generic_sessions.c +++ b/plugins/generic-sessions/protocol_generic_sessions.c @@ -77,7 +77,7 @@ lwsgs_email_cb_get_body(struct lws_email *email, char *buf, int len) a.buf = buf; a.len = len; - snprintf(ss, sizeof(ss) - 1, + lws_snprintf(ss, sizeof(ss) - 1, "select content from email where username='%s';", lws_sql_purify(esc, vhd->u.username, sizeof(esc) - 1)); @@ -100,7 +100,7 @@ lwsgs_email_cb_sent(struct lws_email *email) char s[200], esc[50]; /* mark the user as having sent the verification email */ - snprintf(s, sizeof(s) - 1, + lws_snprintf(s, sizeof(s) - 1, "update users set verified=1 where username='%s' and verified==0;", lws_sql_purify(esc, vhd->u.username, sizeof(esc) - 1)); if (sqlite3_exec(vhd->pdb, s, NULL, NULL, NULL) != SQLITE_OK) { @@ -109,7 +109,7 @@ lwsgs_email_cb_sent(struct lws_email *email) return 1; } - snprintf(s, sizeof(s) - 1, + lws_snprintf(s, sizeof(s) - 1, "delete from email where username='%s';", lws_sql_purify(esc, vhd->u.username, sizeof(esc) - 1)); if (sqlite3_exec(vhd->pdb, s, NULL, NULL, NULL) != SQLITE_OK) { @@ -132,7 +132,7 @@ lwsgs_email_cb_on_next(struct lws_email *email) /* * users not verified in 24h get deleted */ - snprintf(s, sizeof(s) - 1, "delete from users where ((verified != %d)" + lws_snprintf(s, sizeof(s) - 1, "delete from users where ((verified != %d)" " and (creation_time <= %lu));", LWSGS_VERIFIED_ACCEPTED, (unsigned long)now - vhd->timeout_email_secs); if (sqlite3_exec(vhd->pdb, s, NULL, NULL, NULL) != SQLITE_OK) { @@ -141,7 +141,7 @@ lwsgs_email_cb_on_next(struct lws_email *email) return 1; } - snprintf(s, sizeof(s) - 1, "update users set token_time=0 where " + lws_snprintf(s, sizeof(s) - 1, "update users set token_time=0 where " "(token_time <= %lu);", (unsigned long)now - vhd->timeout_email_secs); if (sqlite3_exec(vhd->pdb, s, NULL, NULL, NULL) != SQLITE_OK) { @@ -151,14 +151,14 @@ lwsgs_email_cb_on_next(struct lws_email *email) } vhd->u.username[0] = '\0'; - snprintf(s, sizeof(s) - 1, "select username from email limit 1;"); + lws_snprintf(s, sizeof(s) - 1, "select username from email limit 1;"); if (sqlite3_exec(vhd->pdb, s, lwsgs_lookup_callback_user, &vhd->u, NULL) != SQLITE_OK) { lwsl_err("Unable to lookup user: %s\n", sqlite3_errmsg(vhd->pdb)); return 1; } - snprintf(s, sizeof(s) - 1, + lws_snprintf(s, sizeof(s) - 1, "select username, creation_time, email, ip, verified, token" " from users where username='%s' limit 1;", lws_sql_purify(esc, vhd->u.username, sizeof(esc) - 1)); @@ -207,7 +207,7 @@ lwsgs_subst(void *data, int index) a->pss->delete_session = sid; return NULL; } - snprintf(s, sizeof(s) - 1, "select username,email " + lws_snprintf(s, sizeof(s) - 1, "select username,email " "from users where username = '%s';", lws_sql_purify(esc, a->pss->result, sizeof(esc) - 1)); if (sqlite3_exec(a->vhd->pdb, s, lwsgs_lookup_callback_user, @@ -467,7 +467,7 @@ callback_generic_sessions(struct lws *wsi, enum lws_callback_reasons reason, if (lws_hdr_copy(wsi, cookie, sizeof(cookie) - 1, WSI_TOKEN_HOST) < 0) return 1; - snprintf(pss->onward, sizeof(pss->onward) - 1, + lws_snprintf(pss->onward, sizeof(pss->onward) - 1, "%s%s%s", oprot[lws_is_ssl(wsi)], cookie, args->p); lwsl_notice("redirecting to ourselves with cookie refresh\n"); @@ -504,7 +504,7 @@ callback_generic_sessions(struct lws *wsi, enum lws_callback_reasons reason, if (lwsgs_lookup_session(vhd, &sid, username, sizeof(username))) break; - snprintf(s, sizeof(s) - 1, + lws_snprintf(s, sizeof(s) - 1, "select username, email from users where username='%s';", username); if (sqlite3_exec(vhd->pdb, s, lwsgs_lookup_callback_user, &u, NULL) != diff --git a/plugins/generic-sessions/protocol_lws_messageboard.c b/plugins/generic-sessions/protocol_lws_messageboard.c index 0adfe8cb..472f3e1b 100644 --- a/plugins/generic-sessions/protocol_lws_messageboard.c +++ b/plugins/generic-sessions/protocol_lws_messageboard.c @@ -132,7 +132,7 @@ post_message(struct lws *wsi, struct per_vhost_data__gs_mb *vhd, vhd->gsp->callback(wsi, LWS_CALLBACK_SESSION_INFO, pss->pss_gs, &sinfo, 0); - snprintf((char *)s, sizeof(s) - 1, + lws_snprintf((char *)s, sizeof(s) - 1, "insert into msg(time, username, email, ip, content)" " values (%lu, '%s', '%s', '%s', '%s');", (unsigned long)lws_now_secs(), sinfo.username, sinfo.email, sinfo.ip, @@ -253,16 +253,16 @@ callback_messageboard(struct lws *wsi, enum lws_callback_reasons reason, } /* format in JSON */ - p += snprintf(p, end - p, + p += lws_snprintf(p, end - p, "{\"idx\":\"%lu\",\"time\":\"%lu\",", m.idx, m.time); - p += snprintf(p, end - p, " \"username\":\"%s\",", + p += lws_snprintf(p, end - p, " \"username\":\"%s\",", lws_json_purify(e, m.username, sizeof(e))); - p += snprintf(p, end - p, " \"email\":\"%s\",", + p += lws_snprintf(p, end - p, " \"email\":\"%s\",", lws_json_purify(e, m.email, sizeof(e))); - p += snprintf(p, end - p, " \"ip\":\"%s\",", + p += lws_snprintf(p, end - p, " \"ip\":\"%s\",", lws_json_purify(e, m.ip, sizeof(e))); - p += snprintf(p, end - p, " \"content\":\"%s\"}", + p += lws_snprintf(p, end - p, " \"content\":\"%s\"}", lws_json_purify(e, m.content, sizeof(e))); if (lws_write(wsi, (unsigned char *)start, p - start, diff --git a/plugins/generic-sessions/utils.c b/plugins/generic-sessions/utils.c index 98dfe318..f751f287 100644 --- a/plugins/generic-sessions/utils.c +++ b/plugins/generic-sessions/utils.c @@ -64,16 +64,16 @@ lwsgw_cookie_from_session(lwsgw_hash *sid, time_t expires, char **p, char *end) struct tm *tm = gmtime(&expires); time_t n = lws_now_secs(); - *p += snprintf(*p, end - *p, "id=%s;Expires=", sid->id); + *p += lws_snprintf(*p, end - *p, "id=%s;Expires=", sid->id); #ifdef WIN32 *p += strftime(*p, end - *p, "%Y %H:%M %Z", tm); #else *p += strftime(*p, end - *p, "%F %H:%M %Z", tm); #endif - *p += snprintf(*p, end - *p, ";path=/"); - *p += snprintf(*p, end - *p, ";Max-Age=%lu", (unsigned long)(expires - n)); -// *p += snprintf(*p, end - *p, ";secure"); - *p += snprintf(*p, end - *p, ";HttpOnly"); + *p += lws_snprintf(*p, end - *p, ";path=/"); + *p += lws_snprintf(*p, end - *p, ";Max-Age=%lu", (unsigned long)(expires - n)); +// *p += lws_snprintf(*p, end - *p, ";secure"); + *p += lws_snprintf(*p, end - *p, ";HttpOnly"); } int @@ -87,7 +87,7 @@ lwsgw_expire_old_sessions(struct per_vhost_data__gs *vhd) vhd->last_session_expire = n; - snprintf(s, sizeof(s) - 1, + lws_snprintf(s, sizeof(s) - 1, "delete from sessions where " "expire <= %lu;", (unsigned long)n); @@ -112,7 +112,7 @@ lwsgw_update_session(struct per_vhost_data__gs *vhd, else n += vhd->timeout_anon_absolute_secs; - snprintf(s, sizeof(s) - 1, + lws_snprintf(s, sizeof(s) - 1, "update sessions set expire=%lu,username='%s' where name='%s';", (unsigned long)n, lws_sql_purify(esc, user, sizeof(esc)), @@ -222,7 +222,7 @@ lwsgs_lookup_session(struct per_vhost_data__gs *vhd, lwsgw_expire_old_sessions(vhd); - snprintf(s, sizeof(s) - 1, + lws_snprintf(s, sizeof(s) - 1, "select username from sessions where name = '%s';", lws_sql_purify(esc, sid->id, sizeof(esc) - 1)); @@ -300,7 +300,7 @@ lwsgs_lookup_user(struct per_vhost_data__gs *vhd, char s[150], esc[50]; u->username[0] = '\0'; - snprintf(s, sizeof(s) - 1, + lws_snprintf(s, sizeof(s) - 1, "select username,creation_time,ip,email,verified,pwhash,pwsalt,last_forgot_validated " "from users where username = '%s';", lws_sql_purify(esc, username, sizeof(esc) - 1)); @@ -340,7 +340,7 @@ lwsgs_new_session_id(struct per_vhost_data__gs *vhd, sha1_to_lwsgw_hash(sid_rand, sid); - snprintf(s, sizeof(s) - 1, + lws_snprintf(s, sizeof(s) - 1, "insert into sessions(name, username, expire) " "values ('%s', '%s', %u);", lws_sql_purify(esc, sid->id, sizeof(esc) - 1), @@ -398,7 +398,7 @@ lwsgs_check_credentials(struct per_vhost_data__gs *vhd, lwsl_info("user %s found, salt '%s'\n", username, u.pwsalt.id); /* [password in ascii][salt] */ - n = snprintf((char *)buffer, sizeof(buffer) - 1, + n = lws_snprintf((char *)buffer, sizeof(buffer) - 1, "%s-%s-%s", password, vhd->confounder, u.pwsalt.id); /* sha1sum of password + salt */ @@ -439,7 +439,7 @@ lwsgs_hash_password(struct per_vhost_data__gs *vhd, sha1_to_lwsgw_hash(sid_rand, &hash); /* [password in ascii][salt] */ - n = snprintf((char *)buffer, sizeof(buffer) - 1, + n = lws_snprintf((char *)buffer, sizeof(buffer) - 1, "%s-%s-%s", password, vhd->confounder, u->pwsalt.id); /* sha1sum of password + salt */ diff --git a/plugins/generic-table/protocol_table_dirlisting.c b/plugins/generic-table/protocol_table_dirlisting.c index 8d673111..6c3fe443 100644 --- a/plugins/generic-table/protocol_table_dirlisting.c +++ b/plugins/generic-table/protocol_table_dirlisting.c @@ -95,7 +95,7 @@ scan_dir(struct lws *wsi, struct per_session_data__tbl_dir *pss) lws_protocol_dir_kill_monitor(pss); - snprintf(path, sizeof(path) - 1, "%s/%s", pss->dir, pss->reldir); + lws_snprintf(path, sizeof(path) - 1, "%s/%s", pss->dir, pss->reldir); //lwsl_notice("path = %s\n", path); pss->event_req = malloc(sizeof(*pss->event_req)); @@ -119,7 +119,7 @@ scan_dir(struct lws *wsi, struct per_session_data__tbl_dir *pss) pss->p = pss->strings; while (uv_fs_scandir_next(&req, &dent) != UV_EOF) { - snprintf(path, sizeof(path) - 1, "%s/%s/%s", pss->dir, pss->reldir, dent.name); + lws_snprintf(path, sizeof(path) - 1, "%s/%s/%s", pss->dir, pss->reldir, dent.name); if (stat(path, &st)) { lwsl_info("unable to stat %s\n", path); @@ -128,15 +128,15 @@ scan_dir(struct lws *wsi, struct per_session_data__tbl_dir *pss) f = malloc(sizeof(*f)); f->next = NULL; f->name = pss->p; - n = snprintf(pss->p, end - pss->p, "%s", dent.name); + n = lws_snprintf(pss->p, end - pss->p, "%s", dent.name); pss->p += n + 1; f->uri = NULL; if ((S_IFMT & st.st_mode) == S_IFDIR) { - n = snprintf(pss->p, end - pss->p, "=%s/%s", pss->reldir, dent.name); + n = lws_snprintf(pss->p, end - pss->p, "=%s/%s", pss->reldir, dent.name); f->uri = pss->p; } if (lws_get_mimetype(dent.name, NULL)) { - n = snprintf(pss->p, end - pss->p, "./serve/%s/%s", pss->reldir, dent.name); + n = lws_snprintf(pss->p, end - pss->p, "./serve/%s/%s", pss->reldir, dent.name); f->uri = pss->p; } if (f->uri) @@ -152,13 +152,13 @@ scan_dir(struct lws *wsi, struct per_session_data__tbl_dir *pss) icon = "📂"; f->icon = pss->p; - n = snprintf(pss->p, end - pss->p, "%s", icon); + n = lws_snprintf(pss->p, end - pss->p, "%s", icon); pss->p += n + 1; f->date = pss->p; tm = gmtime(&st.st_mtime); strftime(da, sizeof(da), "%Y-%b-%d %H:%M:%S %z", tm); - n = snprintf(pss->p, end - pss->p, "%s", da); + n = lws_snprintf(pss->p, end - pss->p, "%s", da); pss->p += n + 1; f->size = st.st_size; @@ -244,11 +244,11 @@ callback_lws_table_dirlisting(struct lws *wsi, enum lws_callback_reasons reason, if (scan_dir(wsi, pss)) return 1; - p += snprintf(p, end - p, "{\"breadcrumbs\":["); + p += lws_snprintf(p, end - p, "{\"breadcrumbs\":["); q = pss->reldir; if (!q[0]) - p += snprintf(p, end - p, "{\"name\":\"top\"}"); + p += lws_snprintf(p, end - p, "{\"name\":\"top\"}"); while (*q) { @@ -280,48 +280,48 @@ callback_lws_table_dirlisting(struct lws *wsi, enum lws_callback_reasons reason, q = q1 + 1; } if (!first) - p += snprintf(p, end - p, ","); + p += lws_snprintf(p, end - p, ","); else first = 0; - p += snprintf(p, end - p, "{\"name\":\"%s\"", + p += lws_snprintf(p, end - p, "{\"name\":\"%s\"", lws_json_purify(e, s, sizeof(e))); if (*q) { w = s1; while (w[0] == '/' && w[1] == '/') w++; - p += snprintf(p, end - p, ",\"url\":\"%s\"", + p += lws_snprintf(p, end - p, ",\"url\":\"%s\"", lws_json_purify(e, w, sizeof(e))); } - p += snprintf(p, end - p, "}"); + p += lws_snprintf(p, end - p, "}"); if (!q1) break; } - p += snprintf(p, end - p, "],\"data\":["); + p += lws_snprintf(p, end - p, "],\"data\":["); f = pss->base.next; while (f) { /* format in JSON */ - p += snprintf(p, end - p, "{\"Icon\":\"%s\",", + p += lws_snprintf(p, end - p, "{\"Icon\":\"%s\",", lws_json_purify(e, f->icon, sizeof(e))); - p += snprintf(p, end - p, " \"Date\":\"%s\",", + p += lws_snprintf(p, end - p, " \"Date\":\"%s\",", lws_json_purify(e, f->date, sizeof(e))); - p += snprintf(p, end - p, " \"Size\":\"%ld\",", + p += lws_snprintf(p, end - p, " \"Size\":\"%ld\",", f->size); if (f->uri) - p += snprintf(p, end - p, " \"uri\":\"%s\",", + p += lws_snprintf(p, end - p, " \"uri\":\"%s\",", lws_json_purify(e, f->uri, sizeof(e))); - p += snprintf(p, end - p, " \"Name\":\"%s\"}", + p += lws_snprintf(p, end - p, " \"Name\":\"%s\"}", lws_json_purify(e, f->name, sizeof(e))); f = f->next; if (f) - p += snprintf(p, end - p, ","); + p += lws_snprintf(p, end - p, ","); } - p += snprintf(p, end - p, "]}"); + p += lws_snprintf(p, end - p, "]}"); free_scan_dir(pss); diff --git a/plugins/protocol_dumb_increment.c b/plugins/protocol_dumb_increment.c index 51db911f..042c5dc9 100644 --- a/plugins/protocol_dumb_increment.c +++ b/plugins/protocol_dumb_increment.c @@ -96,7 +96,7 @@ callback_dumb_increment(struct lws *wsi, enum lws_callback_reasons reason, break; case LWS_CALLBACK_SERVER_WRITEABLE: - n = snprintf((char *)p, sizeof(buf) - LWS_PRE, "%d", pss->number++); + n = lws_snprintf((char *)p, sizeof(buf) - LWS_PRE, "%d", pss->number++); m = lws_write(wsi, p, n, LWS_WRITE_TEXT); if (m < n) { lwsl_err("ERROR %d writing to di socket\n", n); diff --git a/plugins/protocol_lws_status.c b/plugins/protocol_lws_status.c index 67b53980..49fa6b99 100644 --- a/plugins/protocol_lws_status.c +++ b/plugins/protocol_lws_status.c @@ -130,7 +130,7 @@ callback_lws_status(struct lws *wsi, enum lws_callback_reasons reason, switch (pss->walk) { case WALK_INITIAL: n = LWS_WRITE_TEXT | LWS_WRITE_NO_FIN;; - p += snprintf(p, end - p, + p += lws_snprintf(p, end - p, "{ \"version\":\"%s\"," " \"hostname\":\"%s\"," " \"wsi\":\"%d\", \"conns\":[", @@ -166,7 +166,7 @@ callback_lws_status(struct lws *wsi, enum lws_callback_reasons reason, } lws_get_peer_simple(pss->walk_next->wsi, ip, sizeof(ip)); - p += snprintf(p, end - p, + p += lws_snprintf(p, end - p, "{\"peer\":\"%s\",\"time\":\"%ld\"," "\"ua\":\"%s\"}", ip, (unsigned long)pss->walk_next->time_est, diff --git a/plugins/protocol_post_demo.c b/plugins/protocol_post_demo.c index 2b07d5e0..18b6b602 100644 --- a/plugins/protocol_post_demo.c +++ b/plugins/protocol_post_demo.c @@ -147,16 +147,16 @@ callback_post_demo(struct lws *wsi, enum lws_callback_reasons reason, ""); for (n = 0; n < ARRAY_SIZE(param_names); n++) - p += snprintf((char *)p, end - p, + p += lws_snprintf((char *)p, end - p, "", param_names[n], lws_spa_get_length(pss->spa, n), lws_spa_get_string(pss->spa, n)); - p += snprintf((char *)p, end - p, "
    NameLengthValue
    %s%d%s

    filename: %s, length %ld", + p += lws_snprintf((char *)p, end - p, "
    filename: %s, length %ld", pss->filename, pss->file_length); - p += snprintf((char *)p, end - p, ""); + p += lws_snprintf((char *)p, end - p, ""); pss->result_len = p - (unsigned char *)(pss->result + LWS_PRE); n = LWS_PRE + 1024; diff --git a/test-server/test-fraggle.c b/test-server/test-fraggle.c index 2137e7b5..80aaea58 100644 --- a/test-server/test-fraggle.c +++ b/test-server/test-fraggle.c @@ -349,7 +349,7 @@ int main(int argc, char **argv) struct lws_client_connect_info i; address = argv[optind]; - snprintf(ads_port, sizeof(ads_port), "%s:%u", + lws_snprintf(ads_port, sizeof(ads_port), "%s:%u", address, port & 65535); memset(&i, 0, sizeof(i)); i.context = context; diff --git a/test-server/test-ping.c b/test-server/test-ping.c index d10e20da..25b8a15c 100644 --- a/test-server/test-ping.c +++ b/test-server/test-ping.c @@ -457,7 +457,7 @@ int main(int argc, char **argv) /* create client websockets using dumb increment protocol */ address = argv[optind]; - snprintf(ads_port, sizeof(ads_port), "%s:%u", + lws_snprintf(ads_port, sizeof(ads_port), "%s:%u", address, port & 65535); lwsl_notice("Connecting to %s...\n", ads_port); memset(&i, 0, sizeof(i)); diff --git a/test-server/test-server-http.c b/test-server/test-server-http.c index e15cef98..60cf02a4 100644 --- a/test-server/test-server-http.c +++ b/test-server/test-server-http.c @@ -460,16 +460,16 @@ int callback_http(struct lws *wsi, enum lws_callback_reasons reason, void *user, ""); for (n = 0; n < ARRAY_SIZE(param_names); n++) - p += snprintf((char *)p, end - p, + p += lws_snprintf((char *)p, end - p, "", param_names[n], lws_spa_get_length(pss->spa, n), lws_spa_get_string(pss->spa, n)); - p += snprintf((char *)p, end - p, "
    NameLengthValue
    %s%d%s

    filename: %s, length %ld", + p += lws_snprintf((char *)p, end - p, "
    filename: %s, length %ld", pss->filename, pss->file_length); - p += snprintf((char *)p, end - p, ""); + p += lws_snprintf((char *)p, end - p, ""); pss->result_len = p - (unsigned char *)(pss->result + LWS_PRE); p = buffer + LWS_PRE; diff --git a/test-server/test-server-status.c b/test-server/test-server-status.c index d85897b8..50fe5bf9 100644 --- a/test-server/test-server-status.c +++ b/test-server/test-server-status.c @@ -42,7 +42,7 @@ update_status(struct lws *wsi, struct per_session_data__lws_status *pss) struct tm tm; #endif - p += snprintf(p, 512, " { %s, \"wsi\":\"%d\", \"conns\":[", + p += lws_snprintf(p, 512, " { %s, \"wsi\":\"%d\", \"conns\":[", server_info, live_wsi); /* render the list */ @@ -67,7 +67,7 @@ update_status(struct lws *wsi, struct per_session_data__lws_status *pss) if (subsequent) *p++ = ','; subsequent = 1; - p += snprintf(p, sizeof(cache) - (p - start) - 1, + p += lws_snprintf(p, sizeof(cache) - (p - start) - 1, "{\"peer\":\"%s\",\"time\":\"%s\"," "\"ua\":\"%s\"}", (*pp)->ip, date, (*pp)->user_agent);