From 51c96d8c2a7e3c6a332d5629e180802e11aea864 Mon Sep 17 00:00:00 2001 From: Andy Green Date: Tue, 17 Jan 2017 07:01:02 +0800 Subject: [PATCH] plat-optee and boringssl adaptations --- .gitignore | 2 +- CMakeLists.txt | 11 +- README.build.md | 14 +- cross-aarch64.cmake | 32 ++ doc/html/globals_eval.html | 3 + doc/html/globals_l.html | 3 + doc/html/group__client.html | 2 +- doc/html/group__context-and-vhost.html | 36 +- doc/html/group__extensions.html | 6 +- doc/html/group__form-parsing.html | 6 +- doc/html/group__generic-sessions.html | 12 +- doc/html/group__sending-data.html | 14 +- doc/html/group__smtp.html | 18 +- doc/html/group__usercb.html | 13 +- doc/html/group__usercb.js | 1 + doc/html/group__vhost-mounts.html | 14 +- doc/html/libwebsockets_8h.html | 1 + doc/html/libwebsockets_8h.js | 1 + doc/html/libwebsockets_8h_source.html | 443 +++++++++++++------------ doc/html/navtreedata.js | 4 +- doc/html/navtreeindex0.js | 6 +- doc/html/navtreeindex1.js | 10 +- doc/html/navtreeindex2.js | 64 ++-- doc/html/navtreeindex3.js | 12 +- doc/html/navtreeindex4.js | 8 +- lib/client-handshake.c | 42 ++- lib/client.c | 5 + lib/context.c | 15 +- lib/libwebsockets.c | 27 +- lib/libwebsockets.h | 4 +- lib/lws-plat-optee.c | 328 ++++++++++++++++++ lib/service.c | 44 ++- lib/ssl-client.c | 47 ++- lib/ssl.c | 30 +- lws_config.h.in | 5 + 35 files changed, 903 insertions(+), 380 deletions(-) create mode 100644 cross-aarch64.cmake create mode 100644 lib/lws-plat-optee.c diff --git a/.gitignore b/.gitignore index db59c006..7a1adf8a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,4 @@ #Ignore build files -Makefile config.h config.log config.status @@ -23,6 +22,7 @@ win32port/zlib/Release*/ *.suo *.su *.m4 +*.a missing depcomp install-sh diff --git a/CMakeLists.txt b/CMakeLists.txt index 7d1f0d42..7567a19b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -109,6 +109,7 @@ option(LWS_WITH_GENERIC_SESSIONS "With the Generic Sessions plugin" OFF) option(LWS_WITH_SQLITE3 "Require SQLITE3 support" OFF) option(LWS_WITH_SMTP "Provide SMTP support" OFF) option(LWS_WITH_ESP8266 "Build for ESP8266" OFF) +option(LWS_PLAT_OPTEE "Build for OPTEE" OFF) option(LWS_WITH_NO_LOGS "Disable all logging from being compiled in" OFF) option(LWS_STATIC_PIC "Build the static version of the library with position-independent code" OFF) option(LWS_WITH_RANGES "Support http ranges (RFC7233)" ON) @@ -603,8 +604,13 @@ else() list(APPEND SOURCES lib/lws-plat-esp8266.c) else() - list(APPEND SOURCES - lib/lws-plat-unix.c) + if (LWS_PLAT_OPTEE) + list(APPEND SOURCES + lib/lws-plat-optee.c) + else() + list(APPEND SOURCES + lib/lws-plat-unix.c) + endif() endif() endif() endif() @@ -1649,6 +1655,7 @@ message(" LWS_WITH_SMTP = ${LWS_WITH_SMTP}") message(" LWS_WITH_GENERIC_SESSIONS = ${LWS_WITH_GENERIC_SESSIONS}") message(" LWS_STATIC_PIC = ${LWS_STATIC_PIC}") message(" LWS_WITH_RANGES = ${LWS_WITH_RANGES}") +message(" LWS_PLAT_OPTEE = ${LWS_PLAT_OPTEE}") message("---------------------------------------------------------------------") diff --git a/README.build.md b/README.build.md index 889f5ffb..71c73c1d 100644 --- a/README.build.md +++ b/README.build.md @@ -13,7 +13,7 @@ create elaborate clean scripts to get a clean source tree, instead you simply remove your build directory. Libwebsockets has been tested to build successfully on the following platforms -with SSL support (both OpenSSL/wolfSSL): +with SSL support (for OpenSSL/wolfSSL/BoringSSL): - Windows (Visual Studio) - Windows (MinGW) @@ -265,8 +265,18 @@ and cd into it 8) yotta build -@section cmco Setting compile options +@section optee Building for OP-TEE +OP-TEE is a "Secure World" Trusted Execution Environment. + +Although lws is only part of the necessary picture to have an https-enabled +TA, it does support OP-TEE as a platform and if you provide the other +pieces, does work very well. + +Select it in cmake with `-DLWS_PLAT_OPTEE=1` + + +@section cmco Setting compile options To set compile time flags you can either use one of the CMake gui applications or do it via the command line. diff --git a/cross-aarch64.cmake b/cross-aarch64.cmake new file mode 100644 index 00000000..d85a6417 --- /dev/null +++ b/cross-aarch64.cmake @@ -0,0 +1,32 @@ +# +# CMake Toolchain file for crosscompiling on ARM. +# +# This can be used when running cmake in the following way: +# cd build/ +# cmake .. -DCMAKE_TOOLCHAIN_FILE=../cross-arm-linux-gnueabihf.cmake +# + +# Target operating system name. +set(CMAKE_SYSTEM_NAME Linux) +set(CMAKE_SYSTEM_PROCESSOR aarch64) + +# Name of C compiler. +set(CMAKE_C_COMPILER "aarch64-linux-gnu-gcc") +set(CMAKE_CXX_COMPILER "aarch64-linux-gnu-g++") + +#-nostdlib +SET(CMAKE_C_FLAGS "-DGCC_VER=\"\\\"$(GCC_VER)\\\"\" -DARM64=1 -D__LP64__=1 -Os -g3 -fpie -mstrict-align -DOPTEE_DEV_KIT=../../../optee_os/out/arm-plat-hikey/export-ta_arm64/include -fPIC -ffunction-sections -fdata-sections" CACHE STRING "" FORCE) + + +# Where to look for the target environment. (More paths can be added here) +set(CMAKE_FIND_ROOT_PATH "/projects/aist-tb/arm64-tc/") + +# Adjust the default behavior of the FIND_XXX() commands: +# search programs in the host environment only. +set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) + +# Search headers and libraries in the target environment only. +set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) + + diff --git a/doc/html/globals_eval.html b/doc/html/globals_eval.html index 26271759..d8a68975 100644 --- a/doc/html/globals_eval.html +++ b/doc/html/globals_eval.html @@ -196,6 +196,9 @@ $(document).ready(function(){initNavTree('globals_eval.html','');});
  • LWS_CALLBACK_OPENSSL_PERFORM_CLIENT_CERT_VERIFICATION : libwebsockets.h
  • +
  • LWS_CALLBACK_OPENSSL_PERFORM_SERVER_CERT_VERIFICATION +: libwebsockets.h +
  • LWS_CALLBACK_PROTOCOL_DESTROY : libwebsockets.h
  • diff --git a/doc/html/globals_l.html b/doc/html/globals_l.html index e992c0c9..815f6bbe 100644 --- a/doc/html/globals_l.html +++ b/doc/html/globals_l.html @@ -231,6 +231,9 @@ $(document).ready(function(){initNavTree('globals_l.html','');});
  • LWS_CALLBACK_OPENSSL_PERFORM_CLIENT_CERT_VERIFICATION : libwebsockets.h
  • +
  • LWS_CALLBACK_OPENSSL_PERFORM_SERVER_CERT_VERIFICATION +: libwebsockets.h +
  • LWS_CALLBACK_PROTOCOL_DESTROY : libwebsockets.h
  • diff --git a/doc/html/group__client.html b/doc/html/group__client.html index 44d6bec4..8212e509 100644 --- a/doc/html/group__client.html +++ b/doc/html/group__client.html @@ -119,7 +119,7 @@ LWS_VISIBLE LWS_EXTERN void <

    #include <lib/libwebsockets.h>

    enum lws_client_connect_ssl_connection_flags - flags that may be used with struct lws_client_connect_info ssl_connection member to control if and how SSL checks apply to the client connection being created

    -
    2040  {
    2041  LCCSCF_USE_SSL = (1 << 0),
    2042  LCCSCF_ALLOW_SELFSIGNED = (1 << 1),
    2043  LCCSCF_SKIP_SERVER_CERT_HOSTNAME_CHECK = (1 << 2),
    2044  LCCSCF_ALLOW_EXPIRED = (1 << 3)
    2045 };
    +
    2070  {
    2071  LCCSCF_USE_SSL = (1 << 0),
    2072  LCCSCF_ALLOW_SELFSIGNED = (1 << 1),
    2073  LCCSCF_SKIP_SERVER_CERT_HOSTNAME_CHECK = (1 << 2),
    2074  LCCSCF_ALLOW_EXPIRED = (1 << 3)
    2075 };

    Function Documentation

    diff --git a/doc/html/group__context-and-vhost.html b/doc/html/group__context-and-vhost.html index 88b26a38..6afb7410 100644 --- a/doc/html/group__context-and-vhost.html +++ b/doc/html/group__context-and-vhost.html @@ -208,24 +208,24 @@ LWS_VISIBLE LWS_EXTERN int LWS_SERVER_OPTION_UV_NO_SIGSEGV_SIGFPE_SPIN 

    (CTX) Libuv only: Do not spin on SIGSEGV / SIGFPE. A segfault normally makes the lib spin so you can attach a debugger to it even if it happened without a debugger in place. You can disable that by giving this option.

    -
    1494  {
    1496  (1 << 12),
    1503  (1 << 12),
    1507  LWS_SERVER_OPTION_LIBEV = (1 << 4),
    1509  LWS_SERVER_OPTION_DISABLE_IPV6 = (1 << 5),
    1518  LWS_SERVER_OPTION_SSL_ECDH = (1 << 9) |
    1519  (1 << 12),
    1521  LWS_SERVER_OPTION_LIBUV = (1 << 10),
    1524  (1 << 12),
    1532  LWS_SERVER_OPTION_UNIX_SOCK = (1 << 14),
    1534  LWS_SERVER_OPTION_STS = (1 << 15),
    1548  /****** add new things just above ---^ ******/
    1549 };
    -
    Definition: libwebsockets.h:1511
    -
    Definition: libwebsockets.h:1541
    -
    Definition: libwebsockets.h:1523
    -
    Definition: libwebsockets.h:1529
    -
    Definition: libwebsockets.h:1500
    -
    Definition: libwebsockets.h:1518
    -
    Definition: libwebsockets.h:1502
    -
    Definition: libwebsockets.h:1507
    -
    Definition: libwebsockets.h:1527
    -
    Definition: libwebsockets.h:1539
    -
    Definition: libwebsockets.h:1509
    -
    Definition: libwebsockets.h:1521
    -
    Definition: libwebsockets.h:1532
    -
    Definition: libwebsockets.h:1516
    -
    Definition: libwebsockets.h:1514
    -
    Definition: libwebsockets.h:1534
    -
    Definition: libwebsockets.h:1537
    +
    1524  {
    1526  (1 << 12),
    1533  (1 << 12),
    1537  LWS_SERVER_OPTION_LIBEV = (1 << 4),
    1539  LWS_SERVER_OPTION_DISABLE_IPV6 = (1 << 5),
    1548  LWS_SERVER_OPTION_SSL_ECDH = (1 << 9) |
    1549  (1 << 12),
    1551  LWS_SERVER_OPTION_LIBUV = (1 << 10),
    1554  (1 << 12),
    1562  LWS_SERVER_OPTION_UNIX_SOCK = (1 << 14),
    1564  LWS_SERVER_OPTION_STS = (1 << 15),
    1578  /****** add new things just above ---^ ******/
    1579 };
    +
    Definition: libwebsockets.h:1541
    +
    Definition: libwebsockets.h:1571
    +
    Definition: libwebsockets.h:1553
    +
    Definition: libwebsockets.h:1559
    +
    Definition: libwebsockets.h:1530
    +
    Definition: libwebsockets.h:1548
    +
    Definition: libwebsockets.h:1532
    +
    Definition: libwebsockets.h:1537
    +
    Definition: libwebsockets.h:1557
    +
    Definition: libwebsockets.h:1569
    +
    Definition: libwebsockets.h:1539
    +
    Definition: libwebsockets.h:1551
    +
    Definition: libwebsockets.h:1562
    +
    Definition: libwebsockets.h:1546
    +
    Definition: libwebsockets.h:1544
    +
    Definition: libwebsockets.h:1564
    +
    Definition: libwebsockets.h:1567
    diff --git a/doc/html/group__extensions.html b/doc/html/group__extensions.html index ff46bd4e..825b4996 100644 --- a/doc/html/group__extensions.html +++ b/doc/html/group__extensions.html @@ -242,9 +242,9 @@ Functions EXTARG_OPT_DEC 

    may have an optional decimal argument

    -
    1096  {
    1097  EXTARG_NONE,
    1098  EXTARG_DEC,
    1101  /* Add new things just above here ---^
    1102  * This is part of the ABI, don't needlessly break compatibility */
    1103 };
    Definition: libwebsockets.h:1099
    -
    Definition: libwebsockets.h:1097
    -
    Definition: libwebsockets.h:1098
    +
    1126  {
    1127  EXTARG_NONE,
    1128  EXTARG_DEC,
    1131  /* Add new things just above here ---^
    1132  * This is part of the ABI, don't needlessly break compatibility */
    1133 };
    Definition: libwebsockets.h:1129
    +
    Definition: libwebsockets.h:1127
    +
    Definition: libwebsockets.h:1128
    diff --git a/doc/html/group__form-parsing.html b/doc/html/group__form-parsing.html index dd0a801b..0dc36404 100644 --- a/doc/html/group__form-parsing.html +++ b/doc/html/group__form-parsing.html @@ -156,9 +156,9 @@ Functions LWS_UFS_OPEN 

    a new file is starting to arrive

    -
    2884  {
    2889  LWS_UFS_OPEN
    2891 };
    Definition: libwebsockets.h:2887
    -
    Definition: libwebsockets.h:2889
    -
    Definition: libwebsockets.h:2885
    +
    2914  {
    2919  LWS_UFS_OPEN
    2921 };
    Definition: libwebsockets.h:2917
    +
    Definition: libwebsockets.h:2919
    +
    Definition: libwebsockets.h:2915
    diff --git a/doc/html/group__generic-sessions.html b/doc/html/group__generic-sessions.html index f37fc52d..b457dabb 100644 --- a/doc/html/group__generic-sessions.html +++ b/doc/html/group__generic-sessions.html @@ -116,8 +116,8 @@ Enumerations LWSGSE_DELETED 

    an existing user was deleted

    -
    1458  {
    1459  LWSGSE_CREATED,
    1461 };
    Definition: libwebsockets.h:1460
    -
    Definition: libwebsockets.h:1459
    +
    1488  {
    1489  LWSGSE_CREATED,
    1491 };
    Definition: libwebsockets.h:1490
    +
    Definition: libwebsockets.h:1489
    @@ -145,10 +145,10 @@ Enumerations LWSGS_AUTH_FORGOT_FLOW 

    he just completed "forgot password" flow

    -
    1440  {
    1441  LWSGS_AUTH_LOGGED_IN = 1,
    1442  LWSGS_AUTH_ADMIN = 2,
    1443  LWSGS_AUTH_VERIFIED = 4,
    1445 };
    Definition: libwebsockets.h:1443
    -
    Definition: libwebsockets.h:1444
    -
    Definition: libwebsockets.h:1442
    -
    Definition: libwebsockets.h:1441
    +
    1470  {
    1471  LWSGS_AUTH_LOGGED_IN = 1,
    1472  LWSGS_AUTH_ADMIN = 2,
    1473  LWSGS_AUTH_VERIFIED = 4,
    1475 };
    Definition: libwebsockets.h:1473
    +
    Definition: libwebsockets.h:1474
    +
    Definition: libwebsockets.h:1472
    +
    Definition: libwebsockets.h:1471
    diff --git a/doc/html/group__sending-data.html b/doc/html/group__sending-data.html index ac3ae3f5..b235ac3b 100644 --- a/doc/html/group__sending-data.html +++ b/doc/html/group__sending-data.html @@ -124,13 +124,13 @@ Functions LWS_WRITE_CLIENT_IGNORE_XOR_MASK 

    client packet payload goes out on wire unmunged only useful for security tests since normal servers cannot decode the content if used

    -
    3231  {
    3232  LWS_WRITE_TEXT = 0,
    3236  LWS_WRITE_BINARY = 1,
    3242  LWS_WRITE_HTTP = 3,
    3245  /* LWS_WRITE_CLOSE is handled by lws_close_reason() */
    3246  LWS_WRITE_PING = 5,
    3247  LWS_WRITE_PONG = 6,
    3248 
    3249  /* Same as write_http but we know this write ends the transaction */
    3250  LWS_WRITE_HTTP_FINAL = 7,
    3251 
    3252  /* HTTP2 */
    3253 
    3261  /****** add new things just above ---^ ******/
    3262 
    3263  /* flags */
    3264 
    3265  LWS_WRITE_NO_FIN = 0x40,
    3272 };
    Definition: libwebsockets.h:3242
    -
    Definition: libwebsockets.h:3265
    -
    Definition: libwebsockets.h:3232
    -
    Definition: libwebsockets.h:3236
    -
    Definition: libwebsockets.h:3268
    -
    Definition: libwebsockets.h:3239
    -
    Definition: libwebsockets.h:3254
    +
    3261  {
    3262  LWS_WRITE_TEXT = 0,
    3266  LWS_WRITE_BINARY = 1,
    3272  LWS_WRITE_HTTP = 3,
    3275  /* LWS_WRITE_CLOSE is handled by lws_close_reason() */
    3276  LWS_WRITE_PING = 5,
    3277  LWS_WRITE_PONG = 6,
    3278 
    3279  /* Same as write_http but we know this write ends the transaction */
    3280  LWS_WRITE_HTTP_FINAL = 7,
    3281 
    3282  /* HTTP2 */
    3283 
    3291  /****** add new things just above ---^ ******/
    3292 
    3293  /* flags */
    3294 
    3295  LWS_WRITE_NO_FIN = 0x40,
    3302 };
    Definition: libwebsockets.h:3272
    +
    Definition: libwebsockets.h:3295
    +
    Definition: libwebsockets.h:3262
    +
    Definition: libwebsockets.h:3266
    +
    Definition: libwebsockets.h:3298
    +
    Definition: libwebsockets.h:3269
    +
    Definition: libwebsockets.h:3284
    diff --git a/doc/html/group__smtp.html b/doc/html/group__smtp.html index 1329469f..2807b91c 100644 --- a/doc/html/group__smtp.html +++ b/doc/html/group__smtp.html @@ -149,15 +149,15 @@ Functions LGSSMTP_SENT_QUIT 

    sent the session quit

    -
    4228  {
    4229  LGSSMTP_IDLE,
    4234  LGSSMTP_SENT_TO,
    4238 };
    Definition: libwebsockets.h:4231
    -
    Definition: libwebsockets.h:4236
    -
    Definition: libwebsockets.h:4229
    -
    Definition: libwebsockets.h:4230
    -
    Definition: libwebsockets.h:4234
    -
    Definition: libwebsockets.h:4233
    -
    Definition: libwebsockets.h:4237
    -
    Definition: libwebsockets.h:4232
    -
    Definition: libwebsockets.h:4235
    +
    4258  {
    4259  LGSSMTP_IDLE,
    4264  LGSSMTP_SENT_TO,
    4268 };
    Definition: libwebsockets.h:4261
    +
    Definition: libwebsockets.h:4266
    +
    Definition: libwebsockets.h:4259
    +
    Definition: libwebsockets.h:4260
    +
    Definition: libwebsockets.h:4264
    +
    Definition: libwebsockets.h:4263
    +
    Definition: libwebsockets.h:4267
    +
    Definition: libwebsockets.h:4262
    +
    Definition: libwebsockets.h:4265
    diff --git a/doc/html/group__usercb.html b/doc/html/group__usercb.html index 23b99f92..26c23260 100644 --- a/doc/html/group__usercb.html +++ b/doc/html/group__usercb.html @@ -148,6 +148,7 @@ Enumerations
      LWS_CALLBACK_HTTP_PMO = 56, LWS_CALLBACK_CLIENT_HTTP_WRITEABLE = 57, +LWS_CALLBACK_OPENSSL_PERFORM_SERVER_CERT_VERIFICATION = 58, LWS_CALLBACK_USER = 1000
    } @@ -337,10 +338,17 @@ Enumerations LWS_CALLBACK_CLIENT_HTTP_WRITEABLE 

    when doing an HTTP type client connection, you can call lws_client_http_body_pending(wsi, 1) from LWS_CALLBACK_CLIENT_APPEND_HANDSHAKE_HEADER to get these callbacks sending the HTTP headers.

    From this callback, when you have sent everything, you should let lws know by calling lws_client_http_body_pending(wsi, 0)

    +LWS_CALLBACK_OPENSSL_PERFORM_SERVER_CERT_VERIFICATION 

    Similar to LWS_CALLBACK_OPENSSL_PERFORM_CLIENT_CERT_VERIFICATION this callback is called during OpenSSL verification of the cert sent from the server to the client. It is sent to protocol[0] callback as no protocol has been negotiated on the connection yet. Notice that the wsi is set because lws_client_connect_via_info was successful.

    +

    See http://www.openssl.org/docs/ssl/SSL_CTX_set_verify.html to understand more detail about the OpenSSL callback that generates this libwebsockets callback and the meanings of the arguments passed. In this callback, user is the x509_ctx, in is the ssl pointer and len is preverify_ok.

    +

    THIS IS NOT RECOMMENDED BUT if a cert validation error shall be overruled and cert shall be accepted as ok, X509_STORE_CTX_set_error((X509_STORE_CTX*)user, X509_V_OK); must be called and return value must be 0 to mean the cert is OK; returning 1 will fail the cert in any case.

    +

    This also means that if you don't handle this callback then the default callback action of returning 0 will not accept the certificate in case of a validation error decided by the SSL lib.

    +

    This is expected and secure behaviour when validating certificates.

    +

    Note: LCCSCF_ALLOW_SELFSIGNED and LCCSCF_SKIP_SERVER_CERT_HOSTNAME_CHECK still work without this callback being implemented.

    + LWS_CALLBACK_USER 

    user code can use any including / above without fear of clashes

    -
    664  {
    748  LWS_CALLBACK_HTTP = 12,
    906  /* external poll() management support */
    969  LWS_CALLBACK_WS_EXT_DEFAULTS = 39,
    972  LWS_CALLBACK_CGI = 40,
    974  LWS_CALLBACK_CGI_TERMINATED = 41,
    976  LWS_CALLBACK_CGI_STDIN_DATA = 42,
    978  LWS_CALLBACK_CGI_STDIN_COMPLETED = 43,
    980  LWS_CALLBACK_ESTABLISHED_CLIENT_HTTP = 44,
    982  LWS_CALLBACK_CLOSED_CLIENT_HTTP = 45,
    984  LWS_CALLBACK_RECEIVE_CLIENT_HTTP = 46,
    986  LWS_CALLBACK_COMPLETED_CLIENT_HTTP = 47,
    988  LWS_CALLBACK_RECEIVE_CLIENT_HTTP_READ = 48,
    990  LWS_CALLBACK_HTTP_BIND_PROTOCOL = 49,
    992  LWS_CALLBACK_HTTP_DROP_PROTOCOL = 50,
    994  LWS_CALLBACK_CHECK_ACCESS_RIGHTS = 51,
    996  LWS_CALLBACK_PROCESS_HTML = 52,
    998  LWS_CALLBACK_ADD_HEADERS = 53,
    1000  LWS_CALLBACK_SESSION_INFO = 54,
    1003  LWS_CALLBACK_GS_EVENT = 55,
    1005  LWS_CALLBACK_HTTP_PMO = 56,
    1020  /****** add new things just above ---^ ******/
    1021 
    1022  LWS_CALLBACK_USER = 1000,
    1024 };
    Definition: libwebsockets.h:771
    +
    664  {
    748  LWS_CALLBACK_HTTP = 12,
    906  /* external poll() management support */
    969  LWS_CALLBACK_WS_EXT_DEFAULTS = 39,
    972  LWS_CALLBACK_CGI = 40,
    974  LWS_CALLBACK_CGI_TERMINATED = 41,
    976  LWS_CALLBACK_CGI_STDIN_DATA = 42,
    978  LWS_CALLBACK_CGI_STDIN_COMPLETED = 43,
    980  LWS_CALLBACK_ESTABLISHED_CLIENT_HTTP = 44,
    982  LWS_CALLBACK_CLOSED_CLIENT_HTTP = 45,
    984  LWS_CALLBACK_RECEIVE_CLIENT_HTTP = 46,
    986  LWS_CALLBACK_COMPLETED_CLIENT_HTTP = 47,
    988  LWS_CALLBACK_RECEIVE_CLIENT_HTTP_READ = 48,
    990  LWS_CALLBACK_HTTP_BIND_PROTOCOL = 49,
    992  LWS_CALLBACK_HTTP_DROP_PROTOCOL = 50,
    994  LWS_CALLBACK_CHECK_ACCESS_RIGHTS = 51,
    996  LWS_CALLBACK_PROCESS_HTML = 52,
    998  LWS_CALLBACK_ADD_HEADERS = 53,
    1000  LWS_CALLBACK_SESSION_INFO = 54,
    1003  LWS_CALLBACK_GS_EVENT = 55,
    1005  LWS_CALLBACK_HTTP_PMO = 56,
    1050  /****** add new things just above ---^ ******/
    1051 
    1052  LWS_CALLBACK_USER = 1000,
    1054 };
    Definition: libwebsockets.h:771
    Definition: libwebsockets.h:899
    Definition: libwebsockets.h:897
    @@ -377,7 +385,8 @@ Enumerations
    Definition: libwebsockets.h:669
    Definition: libwebsockets.h:746
    -
    Definition: libwebsockets.h:1022
    +
    Definition: libwebsockets.h:1052
    +
    Definition: libwebsockets.h:725
    Definition: libwebsockets.h:727
    Definition: libwebsockets.h:738
    diff --git a/doc/html/group__usercb.js b/doc/html/group__usercb.js index 4fb656a2..0d8212bb 100644 --- a/doc/html/group__usercb.js +++ b/doc/html/group__usercb.js @@ -43,6 +43,7 @@ var group__usercb = [ "LWS_CALLBACK_WS_PEER_INITIATED_CLOSE", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ac3fc5bbb55e69f90396526287ee84a51", null ], [ "LWS_CALLBACK_HTTP_PMO", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aa5cc921b7697743017a533822a3d556a", null ], [ "LWS_CALLBACK_CLIENT_HTTP_WRITEABLE", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aeb0cec65ec82a713cd01e9ca9aeeb5e6", null ], + [ "LWS_CALLBACK_OPENSSL_PERFORM_SERVER_CERT_VERIFICATION", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a17620dd6cb920b9b6daeae63575be08b", null ], [ "LWS_CALLBACK_USER", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a982579753e70e59a9ea13ce628ac891a", null ] ] ] ]; \ No newline at end of file diff --git a/doc/html/group__vhost-mounts.html b/doc/html/group__vhost-mounts.html index 938c5e78..8e86d532 100644 --- a/doc/html/group__vhost-mounts.html +++ b/doc/html/group__vhost-mounts.html @@ -123,13 +123,13 @@ Enumerations LWSMPRO_CALLBACK 

    hand by named protocol's callback

    -
    1963  {
    1964  LWSMPRO_HTTP = 0,
    1965  LWSMPRO_HTTPS = 1,
    1966  LWSMPRO_FILE = 2,
    1967  LWSMPRO_CGI = 3,
    1968  LWSMPRO_REDIR_HTTP = 4,
    1969  LWSMPRO_REDIR_HTTPS = 5,
    1970  LWSMPRO_CALLBACK = 6,
    1971 };
    Definition: libwebsockets.h:1967
    -
    Definition: libwebsockets.h:1965
    -
    Definition: libwebsockets.h:1966
    -
    Definition: libwebsockets.h:1968
    -
    Definition: libwebsockets.h:1969
    -
    Definition: libwebsockets.h:1964
    -
    Definition: libwebsockets.h:1970
    +
    1993  {
    1994  LWSMPRO_HTTP = 0,
    1995  LWSMPRO_HTTPS = 1,
    1996  LWSMPRO_FILE = 2,
    1997  LWSMPRO_CGI = 3,
    1998  LWSMPRO_REDIR_HTTP = 4,
    1999  LWSMPRO_REDIR_HTTPS = 5,
    2000  LWSMPRO_CALLBACK = 6,
    2001 };
    Definition: libwebsockets.h:1997
    +
    Definition: libwebsockets.h:1995
    +
    Definition: libwebsockets.h:1996
    +
    Definition: libwebsockets.h:1998
    +
    Definition: libwebsockets.h:1999
    +
    Definition: libwebsockets.h:1994
    +
    Definition: libwebsockets.h:2000
    diff --git a/doc/html/libwebsockets_8h.html b/doc/html/libwebsockets_8h.html index 61d25e62..8965b54c 100644 --- a/doc/html/libwebsockets_8h.html +++ b/doc/html/libwebsockets_8h.html @@ -287,6 +287,7 @@ Enumerations
      LWS_CALLBACK_HTTP_PMO = 56, LWS_CALLBACK_CLIENT_HTTP_WRITEABLE = 57, +LWS_CALLBACK_OPENSSL_PERFORM_SERVER_CERT_VERIFICATION = 58, LWS_CALLBACK_USER = 1000
    } diff --git a/doc/html/libwebsockets_8h.js b/doc/html/libwebsockets_8h.js index 83dfb69d..891c6167 100644 --- a/doc/html/libwebsockets_8h.js +++ b/doc/html/libwebsockets_8h.js @@ -113,6 +113,7 @@ var libwebsockets_8h = [ "LWS_CALLBACK_GS_EVENT", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7af6cf80e57aae8ba0a57a5c456b1fe026", null ], [ "LWS_CALLBACK_HTTP_PMO", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aa5cc921b7697743017a533822a3d556a", null ], [ "LWS_CALLBACK_CLIENT_HTTP_WRITEABLE", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aeb0cec65ec82a713cd01e9ca9aeeb5e6", null ], + [ "LWS_CALLBACK_OPENSSL_PERFORM_SERVER_CERT_VERIFICATION", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a17620dd6cb920b9b6daeae63575be08b", null ], [ "LWS_CALLBACK_USER", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a982579753e70e59a9ea13ce628ac891a", null ] ] ], [ "lws_cgi_hdr_state", "libwebsockets_8h.html#a42394a38f08a97420c98127358cfeedb", [ diff --git a/doc/html/libwebsockets_8h_source.html b/doc/html/libwebsockets_8h_source.html index 0afb1f19..88692a8e 100644 --- a/doc/html/libwebsockets_8h_source.html +++ b/doc/html/libwebsockets_8h_source.html @@ -64,38 +64,38 @@ $(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 #elif !defined(__MINGW32__)
    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(__MINGW32__) && (!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 #ifdef LWS_HAVE_UV_VERSION_H
    208 #include <uv-version.h>
    209 #endif
    210 #endif /* LWS_USE_LIBUV */
    211 
    212 #ifndef LWS_EXTERN
    213 #define LWS_EXTERN extern
    214 #endif
    215 
    216 #ifdef _WIN32
    217 #define random rand
    218 #else
    219 #include <sys/time.h>
    220 #include <unistd.h>
    221 #endif
    222 
    223 #ifdef LWS_OPENSSL_SUPPORT
    224 
    225 #ifdef USE_WOLFSSL
    226 #ifdef USE_OLD_CYASSL
    227 #include <cyassl/openssl/ssl.h>
    228 #include <cyassl/error-ssl.h>
    229 #else
    230 #include <wolfssl/openssl/ssl.h>
    231 #include <wolfssl/error-ssl.h>
    232 #endif /* not USE_OLD_CYASSL */
    233 #else
    234 #if defined(LWS_USE_POLARSSL)
    235 #include <polarssl/ssl.h>
    237  x509_crt ca;
    238  x509_crt certificate;
    239  rsa_context key;
    240 };
    241 typedef struct lws_polarssl_context SSL_CTX;
    242 typedef ssl_context SSL;
    243 #else
    244 #if defined(LWS_USE_MBEDTLS)
    245 #include <mbedtls/ssl.h>
    246 #else
    247 #include <openssl/ssl.h>
    248 #include <openssl/err.h>
    249 #endif /* not USE_MBEDTLS */
    250 #endif /* not USE_POLARSSL */
    251 #endif /* not USE_WOLFSSL */
    252 #endif
    253 
    254 
    255 #define CONTEXT_PORT_NO_LISTEN -1
    256 #define CONTEXT_PORT_NO_LISTEN_SERVER -2
    257 
    268 
    270 enum lws_log_levels {
    271  LLL_ERR = 1 << 0,
    272  LLL_WARN = 1 << 1,
    273  LLL_NOTICE = 1 << 2,
    274  LLL_INFO = 1 << 3,
    275  LLL_DEBUG = 1 << 4,
    276  LLL_PARSER = 1 << 5,
    277  LLL_HEADER = 1 << 6,
    278  LLL_EXT = 1 << 7,
    279  LLL_CLIENT = 1 << 8,
    280  LLL_LATENCY = 1 << 9,
    281 
    282  LLL_COUNT = 10 /* set to count of valid flags */
    283 };
    284 
    285 LWS_VISIBLE LWS_EXTERN void _lws_log(int filter, const char *format, ...);
    286 LWS_VISIBLE LWS_EXTERN void _lws_logv(int filter, const char *format, va_list vl);
    296 LWS_VISIBLE LWS_EXTERN int
    297 lwsl_timestamp(int level, char *p, int len);
    298 
    299 #define lwsl_err(...) _lws_log(LLL_ERR, __VA_ARGS__)
    300 
    301 #if !defined(LWS_WITH_NO_LOGS)
    302 /* notice, warn and log are always compiled in */
    303 #define lwsl_warn(...) _lws_log(LLL_WARN, __VA_ARGS__)
    304 #define lwsl_notice(...) _lws_log(LLL_NOTICE, __VA_ARGS__)
    305 #endif
    306 /*
    307  * weaker logging can be deselected at configure time using --disable-debug
    308  * that gets rid of the overhead of checking while keeping _warn and _err
    309  * active
    310  */
    311 
    312 #if defined(LWS_WITH_ESP8266)
    313 #undef _DEBUG
    314 #endif
    315 
    316 #ifdef _DEBUG
    317 #if defined(LWS_WITH_NO_LOGS)
    318 /* notice, warn and log are always compiled in */
    319 //#define lwsl_err(...) _lws_log(LLL_ERR, __VA_ARGS__)
    320 #define lwsl_warn(...) _lws_log(LLL_WARN, __VA_ARGS__)
    321 #define lwsl_notice(...) _lws_log(LLL_NOTICE, __VA_ARGS__)
    322 #endif
    323 #define lwsl_info(...) _lws_log(LLL_INFO, __VA_ARGS__)
    324 #define lwsl_debug(...) _lws_log(LLL_DEBUG, __VA_ARGS__)
    325 #define lwsl_parser(...) _lws_log(LLL_PARSER, __VA_ARGS__)
    326 #define lwsl_header(...) _lws_log(LLL_HEADER, __VA_ARGS__)
    327 #define lwsl_ext(...) _lws_log(LLL_EXT, __VA_ARGS__)
    328 #define lwsl_client(...) _lws_log(LLL_CLIENT, __VA_ARGS__)
    329 #define lwsl_latency(...) _lws_log(LLL_LATENCY, __VA_ARGS__)
    330 
    336 LWS_VISIBLE LWS_EXTERN void lwsl_hexdump(void *buf, size_t len);
    337 
    338 #else /* no debug */
    339 #if defined(LWS_WITH_NO_LOGS)
    340 //#define lwsl_err(...) do {} while(0)
    341 #define lwsl_warn(...) do {} while(0)
    342 #define lwsl_notice(...) do {} while(0)
    343 #endif
    344 #define lwsl_info(...) do {} while(0)
    345 #define lwsl_debug(...) do {} while(0)
    346 #define lwsl_parser(...) do {} while(0)
    347 #define lwsl_header(...) do {} while(0)
    348 #define lwsl_ext(...) do {} while(0)
    349 #define lwsl_client(...) do {} while(0)
    350 #define lwsl_latency(...) do {} while(0)
    351 #define lwsl_hexdump(a, b)
    352 
    353 #endif
    354 
    365 LWS_VISIBLE LWS_EXTERN void
    366 lws_set_log_level(int level,
    367  void (*log_emit_function)(int level, const char *line));
    368 
    378 LWS_VISIBLE LWS_EXTERN void
    379 lwsl_emit_syslog(int level, const char *line);
    380 
    382 
    383 
    384 #include <stddef.h>
    385 
    386 #ifndef lws_container_of
    387 #define lws_container_of(P,T,M) ((T *)((char *)(P) - offsetof(T, M)))
    388 #endif
    389 
    390 
    391 struct lws;
    392 #ifndef ARRAY_SIZE
    393 #define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0]))
    394 #endif
    395 
    396 /* api change list for user code to test against */
    397 
    398 #define LWS_FEATURE_SERVE_HTTP_FILE_HAS_OTHER_HEADERS_ARG
    399 
    400 /* the struct lws_protocols has the id field present */
    401 #define LWS_FEATURE_PROTOCOLS_HAS_ID_FIELD
    402 
    403 /* you can call lws_get_peer_write_allowance */
    404 #define LWS_FEATURE_PROTOCOLS_HAS_PEER_WRITE_ALLOWANCE
    405 
    406 /* extra parameter introduced in 917f43ab821 */
    407 #define LWS_FEATURE_SERVE_HTTP_FILE_HAS_OTHER_HEADERS_LEN
    408 
    409 /* File operations stuff exists */
    410 #define LWS_FEATURE_FOPS
    411 
    412 
    413 #if defined(_WIN32)
    414 typedef SOCKET lws_sockfd_type;
    415 typedef HANDLE lws_filefd_type;
    416 #define lws_sockfd_valid(sfd) (!!sfd)
    417 struct lws_pollfd {
    418  lws_sockfd_type fd;
    419  SHORT events;
    420  SHORT revents;
    421 };
    422 #define LWS_POLLHUP (FD_CLOSE)
    423 #define LWS_POLLIN (FD_READ | FD_ACCEPT)
    424 #define LWS_POLLOUT (FD_WRITE)
    425 #else
    426 
    427 #if defined(MBED_OPERATORS)
    428 /* it's a class lws_conn * */
    429 typedef void * lws_sockfd_type;
    430 typedef void * lws_filefd_type;
    431 #define lws_sockfd_valid(sfd) (!!sfd)
    432 struct pollfd {
    433  lws_sockfd_type fd;
    434  short events;
    435  short revents;
    436 };
    437 #define POLLIN 0x0001
    438 #define POLLPRI 0x0002
    439 #define POLLOUT 0x0004
    440 #define POLLERR 0x0008
    441 #define POLLHUP 0x0010
    442 #define POLLNVAL 0x0020
    443 
    444 struct lws;
    445 
    446 void * mbed3_create_tcp_stream_socket(void);
    447 void mbed3_delete_tcp_stream_socket(void *sockfd);
    448 void mbed3_tcp_stream_bind(void *sock, int port, struct lws *);
    449 void mbed3_tcp_stream_accept(void *sock, struct lws *);
    450 #else
    451 #if defined(LWS_WITH_ESP8266)
    452 
    453 #include <user_interface.h>
    454 #include <espconn.h>
    455 
    456 typedef struct espconn * lws_sockfd_type;
    457 typedef void * lws_filefd_type;
    458 #define lws_sockfd_valid(sfd) (!!sfd)
    459 struct pollfd {
    460  lws_sockfd_type fd;
    461  short events;
    462  short revents;
    463 };
    464 #define POLLIN 0x0001
    465 #define POLLPRI 0x0002
    466 #define POLLOUT 0x0004
    467 #define POLLERR 0x0008
    468 #define POLLHUP 0x0010
    469 #define POLLNVAL 0x0020
    470 
    471 struct lws_vhost;
    472 
    473 lws_sockfd_type esp8266_create_tcp_listen_socket(struct lws_vhost *vh);
    474 void esp8266_tcp_stream_accept(lws_sockfd_type fd, struct lws *wsi);
    475 
    476 #include <os_type.h>
    477 #include <osapi.h>
    478 #include "ets_sys.h"
    479 
    480 int ets_snprintf(char *str, size_t size, const char *format, ...);
    481 #define snprintf ets_snprintf
    482 
    483 typedef os_timer_t uv_timer_t;
    484 typedef void uv_cb_t(uv_timer_t *);
    485 
    486 void os_timer_disarm(void *);
    487 void os_timer_setfn(os_timer_t *, os_timer_func_t *, void *);
    488 
    489 void ets_timer_arm_new(os_timer_t *, int, int, int);
    490 
    491 //void os_timer_arm(os_timer_t *, int, int);
    492 
    493 #define UV_VERSION_MAJOR 1
    494 
    495 #define lws_uv_getloop(a, b) (NULL)
    496 
    497 static inline void uv_timer_init(void *l, uv_timer_t *t)
    498 {
    499  (void)l;
    500  memset(t, 0, sizeof(*t));
    501  os_timer_disarm(t);
    502 }
    503 
    504 static inline void uv_timer_start(uv_timer_t *t, uv_cb_t *cb, int first, int rep)
    505 {
    506  os_timer_setfn(t, (os_timer_func_t *)cb, t);
    507  /* ms, repeat */
    508  os_timer_arm(t, first, !!rep);
    509 }
    510 
    511 static inline void uv_timer_stop(uv_timer_t *t)
    512 {
    513  os_timer_disarm(t);
    514 }
    515 
    516 #else
    517 typedef int lws_sockfd_type;
    518 typedef int lws_filefd_type;
    519 #define lws_sockfd_valid(sfd) (sfd >= 0)
    520 #endif
    521 #endif
    522 
    523 #define lws_pollfd pollfd
    524 #define LWS_POLLHUP (POLLHUP|POLLERR)
    525 #define LWS_POLLIN (POLLIN)
    526 #define LWS_POLLOUT (POLLOUT)
    527 #endif
    528 
    531 struct lws_pollargs {
    532  lws_sockfd_type fd;
    533  int events;
    535 };
    536 
    537 struct lws_tokens;
    538 struct lws_token_limits;
    539 
    547 
    549 /*
    550  * NOTE: These public enums are part of the abi. If you want to add one,
    551  * add it at where specified so existing users are unaffected.
    552  */
    555  LWS_CLOSE_STATUS_NOSTATUS = 0,
    617  /****** add new things just above ---^ ******/
    618 
    619  LWS_CLOSE_STATUS_NOSTATUS_CONTEXT_DESTROY = 9999,
    620 };
    621 
    634 LWS_VISIBLE LWS_EXTERN void
    635 lws_close_reason(struct lws *wsi, enum lws_close_status status,
    636  unsigned char *buf, size_t len);
    637 
    639 
    640 struct lws;
    641 struct lws_context;
    642 /* needed even with extensions disabled for create context */
    643 struct lws_extension;
    644 
    656 
    658 
    659 /*
    660  * NOTE: These public enums are part of the abi. If you want to add one,
    661  * add it at where specified so existing users are unaffected.
    662  */
    906  /* external poll() management support */
    969  LWS_CALLBACK_WS_EXT_DEFAULTS = 39,
    972  LWS_CALLBACK_CGI = 40,
    974  LWS_CALLBACK_CGI_TERMINATED = 41,
    976  LWS_CALLBACK_CGI_STDIN_DATA = 42,
    978  LWS_CALLBACK_CGI_STDIN_COMPLETED = 43,
    980  LWS_CALLBACK_ESTABLISHED_CLIENT_HTTP = 44,
    982  LWS_CALLBACK_CLOSED_CLIENT_HTTP = 45,
    984  LWS_CALLBACK_RECEIVE_CLIENT_HTTP = 46,
    986  LWS_CALLBACK_COMPLETED_CLIENT_HTTP = 47,
    988  LWS_CALLBACK_RECEIVE_CLIENT_HTTP_READ = 48,
    990  LWS_CALLBACK_HTTP_BIND_PROTOCOL = 49,
    992  LWS_CALLBACK_HTTP_DROP_PROTOCOL = 50,
    994  LWS_CALLBACK_CHECK_ACCESS_RIGHTS = 51,
    996  LWS_CALLBACK_PROCESS_HTML = 52,
    998  LWS_CALLBACK_ADD_HEADERS = 53,
    1000  LWS_CALLBACK_SESSION_INFO = 54,
    1003  LWS_CALLBACK_GS_EVENT = 55,
    1020  /****** add new things just above ---^ ******/
    1021 
    1024 };
    1025 
    1026 
    1027 
    1043 typedef int
    1044 lws_callback_function(struct lws *wsi, enum lws_callback_reasons reason,
    1045  void *user, void *in, size_t len);
    1047 
    1057 
    1059 /*
    1060  * NOTE: These public enums are part of the abi. If you want to add one,
    1061  * add it at where specified so existing users are unaffected.
    1062  */
    1063 enum lws_extension_callback_reasons {
    1064  LWS_EXT_CB_SERVER_CONTEXT_CONSTRUCT = 0,
    1065  LWS_EXT_CB_CLIENT_CONTEXT_CONSTRUCT = 1,
    1066  LWS_EXT_CB_SERVER_CONTEXT_DESTRUCT = 2,
    1067  LWS_EXT_CB_CLIENT_CONTEXT_DESTRUCT = 3,
    1068  LWS_EXT_CB_CONSTRUCT = 4,
    1069  LWS_EXT_CB_CLIENT_CONSTRUCT = 5,
    1070  LWS_EXT_CB_CHECK_OK_TO_REALLY_CLOSE = 6,
    1071  LWS_EXT_CB_CHECK_OK_TO_PROPOSE_EXTENSION = 7,
    1072  LWS_EXT_CB_DESTROY = 8,
    1073  LWS_EXT_CB_DESTROY_ANY_WSI_CLOSING = 9,
    1074  LWS_EXT_CB_ANY_WSI_ESTABLISHED = 10,
    1075  LWS_EXT_CB_PACKET_RX_PREPARSE = 11,
    1076  LWS_EXT_CB_PACKET_TX_PRESEND = 12,
    1077  LWS_EXT_CB_PACKET_TX_DO_SEND = 13,
    1078  LWS_EXT_CB_HANDSHAKE_REPLY_TX = 14,
    1079  LWS_EXT_CB_FLUSH_PENDING_TX = 15,
    1080  LWS_EXT_CB_EXTENDED_PAYLOAD_RX = 16,
    1081  LWS_EXT_CB_CAN_PROXY_CLIENT_CONNECTION = 17,
    1082  LWS_EXT_CB_1HZ = 18,
    1083  LWS_EXT_CB_REQUEST_ON_WRITEABLE = 19,
    1084  LWS_EXT_CB_IS_WRITEABLE = 20,
    1085  LWS_EXT_CB_PAYLOAD_TX = 21,
    1086  LWS_EXT_CB_PAYLOAD_RX = 22,
    1087  LWS_EXT_CB_OPTION_DEFAULT = 23,
    1088  LWS_EXT_CB_OPTION_SET = 24,
    1089  LWS_EXT_CB_OPTION_CONFIRM = 25,
    1090  LWS_EXT_CB_NAMED_OPTION_SET = 26,
    1091 
    1092  /****** add new things just above ---^ ******/
    1093 };
    1094 
    1101  /* Add new things just above here ---^
    1102  * This is part of the ABI, don't needlessly break compatibility */
    1103 };
    1104 
    1110  const char *name;
    1113  /* Add new things just above here ---^
    1114  * This is part of the ABI, don't needlessly break compatibility */
    1115 };
    1116 
    1119  const char *option_name;
    1121  const char *start;
    1122  int len;
    1123 };
    1124 
    1185 typedef int
    1186 lws_extension_callback_function(struct lws_context *context,
    1187  const struct lws_extension *ext, struct lws *wsi,
    1188  enum lws_extension_callback_reasons reason,
    1189  void *user, void *in, size_t len);
    1190 
    1193  const char *name;
    1195  const char *client_offer;
    1197  /* Add new things just above here ---^
    1198  * This is part of the ABI, don't needlessly break compatibility */
    1199 };
    1200 
    1209 LWS_VISIBLE LWS_EXTERN int
    1210 lws_set_extension_option(struct lws *wsi, const char *ext_name,
    1211  const char *opt_name, const char *opt_val);
    1212 
    1213 #ifndef LWS_NO_EXTENSIONS
    1214 /* lws_get_internal_extensions() - DEPRECATED
    1215  *
    1216  * \Deprecated There is no longer a set internal extensions table. The table is provided
    1217  * by user code along with application-specific settings. See the test
    1218  * client and server for how to do.
    1219  */
    1220 static LWS_INLINE LWS_WARN_DEPRECATED const struct lws_extension *
    1221 lws_get_internal_extensions(void) { return NULL; }
    1222 
    1233 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
    1234 lws_ext_parse_options(const struct lws_extension *ext, struct lws *wsi,
    1235  void *ext_user, const struct lws_ext_options *opts,
    1236  const char *o, int len);
    1237 #endif
    1238 
    1251 LWS_EXTERN
    1253  struct lws_context *context, const struct lws_extension *ext,
    1254  struct lws *wsi, enum lws_extension_callback_reasons reason,
    1255  void *user, void *in, size_t len);
    1256 
    1257 /*
    1258  * The internal exts are part of the public abi
    1259  * If we add more extensions, publish the callback here ------v
    1260  */
    1262 
    1278 
    1283  const char *name;
    1304  unsigned int id;
    1311  void *user;
    1314  /* Add new things just above here ---^
    1315  * This is part of the ABI, don't needlessly break compatibility */
    1316 };
    1317 
    1318 struct lws_vhost;
    1319 
    1328 LWS_VISIBLE LWS_EXTERN const struct lws_protocols *
    1329 lws_vhost_name_to_protocol(struct lws_vhost *vh, const char *name);
    1330 
    1340 LWS_VISIBLE LWS_EXTERN const struct lws_protocols *
    1341 lws_get_protocol(struct lws *wsi);
    1342 
    1344 LWS_VISIBLE LWS_EXTERN const struct lws_protocols *
    1345 lws_protocol_get(struct lws *wsi) LWS_WARN_DEPRECATED;
    1346 
    1357 LWS_VISIBLE LWS_EXTERN void *
    1358 lws_protocol_vh_priv_zalloc(struct lws_vhost *vhost, const struct lws_protocols *prot,
    1359  int size);
    1360 
    1370 LWS_VISIBLE LWS_EXTERN void *
    1371 lws_protocol_vh_priv_get(struct lws_vhost *vhost, const struct lws_protocols *prot);
    1372 
    1381 LWS_VISIBLE LWS_EXTERN int
    1382 lws_finalize_startup(struct lws_context *context);
    1383 
    1384 #ifdef LWS_WITH_PLUGINS
    1385 
    1386 /* PLUGINS implies LIBUV */
    1387 
    1388 #define LWS_PLUGIN_API_MAGIC 180
    1389 
    1392  unsigned int api_magic;
    1393  const struct lws_protocols *protocols;
    1395  const struct lws_extension *extensions;
    1397 };
    1398 
    1399 typedef int (*lws_plugin_init_func)(struct lws_context *,
    1400  struct lws_plugin_capability *);
    1401 typedef int (*lws_plugin_destroy_func)(struct lws_context *);
    1402 
    1404 struct lws_plugin {
    1405  struct lws_plugin *list;
    1406 #if (UV_VERSION_MAJOR > 0)
    1407  uv_lib_t lib;
    1408 #else
    1409  void *l;
    1410 #endif
    1411  char name[64];
    1413 };
    1414 
    1415 #endif
    1416 
    1418 
    1419 
    1428 
    1430 #define LWSGS_EMAIL_CONTENT_SIZE 16384
    1431 
    1433 /* SHA-1 binary and hexified versions */
    1435 typedef struct { unsigned char bin[20]; } lwsgw_hash_bin;
    1437 typedef struct { char id[41]; } lwsgw_hash;
    1438 
    1445 };
    1446 
    1449  char username[32];
    1450  char email[100];
    1451  char ip[72];
    1452  unsigned int mask;
    1454  char session[42];
    1455 };
    1456 
    1461 };
    1462 
    1465  enum lws_gs_event event;
    1466  const char *username;
    1467  const char *email;
    1468 };
    1469 
    1471 
    1472 
    1486 
    1488 /*
    1489  * NOTE: These public enums are part of the abi. If you want to add one,
    1490  * add it at where specified so existing users are unaffected.
    1491  */
    1492 
    1496  (1 << 12),
    1503  (1 << 12),
    1519  (1 << 12),
    1524  (1 << 12),
    1548  /****** add new things just above ---^ ******/
    1549 };
    1550 
    1551 #define lws_check_opt(c, f) (((c) & (f)) == (f))
    1552 
    1563  int port;
    1568  const char *iface;
    1575  const struct lws_protocols *protocols;
    1579  const struct lws_extension *extensions;
    1587  const char *ssl_cert_filepath;
    1597  const char *ssl_ca_filepath;
    1599  const char *ssl_cipher_list;
    1603  const char *http_proxy_address;
    1606  unsigned int http_proxy_port;
    1608  int gid;
    1610  int uid;
    1612  unsigned int options;
    1614  void *user;
    1617  int ka_time;
    1627 #ifdef LWS_OPENSSL_SUPPORT
    1633 #else /* maintain structure layout either way */
    1635 #endif
    1636 
    1647  unsigned int count_threads;
    1649  unsigned int fd_limit_per_thread;
    1653  unsigned int timeout_secs;
    1658  const char *ecdh_curve;
    1660  const char *vhost_name;
    1664  const char * const *plugin_dirs;
    1673  const char *log_filepath;
    1676  const struct lws_http_mount *mounts;
    1678  const char *server_string;
    1681  unsigned int pt_serv_buf_size;
    1696  unsigned short ws_ping_pong_interval;
    1727  /* Add new things just above here ---^
    1728  * This is part of the ABI, don't needlessly break compatibility
    1729  *
    1730  * The below is to ensure later library versions with new
    1731  * members added above will see 0 (default) even if the app
    1732  * was not built against the newer headers.
    1733  */
    1734 
    1735  void *_unused[8];
    1736 };
    1737 
    1772 LWS_VISIBLE LWS_EXTERN struct lws_context *
    1774 
    1783 LWS_VISIBLE LWS_EXTERN void
    1784 lws_context_destroy(struct lws_context *context);
    1785 
    1786 LWS_VISIBLE LWS_EXTERN void
    1787 lws_context_destroy2(struct lws_context *context);
    1788 
    1789 typedef int (*lws_reload_func)(void);
    1790 
    1815 LWS_VISIBLE LWS_EXTERN void
    1816 lws_context_deprecate(struct lws_context *context, lws_reload_func cb);
    1817 
    1818 LWS_VISIBLE LWS_EXTERN int
    1819 lws_context_is_deprecated(struct lws_context *context);
    1820 
    1838 LWS_VISIBLE LWS_EXTERN int
    1839 lws_set_proxy(struct lws_vhost *vhost, const char *proxy);
    1840 
    1841 
    1842 struct lws_vhost;
    1843 
    1853 LWS_EXTERN LWS_VISIBLE struct lws_vhost *
    1854 lws_create_vhost(struct lws_context *context,
    1855  struct lws_context_creation_info *info);
    1856 
    1871 LWS_VISIBLE LWS_EXTERN int
    1872 lwsws_get_config_globals(struct lws_context_creation_info *info, const char *d,
    1873  char **config_strings, int *len);
    1874 
    1890 LWS_VISIBLE LWS_EXTERN int
    1891 lwsws_get_config_vhosts(struct lws_context *context,
    1892  struct lws_context_creation_info *info, const char *d,
    1893  char **config_strings, int *len);
    1894 
    1896 LWS_VISIBLE LWS_EXTERN struct lws_vhost *
    1897 lws_vhost_get(struct lws *wsi) LWS_WARN_DEPRECATED;
    1898 
    1904 LWS_VISIBLE LWS_EXTERN struct lws_vhost *
    1905 lws_get_vhost(struct lws *wsi);
    1906 
    1914 LWS_VISIBLE LWS_EXTERN int
    1915 lws_json_dump_vhost(const struct lws_vhost *vh, char *buf, int len);
    1916 
    1924 LWS_VISIBLE LWS_EXTERN int
    1925 lws_json_dump_context(const struct lws_context *context, char *buf, int len,
    1926  int hide_vhosts);
    1927 
    1937 LWS_VISIBLE LWS_EXTERN void *
    1938 lws_context_user(struct lws_context *context);
    1939 
    1945 
    1955  const char *name;
    1956  const char *value;
    1957 };
    1958 
    1971 };
    1972 
    1980  const char *mountpoint;
    1982  const char *origin;
    1984  const char *def;
    1986  const char *protocol;
    2002  unsigned int auth_mask;
    2005  unsigned int cache_reusable:1;
    2006  unsigned int cache_revalidate:1;
    2007  unsigned int cache_intermediaries:1;
    2009  unsigned char origin_protocol;
    2010  unsigned char mountpoint_len;
    2015  /* Add new things just above here ---^
    2016  * This is part of the ABI, don't needlessly break compatibility
    2017  *
    2018  * The below is to ensure later library versions with new
    2019  * members added above will see 0 (default) even if the app
    2020  * was not built against the newer headers.
    2021  */
    2022 
    2023  void *_unused[2];
    2024 };
    2027 
    2033 
    2041  LCCSCF_USE_SSL = (1 << 0),
    2042  LCCSCF_ALLOW_SELFSIGNED = (1 << 1),
    2043  LCCSCF_SKIP_SERVER_CERT_HOSTNAME_CHECK = (1 << 2),
    2044  LCCSCF_ALLOW_EXPIRED = (1 << 3)
    2045 };
    2046 
    2051  struct lws_context *context;
    2053  const char *address;
    2055  int port;
    2059  const char *path;
    2061  const char *host;
    2063  const char *origin;
    2065  const char *protocol;
    2069  void *userdata;
    2073  const char *method;
    2076  struct lws *parent_wsi;
    2080  const char *uri_replace_from;
    2083  const char *uri_replace_to;
    2085  struct lws_vhost *vhost;
    2087  struct lws **pwsi;
    2099  /* Add new things just above here ---^
    2100  * This is part of the ABI, don't needlessly break compatibility
    2101  *
    2102  * The below is to ensure later library versions with new
    2103  * members added above will see 0 (default) even if the app
    2104  * was not built against the newer headers.
    2105  */
    2106 
    2107  void *_unused[4];
    2108 };
    2109 
    2117 LWS_VISIBLE LWS_EXTERN struct lws *
    2119 
    2140 /* deprecated, use lws_client_connect_via_info() */
    2141 LWS_VISIBLE LWS_EXTERN struct lws * LWS_WARN_UNUSED_RESULT
    2142 lws_client_connect(struct lws_context *clients, const char *address,
    2143  int port, int ssl_connection, const char *path,
    2144  const char *host, const char *origin, const char *protocol,
    2145  int ietf_version_or_minus_one) LWS_WARN_DEPRECATED;
    2146 /* deprecated, use lws_client_connect_via_info() */
    2167 LWS_VISIBLE LWS_EXTERN struct lws * LWS_WARN_UNUSED_RESULT
    2168 lws_client_connect_extended(struct lws_context *clients, const char *address,
    2169  int port, int ssl_connection, const char *path,
    2170  const char *host, const char *origin,
    2171  const char *protocol, int ietf_version_or_minus_one,
    2172  void *userdata) LWS_WARN_DEPRECATED;
    2173 
    2199 LWS_VISIBLE LWS_EXTERN int
    2201  struct lws_vhost *vhost);
    2202 
    2203 LWS_VISIBLE LWS_EXTERN int
    2204 lws_http_client_read(struct lws *wsi, char **buf, int *len);
    2205 
    2213 LWS_VISIBLE LWS_EXTERN unsigned int
    2214 lws_http_client_http_response(struct lws *wsi);
    2215 
    2216 LWS_VISIBLE LWS_EXTERN void
    2217 lws_client_http_body_pending(struct lws *wsi, int something_left_to_send);
    2218 
    2239 
    2248 
    2281 LWS_VISIBLE LWS_EXTERN int
    2282 lws_service(struct lws_context *context, int timeout_ms);
    2283 
    2295 LWS_VISIBLE LWS_EXTERN int
    2296 lws_service_tsi(struct lws_context *context, int timeout_ms, int tsi);
    2297 
    2313 LWS_VISIBLE LWS_EXTERN void
    2314 lws_cancel_service_pt(struct lws *wsi);
    2315 
    2327 LWS_VISIBLE LWS_EXTERN void
    2328 lws_cancel_service(struct lws_context *context);
    2329 
    2356 LWS_VISIBLE LWS_EXTERN int
    2357 lws_service_fd(struct lws_context *context, struct lws_pollfd *pollfd);
    2358 
    2368 LWS_VISIBLE LWS_EXTERN int
    2369 lws_service_fd_tsi(struct lws_context *context, struct lws_pollfd *pollfd,
    2370  int tsi);
    2371 
    2389 LWS_VISIBLE LWS_EXTERN int
    2390 lws_service_adjust_timeout(struct lws_context *context, int timeout_ms, int tsi);
    2391 
    2392 /* Backwards compatibility */
    2393 #define lws_plat_service_tsi lws_service_tsi
    2394 
    2396 
    2402 
    2409 
    2421 LWS_VISIBLE LWS_EXTERN const char *
    2422 lws_get_mimetype(const char *file, const struct lws_http_mount *m);
    2423 
    2442 LWS_VISIBLE LWS_EXTERN int
    2443 lws_serve_http_file(struct lws *wsi, const char *file, const char *content_type,
    2444  const char *other_headers, int other_headers_len);
    2445 LWS_VISIBLE LWS_EXTERN int
    2446 lws_serve_http_file_fragment(struct lws *wsi);
    2448 
    2459 
    2460 enum http_status {
    2461  HTTP_STATUS_OK = 200,
    2462  HTTP_STATUS_NO_CONTENT = 204,
    2463  HTTP_STATUS_PARTIAL_CONTENT = 206,
    2464 
    2465  HTTP_STATUS_MOVED_PERMANENTLY = 301,
    2466  HTTP_STATUS_FOUND = 302,
    2467  HTTP_STATUS_SEE_OTHER = 303,
    2468 
    2469  HTTP_STATUS_BAD_REQUEST = 400,
    2470  HTTP_STATUS_UNAUTHORIZED,
    2471  HTTP_STATUS_PAYMENT_REQUIRED,
    2472  HTTP_STATUS_FORBIDDEN,
    2473  HTTP_STATUS_NOT_FOUND,
    2474  HTTP_STATUS_METHOD_NOT_ALLOWED,
    2475  HTTP_STATUS_NOT_ACCEPTABLE,
    2476  HTTP_STATUS_PROXY_AUTH_REQUIRED,
    2477  HTTP_STATUS_REQUEST_TIMEOUT,
    2478  HTTP_STATUS_CONFLICT,
    2479  HTTP_STATUS_GONE,
    2480  HTTP_STATUS_LENGTH_REQUIRED,
    2481  HTTP_STATUS_PRECONDITION_FAILED,
    2482  HTTP_STATUS_REQ_ENTITY_TOO_LARGE,
    2483  HTTP_STATUS_REQ_URI_TOO_LONG,
    2484  HTTP_STATUS_UNSUPPORTED_MEDIA_TYPE,
    2485  HTTP_STATUS_REQ_RANGE_NOT_SATISFIABLE,
    2486  HTTP_STATUS_EXPECTATION_FAILED,
    2487 
    2488  HTTP_STATUS_INTERNAL_SERVER_ERROR = 500,
    2489  HTTP_STATUS_NOT_IMPLEMENTED,
    2490  HTTP_STATUS_BAD_GATEWAY,
    2491  HTTP_STATUS_SERVICE_UNAVAILABLE,
    2492  HTTP_STATUS_GATEWAY_TIMEOUT,
    2493  HTTP_STATUS_HTTP_VERSION_NOT_SUPPORTED,
    2494 };
    2495 
    2497  char *p;
    2498  int len;
    2499  int max_len;
    2500  int final;
    2501 };
    2502 
    2503 typedef const char *(*lws_process_html_state_cb)(void *data, int index);
    2504 
    2506  char *start;
    2507  char swallow[16];
    2508  int pos;
    2509  void *data;
    2510  const char * const *vars;
    2513  lws_process_html_state_cb replace;
    2514 };
    2515 
    2520 LWS_VISIBLE LWS_EXTERN int
    2522  struct lws_process_html_state *s);
    2524 
    2557 
    2565 struct lws_tokens {
    2566  char *token;
    2568 };
    2569 
    2570 /* enum lws_token_indexes
    2571  * these have to be kept in sync with lextable.h / minilex.c
    2572  *
    2573  * NOTE: These public enums are part of the abi. If you want to add one,
    2574  * add it at where specified so existing users are unaffected.
    2575  */
    2576 enum lws_token_indexes {
    2577  WSI_TOKEN_GET_URI = 0,
    2578  WSI_TOKEN_POST_URI = 1,
    2579  WSI_TOKEN_OPTIONS_URI = 2,
    2580  WSI_TOKEN_HOST = 3,
    2581  WSI_TOKEN_CONNECTION = 4,
    2582  WSI_TOKEN_UPGRADE = 5,
    2583  WSI_TOKEN_ORIGIN = 6,
    2584  WSI_TOKEN_DRAFT = 7,
    2585  WSI_TOKEN_CHALLENGE = 8,
    2586  WSI_TOKEN_EXTENSIONS = 9,
    2587  WSI_TOKEN_KEY1 = 10,
    2588  WSI_TOKEN_KEY2 = 11,
    2589  WSI_TOKEN_PROTOCOL = 12,
    2590  WSI_TOKEN_ACCEPT = 13,
    2591  WSI_TOKEN_NONCE = 14,
    2592  WSI_TOKEN_HTTP = 15,
    2593  WSI_TOKEN_HTTP2_SETTINGS = 16,
    2594  WSI_TOKEN_HTTP_ACCEPT = 17,
    2595  WSI_TOKEN_HTTP_AC_REQUEST_HEADERS = 18,
    2596  WSI_TOKEN_HTTP_IF_MODIFIED_SINCE = 19,
    2597  WSI_TOKEN_HTTP_IF_NONE_MATCH = 20,
    2598  WSI_TOKEN_HTTP_ACCEPT_ENCODING = 21,
    2599  WSI_TOKEN_HTTP_ACCEPT_LANGUAGE = 22,
    2600  WSI_TOKEN_HTTP_PRAGMA = 23,
    2601  WSI_TOKEN_HTTP_CACHE_CONTROL = 24,
    2602  WSI_TOKEN_HTTP_AUTHORIZATION = 25,
    2603  WSI_TOKEN_HTTP_COOKIE = 26,
    2604  WSI_TOKEN_HTTP_CONTENT_LENGTH = 27,
    2605  WSI_TOKEN_HTTP_CONTENT_TYPE = 28,
    2606  WSI_TOKEN_HTTP_DATE = 29,
    2607  WSI_TOKEN_HTTP_RANGE = 30,
    2608  WSI_TOKEN_HTTP_REFERER = 31,
    2609  WSI_TOKEN_KEY = 32,
    2610  WSI_TOKEN_VERSION = 33,
    2611  WSI_TOKEN_SWORIGIN = 34,
    2612 
    2613  WSI_TOKEN_HTTP_COLON_AUTHORITY = 35,
    2614  WSI_TOKEN_HTTP_COLON_METHOD = 36,
    2615  WSI_TOKEN_HTTP_COLON_PATH = 37,
    2616  WSI_TOKEN_HTTP_COLON_SCHEME = 38,
    2617  WSI_TOKEN_HTTP_COLON_STATUS = 39,
    2618 
    2619  WSI_TOKEN_HTTP_ACCEPT_CHARSET = 40,
    2620  WSI_TOKEN_HTTP_ACCEPT_RANGES = 41,
    2621  WSI_TOKEN_HTTP_ACCESS_CONTROL_ALLOW_ORIGIN = 42,
    2622  WSI_TOKEN_HTTP_AGE = 43,
    2623  WSI_TOKEN_HTTP_ALLOW = 44,
    2624  WSI_TOKEN_HTTP_CONTENT_DISPOSITION = 45,
    2625  WSI_TOKEN_HTTP_CONTENT_ENCODING = 46,
    2626  WSI_TOKEN_HTTP_CONTENT_LANGUAGE = 47,
    2627  WSI_TOKEN_HTTP_CONTENT_LOCATION = 48,
    2628  WSI_TOKEN_HTTP_CONTENT_RANGE = 49,
    2629  WSI_TOKEN_HTTP_ETAG = 50,
    2630  WSI_TOKEN_HTTP_EXPECT = 51,
    2631  WSI_TOKEN_HTTP_EXPIRES = 52,
    2632  WSI_TOKEN_HTTP_FROM = 53,
    2633  WSI_TOKEN_HTTP_IF_MATCH = 54,
    2634  WSI_TOKEN_HTTP_IF_RANGE = 55,
    2635  WSI_TOKEN_HTTP_IF_UNMODIFIED_SINCE = 56,
    2636  WSI_TOKEN_HTTP_LAST_MODIFIED = 57,
    2637  WSI_TOKEN_HTTP_LINK = 58,
    2638  WSI_TOKEN_HTTP_LOCATION = 59,
    2639  WSI_TOKEN_HTTP_MAX_FORWARDS = 60,
    2640  WSI_TOKEN_HTTP_PROXY_AUTHENTICATE = 61,
    2641  WSI_TOKEN_HTTP_PROXY_AUTHORIZATION = 62,
    2642  WSI_TOKEN_HTTP_REFRESH = 63,
    2643  WSI_TOKEN_HTTP_RETRY_AFTER = 64,
    2644  WSI_TOKEN_HTTP_SERVER = 65,
    2645  WSI_TOKEN_HTTP_SET_COOKIE = 66,
    2646  WSI_TOKEN_HTTP_STRICT_TRANSPORT_SECURITY = 67,
    2647  WSI_TOKEN_HTTP_TRANSFER_ENCODING = 68,
    2648  WSI_TOKEN_HTTP_USER_AGENT = 69,
    2649  WSI_TOKEN_HTTP_VARY = 70,
    2650  WSI_TOKEN_HTTP_VIA = 71,
    2651  WSI_TOKEN_HTTP_WWW_AUTHENTICATE = 72,
    2652 
    2653  WSI_TOKEN_PATCH_URI = 73,
    2654  WSI_TOKEN_PUT_URI = 74,
    2655  WSI_TOKEN_DELETE_URI = 75,
    2656 
    2657  WSI_TOKEN_HTTP_URI_ARGS = 76,
    2658  WSI_TOKEN_PROXY = 77,
    2659  WSI_TOKEN_HTTP_X_REAL_IP = 78,
    2660  WSI_TOKEN_HTTP1_0 = 79,
    2661  WSI_TOKEN_X_FORWARDED_FOR = 80,
    2662 
    2663  /****** add new things just above ---^ ******/
    2664 
    2665  /* use token storage to stash these internally, not for
    2666  * user use */
    2667 
    2668  _WSI_TOKEN_CLIENT_SENT_PROTOCOLS,
    2669  _WSI_TOKEN_CLIENT_PEER_ADDRESS,
    2670  _WSI_TOKEN_CLIENT_URI,
    2671  _WSI_TOKEN_CLIENT_HOST,
    2672  _WSI_TOKEN_CLIENT_ORIGIN,
    2673  _WSI_TOKEN_CLIENT_METHOD,
    2674 
    2675  /* always last real token index*/
    2676  WSI_TOKEN_COUNT,
    2677 
    2678  /* parser state additions, no storage associated */
    2679  WSI_TOKEN_NAME_PART,
    2680  WSI_TOKEN_SKIPPING,
    2681  WSI_TOKEN_SKIPPING_SAW_CR,
    2682  WSI_PARSING_COMPLETE,
    2683  WSI_INIT_TOKEN_MUXURL,
    2684 };
    2685 
    2687  unsigned short token_limit[WSI_TOKEN_COUNT];
    2688 };
    2689 
    2695 LWS_VISIBLE LWS_EXTERN const unsigned char *
    2696 lws_token_to_string(enum lws_token_indexes token);
    2697 
    2698 
    2707 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
    2708 lws_hdr_total_length(struct lws *wsi, enum lws_token_indexes h);
    2709 
    2719 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
    2720 lws_hdr_fragment_length(struct lws *wsi, enum lws_token_indexes h, int frag_idx);
    2721 
    2735 LWS_VISIBLE LWS_EXTERN int
    2736 lws_hdr_copy(struct lws *wsi, char *dest, int len, enum lws_token_indexes h);
    2737 
    2755 LWS_VISIBLE LWS_EXTERN int
    2756 lws_hdr_copy_fragment(struct lws *wsi, char *dest, int len,
    2757  enum lws_token_indexes h, int frag_idx);
    2758 
    2769 LWS_VISIBLE LWS_EXTERN const char *
    2770 lws_get_urlarg_by_name(struct lws *wsi, const char *name, char *buf, int len);
    2772 
    2787 
    2798 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
    2799 lws_add_http_header_status(struct lws *wsi,
    2800  unsigned int code, unsigned char **p,
    2801  unsigned char *end);
    2814 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
    2815 lws_add_http_header_by_name(struct lws *wsi, const unsigned char *name,
    2816  const unsigned char *value, int length,
    2817  unsigned char **p, unsigned char *end);
    2831 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
    2832 lws_add_http_header_by_token(struct lws *wsi, enum lws_token_indexes token,
    2833  const unsigned char *value, int length,
    2834  unsigned char **p, unsigned char *end);
    2845 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
    2846 lws_add_http_header_content_length(struct lws *wsi,
    2847  unsigned long content_length,
    2848  unsigned char **p, unsigned char *end);
    2858 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
    2859 lws_finalize_http_header(struct lws *wsi, unsigned char **p,
    2860  unsigned char *end);
    2862 
    2881 
    2891 };
    2892 
    2906 typedef int (*lws_spa_fileupload_cb)(void *data, const char *name,
    2907  const char *filename, char *buf, int len,
    2908  enum lws_spa_fileupload_states state);
    2909 
    2912 struct lws_spa;
    2913 
    2932 LWS_VISIBLE LWS_EXTERN struct lws_spa *
    2933 lws_spa_create(struct lws *wsi, const char * const *param_names,
    2934  int count_params, int max_storage, lws_spa_fileupload_cb opt_cb,
    2935  void *opt_data);
    2936 
    2944 LWS_VISIBLE LWS_EXTERN int
    2945 lws_spa_process(struct lws_spa *spa, const char *in, int len);
    2946 
    2952 LWS_VISIBLE LWS_EXTERN int
    2953 lws_spa_finalize(struct lws_spa *spa);
    2954 
    2961 LWS_VISIBLE LWS_EXTERN int
    2962 lws_spa_get_length(struct lws_spa *spa, int n);
    2963 
    2969 LWS_VISIBLE LWS_EXTERN const char *
    2970 lws_spa_get_string(struct lws_spa *spa, int n);
    2971 
    2977 LWS_VISIBLE LWS_EXTERN int
    2978 lws_spa_destroy(struct lws_spa *spa);
    2980 
    2991 
    3002 LWS_VISIBLE LWS_EXTERN const char *
    3003 lws_urlencode(char *escaped, const char *string, int len);
    3004 
    3005 /*
    3006  * URLDECODE 1 / 2
    3007  *
    3008  * This simple urldecode only operates until the first '\0' and requires the
    3009  * data to exist all at once
    3010  */
    3023 LWS_VISIBLE LWS_EXTERN int
    3024 lws_urldecode(char *string, const char *escaped, int len);
    3026 
    3035 LWS_VISIBLE LWS_EXTERN int
    3036 lws_return_http_status(struct lws *wsi, unsigned int code,
    3037  const char *html_body);
    3038 
    3049 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
    3050 lws_http_redirect(struct lws *wsi, int code, const unsigned char *loc, int len,
    3051  unsigned char **p, unsigned char *end);
    3052 
    3061 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
    3062 lws_http_transaction_completed(struct lws *wsi);
    3064 
    3072 
    3083 LWS_VISIBLE LWS_EXTERN const char *
    3084 lws_sql_purify(char *escaped, const char *string, int len);
    3085 
    3096 LWS_VISIBLE LWS_EXTERN const char *
    3097 lws_json_purify(char *escaped, const char *string, int len);
    3099 
    3106 
    3108 #ifdef LWS_USE_LIBEV
    3109 typedef void (lws_ev_signal_cb_t)(EV_P_ struct ev_signal *w, int revents);
    3110 
    3111 LWS_VISIBLE LWS_EXTERN int
    3112 lws_ev_sigint_cfg(struct lws_context *context, int use_ev_sigint,
    3113  lws_ev_signal_cb_t *cb);
    3114 
    3115 LWS_VISIBLE LWS_EXTERN int
    3116 lws_ev_initloop(struct lws_context *context, struct ev_loop *loop, int tsi);
    3117 
    3118 LWS_VISIBLE LWS_EXTERN void
    3119 lws_ev_sigint_cb(struct ev_loop *loop, struct ev_signal *watcher, int revents);
    3120 #endif /* LWS_USE_LIBEV */
    3121 
    3123 
    3130 #ifdef LWS_USE_LIBUV
    3132 LWS_VISIBLE LWS_EXTERN int
    3133 lws_uv_sigint_cfg(struct lws_context *context, int use_uv_sigint,
    3134  uv_signal_cb cb);
    3135 
    3136 LWS_VISIBLE LWS_EXTERN void
    3137 lws_libuv_run(const struct lws_context *context, int tsi);
    3138 
    3139 LWS_VISIBLE LWS_EXTERN void
    3140 lws_libuv_stop(struct lws_context *context);
    3141 
    3142 LWS_VISIBLE LWS_EXTERN void
    3143 lws_libuv_stop_without_kill(const struct lws_context *context, int tsi);
    3144 
    3145 LWS_VISIBLE LWS_EXTERN int
    3146 lws_uv_initloop(struct lws_context *context, uv_loop_t *loop, int tsi);
    3147 
    3148 LWS_VISIBLE LWS_EXTERN uv_loop_t *
    3149 lws_uv_getloop(struct lws_context *context, int tsi);
    3150 
    3151 LWS_VISIBLE LWS_EXTERN void
    3152 lws_uv_sigint_cb(uv_signal_t *watcher, int signum);
    3153 #endif /* LWS_USE_LIBUV */
    3154 
    3161 
    3162 /*
    3163  * NOTE: These public enums are part of the abi. If you want to add one,
    3164  * add it at where specified so existing users are unaffected.
    3165  */
    3166 enum pending_timeout {
    3167  NO_PENDING_TIMEOUT = 0,
    3168  PENDING_TIMEOUT_AWAITING_PROXY_RESPONSE = 1,
    3169  PENDING_TIMEOUT_AWAITING_CONNECT_RESPONSE = 2,
    3170  PENDING_TIMEOUT_ESTABLISH_WITH_SERVER = 3,
    3171  PENDING_TIMEOUT_AWAITING_SERVER_RESPONSE = 4,
    3172  PENDING_TIMEOUT_AWAITING_PING = 5,
    3173  PENDING_TIMEOUT_CLOSE_ACK = 6,
    3174  PENDING_TIMEOUT_AWAITING_EXTENSION_CONNECT_RESPONSE = 7,
    3175  PENDING_TIMEOUT_SENT_CLIENT_HANDSHAKE = 8,
    3176  PENDING_TIMEOUT_SSL_ACCEPT = 9,
    3177  PENDING_TIMEOUT_HTTP_CONTENT = 10,
    3178  PENDING_TIMEOUT_AWAITING_CLIENT_HS_SEND = 11,
    3179  PENDING_FLUSH_STORED_SEND_BEFORE_CLOSE = 12,
    3180  PENDING_TIMEOUT_SHUTDOWN_FLUSH = 13,
    3181  PENDING_TIMEOUT_CGI = 14,
    3182  PENDING_TIMEOUT_HTTP_KEEPALIVE_IDLE = 15,
    3183  PENDING_TIMEOUT_WS_PONG_CHECK_SEND_PING = 16,
    3184  PENDING_TIMEOUT_WS_PONG_CHECK_GET_PONG = 17,
    3185  PENDING_TIMEOUT_CLIENT_ISSUE_PAYLOAD = 18,
    3186 
    3187  /****** add new things just above ---^ ******/
    3188 };
    3189 
    3199 LWS_VISIBLE LWS_EXTERN void
    3200 lws_set_timeout(struct lws *wsi, enum pending_timeout reason, int secs);
    3202 
    3208 #if !defined(LWS_SIZEOFPTR)
    3209 #define LWS_SIZEOFPTR (sizeof (void *))
    3210 #endif
    3211 #if !defined(u_int64_t)
    3212 #define u_int64_t unsigned long long
    3213 #endif
    3214 
    3215 #if defined(__x86_64__)
    3216 #define _LWS_PAD_SIZE 16 /* Intel recommended for best performance */
    3217 #else
    3218 #define _LWS_PAD_SIZE LWS_SIZEOFPTR /* Size of a pointer on the target arch */
    3219 #endif
    3220 #define _LWS_PAD(n) (((n) % _LWS_PAD_SIZE) ? \
    3221  ((n) + (_LWS_PAD_SIZE - ((n) % _LWS_PAD_SIZE))) : (n))
    3222 #define LWS_PRE _LWS_PAD(4 + 10)
    3223 /* used prior to 1.7 and retained for backward compatibility */
    3224 #define LWS_SEND_BUFFER_PRE_PADDING LWS_PRE
    3225 #define LWS_SEND_BUFFER_POST_PADDING 0
    3226 
    3227 /*
    3228  * NOTE: These public enums are part of the abi. If you want to add one,
    3229  * add it at where specified so existing users are unaffected.
    3230  */
    3245  /* LWS_WRITE_CLOSE is handled by lws_close_reason() */
    3246  LWS_WRITE_PING = 5,
    3247  LWS_WRITE_PONG = 6,
    3248 
    3249  /* Same as write_http but we know this write ends the transaction */
    3250  LWS_WRITE_HTTP_FINAL = 7,
    3251 
    3252  /* HTTP2 */
    3253 
    3261  /****** add new things just above ---^ ******/
    3262 
    3263  /* flags */
    3264 
    3272 };
    3273 
    3274 
    3361 LWS_VISIBLE LWS_EXTERN int
    3362 lws_write(struct lws *wsi, unsigned char *buf, size_t len,
    3363  enum lws_write_protocol protocol);
    3364 
    3365 /* helper for case where buffer may be const */
    3366 #define lws_write_http(wsi, buf, len) \
    3367  lws_write(wsi, (unsigned char *)(buf), len, LWS_WRITE_HTTP)
    3368 
    3388 
    3401 LWS_VISIBLE LWS_EXTERN int
    3402 lws_callback_on_writable(struct lws *wsi);
    3403 
    3417 LWS_VISIBLE LWS_EXTERN int
    3418 lws_callback_on_writable_all_protocol(const struct lws_context *context,
    3419  const struct lws_protocols *protocol);
    3420 
    3434 LWS_VISIBLE LWS_EXTERN int
    3435 lws_callback_on_writable_all_protocol_vhost(const struct lws_vhost *vhost,
    3436  const struct lws_protocols *protocol);
    3437 
    3450 LWS_VISIBLE LWS_EXTERN int
    3451 lws_callback_all_protocol(struct lws_context *context,
    3452  const struct lws_protocols *protocol, int reason);
    3453 
    3466 LWS_VISIBLE LWS_EXTERN int
    3467 lws_callback_all_protocol_vhost(struct lws_vhost *vh,
    3468  const struct lws_protocols *protocol, int reason);
    3469 
    3483 LWS_VISIBLE LWS_EXTERN int
    3484 lws_callback_vhost_protocols(struct lws *wsi, int reason, void *in, int len);
    3485 
    3486 LWS_VISIBLE LWS_EXTERN int
    3487 lws_callback_http_dummy(struct lws *wsi, enum lws_callback_reasons reason,
    3488  void *user, void *in, size_t len);
    3489 
    3497 LWS_VISIBLE LWS_EXTERN int
    3498 lws_get_socket_fd(struct lws *wsi);
    3499 
    3521 LWS_VISIBLE LWS_EXTERN size_t
    3522 lws_get_peer_write_allowance(struct lws *wsi);
    3524 
    3535 LWS_VISIBLE LWS_EXTERN int
    3536 lws_rx_flow_control(struct lws *wsi, int enable);
    3537 
    3547 LWS_VISIBLE LWS_EXTERN void
    3548 lws_rx_flow_allow_all_protocol(const struct lws_context *context,
    3549  const struct lws_protocols *protocol);
    3550 
    3567 LWS_VISIBLE LWS_EXTERN size_t
    3568 lws_remaining_packet_payload(struct lws *wsi);
    3569 
    3570 
    3579 
    3593 LWS_VISIBLE LWS_EXTERN struct lws *
    3594 lws_adopt_socket(struct lws_context *context, lws_sockfd_type accept_fd);
    3607 LWS_VISIBLE LWS_EXTERN struct lws *
    3608 lws_adopt_socket_vhost(struct lws_vhost *vh, lws_sockfd_type accept_fd);
    3632 LWS_VISIBLE LWS_EXTERN struct lws *
    3633 lws_adopt_socket_readbuf(struct lws_context *context, lws_sockfd_type accept_fd,
    3634  const char *readbuf, size_t len);
    3658 LWS_VISIBLE LWS_EXTERN struct lws *
    3659 lws_adopt_socket_vhost_readbuf(struct lws_vhost *vhost, lws_sockfd_type accept_fd,
    3660  const char *readbuf, size_t len);
    3662 
    3668 
    3679 LWS_VISIBLE LWS_EXTERN const char * LWS_WARN_UNUSED_RESULT
    3680 lws_canonical_hostname(struct lws_context *context);
    3681 
    3696 LWS_VISIBLE LWS_EXTERN void
    3697 lws_get_peer_addresses(struct lws *wsi, lws_sockfd_type fd, char *name,
    3698  int name_len, char *rip, int rip_len);
    3699 
    3710 LWS_VISIBLE LWS_EXTERN const char *
    3711 lws_get_peer_simple(struct lws *wsi, char *name, int namelen);
    3712 #ifndef LWS_WITH_ESP8266
    3713 
    3724 LWS_VISIBLE LWS_EXTERN int
    3725 lws_interface_to_sa(int ipv6, const char *ifname, struct sockaddr_in *addr,
    3726  size_t addrlen);
    3728 #endif
    3729 
    3735 
    3748 LWS_VISIBLE LWS_EXTERN int
    3749 lws_snprintf(char *str, size_t size, const char *format, ...);
    3750 
    3762 LWS_VISIBLE LWS_EXTERN int
    3763 lws_get_random(struct lws_context *context, void *buf, int len);
    3771 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
    3772 lws_daemonize(const char *_lock_path);
    3778 LWS_VISIBLE LWS_EXTERN const char * LWS_WARN_UNUSED_RESULT
    3780 
    3787 LWS_VISIBLE LWS_EXTERN void *
    3788 lws_wsi_user(struct lws *wsi);
    3789 
    3801 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
    3802 lws_parse_uri(char *p, const char **prot, const char **ads, int *port,
    3803  const char **path);
    3804 
    3808 LWS_VISIBLE LWS_EXTERN unsigned long
    3809 lws_now_secs(void);
    3810 
    3820 LWS_VISIBLE LWS_EXTERN struct lws_context * LWS_WARN_UNUSED_RESULT
    3821 lws_get_context(const struct lws *wsi);
    3822 
    3832 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
    3833 lws_get_count_threads(struct lws_context *context);
    3834 
    3842 LWS_VISIBLE LWS_EXTERN struct lws * LWS_WARN_UNUSED_RESULT
    3843 lws_get_parent(const struct lws *wsi);
    3844 
    3851 LWS_VISIBLE LWS_EXTERN struct lws * LWS_WARN_UNUSED_RESULT
    3852 lws_get_child(const struct lws *wsi);
    3853 
    3854 
    3855 /*
    3856  * \deprecated DEPRECATED Note: this is not normally needed as a user api.
    3857  * It's provided in case it is
    3858  * useful when integrating with other app poll loop service code.
    3859  */
    3860 LWS_VISIBLE LWS_EXTERN int
    3861 lws_read(struct lws *wsi, unsigned char *buf, size_t len);
    3862 
    3870 LWS_VISIBLE LWS_EXTERN void
    3871 lws_set_allocator(void *(*realloc)(void *ptr, size_t size));
    3873 
    3879 
    3886 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
    3887 lws_send_pipe_choked(struct lws *wsi);
    3888 
    3893 LWS_VISIBLE LWS_EXTERN int
    3894 lws_is_final_fragment(struct lws *wsi);
    3895 
    3900 LWS_VISIBLE LWS_EXTERN unsigned char
    3901 lws_get_reserved_bits(struct lws *wsi);
    3902 
    3919 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
    3920 lws_partial_buffered(struct lws *wsi);
    3921 
    3931 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
    3932 lws_frame_is_binary(struct lws *wsi);
    3933 
    3942 LWS_VISIBLE LWS_EXTERN int
    3943 lws_is_ssl(struct lws *wsi);
    3948 LWS_VISIBLE LWS_EXTERN int
    3949 lws_is_cgi(struct lws *wsi);
    3951 
    3952 
    3958 #ifdef LWS_SHA1_USE_OPENSSL_NAME
    3960 #define lws_SHA1 SHA1
    3961 #else
    3962 
    3971 LWS_VISIBLE LWS_EXTERN unsigned char *
    3972 lws_SHA1(const unsigned char *d, size_t n, unsigned char *md);
    3973 #endif
    3974 
    3984 LWS_VISIBLE LWS_EXTERN int
    3985 lws_b64_encode_string(const char *in, int in_len, char *out, int out_size);
    3995 LWS_VISIBLE LWS_EXTERN int
    3996 lws_b64_decode_string(const char *in, char *out, int out_size);
    3998 
    3999 
    4009 #ifdef LWS_WITH_CGI
    4010 enum lws_enum_stdinouterr {
    4011  LWS_STDIN = 0,
    4012  LWS_STDOUT = 1,
    4013  LWS_STDERR = 2,
    4014 };
    4015 
    4016 enum lws_cgi_hdr_state {
    4017  LCHS_HEADER,
    4018  LCHS_CR1,
    4019  LCHS_LF1,
    4020  LCHS_CR2,
    4021  LCHS_LF2,
    4022  LHCS_PAYLOAD,
    4023  LCHS_SINGLE_0A,
    4024 };
    4025 
    4027  struct lws **stdwsi;
    4028  enum lws_enum_stdinouterr ch;
    4029  unsigned char *data;
    4030  enum lws_cgi_hdr_state hdr_state;
    4031  int len;
    4032 };
    4033 
    4034 
    4044 LWS_VISIBLE LWS_EXTERN int
    4045 lws_cgi(struct lws *wsi, const char * const *exec_array,
    4046  int script_uri_path_len, int timeout_secs,
    4047  const struct lws_protocol_vhost_options *mp_cgienv);
    4048 
    4054 LWS_VISIBLE LWS_EXTERN int
    4055 lws_cgi_write_split_stdout_headers(struct lws *wsi);
    4056 
    4062 LWS_VISIBLE LWS_EXTERN int
    4063 lws_cgi_kill(struct lws *wsi);
    4064 #endif
    4065 
    4067 
    4084 
    4091  lws_filefd_type (*open)(struct lws *wsi, const char *filename,
    4092  unsigned long *filelen, int flags);
    4096  int (*close)(struct lws *wsi, lws_filefd_type fd);
    4098  unsigned long (*seek_cur)(struct lws *wsi, lws_filefd_type fd,
    4099  long offset_from_cur_pos);
    4101  int (*read)(struct lws *wsi, lws_filefd_type fd, unsigned long *amount,
    4102  unsigned char *buf, unsigned long len);
    4104  int (*write)(struct lws *wsi, lws_filefd_type fd, unsigned long *amount,
    4105  unsigned char *buf, unsigned long len);
    4108  /* Add new things just above here ---^
    4109  * This is part of the ABI, don't needlessly break compatibility */
    4110 };
    4111 
    4117 LWS_VISIBLE LWS_EXTERN struct lws_plat_file_ops * LWS_WARN_UNUSED_RESULT
    4118 lws_get_fops(struct lws_context *context);
    4119 
    4128 static LWS_INLINE lws_filefd_type LWS_WARN_UNUSED_RESULT
    4129 lws_plat_file_open(struct lws *wsi, const char *filename,
    4130  unsigned long *filelen, int flags)
    4131 {
    4132  return lws_get_fops(lws_get_context(wsi))->open(wsi, filename,
    4133  filelen, flags);
    4134 }
    4135 
    4142 static LWS_INLINE int
    4143 lws_plat_file_close(struct lws *wsi, lws_filefd_type fd)
    4144 {
    4145  return lws_get_fops(lws_get_context(wsi))->close(wsi, fd);
    4146 }
    4147 
    4155 static LWS_INLINE unsigned long
    4156 lws_plat_file_seek_cur(struct lws *wsi, lws_filefd_type fd, long offset)
    4157 {
    4158  return lws_get_fops(lws_get_context(wsi))->seek_cur(wsi, fd, offset);
    4159 }
    4169 static LWS_INLINE int LWS_WARN_UNUSED_RESULT
    4170 lws_plat_file_read(struct lws *wsi, lws_filefd_type fd, unsigned long *amount,
    4171  unsigned char *buf, unsigned long len)
    4172 {
    4173  return lws_get_fops(lws_get_context(wsi))->read(wsi, fd, amount, buf,
    4174  len);
    4175 }
    4185 static LWS_INLINE int LWS_WARN_UNUSED_RESULT
    4186 lws_plat_file_write(struct lws *wsi, lws_filefd_type fd, unsigned long *amount,
    4187  unsigned char *buf, unsigned long len)
    4188 {
    4189  return lws_get_fops(lws_get_context(wsi))->write(wsi, fd, amount, buf,
    4190  len);
    4191 }
    4193 
    4225 #ifdef LWS_WITH_SMTP
    4226 
    4238 };
    4239 
    4241 struct lws_email {
    4242  void *data;
    4244  uv_loop_t *loop;
    4247  char email_smtp_ip[32];
    4248  char email_helo[32];
    4249  char email_from[100];
    4250  char email_to[100];
    4252  unsigned int max_content_size;
    4255  /* Fill all the callbacks before init */
    4256 
    4257  int (*on_next)(struct lws_email *email);
    4262  int (*on_sent)(struct lws_email *email);
    4267  int (*on_get_body)(struct lws_email *email, char *buf, int len);
    4273  /* private things */
    4274  uv_timer_t timeout_email;
    4276  uv_connect_t email_connect_req;
    4277  uv_tcp_t email_client;
    4279  char email_buf[256];
    4280  char *content;
    4281 };
    4282 
    4292 LWS_VISIBLE LWS_EXTERN int
    4293 lws_email_init(struct lws_email *email, uv_loop_t *loop, int max_content);
    4294 
    4303 LWS_VISIBLE LWS_EXTERN void
    4304 lws_email_check(struct lws_email *email);
    4312 LWS_VISIBLE LWS_EXTERN void
    4313 lws_email_destroy(struct lws_email *email);
    4314 
    4315 #endif
    4316 
    4317 
    4318 #ifdef __cplusplus
    4319 }
    4320 #endif
    4321 
    4322 #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 #elif !defined(__MINGW32__)
    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(__MINGW32__) && (!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 #ifdef LWS_HAVE_UV_VERSION_H
    208 #include <uv-version.h>
    209 #endif
    210 #endif /* LWS_USE_LIBUV */
    211 
    212 #ifndef LWS_EXTERN
    213 #define LWS_EXTERN extern
    214 #endif
    215 
    216 #ifdef _WIN32
    217 #define random rand
    218 #else
    219 #include <sys/time.h>
    220 #include <unistd.h>
    221 #endif
    222 
    223 #ifdef LWS_OPENSSL_SUPPORT
    224 
    225 #ifdef USE_WOLFSSL
    226 #ifdef USE_OLD_CYASSL
    227 #include <cyassl/openssl/ssl.h>
    228 #include <cyassl/error-ssl.h>
    229 #else
    230 #include <wolfssl/openssl/ssl.h>
    231 #include <wolfssl/error-ssl.h>
    232 #endif /* not USE_OLD_CYASSL */
    233 #else
    234 #if defined(LWS_USE_POLARSSL)
    235 #include <polarssl/ssl.h>
    237  x509_crt ca;
    238  x509_crt certificate;
    239  rsa_context key;
    240 };
    241 typedef struct lws_polarssl_context SSL_CTX;
    242 typedef ssl_context SSL;
    243 #else
    244 #if defined(LWS_USE_MBEDTLS)
    245 #include <mbedtls/ssl.h>
    246 #else
    247 #include <openssl/ssl.h>
    248 #include <openssl/err.h>
    249 #endif /* not USE_MBEDTLS */
    250 #endif /* not USE_POLARSSL */
    251 #endif /* not USE_WOLFSSL */
    252 #endif
    253 
    254 
    255 #define CONTEXT_PORT_NO_LISTEN -1
    256 #define CONTEXT_PORT_NO_LISTEN_SERVER -2
    257 
    268 
    270 enum lws_log_levels {
    271  LLL_ERR = 1 << 0,
    272  LLL_WARN = 1 << 1,
    273  LLL_NOTICE = 1 << 2,
    274  LLL_INFO = 1 << 3,
    275  LLL_DEBUG = 1 << 4,
    276  LLL_PARSER = 1 << 5,
    277  LLL_HEADER = 1 << 6,
    278  LLL_EXT = 1 << 7,
    279  LLL_CLIENT = 1 << 8,
    280  LLL_LATENCY = 1 << 9,
    281 
    282  LLL_COUNT = 10 /* set to count of valid flags */
    283 };
    284 
    285 LWS_VISIBLE LWS_EXTERN void _lws_log(int filter, const char *format, ...);
    286 LWS_VISIBLE LWS_EXTERN void _lws_logv(int filter, const char *format, va_list vl);
    296 LWS_VISIBLE LWS_EXTERN int
    297 lwsl_timestamp(int level, char *p, int len);
    298 
    299 #define lwsl_err(...) _lws_log(LLL_ERR, __VA_ARGS__)
    300 
    301 #if !defined(LWS_WITH_NO_LOGS)
    302 /* notice, warn and log are always compiled in */
    303 #define lwsl_warn(...) _lws_log(LLL_WARN, __VA_ARGS__)
    304 #define lwsl_notice(...) _lws_log(LLL_NOTICE, __VA_ARGS__)
    305 #endif
    306 /*
    307  * weaker logging can be deselected at configure time using --disable-debug
    308  * that gets rid of the overhead of checking while keeping _warn and _err
    309  * active
    310  */
    311 
    312 #if defined(LWS_WITH_ESP8266)
    313 #undef _DEBUG
    314 #endif
    315 
    316 #ifdef _DEBUG
    317 #if defined(LWS_WITH_NO_LOGS)
    318 /* notice, warn and log are always compiled in */
    319 //#define lwsl_err(...) _lws_log(LLL_ERR, __VA_ARGS__)
    320 #define lwsl_warn(...) _lws_log(LLL_WARN, __VA_ARGS__)
    321 #define lwsl_notice(...) _lws_log(LLL_NOTICE, __VA_ARGS__)
    322 #endif
    323 #define lwsl_info(...) _lws_log(LLL_INFO, __VA_ARGS__)
    324 #define lwsl_debug(...) _lws_log(LLL_DEBUG, __VA_ARGS__)
    325 #define lwsl_parser(...) _lws_log(LLL_PARSER, __VA_ARGS__)
    326 #define lwsl_header(...) _lws_log(LLL_HEADER, __VA_ARGS__)
    327 #define lwsl_ext(...) _lws_log(LLL_EXT, __VA_ARGS__)
    328 #define lwsl_client(...) _lws_log(LLL_CLIENT, __VA_ARGS__)
    329 #define lwsl_latency(...) _lws_log(LLL_LATENCY, __VA_ARGS__)
    330 
    336 LWS_VISIBLE LWS_EXTERN void lwsl_hexdump(void *buf, size_t len);
    337 
    338 #else /* no debug */
    339 #if defined(LWS_WITH_NO_LOGS)
    340 //#define lwsl_err(...) do {} while(0)
    341 #define lwsl_warn(...) do {} while(0)
    342 #define lwsl_notice(...) do {} while(0)
    343 #endif
    344 #define lwsl_info(...) do {} while(0)
    345 #define lwsl_debug(...) do {} while(0)
    346 #define lwsl_parser(...) do {} while(0)
    347 #define lwsl_header(...) do {} while(0)
    348 #define lwsl_ext(...) do {} while(0)
    349 #define lwsl_client(...) do {} while(0)
    350 #define lwsl_latency(...) do {} while(0)
    351 #define lwsl_hexdump(a, b)
    352 
    353 #endif
    354 
    365 LWS_VISIBLE LWS_EXTERN void
    366 lws_set_log_level(int level,
    367  void (*log_emit_function)(int level, const char *line));
    368 
    378 LWS_VISIBLE LWS_EXTERN void
    379 lwsl_emit_syslog(int level, const char *line);
    380 
    382 
    383 
    384 #include <stddef.h>
    385 
    386 #ifndef lws_container_of
    387 #define lws_container_of(P,T,M) ((T *)((char *)(P) - offsetof(T, M)))
    388 #endif
    389 
    390 
    391 struct lws;
    392 #ifndef ARRAY_SIZE
    393 #define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0]))
    394 #endif
    395 
    396 /* api change list for user code to test against */
    397 
    398 #define LWS_FEATURE_SERVE_HTTP_FILE_HAS_OTHER_HEADERS_ARG
    399 
    400 /* the struct lws_protocols has the id field present */
    401 #define LWS_FEATURE_PROTOCOLS_HAS_ID_FIELD
    402 
    403 /* you can call lws_get_peer_write_allowance */
    404 #define LWS_FEATURE_PROTOCOLS_HAS_PEER_WRITE_ALLOWANCE
    405 
    406 /* extra parameter introduced in 917f43ab821 */
    407 #define LWS_FEATURE_SERVE_HTTP_FILE_HAS_OTHER_HEADERS_LEN
    408 
    409 /* File operations stuff exists */
    410 #define LWS_FEATURE_FOPS
    411 
    412 
    413 #if defined(_WIN32)
    414 typedef SOCKET lws_sockfd_type;
    415 typedef HANDLE lws_filefd_type;
    416 #define lws_sockfd_valid(sfd) (!!sfd)
    417 struct lws_pollfd {
    418  lws_sockfd_type fd;
    419  SHORT events;
    420  SHORT revents;
    421 };
    422 #define LWS_POLLHUP (FD_CLOSE)
    423 #define LWS_POLLIN (FD_READ | FD_ACCEPT)
    424 #define LWS_POLLOUT (FD_WRITE)
    425 #else
    426 
    427 #if defined(MBED_OPERATORS)
    428 /* it's a class lws_conn * */
    429 typedef void * lws_sockfd_type;
    430 typedef void * lws_filefd_type;
    431 #define lws_sockfd_valid(sfd) (!!sfd)
    432 struct pollfd {
    433  lws_sockfd_type fd;
    434  short events;
    435  short revents;
    436 };
    437 #define POLLIN 0x0001
    438 #define POLLPRI 0x0002
    439 #define POLLOUT 0x0004
    440 #define POLLERR 0x0008
    441 #define POLLHUP 0x0010
    442 #define POLLNVAL 0x0020
    443 
    444 struct lws;
    445 
    446 void * mbed3_create_tcp_stream_socket(void);
    447 void mbed3_delete_tcp_stream_socket(void *sockfd);
    448 void mbed3_tcp_stream_bind(void *sock, int port, struct lws *);
    449 void mbed3_tcp_stream_accept(void *sock, struct lws *);
    450 #else
    451 #if defined(LWS_WITH_ESP8266)
    452 
    453 #include <user_interface.h>
    454 #include <espconn.h>
    455 
    456 typedef struct espconn * lws_sockfd_type;
    457 typedef void * lws_filefd_type;
    458 #define lws_sockfd_valid(sfd) (!!sfd)
    459 struct pollfd {
    460  lws_sockfd_type fd;
    461  short events;
    462  short revents;
    463 };
    464 #define POLLIN 0x0001
    465 #define POLLPRI 0x0002
    466 #define POLLOUT 0x0004
    467 #define POLLERR 0x0008
    468 #define POLLHUP 0x0010
    469 #define POLLNVAL 0x0020
    470 
    471 struct lws_vhost;
    472 
    473 lws_sockfd_type esp8266_create_tcp_listen_socket(struct lws_vhost *vh);
    474 void esp8266_tcp_stream_accept(lws_sockfd_type fd, struct lws *wsi);
    475 
    476 #include <os_type.h>
    477 #include <osapi.h>
    478 #include "ets_sys.h"
    479 
    480 int ets_snprintf(char *str, size_t size, const char *format, ...);
    481 #define snprintf ets_snprintf
    482 
    483 typedef os_timer_t uv_timer_t;
    484 typedef void uv_cb_t(uv_timer_t *);
    485 
    486 void os_timer_disarm(void *);
    487 void os_timer_setfn(os_timer_t *, os_timer_func_t *, void *);
    488 
    489 void ets_timer_arm_new(os_timer_t *, int, int, int);
    490 
    491 //void os_timer_arm(os_timer_t *, int, int);
    492 
    493 #define UV_VERSION_MAJOR 1
    494 
    495 #define lws_uv_getloop(a, b) (NULL)
    496 
    497 static inline void uv_timer_init(void *l, uv_timer_t *t)
    498 {
    499  (void)l;
    500  memset(t, 0, sizeof(*t));
    501  os_timer_disarm(t);
    502 }
    503 
    504 static inline void uv_timer_start(uv_timer_t *t, uv_cb_t *cb, int first, int rep)
    505 {
    506  os_timer_setfn(t, (os_timer_func_t *)cb, t);
    507  /* ms, repeat */
    508  os_timer_arm(t, first, !!rep);
    509 }
    510 
    511 static inline void uv_timer_stop(uv_timer_t *t)
    512 {
    513  os_timer_disarm(t);
    514 }
    515 
    516 #else
    517 typedef int lws_sockfd_type;
    518 typedef int lws_filefd_type;
    519 #define lws_sockfd_valid(sfd) (sfd >= 0)
    520 #endif
    521 #endif
    522 
    523 #define lws_pollfd pollfd
    524 #define LWS_POLLHUP (POLLHUP|POLLERR)
    525 #define LWS_POLLIN (POLLIN)
    526 #define LWS_POLLOUT (POLLOUT)
    527 #endif
    528 
    531 struct lws_pollargs {
    532  lws_sockfd_type fd;
    533  int events;
    535 };
    536 
    537 struct lws_tokens;
    538 struct lws_token_limits;
    539 
    547 
    549 /*
    550  * NOTE: These public enums are part of the abi. If you want to add one,
    551  * add it at where specified so existing users are unaffected.
    552  */
    555  LWS_CLOSE_STATUS_NOSTATUS = 0,
    617  /****** add new things just above ---^ ******/
    618 
    619  LWS_CLOSE_STATUS_NOSTATUS_CONTEXT_DESTROY = 9999,
    620 };
    621 
    634 LWS_VISIBLE LWS_EXTERN void
    635 lws_close_reason(struct lws *wsi, enum lws_close_status status,
    636  unsigned char *buf, size_t len);
    637 
    639 
    640 struct lws;
    641 struct lws_context;
    642 /* needed even with extensions disabled for create context */
    643 struct lws_extension;
    644 
    656 
    658 
    659 /*
    660  * NOTE: These public enums are part of the abi. If you want to add one,
    661  * add it at where specified so existing users are unaffected.
    662  */
    906  /* external poll() management support */
    969  LWS_CALLBACK_WS_EXT_DEFAULTS = 39,
    972  LWS_CALLBACK_CGI = 40,
    974  LWS_CALLBACK_CGI_TERMINATED = 41,
    976  LWS_CALLBACK_CGI_STDIN_DATA = 42,
    978  LWS_CALLBACK_CGI_STDIN_COMPLETED = 43,
    980  LWS_CALLBACK_ESTABLISHED_CLIENT_HTTP = 44,
    982  LWS_CALLBACK_CLOSED_CLIENT_HTTP = 45,
    984  LWS_CALLBACK_RECEIVE_CLIENT_HTTP = 46,
    986  LWS_CALLBACK_COMPLETED_CLIENT_HTTP = 47,
    988  LWS_CALLBACK_RECEIVE_CLIENT_HTTP_READ = 48,
    990  LWS_CALLBACK_HTTP_BIND_PROTOCOL = 49,
    992  LWS_CALLBACK_HTTP_DROP_PROTOCOL = 50,
    994  LWS_CALLBACK_CHECK_ACCESS_RIGHTS = 51,
    996  LWS_CALLBACK_PROCESS_HTML = 52,
    998  LWS_CALLBACK_ADD_HEADERS = 53,
    1000  LWS_CALLBACK_SESSION_INFO = 54,
    1003  LWS_CALLBACK_GS_EVENT = 55,
    1050  /****** add new things just above ---^ ******/
    1051 
    1054 };
    1055 
    1056 
    1057 
    1073 typedef int
    1074 lws_callback_function(struct lws *wsi, enum lws_callback_reasons reason,
    1075  void *user, void *in, size_t len);
    1077 
    1087 
    1089 /*
    1090  * NOTE: These public enums are part of the abi. If you want to add one,
    1091  * add it at where specified so existing users are unaffected.
    1092  */
    1093 enum lws_extension_callback_reasons {
    1094  LWS_EXT_CB_SERVER_CONTEXT_CONSTRUCT = 0,
    1095  LWS_EXT_CB_CLIENT_CONTEXT_CONSTRUCT = 1,
    1096  LWS_EXT_CB_SERVER_CONTEXT_DESTRUCT = 2,
    1097  LWS_EXT_CB_CLIENT_CONTEXT_DESTRUCT = 3,
    1098  LWS_EXT_CB_CONSTRUCT = 4,
    1099  LWS_EXT_CB_CLIENT_CONSTRUCT = 5,
    1100  LWS_EXT_CB_CHECK_OK_TO_REALLY_CLOSE = 6,
    1101  LWS_EXT_CB_CHECK_OK_TO_PROPOSE_EXTENSION = 7,
    1102  LWS_EXT_CB_DESTROY = 8,
    1103  LWS_EXT_CB_DESTROY_ANY_WSI_CLOSING = 9,
    1104  LWS_EXT_CB_ANY_WSI_ESTABLISHED = 10,
    1105  LWS_EXT_CB_PACKET_RX_PREPARSE = 11,
    1106  LWS_EXT_CB_PACKET_TX_PRESEND = 12,
    1107  LWS_EXT_CB_PACKET_TX_DO_SEND = 13,
    1108  LWS_EXT_CB_HANDSHAKE_REPLY_TX = 14,
    1109  LWS_EXT_CB_FLUSH_PENDING_TX = 15,
    1110  LWS_EXT_CB_EXTENDED_PAYLOAD_RX = 16,
    1111  LWS_EXT_CB_CAN_PROXY_CLIENT_CONNECTION = 17,
    1112  LWS_EXT_CB_1HZ = 18,
    1113  LWS_EXT_CB_REQUEST_ON_WRITEABLE = 19,
    1114  LWS_EXT_CB_IS_WRITEABLE = 20,
    1115  LWS_EXT_CB_PAYLOAD_TX = 21,
    1116  LWS_EXT_CB_PAYLOAD_RX = 22,
    1117  LWS_EXT_CB_OPTION_DEFAULT = 23,
    1118  LWS_EXT_CB_OPTION_SET = 24,
    1119  LWS_EXT_CB_OPTION_CONFIRM = 25,
    1120  LWS_EXT_CB_NAMED_OPTION_SET = 26,
    1121 
    1122  /****** add new things just above ---^ ******/
    1123 };
    1124 
    1131  /* Add new things just above here ---^
    1132  * This is part of the ABI, don't needlessly break compatibility */
    1133 };
    1134 
    1140  const char *name;
    1143  /* Add new things just above here ---^
    1144  * This is part of the ABI, don't needlessly break compatibility */
    1145 };
    1146 
    1149  const char *option_name;
    1151  const char *start;
    1152  int len;
    1153 };
    1154 
    1215 typedef int
    1216 lws_extension_callback_function(struct lws_context *context,
    1217  const struct lws_extension *ext, struct lws *wsi,
    1218  enum lws_extension_callback_reasons reason,
    1219  void *user, void *in, size_t len);
    1220 
    1223  const char *name;
    1225  const char *client_offer;
    1227  /* Add new things just above here ---^
    1228  * This is part of the ABI, don't needlessly break compatibility */
    1229 };
    1230 
    1239 LWS_VISIBLE LWS_EXTERN int
    1240 lws_set_extension_option(struct lws *wsi, const char *ext_name,
    1241  const char *opt_name, const char *opt_val);
    1242 
    1243 #ifndef LWS_NO_EXTENSIONS
    1244 /* lws_get_internal_extensions() - DEPRECATED
    1245  *
    1246  * \Deprecated There is no longer a set internal extensions table. The table is provided
    1247  * by user code along with application-specific settings. See the test
    1248  * client and server for how to do.
    1249  */
    1250 static LWS_INLINE LWS_WARN_DEPRECATED const struct lws_extension *
    1251 lws_get_internal_extensions(void) { return NULL; }
    1252 
    1263 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
    1264 lws_ext_parse_options(const struct lws_extension *ext, struct lws *wsi,
    1265  void *ext_user, const struct lws_ext_options *opts,
    1266  const char *o, int len);
    1267 #endif
    1268 
    1281 LWS_EXTERN
    1283  struct lws_context *context, const struct lws_extension *ext,
    1284  struct lws *wsi, enum lws_extension_callback_reasons reason,
    1285  void *user, void *in, size_t len);
    1286 
    1287 /*
    1288  * The internal exts are part of the public abi
    1289  * If we add more extensions, publish the callback here ------v
    1290  */
    1292 
    1308 
    1313  const char *name;
    1334  unsigned int id;
    1341  void *user;
    1344  /* Add new things just above here ---^
    1345  * This is part of the ABI, don't needlessly break compatibility */
    1346 };
    1347 
    1348 struct lws_vhost;
    1349 
    1358 LWS_VISIBLE LWS_EXTERN const struct lws_protocols *
    1359 lws_vhost_name_to_protocol(struct lws_vhost *vh, const char *name);
    1360 
    1370 LWS_VISIBLE LWS_EXTERN const struct lws_protocols *
    1371 lws_get_protocol(struct lws *wsi);
    1372 
    1374 LWS_VISIBLE LWS_EXTERN const struct lws_protocols *
    1375 lws_protocol_get(struct lws *wsi) LWS_WARN_DEPRECATED;
    1376 
    1387 LWS_VISIBLE LWS_EXTERN void *
    1388 lws_protocol_vh_priv_zalloc(struct lws_vhost *vhost, const struct lws_protocols *prot,
    1389  int size);
    1390 
    1400 LWS_VISIBLE LWS_EXTERN void *
    1401 lws_protocol_vh_priv_get(struct lws_vhost *vhost, const struct lws_protocols *prot);
    1402 
    1411 LWS_VISIBLE LWS_EXTERN int
    1412 lws_finalize_startup(struct lws_context *context);
    1413 
    1414 #ifdef LWS_WITH_PLUGINS
    1415 
    1416 /* PLUGINS implies LIBUV */
    1417 
    1418 #define LWS_PLUGIN_API_MAGIC 180
    1419 
    1422  unsigned int api_magic;
    1423  const struct lws_protocols *protocols;
    1425  const struct lws_extension *extensions;
    1427 };
    1428 
    1429 typedef int (*lws_plugin_init_func)(struct lws_context *,
    1430  struct lws_plugin_capability *);
    1431 typedef int (*lws_plugin_destroy_func)(struct lws_context *);
    1432 
    1434 struct lws_plugin {
    1435  struct lws_plugin *list;
    1436 #if (UV_VERSION_MAJOR > 0)
    1437  uv_lib_t lib;
    1438 #else
    1439  void *l;
    1440 #endif
    1441  char name[64];
    1443 };
    1444 
    1445 #endif
    1446 
    1448 
    1449 
    1458 
    1460 #define LWSGS_EMAIL_CONTENT_SIZE 16384
    1461 
    1463 /* SHA-1 binary and hexified versions */
    1465 typedef struct { unsigned char bin[20]; } lwsgw_hash_bin;
    1467 typedef struct { char id[41]; } lwsgw_hash;
    1468 
    1475 };
    1476 
    1479  char username[32];
    1480  char email[100];
    1481  char ip[72];
    1482  unsigned int mask;
    1484  char session[42];
    1485 };
    1486 
    1491 };
    1492 
    1495  enum lws_gs_event event;
    1496  const char *username;
    1497  const char *email;
    1498 };
    1499 
    1501 
    1502 
    1516 
    1518 /*
    1519  * NOTE: These public enums are part of the abi. If you want to add one,
    1520  * add it at where specified so existing users are unaffected.
    1521  */
    1522 
    1526  (1 << 12),
    1533  (1 << 12),
    1549  (1 << 12),
    1554  (1 << 12),
    1578  /****** add new things just above ---^ ******/
    1579 };
    1580 
    1581 #define lws_check_opt(c, f) (((c) & (f)) == (f))
    1582 
    1593  int port;
    1598  const char *iface;
    1605  const struct lws_protocols *protocols;
    1609  const struct lws_extension *extensions;
    1617  const char *ssl_cert_filepath;
    1627  const char *ssl_ca_filepath;
    1629  const char *ssl_cipher_list;
    1633  const char *http_proxy_address;
    1636  unsigned int http_proxy_port;
    1638  int gid;
    1640  int uid;
    1642  unsigned int options;
    1644  void *user;
    1647  int ka_time;
    1657 #ifdef LWS_OPENSSL_SUPPORT
    1663 #else /* maintain structure layout either way */
    1665 #endif
    1666 
    1677  unsigned int count_threads;
    1679  unsigned int fd_limit_per_thread;
    1683  unsigned int timeout_secs;
    1688  const char *ecdh_curve;
    1690  const char *vhost_name;
    1694  const char * const *plugin_dirs;
    1703  const char *log_filepath;
    1706  const struct lws_http_mount *mounts;
    1708  const char *server_string;
    1711  unsigned int pt_serv_buf_size;
    1726  unsigned short ws_ping_pong_interval;
    1757  /* Add new things just above here ---^
    1758  * This is part of the ABI, don't needlessly break compatibility
    1759  *
    1760  * The below is to ensure later library versions with new
    1761  * members added above will see 0 (default) even if the app
    1762  * was not built against the newer headers.
    1763  */
    1764 
    1765  void *_unused[8];
    1766 };
    1767 
    1802 LWS_VISIBLE LWS_EXTERN struct lws_context *
    1804 
    1813 LWS_VISIBLE LWS_EXTERN void
    1814 lws_context_destroy(struct lws_context *context);
    1815 
    1816 LWS_VISIBLE LWS_EXTERN void
    1817 lws_context_destroy2(struct lws_context *context);
    1818 
    1819 typedef int (*lws_reload_func)(void);
    1820 
    1845 LWS_VISIBLE LWS_EXTERN void
    1846 lws_context_deprecate(struct lws_context *context, lws_reload_func cb);
    1847 
    1848 LWS_VISIBLE LWS_EXTERN int
    1849 lws_context_is_deprecated(struct lws_context *context);
    1850 
    1868 LWS_VISIBLE LWS_EXTERN int
    1869 lws_set_proxy(struct lws_vhost *vhost, const char *proxy);
    1870 
    1871 
    1872 struct lws_vhost;
    1873 
    1883 LWS_EXTERN LWS_VISIBLE struct lws_vhost *
    1884 lws_create_vhost(struct lws_context *context,
    1885  struct lws_context_creation_info *info);
    1886 
    1901 LWS_VISIBLE LWS_EXTERN int
    1902 lwsws_get_config_globals(struct lws_context_creation_info *info, const char *d,
    1903  char **config_strings, int *len);
    1904 
    1920 LWS_VISIBLE LWS_EXTERN int
    1921 lwsws_get_config_vhosts(struct lws_context *context,
    1922  struct lws_context_creation_info *info, const char *d,
    1923  char **config_strings, int *len);
    1924 
    1926 LWS_VISIBLE LWS_EXTERN struct lws_vhost *
    1927 lws_vhost_get(struct lws *wsi) LWS_WARN_DEPRECATED;
    1928 
    1934 LWS_VISIBLE LWS_EXTERN struct lws_vhost *
    1935 lws_get_vhost(struct lws *wsi);
    1936 
    1944 LWS_VISIBLE LWS_EXTERN int
    1945 lws_json_dump_vhost(const struct lws_vhost *vh, char *buf, int len);
    1946 
    1954 LWS_VISIBLE LWS_EXTERN int
    1955 lws_json_dump_context(const struct lws_context *context, char *buf, int len,
    1956  int hide_vhosts);
    1957 
    1967 LWS_VISIBLE LWS_EXTERN void *
    1968 lws_context_user(struct lws_context *context);
    1969 
    1975 
    1985  const char *name;
    1986  const char *value;
    1987 };
    1988 
    2001 };
    2002 
    2010  const char *mountpoint;
    2012  const char *origin;
    2014  const char *def;
    2016  const char *protocol;
    2032  unsigned int auth_mask;
    2035  unsigned int cache_reusable:1;
    2036  unsigned int cache_revalidate:1;
    2037  unsigned int cache_intermediaries:1;
    2039  unsigned char origin_protocol;
    2040  unsigned char mountpoint_len;
    2045  /* Add new things just above here ---^
    2046  * This is part of the ABI, don't needlessly break compatibility
    2047  *
    2048  * The below is to ensure later library versions with new
    2049  * members added above will see 0 (default) even if the app
    2050  * was not built against the newer headers.
    2051  */
    2052 
    2053  void *_unused[2];
    2054 };
    2057 
    2063 
    2071  LCCSCF_USE_SSL = (1 << 0),
    2072  LCCSCF_ALLOW_SELFSIGNED = (1 << 1),
    2073  LCCSCF_SKIP_SERVER_CERT_HOSTNAME_CHECK = (1 << 2),
    2074  LCCSCF_ALLOW_EXPIRED = (1 << 3)
    2075 };
    2076 
    2081  struct lws_context *context;
    2083  const char *address;
    2085  int port;
    2089  const char *path;
    2091  const char *host;
    2093  const char *origin;
    2095  const char *protocol;
    2099  void *userdata;
    2103  const char *method;
    2106  struct lws *parent_wsi;
    2110  const char *uri_replace_from;
    2113  const char *uri_replace_to;
    2115  struct lws_vhost *vhost;
    2117  struct lws **pwsi;
    2129  /* Add new things just above here ---^
    2130  * This is part of the ABI, don't needlessly break compatibility
    2131  *
    2132  * The below is to ensure later library versions with new
    2133  * members added above will see 0 (default) even if the app
    2134  * was not built against the newer headers.
    2135  */
    2136 
    2137  void *_unused[4];
    2138 };
    2139 
    2147 LWS_VISIBLE LWS_EXTERN struct lws *
    2149 
    2170 /* deprecated, use lws_client_connect_via_info() */
    2171 LWS_VISIBLE LWS_EXTERN struct lws * LWS_WARN_UNUSED_RESULT
    2172 lws_client_connect(struct lws_context *clients, const char *address,
    2173  int port, int ssl_connection, const char *path,
    2174  const char *host, const char *origin, const char *protocol,
    2175  int ietf_version_or_minus_one) LWS_WARN_DEPRECATED;
    2176 /* deprecated, use lws_client_connect_via_info() */
    2197 LWS_VISIBLE LWS_EXTERN struct lws * LWS_WARN_UNUSED_RESULT
    2198 lws_client_connect_extended(struct lws_context *clients, const char *address,
    2199  int port, int ssl_connection, const char *path,
    2200  const char *host, const char *origin,
    2201  const char *protocol, int ietf_version_or_minus_one,
    2202  void *userdata) LWS_WARN_DEPRECATED;
    2203 
    2229 LWS_VISIBLE LWS_EXTERN int
    2231  struct lws_vhost *vhost);
    2232 
    2233 LWS_VISIBLE LWS_EXTERN int
    2234 lws_http_client_read(struct lws *wsi, char **buf, int *len);
    2235 
    2243 LWS_VISIBLE LWS_EXTERN unsigned int
    2244 lws_http_client_http_response(struct lws *wsi);
    2245 
    2246 LWS_VISIBLE LWS_EXTERN void
    2247 lws_client_http_body_pending(struct lws *wsi, int something_left_to_send);
    2248 
    2269 
    2278 
    2311 LWS_VISIBLE LWS_EXTERN int
    2312 lws_service(struct lws_context *context, int timeout_ms);
    2313 
    2325 LWS_VISIBLE LWS_EXTERN int
    2326 lws_service_tsi(struct lws_context *context, int timeout_ms, int tsi);
    2327 
    2343 LWS_VISIBLE LWS_EXTERN void
    2344 lws_cancel_service_pt(struct lws *wsi);
    2345 
    2357 LWS_VISIBLE LWS_EXTERN void
    2358 lws_cancel_service(struct lws_context *context);
    2359 
    2386 LWS_VISIBLE LWS_EXTERN int
    2387 lws_service_fd(struct lws_context *context, struct lws_pollfd *pollfd);
    2388 
    2398 LWS_VISIBLE LWS_EXTERN int
    2399 lws_service_fd_tsi(struct lws_context *context, struct lws_pollfd *pollfd,
    2400  int tsi);
    2401 
    2419 LWS_VISIBLE LWS_EXTERN int
    2420 lws_service_adjust_timeout(struct lws_context *context, int timeout_ms, int tsi);
    2421 
    2422 /* Backwards compatibility */
    2423 #define lws_plat_service_tsi lws_service_tsi
    2424 
    2426 
    2432 
    2439 
    2451 LWS_VISIBLE LWS_EXTERN const char *
    2452 lws_get_mimetype(const char *file, const struct lws_http_mount *m);
    2453 
    2472 LWS_VISIBLE LWS_EXTERN int
    2473 lws_serve_http_file(struct lws *wsi, const char *file, const char *content_type,
    2474  const char *other_headers, int other_headers_len);
    2475 LWS_VISIBLE LWS_EXTERN int
    2476 lws_serve_http_file_fragment(struct lws *wsi);
    2478 
    2489 
    2490 enum http_status {
    2491  HTTP_STATUS_OK = 200,
    2492  HTTP_STATUS_NO_CONTENT = 204,
    2493  HTTP_STATUS_PARTIAL_CONTENT = 206,
    2494 
    2495  HTTP_STATUS_MOVED_PERMANENTLY = 301,
    2496  HTTP_STATUS_FOUND = 302,
    2497  HTTP_STATUS_SEE_OTHER = 303,
    2498 
    2499  HTTP_STATUS_BAD_REQUEST = 400,
    2500  HTTP_STATUS_UNAUTHORIZED,
    2501  HTTP_STATUS_PAYMENT_REQUIRED,
    2502  HTTP_STATUS_FORBIDDEN,
    2503  HTTP_STATUS_NOT_FOUND,
    2504  HTTP_STATUS_METHOD_NOT_ALLOWED,
    2505  HTTP_STATUS_NOT_ACCEPTABLE,
    2506  HTTP_STATUS_PROXY_AUTH_REQUIRED,
    2507  HTTP_STATUS_REQUEST_TIMEOUT,
    2508  HTTP_STATUS_CONFLICT,
    2509  HTTP_STATUS_GONE,
    2510  HTTP_STATUS_LENGTH_REQUIRED,
    2511  HTTP_STATUS_PRECONDITION_FAILED,
    2512  HTTP_STATUS_REQ_ENTITY_TOO_LARGE,
    2513  HTTP_STATUS_REQ_URI_TOO_LONG,
    2514  HTTP_STATUS_UNSUPPORTED_MEDIA_TYPE,
    2515  HTTP_STATUS_REQ_RANGE_NOT_SATISFIABLE,
    2516  HTTP_STATUS_EXPECTATION_FAILED,
    2517 
    2518  HTTP_STATUS_INTERNAL_SERVER_ERROR = 500,
    2519  HTTP_STATUS_NOT_IMPLEMENTED,
    2520  HTTP_STATUS_BAD_GATEWAY,
    2521  HTTP_STATUS_SERVICE_UNAVAILABLE,
    2522  HTTP_STATUS_GATEWAY_TIMEOUT,
    2523  HTTP_STATUS_HTTP_VERSION_NOT_SUPPORTED,
    2524 };
    2525 
    2527  char *p;
    2528  int len;
    2529  int max_len;
    2530  int final;
    2531 };
    2532 
    2533 typedef const char *(*lws_process_html_state_cb)(void *data, int index);
    2534 
    2536  char *start;
    2537  char swallow[16];
    2538  int pos;
    2539  void *data;
    2540  const char * const *vars;
    2543  lws_process_html_state_cb replace;
    2544 };
    2545 
    2550 LWS_VISIBLE LWS_EXTERN int
    2552  struct lws_process_html_state *s);
    2554 
    2587 
    2595 struct lws_tokens {
    2596  char *token;
    2598 };
    2599 
    2600 /* enum lws_token_indexes
    2601  * these have to be kept in sync with lextable.h / minilex.c
    2602  *
    2603  * NOTE: These public enums are part of the abi. If you want to add one,
    2604  * add it at where specified so existing users are unaffected.
    2605  */
    2606 enum lws_token_indexes {
    2607  WSI_TOKEN_GET_URI = 0,
    2608  WSI_TOKEN_POST_URI = 1,
    2609  WSI_TOKEN_OPTIONS_URI = 2,
    2610  WSI_TOKEN_HOST = 3,
    2611  WSI_TOKEN_CONNECTION = 4,
    2612  WSI_TOKEN_UPGRADE = 5,
    2613  WSI_TOKEN_ORIGIN = 6,
    2614  WSI_TOKEN_DRAFT = 7,
    2615  WSI_TOKEN_CHALLENGE = 8,
    2616  WSI_TOKEN_EXTENSIONS = 9,
    2617  WSI_TOKEN_KEY1 = 10,
    2618  WSI_TOKEN_KEY2 = 11,
    2619  WSI_TOKEN_PROTOCOL = 12,
    2620  WSI_TOKEN_ACCEPT = 13,
    2621  WSI_TOKEN_NONCE = 14,
    2622  WSI_TOKEN_HTTP = 15,
    2623  WSI_TOKEN_HTTP2_SETTINGS = 16,
    2624  WSI_TOKEN_HTTP_ACCEPT = 17,
    2625  WSI_TOKEN_HTTP_AC_REQUEST_HEADERS = 18,
    2626  WSI_TOKEN_HTTP_IF_MODIFIED_SINCE = 19,
    2627  WSI_TOKEN_HTTP_IF_NONE_MATCH = 20,
    2628  WSI_TOKEN_HTTP_ACCEPT_ENCODING = 21,
    2629  WSI_TOKEN_HTTP_ACCEPT_LANGUAGE = 22,
    2630  WSI_TOKEN_HTTP_PRAGMA = 23,
    2631  WSI_TOKEN_HTTP_CACHE_CONTROL = 24,
    2632  WSI_TOKEN_HTTP_AUTHORIZATION = 25,
    2633  WSI_TOKEN_HTTP_COOKIE = 26,
    2634  WSI_TOKEN_HTTP_CONTENT_LENGTH = 27,
    2635  WSI_TOKEN_HTTP_CONTENT_TYPE = 28,
    2636  WSI_TOKEN_HTTP_DATE = 29,
    2637  WSI_TOKEN_HTTP_RANGE = 30,
    2638  WSI_TOKEN_HTTP_REFERER = 31,
    2639  WSI_TOKEN_KEY = 32,
    2640  WSI_TOKEN_VERSION = 33,
    2641  WSI_TOKEN_SWORIGIN = 34,
    2642 
    2643  WSI_TOKEN_HTTP_COLON_AUTHORITY = 35,
    2644  WSI_TOKEN_HTTP_COLON_METHOD = 36,
    2645  WSI_TOKEN_HTTP_COLON_PATH = 37,
    2646  WSI_TOKEN_HTTP_COLON_SCHEME = 38,
    2647  WSI_TOKEN_HTTP_COLON_STATUS = 39,
    2648 
    2649  WSI_TOKEN_HTTP_ACCEPT_CHARSET = 40,
    2650  WSI_TOKEN_HTTP_ACCEPT_RANGES = 41,
    2651  WSI_TOKEN_HTTP_ACCESS_CONTROL_ALLOW_ORIGIN = 42,
    2652  WSI_TOKEN_HTTP_AGE = 43,
    2653  WSI_TOKEN_HTTP_ALLOW = 44,
    2654  WSI_TOKEN_HTTP_CONTENT_DISPOSITION = 45,
    2655  WSI_TOKEN_HTTP_CONTENT_ENCODING = 46,
    2656  WSI_TOKEN_HTTP_CONTENT_LANGUAGE = 47,
    2657  WSI_TOKEN_HTTP_CONTENT_LOCATION = 48,
    2658  WSI_TOKEN_HTTP_CONTENT_RANGE = 49,
    2659  WSI_TOKEN_HTTP_ETAG = 50,
    2660  WSI_TOKEN_HTTP_EXPECT = 51,
    2661  WSI_TOKEN_HTTP_EXPIRES = 52,
    2662  WSI_TOKEN_HTTP_FROM = 53,
    2663  WSI_TOKEN_HTTP_IF_MATCH = 54,
    2664  WSI_TOKEN_HTTP_IF_RANGE = 55,
    2665  WSI_TOKEN_HTTP_IF_UNMODIFIED_SINCE = 56,
    2666  WSI_TOKEN_HTTP_LAST_MODIFIED = 57,
    2667  WSI_TOKEN_HTTP_LINK = 58,
    2668  WSI_TOKEN_HTTP_LOCATION = 59,
    2669  WSI_TOKEN_HTTP_MAX_FORWARDS = 60,
    2670  WSI_TOKEN_HTTP_PROXY_AUTHENTICATE = 61,
    2671  WSI_TOKEN_HTTP_PROXY_AUTHORIZATION = 62,
    2672  WSI_TOKEN_HTTP_REFRESH = 63,
    2673  WSI_TOKEN_HTTP_RETRY_AFTER = 64,
    2674  WSI_TOKEN_HTTP_SERVER = 65,
    2675  WSI_TOKEN_HTTP_SET_COOKIE = 66,
    2676  WSI_TOKEN_HTTP_STRICT_TRANSPORT_SECURITY = 67,
    2677  WSI_TOKEN_HTTP_TRANSFER_ENCODING = 68,
    2678  WSI_TOKEN_HTTP_USER_AGENT = 69,
    2679  WSI_TOKEN_HTTP_VARY = 70,
    2680  WSI_TOKEN_HTTP_VIA = 71,
    2681  WSI_TOKEN_HTTP_WWW_AUTHENTICATE = 72,
    2682 
    2683  WSI_TOKEN_PATCH_URI = 73,
    2684  WSI_TOKEN_PUT_URI = 74,
    2685  WSI_TOKEN_DELETE_URI = 75,
    2686 
    2687  WSI_TOKEN_HTTP_URI_ARGS = 76,
    2688  WSI_TOKEN_PROXY = 77,
    2689  WSI_TOKEN_HTTP_X_REAL_IP = 78,
    2690  WSI_TOKEN_HTTP1_0 = 79,
    2691  WSI_TOKEN_X_FORWARDED_FOR = 80,
    2692 
    2693  /****** add new things just above ---^ ******/
    2694 
    2695  /* use token storage to stash these internally, not for
    2696  * user use */
    2697 
    2698  _WSI_TOKEN_CLIENT_SENT_PROTOCOLS,
    2699  _WSI_TOKEN_CLIENT_PEER_ADDRESS,
    2700  _WSI_TOKEN_CLIENT_URI,
    2701  _WSI_TOKEN_CLIENT_HOST,
    2702  _WSI_TOKEN_CLIENT_ORIGIN,
    2703  _WSI_TOKEN_CLIENT_METHOD,
    2704 
    2705  /* always last real token index*/
    2706  WSI_TOKEN_COUNT,
    2707 
    2708  /* parser state additions, no storage associated */
    2709  WSI_TOKEN_NAME_PART,
    2710  WSI_TOKEN_SKIPPING,
    2711  WSI_TOKEN_SKIPPING_SAW_CR,
    2712  WSI_PARSING_COMPLETE,
    2713  WSI_INIT_TOKEN_MUXURL,
    2714 };
    2715 
    2717  unsigned short token_limit[WSI_TOKEN_COUNT];
    2718 };
    2719 
    2725 LWS_VISIBLE LWS_EXTERN const unsigned char *
    2726 lws_token_to_string(enum lws_token_indexes token);
    2727 
    2728 
    2737 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
    2738 lws_hdr_total_length(struct lws *wsi, enum lws_token_indexes h);
    2739 
    2749 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
    2750 lws_hdr_fragment_length(struct lws *wsi, enum lws_token_indexes h, int frag_idx);
    2751 
    2765 LWS_VISIBLE LWS_EXTERN int
    2766 lws_hdr_copy(struct lws *wsi, char *dest, int len, enum lws_token_indexes h);
    2767 
    2785 LWS_VISIBLE LWS_EXTERN int
    2786 lws_hdr_copy_fragment(struct lws *wsi, char *dest, int len,
    2787  enum lws_token_indexes h, int frag_idx);
    2788 
    2799 LWS_VISIBLE LWS_EXTERN const char *
    2800 lws_get_urlarg_by_name(struct lws *wsi, const char *name, char *buf, int len);
    2802 
    2817 
    2828 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
    2829 lws_add_http_header_status(struct lws *wsi,
    2830  unsigned int code, unsigned char **p,
    2831  unsigned char *end);
    2844 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
    2845 lws_add_http_header_by_name(struct lws *wsi, const unsigned char *name,
    2846  const unsigned char *value, int length,
    2847  unsigned char **p, unsigned char *end);
    2861 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
    2862 lws_add_http_header_by_token(struct lws *wsi, enum lws_token_indexes token,
    2863  const unsigned char *value, int length,
    2864  unsigned char **p, unsigned char *end);
    2875 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
    2876 lws_add_http_header_content_length(struct lws *wsi,
    2877  unsigned long content_length,
    2878  unsigned char **p, unsigned char *end);
    2888 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
    2889 lws_finalize_http_header(struct lws *wsi, unsigned char **p,
    2890  unsigned char *end);
    2892 
    2911 
    2921 };
    2922 
    2936 typedef int (*lws_spa_fileupload_cb)(void *data, const char *name,
    2937  const char *filename, char *buf, int len,
    2938  enum lws_spa_fileupload_states state);
    2939 
    2942 struct lws_spa;
    2943 
    2962 LWS_VISIBLE LWS_EXTERN struct lws_spa *
    2963 lws_spa_create(struct lws *wsi, const char * const *param_names,
    2964  int count_params, int max_storage, lws_spa_fileupload_cb opt_cb,
    2965  void *opt_data);
    2966 
    2974 LWS_VISIBLE LWS_EXTERN int
    2975 lws_spa_process(struct lws_spa *spa, const char *in, int len);
    2976 
    2982 LWS_VISIBLE LWS_EXTERN int
    2983 lws_spa_finalize(struct lws_spa *spa);
    2984 
    2991 LWS_VISIBLE LWS_EXTERN int
    2992 lws_spa_get_length(struct lws_spa *spa, int n);
    2993 
    2999 LWS_VISIBLE LWS_EXTERN const char *
    3000 lws_spa_get_string(struct lws_spa *spa, int n);
    3001 
    3007 LWS_VISIBLE LWS_EXTERN int
    3008 lws_spa_destroy(struct lws_spa *spa);
    3010 
    3021 
    3032 LWS_VISIBLE LWS_EXTERN const char *
    3033 lws_urlencode(char *escaped, const char *string, int len);
    3034 
    3035 /*
    3036  * URLDECODE 1 / 2
    3037  *
    3038  * This simple urldecode only operates until the first '\0' and requires the
    3039  * data to exist all at once
    3040  */
    3053 LWS_VISIBLE LWS_EXTERN int
    3054 lws_urldecode(char *string, const char *escaped, int len);
    3056 
    3065 LWS_VISIBLE LWS_EXTERN int
    3066 lws_return_http_status(struct lws *wsi, unsigned int code,
    3067  const char *html_body);
    3068 
    3079 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
    3080 lws_http_redirect(struct lws *wsi, int code, const unsigned char *loc, int len,
    3081  unsigned char **p, unsigned char *end);
    3082 
    3091 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
    3092 lws_http_transaction_completed(struct lws *wsi);
    3094 
    3102 
    3113 LWS_VISIBLE LWS_EXTERN const char *
    3114 lws_sql_purify(char *escaped, const char *string, int len);
    3115 
    3126 LWS_VISIBLE LWS_EXTERN const char *
    3127 lws_json_purify(char *escaped, const char *string, int len);
    3129 
    3136 
    3138 #ifdef LWS_USE_LIBEV
    3139 typedef void (lws_ev_signal_cb_t)(EV_P_ struct ev_signal *w, int revents);
    3140 
    3141 LWS_VISIBLE LWS_EXTERN int
    3142 lws_ev_sigint_cfg(struct lws_context *context, int use_ev_sigint,
    3143  lws_ev_signal_cb_t *cb);
    3144 
    3145 LWS_VISIBLE LWS_EXTERN int
    3146 lws_ev_initloop(struct lws_context *context, struct ev_loop *loop, int tsi);
    3147 
    3148 LWS_VISIBLE LWS_EXTERN void
    3149 lws_ev_sigint_cb(struct ev_loop *loop, struct ev_signal *watcher, int revents);
    3150 #endif /* LWS_USE_LIBEV */
    3151 
    3153 
    3160 #ifdef LWS_USE_LIBUV
    3162 LWS_VISIBLE LWS_EXTERN int
    3163 lws_uv_sigint_cfg(struct lws_context *context, int use_uv_sigint,
    3164  uv_signal_cb cb);
    3165 
    3166 LWS_VISIBLE LWS_EXTERN void
    3167 lws_libuv_run(const struct lws_context *context, int tsi);
    3168 
    3169 LWS_VISIBLE LWS_EXTERN void
    3170 lws_libuv_stop(struct lws_context *context);
    3171 
    3172 LWS_VISIBLE LWS_EXTERN void
    3173 lws_libuv_stop_without_kill(const struct lws_context *context, int tsi);
    3174 
    3175 LWS_VISIBLE LWS_EXTERN int
    3176 lws_uv_initloop(struct lws_context *context, uv_loop_t *loop, int tsi);
    3177 
    3178 LWS_VISIBLE LWS_EXTERN uv_loop_t *
    3179 lws_uv_getloop(struct lws_context *context, int tsi);
    3180 
    3181 LWS_VISIBLE LWS_EXTERN void
    3182 lws_uv_sigint_cb(uv_signal_t *watcher, int signum);
    3183 #endif /* LWS_USE_LIBUV */
    3184 
    3191 
    3192 /*
    3193  * NOTE: These public enums are part of the abi. If you want to add one,
    3194  * add it at where specified so existing users are unaffected.
    3195  */
    3196 enum pending_timeout {
    3197  NO_PENDING_TIMEOUT = 0,
    3198  PENDING_TIMEOUT_AWAITING_PROXY_RESPONSE = 1,
    3199  PENDING_TIMEOUT_AWAITING_CONNECT_RESPONSE = 2,
    3200  PENDING_TIMEOUT_ESTABLISH_WITH_SERVER = 3,
    3201  PENDING_TIMEOUT_AWAITING_SERVER_RESPONSE = 4,
    3202  PENDING_TIMEOUT_AWAITING_PING = 5,
    3203  PENDING_TIMEOUT_CLOSE_ACK = 6,
    3204  PENDING_TIMEOUT_AWAITING_EXTENSION_CONNECT_RESPONSE = 7,
    3205  PENDING_TIMEOUT_SENT_CLIENT_HANDSHAKE = 8,
    3206  PENDING_TIMEOUT_SSL_ACCEPT = 9,
    3207  PENDING_TIMEOUT_HTTP_CONTENT = 10,
    3208  PENDING_TIMEOUT_AWAITING_CLIENT_HS_SEND = 11,
    3209  PENDING_FLUSH_STORED_SEND_BEFORE_CLOSE = 12,
    3210  PENDING_TIMEOUT_SHUTDOWN_FLUSH = 13,
    3211  PENDING_TIMEOUT_CGI = 14,
    3212  PENDING_TIMEOUT_HTTP_KEEPALIVE_IDLE = 15,
    3213  PENDING_TIMEOUT_WS_PONG_CHECK_SEND_PING = 16,
    3214  PENDING_TIMEOUT_WS_PONG_CHECK_GET_PONG = 17,
    3215  PENDING_TIMEOUT_CLIENT_ISSUE_PAYLOAD = 18,
    3216 
    3217  /****** add new things just above ---^ ******/
    3218 };
    3219 
    3229 LWS_VISIBLE LWS_EXTERN void
    3230 lws_set_timeout(struct lws *wsi, enum pending_timeout reason, int secs);
    3232 
    3238 #if !defined(LWS_SIZEOFPTR)
    3239 #define LWS_SIZEOFPTR (sizeof (void *))
    3240 #endif
    3241 #if !defined(u_int64_t)
    3242 #define u_int64_t unsigned long long
    3243 #endif
    3244 
    3245 #if defined(__x86_64__)
    3246 #define _LWS_PAD_SIZE 16 /* Intel recommended for best performance */
    3247 #else
    3248 #define _LWS_PAD_SIZE LWS_SIZEOFPTR /* Size of a pointer on the target arch */
    3249 #endif
    3250 #define _LWS_PAD(n) (((n) % _LWS_PAD_SIZE) ? \
    3251  ((n) + (_LWS_PAD_SIZE - ((n) % _LWS_PAD_SIZE))) : (n))
    3252 #define LWS_PRE _LWS_PAD(4 + 10)
    3253 /* used prior to 1.7 and retained for backward compatibility */
    3254 #define LWS_SEND_BUFFER_PRE_PADDING LWS_PRE
    3255 #define LWS_SEND_BUFFER_POST_PADDING 0
    3256 
    3257 /*
    3258  * NOTE: These public enums are part of the abi. If you want to add one,
    3259  * add it at where specified so existing users are unaffected.
    3260  */
    3275  /* LWS_WRITE_CLOSE is handled by lws_close_reason() */
    3276  LWS_WRITE_PING = 5,
    3277  LWS_WRITE_PONG = 6,
    3278 
    3279  /* Same as write_http but we know this write ends the transaction */
    3280  LWS_WRITE_HTTP_FINAL = 7,
    3281 
    3282  /* HTTP2 */
    3283 
    3291  /****** add new things just above ---^ ******/
    3292 
    3293  /* flags */
    3294 
    3302 };
    3303 
    3304 
    3391 LWS_VISIBLE LWS_EXTERN int
    3392 lws_write(struct lws *wsi, unsigned char *buf, size_t len,
    3393  enum lws_write_protocol protocol);
    3394 
    3395 /* helper for case where buffer may be const */
    3396 #define lws_write_http(wsi, buf, len) \
    3397  lws_write(wsi, (unsigned char *)(buf), len, LWS_WRITE_HTTP)
    3398 
    3418 
    3431 LWS_VISIBLE LWS_EXTERN int
    3432 lws_callback_on_writable(struct lws *wsi);
    3433 
    3447 LWS_VISIBLE LWS_EXTERN int
    3448 lws_callback_on_writable_all_protocol(const struct lws_context *context,
    3449  const struct lws_protocols *protocol);
    3450 
    3464 LWS_VISIBLE LWS_EXTERN int
    3465 lws_callback_on_writable_all_protocol_vhost(const struct lws_vhost *vhost,
    3466  const struct lws_protocols *protocol);
    3467 
    3480 LWS_VISIBLE LWS_EXTERN int
    3481 lws_callback_all_protocol(struct lws_context *context,
    3482  const struct lws_protocols *protocol, int reason);
    3483 
    3496 LWS_VISIBLE LWS_EXTERN int
    3497 lws_callback_all_protocol_vhost(struct lws_vhost *vh,
    3498  const struct lws_protocols *protocol, int reason);
    3499 
    3513 LWS_VISIBLE LWS_EXTERN int
    3514 lws_callback_vhost_protocols(struct lws *wsi, int reason, void *in, int len);
    3515 
    3516 LWS_VISIBLE LWS_EXTERN int
    3517 lws_callback_http_dummy(struct lws *wsi, enum lws_callback_reasons reason,
    3518  void *user, void *in, size_t len);
    3519 
    3527 LWS_VISIBLE LWS_EXTERN int
    3528 lws_get_socket_fd(struct lws *wsi);
    3529 
    3551 LWS_VISIBLE LWS_EXTERN size_t
    3552 lws_get_peer_write_allowance(struct lws *wsi);
    3554 
    3565 LWS_VISIBLE LWS_EXTERN int
    3566 lws_rx_flow_control(struct lws *wsi, int enable);
    3567 
    3577 LWS_VISIBLE LWS_EXTERN void
    3578 lws_rx_flow_allow_all_protocol(const struct lws_context *context,
    3579  const struct lws_protocols *protocol);
    3580 
    3597 LWS_VISIBLE LWS_EXTERN size_t
    3598 lws_remaining_packet_payload(struct lws *wsi);
    3599 
    3600 
    3609 
    3623 LWS_VISIBLE LWS_EXTERN struct lws *
    3624 lws_adopt_socket(struct lws_context *context, lws_sockfd_type accept_fd);
    3637 LWS_VISIBLE LWS_EXTERN struct lws *
    3638 lws_adopt_socket_vhost(struct lws_vhost *vh, lws_sockfd_type accept_fd);
    3662 LWS_VISIBLE LWS_EXTERN struct lws *
    3663 lws_adopt_socket_readbuf(struct lws_context *context, lws_sockfd_type accept_fd,
    3664  const char *readbuf, size_t len);
    3688 LWS_VISIBLE LWS_EXTERN struct lws *
    3689 lws_adopt_socket_vhost_readbuf(struct lws_vhost *vhost, lws_sockfd_type accept_fd,
    3690  const char *readbuf, size_t len);
    3692 
    3698 
    3709 LWS_VISIBLE LWS_EXTERN const char * LWS_WARN_UNUSED_RESULT
    3710 lws_canonical_hostname(struct lws_context *context);
    3711 
    3726 LWS_VISIBLE LWS_EXTERN void
    3727 lws_get_peer_addresses(struct lws *wsi, lws_sockfd_type fd, char *name,
    3728  int name_len, char *rip, int rip_len);
    3729 
    3740 LWS_VISIBLE LWS_EXTERN const char *
    3741 lws_get_peer_simple(struct lws *wsi, char *name, int namelen);
    3742 #ifndef LWS_WITH_ESP8266
    3743 
    3754 LWS_VISIBLE LWS_EXTERN int
    3755 lws_interface_to_sa(int ipv6, const char *ifname, struct sockaddr_in *addr,
    3756  size_t addrlen);
    3758 #endif
    3759 
    3765 
    3778 LWS_VISIBLE LWS_EXTERN int
    3779 lws_snprintf(char *str, size_t size, const char *format, ...);
    3780 
    3792 LWS_VISIBLE LWS_EXTERN int
    3793 lws_get_random(struct lws_context *context, void *buf, int len);
    3801 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
    3802 lws_daemonize(const char *_lock_path);
    3808 LWS_VISIBLE LWS_EXTERN const char * LWS_WARN_UNUSED_RESULT
    3810 
    3817 LWS_VISIBLE LWS_EXTERN void *
    3818 lws_wsi_user(struct lws *wsi);
    3819 
    3831 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
    3832 lws_parse_uri(char *p, const char **prot, const char **ads, int *port,
    3833  const char **path);
    3834 
    3838 LWS_VISIBLE LWS_EXTERN unsigned long
    3839 lws_now_secs(void);
    3840 
    3850 LWS_VISIBLE LWS_EXTERN struct lws_context * LWS_WARN_UNUSED_RESULT
    3851 lws_get_context(const struct lws *wsi);
    3852 
    3862 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
    3863 lws_get_count_threads(struct lws_context *context);
    3864 
    3872 LWS_VISIBLE LWS_EXTERN struct lws * LWS_WARN_UNUSED_RESULT
    3873 lws_get_parent(const struct lws *wsi);
    3874 
    3881 LWS_VISIBLE LWS_EXTERN struct lws * LWS_WARN_UNUSED_RESULT
    3882 lws_get_child(const struct lws *wsi);
    3883 
    3884 
    3885 /*
    3886  * \deprecated DEPRECATED Note: this is not normally needed as a user api.
    3887  * It's provided in case it is
    3888  * useful when integrating with other app poll loop service code.
    3889  */
    3890 LWS_VISIBLE LWS_EXTERN int
    3891 lws_read(struct lws *wsi, unsigned char *buf, size_t len);
    3892 
    3900 LWS_VISIBLE LWS_EXTERN void
    3901 lws_set_allocator(void *(*realloc)(void *ptr, size_t size));
    3903 
    3909 
    3916 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
    3917 lws_send_pipe_choked(struct lws *wsi);
    3918 
    3923 LWS_VISIBLE LWS_EXTERN int
    3924 lws_is_final_fragment(struct lws *wsi);
    3925 
    3930 LWS_VISIBLE LWS_EXTERN unsigned char
    3931 lws_get_reserved_bits(struct lws *wsi);
    3932 
    3949 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
    3950 lws_partial_buffered(struct lws *wsi);
    3951 
    3961 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
    3962 lws_frame_is_binary(struct lws *wsi);
    3963 
    3972 LWS_VISIBLE LWS_EXTERN int
    3973 lws_is_ssl(struct lws *wsi);
    3978 LWS_VISIBLE LWS_EXTERN int
    3979 lws_is_cgi(struct lws *wsi);
    3981 
    3982 
    3988 #ifdef LWS_SHA1_USE_OPENSSL_NAME
    3990 #define lws_SHA1 SHA1
    3991 #else
    3992 
    4001 LWS_VISIBLE LWS_EXTERN unsigned char *
    4002 lws_SHA1(const unsigned char *d, size_t n, unsigned char *md);
    4003 #endif
    4004 
    4014 LWS_VISIBLE LWS_EXTERN int
    4015 lws_b64_encode_string(const char *in, int in_len, char *out, int out_size);
    4025 LWS_VISIBLE LWS_EXTERN int
    4026 lws_b64_decode_string(const char *in, char *out, int out_size);
    4028 
    4029 
    4039 #ifdef LWS_WITH_CGI
    4040 enum lws_enum_stdinouterr {
    4041  LWS_STDIN = 0,
    4042  LWS_STDOUT = 1,
    4043  LWS_STDERR = 2,
    4044 };
    4045 
    4046 enum lws_cgi_hdr_state {
    4047  LCHS_HEADER,
    4048  LCHS_CR1,
    4049  LCHS_LF1,
    4050  LCHS_CR2,
    4051  LCHS_LF2,
    4052  LHCS_PAYLOAD,
    4053  LCHS_SINGLE_0A,
    4054 };
    4055 
    4057  struct lws **stdwsi;
    4058  enum lws_enum_stdinouterr ch;
    4059  unsigned char *data;
    4060  enum lws_cgi_hdr_state hdr_state;
    4061  int len;
    4062 };
    4063 
    4064 
    4074 LWS_VISIBLE LWS_EXTERN int
    4075 lws_cgi(struct lws *wsi, const char * const *exec_array,
    4076  int script_uri_path_len, int timeout_secs,
    4077  const struct lws_protocol_vhost_options *mp_cgienv);
    4078 
    4084 LWS_VISIBLE LWS_EXTERN int
    4085 lws_cgi_write_split_stdout_headers(struct lws *wsi);
    4086 
    4092 LWS_VISIBLE LWS_EXTERN int
    4093 lws_cgi_kill(struct lws *wsi);
    4094 #endif
    4095 
    4097 
    4114 
    4121  lws_filefd_type (*open)(struct lws *wsi, const char *filename,
    4122  unsigned long *filelen, int flags);
    4126  int (*close)(struct lws *wsi, lws_filefd_type fd);
    4128  unsigned long (*seek_cur)(struct lws *wsi, lws_filefd_type fd,
    4129  long offset_from_cur_pos);
    4131  int (*read)(struct lws *wsi, lws_filefd_type fd, unsigned long *amount,
    4132  unsigned char *buf, unsigned long len);
    4134  int (*write)(struct lws *wsi, lws_filefd_type fd, unsigned long *amount,
    4135  unsigned char *buf, unsigned long len);
    4138  /* Add new things just above here ---^
    4139  * This is part of the ABI, don't needlessly break compatibility */
    4140 };
    4141 
    4147 LWS_VISIBLE LWS_EXTERN struct lws_plat_file_ops * LWS_WARN_UNUSED_RESULT
    4148 lws_get_fops(struct lws_context *context);
    4149 
    4158 static LWS_INLINE lws_filefd_type LWS_WARN_UNUSED_RESULT
    4159 lws_plat_file_open(struct lws *wsi, const char *filename,
    4160  unsigned long *filelen, int flags)
    4161 {
    4162  return lws_get_fops(lws_get_context(wsi))->open(wsi, filename,
    4163  filelen, flags);
    4164 }
    4165 
    4172 static LWS_INLINE int
    4173 lws_plat_file_close(struct lws *wsi, lws_filefd_type fd)
    4174 {
    4175  return lws_get_fops(lws_get_context(wsi))->close(wsi, fd);
    4176 }
    4177 
    4185 static LWS_INLINE unsigned long
    4186 lws_plat_file_seek_cur(struct lws *wsi, lws_filefd_type fd, long offset)
    4187 {
    4188  return lws_get_fops(lws_get_context(wsi))->seek_cur(wsi, fd, offset);
    4189 }
    4199 static LWS_INLINE int LWS_WARN_UNUSED_RESULT
    4200 lws_plat_file_read(struct lws *wsi, lws_filefd_type fd, unsigned long *amount,
    4201  unsigned char *buf, unsigned long len)
    4202 {
    4203  return lws_get_fops(lws_get_context(wsi))->read(wsi, fd, amount, buf,
    4204  len);
    4205 }
    4215 static LWS_INLINE int LWS_WARN_UNUSED_RESULT
    4216 lws_plat_file_write(struct lws *wsi, lws_filefd_type fd, unsigned long *amount,
    4217  unsigned char *buf, unsigned long len)
    4218 {
    4219  return lws_get_fops(lws_get_context(wsi))->write(wsi, fd, amount, buf,
    4220  len);
    4221 }
    4223 
    4255 #ifdef LWS_WITH_SMTP
    4256 
    4268 };
    4269 
    4271 struct lws_email {
    4272  void *data;
    4274  uv_loop_t *loop;
    4277  char email_smtp_ip[32];
    4278  char email_helo[32];
    4279  char email_from[100];
    4280  char email_to[100];
    4282  unsigned int max_content_size;
    4285  /* Fill all the callbacks before init */
    4286 
    4287  int (*on_next)(struct lws_email *email);
    4292  int (*on_sent)(struct lws_email *email);
    4297  int (*on_get_body)(struct lws_email *email, char *buf, int len);
    4303  /* private things */
    4304  uv_timer_t timeout_email;
    4306  uv_connect_t email_connect_req;
    4307  uv_tcp_t email_client;
    4309  char email_buf[256];
    4310  char *content;
    4311 };
    4312 
    4322 LWS_VISIBLE LWS_EXTERN int
    4323 lws_email_init(struct lws_email *email, uv_loop_t *loop, int max_content);
    4324 
    4333 LWS_VISIBLE LWS_EXTERN void
    4334 lws_email_check(struct lws_email *email);
    4342 LWS_VISIBLE LWS_EXTERN void
    4343 lws_email_destroy(struct lws_email *email);
    4344 
    4345 #endif
    4346 
    4347 
    4348 #ifdef __cplusplus
    4349 }
    4350 #endif
    4351 
    4352 #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:4026
    -
    size_t rx_buffer_size
    Definition: libwebsockets.h:1295
    +
    Definition: libwebsockets.h:4056
    +
    size_t rx_buffer_size
    Definition: libwebsockets.h:1325
    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
    Definition: libwebsockets.h:771
    Definition: libwebsockets.h:899
    LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT lws_daemonize(const char *_lock_path)
    -
    Definition: libwebsockets.h:1967
    -
    Definition: libwebsockets.h:3242
    -
    Definition: libwebsockets.h:4231
    +
    Definition: libwebsockets.h:1997
    +
    Definition: libwebsockets.h:3272
    +
    Definition: libwebsockets.h:4261
    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:236
    -
    unsigned int auth_mask
    Definition: libwebsockets.h:2002
    -
    Definition: libwebsockets.h:3265
    -
    void * data
    Definition: libwebsockets.h:4242
    -
    const char * uri_replace_from
    Definition: libwebsockets.h:2080
    -
    int(* write)(struct lws *wsi, lws_filefd_type fd, unsigned long *amount, unsigned char *buf, unsigned long len)
    Definition: libwebsockets.h:4104
    +
    unsigned int auth_mask
    Definition: libwebsockets.h:2032
    +
    Definition: libwebsockets.h:3295
    +
    void * data
    Definition: libwebsockets.h:4272
    +
    const char * uri_replace_from
    Definition: libwebsockets.h:2110
    +
    int(* write)(struct lws *wsi, lws_filefd_type fd, unsigned long *amount, unsigned char *buf, unsigned long len)
    Definition: libwebsockets.h:4134
    lws_callback_reasons
    Definition: libwebsockets.h:664
    LWS_VISIBLE LWS_EXTERN int lws_hdr_copy_fragment(struct lws *wsi, char *dest, int len, enum lws_token_indexes h, int frag_idx)
    -
    lwsgs_auth_bits
    Definition: libwebsockets.h:1440
    +
    lwsgs_auth_bits
    Definition: libwebsockets.h:1470
    LWS_VISIBLE LWS_EXTERN void lws_close_reason(struct lws *wsi, enum lws_close_status status, unsigned char *buf, size_t len)
    LWS_VISIBLE LWS_EXTERN void lws_email_destroy(struct lws_email *email)
    LWS_VISIBLE LWS_EXTERN int lws_urldecode(char *string, const char *escaped, int len)
    Definition: libwebsockets.h:897
    -
    Definition: libwebsockets.h:1099
    -
    unsigned int id
    Definition: libwebsockets.h:1304
    +
    Definition: libwebsockets.h:1129
    +
    unsigned int id
    Definition: libwebsockets.h:1334
    LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT lws_hdr_total_length(struct lws *wsi, enum lws_token_indexes h)
    -
    Definition: libwebsockets.h:1097
    +
    Definition: libwebsockets.h:1127
    Definition: libwebsockets.h:802
    LWS_VISIBLE LWS_EXTERN int lws_service_fd_tsi(struct lws_context *context, struct lws_pollfd *pollfd, int tsi)
    LWS_VISIBLE LWS_EXTERN int lws_service_adjust_timeout(struct lws_context *context, int timeout_ms, int tsi)
    @@ -104,195 +104,195 @@ $(document).ready(function(){initNavTree('libwebsockets_8h_source.html','');});
    LWS_VISIBLE LWS_EXTERN struct lws * lws_adopt_socket_vhost(struct lws_vhost *vh, lws_sockfd_type accept_fd)
    Definition: libwebsockets.h:748
    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:4262
    -
    Definition: libwebsockets.h:1435
    -
    struct lws ** pwsi
    Definition: libwebsockets.h:2087
    +
    int(* on_sent)(struct lws_email *email)
    Definition: libwebsockets.h:4292
    +
    Definition: libwebsockets.h:1465
    +
    struct lws ** pwsi
    Definition: libwebsockets.h:2117
    Definition: libwebsockets.h:782
    -
    const char * path
    Definition: libwebsockets.h:2059
    +
    const char * path
    Definition: libwebsockets.h:2089
    LWS_VISIBLE LWS_EXTERN size_t lws_remaining_packet_payload(struct lws *wsi)
    Definition: libwebsockets.h:583
    -
    Definition: libwebsockets.h:1391
    +
    Definition: libwebsockets.h:1421
    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:4278
    +
    time_t email_connect_started
    Definition: libwebsockets.h:4308
    lws_close_status
    Definition: libwebsockets.h:554
    LWS_VISIBLE LWS_EXTERN int lws_callback_all_protocol(struct lws_context *context, const struct lws_protocols *protocol, int reason)
    Definition: libwebsockets.h:594
    - -
    int token_len
    Definition: libwebsockets.h:2567
    -
    const struct lws_http_mount * mounts
    Definition: libwebsockets.h:1676
    + +
    int token_len
    Definition: libwebsockets.h:2597
    +
    const struct lws_http_mount * mounts
    Definition: libwebsockets.h:1706
    Definition: libwebsockets.h:923
    LWS_VISIBLE LWS_EXTERN struct lws_context *LWS_WARN_UNUSED_RESULT lws_get_context(const struct lws *wsi)
    -
    const char * value
    Definition: libwebsockets.h:1956
    -
    Definition: libwebsockets.h:2887
    -
    Definition: libwebsockets.h:4236
    -
    const char * username
    Definition: libwebsockets.h:1466
    +
    const char * value
    Definition: libwebsockets.h:1986
    +
    Definition: libwebsockets.h:2917
    +
    Definition: libwebsockets.h:4266
    +
    const char * username
    Definition: libwebsockets.h:1496
    LWS_VISIBLE LWS_EXTERN struct lws * lws_client_connect_via_info(struct lws_client_connect_info *ccinfo)
    -
    const char * protocol
    Definition: libwebsockets.h:1986
    -
    struct lws ** stdwsi
    Definition: libwebsockets.h:4027
    +
    const char * protocol
    Definition: libwebsockets.h:2016
    +
    struct lws ** stdwsi
    Definition: libwebsockets.h:4057
    LWS_VISIBLE LWS_EXTERN int lws_json_dump_vhost(const struct lws_vhost *vh, char *buf, int len)
    Definition: libwebsockets.h:869
    LWS_VISIBLE LWS_EXTERN const char * lws_get_mimetype(const char *file, const struct lws_http_mount *m)
    -
    Definition: libwebsockets.h:1437
    -
    int cache_max_age
    Definition: libwebsockets.h:2000
    -
    long ssl_options_clear
    Definition: libwebsockets.h:1694
    +
    Definition: libwebsockets.h:1467
    +
    int cache_max_age
    Definition: libwebsockets.h:2030
    +
    long ssl_options_clear
    Definition: libwebsockets.h:1724
    Definition: libwebsockets.h:762
    -
    Definition: libwebsockets.h:1562
    +
    Definition: libwebsockets.h:1592
    LWS_VISIBLE LWS_EXTERN void lws_context_destroy(struct lws_context *context)
    Definition: libwebsockets.h:610
    -
    char * start
    Definition: libwebsockets.h:2506
    +
    char * start
    Definition: libwebsockets.h:2536
    LWS_VISIBLE LWS_EXTERN void lws_set_allocator(void *(*realloc)(void *ptr, size_t size))
    -
    lws_callback_function * callback
    Definition: libwebsockets.h:1286
    -
    Definition: libwebsockets.h:3232
    +
    lws_callback_function * callback
    Definition: libwebsockets.h:1316
    +
    Definition: libwebsockets.h:3262
    LWS_VISIBLE LWS_EXTERN void lws_context_deprecate(struct lws_context *context, lws_reload_func cb)
    LWS_VISIBLE LWS_EXTERN int lws_get_socket_fd(struct lws *wsi)
    Definition: libwebsockets.h:960
    -
    const char * protocol
    Definition: libwebsockets.h:2065
    +
    const char * protocol
    Definition: libwebsockets.h:2095
    Definition: libwebsockets.h:949
    -
    unsigned int pt_serv_buf_size
    Definition: libwebsockets.h:1681
    +
    unsigned int pt_serv_buf_size
    Definition: libwebsockets.h:1711
    LWS_VISIBLE LWS_EXTERN struct lws * lws_adopt_socket(struct lws_context *context, lws_sockfd_type accept_fd)
    -
    int len
    Definition: libwebsockets.h:2498
    -
    int ka_time
    Definition: libwebsockets.h:1617
    -
    Definition: libwebsockets.h:1511
    +
    int len
    Definition: libwebsockets.h:2528
    +
    int ka_time
    Definition: libwebsockets.h:1647
    +
    Definition: libwebsockets.h:1541
    LWS_VISIBLE LWS_EXTERN int lws_callback_on_writable_all_protocol(const struct lws_context *context, const struct lws_protocols *protocol)
    LWS_VISIBLE LWS_EXTERN void lws_set_log_level(int level, void(*log_emit_function)(int level, const char *line))
    -
    unsigned short ws_ping_pong_interval
    Definition: libwebsockets.h:1696
    -
    int count_extensions
    Definition: libwebsockets.h:1396
    -
    Definition: libwebsockets.h:3236
    -
    int port
    Definition: libwebsockets.h:2055
    -
    struct lws_context * context
    Definition: libwebsockets.h:2051
    -
    Definition: libwebsockets.h:1443
    -
    int ietf_version_or_minus_one
    Definition: libwebsockets.h:2067
    +
    unsigned short ws_ping_pong_interval
    Definition: libwebsockets.h:1726
    +
    int count_extensions
    Definition: libwebsockets.h:1426
    +
    Definition: libwebsockets.h:3266
    +
    int port
    Definition: libwebsockets.h:2085
    +
    struct lws_context * context
    Definition: libwebsockets.h:2081
    +
    Definition: libwebsockets.h:1473
    +
    int ietf_version_or_minus_one
    Definition: libwebsockets.h:2097
    LWS_VISIBLE LWS_EXTERN int lws_callback_all_protocol_vhost(struct lws_vhost *vh, const struct lws_protocols *protocol, int reason)
    -
    Definition: libwebsockets.h:4229
    -
    Definition: libwebsockets.h:1952
    +
    Definition: libwebsockets.h:4259
    +
    Definition: libwebsockets.h:1982
    LWS_VISIBLE LWS_EXTERN int lws_callback_on_writable(struct lws *wsi)
    -
    const char *const * vars
    Definition: libwebsockets.h:2510
    +
    const char *const * vars
    Definition: libwebsockets.h:2540
    Definition: libwebsockets.h:562
    -
    Definition: libwebsockets.h:2050
    -
    Definition: libwebsockets.h:1541
    -
    int lws_extension_callback_function(struct lws_context *context, const struct lws_extension *ext, struct lws *wsi, enum lws_extension_callback_reasons reason, void *user, void *in, size_t len)
    Definition: libwebsockets.h:1186
    +
    Definition: libwebsockets.h:2080
    +
    Definition: libwebsockets.h:1571
    +
    int lws_extension_callback_function(struct lws_context *context, const struct lws_extension *ext, struct lws *wsi, enum lws_extension_callback_reasons reason, void *user, void *in, size_t len)
    Definition: libwebsockets.h:1216
    -
    int len
    Definition: libwebsockets.h:1122
    -
    Definition: libwebsockets.h:1977
    -
    const char * def
    Definition: libwebsockets.h:1984
    +
    int len
    Definition: libwebsockets.h:1152
    +
    Definition: libwebsockets.h:2007
    +
    const char * def
    Definition: libwebsockets.h:2014
    Definition: libwebsockets.h:723
    -
    Definition: libwebsockets.h:1523
    -
    lws_context_options
    Definition: libwebsockets.h:1494
    +
    Definition: libwebsockets.h:1553
    +
    lws_context_options
    Definition: libwebsockets.h:1524
    Definition: libwebsockets.h:901
    -
    Definition: libwebsockets.h:1460
    -
    Definition: libwebsockets.h:1529
    +
    Definition: libwebsockets.h:1490
    +
    Definition: libwebsockets.h:1559
    Definition: libwebsockets.h:889
    -
    const char * option_name
    Definition: libwebsockets.h:1119
    -
    Definition: libwebsockets.h:1965
    +
    const char * option_name
    Definition: libwebsockets.h:1149
    +
    Definition: libwebsockets.h:1995
    lws_sockfd_type fd
    Definition: libwebsockets.h:532
    LWS_VISIBLE LWS_EXTERN int lws_json_dump_context(const struct lws_context *context, char *buf, int len, int hide_vhosts)
    -
    const char * ssl_private_key_password
    Definition: libwebsockets.h:1585
    +
    const char * ssl_private_key_password
    Definition: libwebsockets.h:1615
    short events
    Definition: libwebsockets.h:434
    -
    Definition: libwebsockets.h:1404
    -
    const struct lws_extension * extensions
    Definition: libwebsockets.h:1395
    -
    const struct lws_http_mount * mount_next
    Definition: libwebsockets.h:1978
    +
    Definition: libwebsockets.h:1434
    +
    const struct lws_extension * extensions
    Definition: libwebsockets.h:1425
    +
    const struct lws_http_mount * mount_next
    Definition: libwebsockets.h:2008
    LWS_VISIBLE LWS_EXTERN void lws_set_timeout(struct lws *wsi, enum pending_timeout reason, int secs)
    -
    void * userdata
    Definition: libwebsockets.h:2069
    +
    void * userdata
    Definition: libwebsockets.h:2099
    Definition: libwebsockets.h:720
    Definition: libwebsockets.h:907
    LWS_VISIBLE LWS_EXTERN int lws_service_tsi(struct lws_context *context, int timeout_ms, int tsi)
    -
    unsigned char * data
    Definition: libwebsockets.h:4029
    -
    const struct lws_protocol_vhost_options * extra_mimetypes
    Definition: libwebsockets.h:1993
    +
    unsigned char * data
    Definition: libwebsockets.h:4059
    +
    const struct lws_protocol_vhost_options * extra_mimetypes
    Definition: libwebsockets.h:2023
    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:713
    LWS_VISIBLE LWS_EXTERN const char * lws_urlencode(char *escaped, const char *string, int len)
    Definition: libwebsockets.h:794
    -
    uv_loop_t * loop
    Definition: libwebsockets.h:4244
    +
    uv_loop_t * loop
    Definition: libwebsockets.h:4274
    Definition: libwebsockets.h:892
    Definition: libwebsockets.h:72
    -
    Definition: libwebsockets.h:3268
    -
    int pos
    Definition: libwebsockets.h:2508
    -
    struct lws_plugin * list
    Definition: libwebsockets.h:1405
    +
    Definition: libwebsockets.h:3298
    +
    int pos
    Definition: libwebsockets.h:2538
    +
    struct lws_plugin * list
    Definition: libwebsockets.h:1435
    LWS_VISIBLE LWS_EXTERN struct lws *LWS_WARN_UNUSED_RESULT lws_client_connect_extended(struct lws_context *clients, const char *address, int port, int ssl_connection, const char *path, const char *host, const char *origin, const char *protocol, int ietf_version_or_minus_one, void *userdata) LWS_WARN_DEPRECATED
    -
    short max_http_header_data
    Definition: libwebsockets.h:1637
    +
    short max_http_header_data
    Definition: libwebsockets.h:1667
    LWS_VISIBLE LWS_EXTERN int lws_spa_process(struct lws_spa *spa, const char *in, int len)
    -
    void * provided_client_ssl_ctx
    Definition: libwebsockets.h:1634
    +
    void * provided_client_ssl_ctx
    Definition: libwebsockets.h:1664
    LWS_VISIBLE LWS_EXTERN struct lws_vhost * lws_get_vhost(struct lws *wsi)
    Definition: libwebsockets.h:44
    LWS_VISIBLE LWS_EXTERN void lwsl_emit_syslog(int level, const char *line)
    -
    const struct lws_protocols * protocols
    Definition: libwebsockets.h:1393
    -
    Definition: libwebsockets.h:1098
    -
    int ka_probes
    Definition: libwebsockets.h:1620
    +
    const struct lws_protocols * protocols
    Definition: libwebsockets.h:1423
    +
    Definition: libwebsockets.h:1128
    +
    int ka_probes
    Definition: libwebsockets.h:1650
    void onError(Socket *s, socket_error_t err)
    -
    const char * origin
    Definition: libwebsockets.h:2063
    +
    const char * origin
    Definition: libwebsockets.h:2093
    SHORT revents
    Definition: libwebsockets.h:420
    -
    const char * method
    Definition: libwebsockets.h:2073
    +
    const char * method
    Definition: libwebsockets.h:2103
    LWS_VISIBLE LWS_EXTERN const char * lws_spa_get_string(struct lws_spa *spa, int n)
    -
    Definition: libwebsockets.h:1192
    +
    Definition: libwebsockets.h:1222
    LWS_VISIBLE LWS_EXTERN int lws_callback_on_writable_all_protocol_vhost(const struct lws_vhost *vhost, const struct lws_protocols *protocol)
    Definition: libwebsockets.h:929
    -
    const struct lws_extension * client_exts
    Definition: libwebsockets.h:2071
    -
    unsigned char origin_protocol
    Definition: libwebsockets.h:2009
    -
    const char * log_filepath
    Definition: libwebsockets.h:1673
    +
    const struct lws_extension * client_exts
    Definition: libwebsockets.h:2101
    +
    unsigned char origin_protocol
    Definition: libwebsockets.h:2039
    +
    const char * log_filepath
    Definition: libwebsockets.h:1703
    Definition: libwebsockets.h:769
    -
    unsigned int max_content_size
    Definition: libwebsockets.h:4252
    -
    int option_index
    Definition: libwebsockets.h:1120
    +
    unsigned int max_content_size
    Definition: libwebsockets.h:4282
    +
    int option_index
    Definition: libwebsockets.h:1150
    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)
    Definition: libwebsockets.h:765
    -
    const char * uri_replace_to
    Definition: libwebsockets.h:2083
    -
    struct lws * parent_wsi
    Definition: libwebsockets.h:2076
    +
    const char * uri_replace_to
    Definition: libwebsockets.h:2113
    +
    struct lws * parent_wsi
    Definition: libwebsockets.h:2106
    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:4275
    +
    enum lwsgs_smtp_states estate
    Definition: libwebsockets.h:4305
    LWS_VISIBLE LWS_EXTERN int lws_spa_finalize(struct lws_spa *spa)
    Definition: libwebsockets.h:665
    LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT lws_get_count_threads(struct lws_context *context)
    -
    const char *const * plugin_dirs
    Definition: libwebsockets.h:1664
    -
    char name[64]
    Definition: libwebsockets.h:1411
    +
    const char *const * plugin_dirs
    Definition: libwebsockets.h:1694
    +
    char name[64]
    Definition: libwebsockets.h:1441
    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:4279
    +
    char email_buf[256]
    Definition: libwebsockets.h:4309
    LWS_VISIBLE LWS_EXTERN int lws_is_ssl(struct lws *wsi)
    -
    Definition: libwebsockets.h:1500
    -
    int(* close)(struct lws *wsi, lws_filefd_type fd)
    Definition: libwebsockets.h:4096
    -
    uv_lib_t lib
    Definition: libwebsockets.h:1407
    +
    Definition: libwebsockets.h:1530
    +
    int(* close)(struct lws *wsi, lws_filefd_type fd)
    Definition: libwebsockets.h:4126
    +
    uv_lib_t lib
    Definition: libwebsockets.h:1437
    x509_crt certificate
    Definition: libwebsockets.h:238
    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:4230
    +
    Definition: libwebsockets.h:4260
    LWS_VISIBLE LWS_EXTERN int lws_is_cgi(struct lws *wsi)
    -
    int ssl_connection
    Definition: libwebsockets.h:2057
    -
    Definition: libwebsockets.h:1459
    -
    SSL_CTX * provided_client_ssl_ctx
    Definition: libwebsockets.h:1628
    +
    int ssl_connection
    Definition: libwebsockets.h:2087
    +
    Definition: libwebsockets.h:1489
    +
    SSL_CTX * provided_client_ssl_ctx
    Definition: libwebsockets.h:1658
    LWS_VISIBLE LWS_EXTERN int lws_rx_flow_control(struct lws *wsi, int enable)
    -
    Definition: libwebsockets.h:2496
    +
    Definition: libwebsockets.h:2526
    LWS_VISIBLE LWS_EXTERN struct lws_plat_file_ops *LWS_WARN_UNUSED_RESULT lws_get_fops(struct lws_context *context)
    Definition: libwebsockets.h:531
    -
    const struct lws_protocol_vhost_options * cgienv
    Definition: libwebsockets.h:1989
    -
    const char * name
    Definition: libwebsockets.h:1955
    -
    unsigned char mountpoint_len
    Definition: libwebsockets.h:2010
    -
    Definition: libwebsockets.h:3239
    -
    Definition: libwebsockets.h:1518
    +
    const struct lws_protocol_vhost_options * cgienv
    Definition: libwebsockets.h:2019
    +
    const char * name
    Definition: libwebsockets.h:1985
    +
    unsigned char mountpoint_len
    Definition: libwebsockets.h:2040
    +
    Definition: libwebsockets.h:3269
    +
    Definition: libwebsockets.h:1548
    lws_sockfd_type fd
    Definition: libwebsockets.h:418
    -
    Definition: libwebsockets.h:1966
    +
    Definition: libwebsockets.h:1996
    LWS_VISIBLE LWS_EXTERN int lws_is_final_fragment(struct lws *wsi)
    -
    const struct lws_extension * extensions
    Definition: libwebsockets.h:1579
    -
    Definition: libwebsockets.h:1502
    +
    const struct lws_extension * extensions
    Definition: libwebsockets.h:1609
    +
    Definition: libwebsockets.h:1532
    LWS_VISIBLE LWS_EXTERN void * lws_protocol_vh_priv_zalloc(struct lws_vhost *vhost, const struct lws_protocols *prot, int size)
    -
    Definition: libwebsockets.h:1507
    -
    lws_ext_options_types
    Definition: libwebsockets.h:1096
    -
    const struct lws_protocols * protocols
    Definition: libwebsockets.h:1575
    +
    Definition: libwebsockets.h:1537
    +
    lws_ext_options_types
    Definition: libwebsockets.h:1126
    +
    const struct lws_protocols * protocols
    Definition: libwebsockets.h:1605
    LWS_VISIBLE LWS_EXTERN int lwsws_get_config_globals(struct lws_context_creation_info *info, const char *d, char **config_strings, int *len)
    LWS_VISIBLE LWS_EXTERN void * lws_wsi_user(struct lws *wsi)
    LWS_VISIBLE LWS_EXTERN unsigned long lws_now_secs(void)
    LWS_VISIBLE LWS_EXTERN const char * lws_get_peer_simple(struct lws *wsi, char *name, int namelen)
    -
    const char * start
    Definition: libwebsockets.h:1121
    -
    const char * ssl_cipher_list
    Definition: libwebsockets.h:1599
    +
    const char * start
    Definition: libwebsockets.h:1151
    +
    const char * ssl_cipher_list
    Definition: libwebsockets.h:1629
    LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT lws_add_http_header_by_name(struct lws *wsi, const unsigned char *name, const unsigned char *value, int length, unsigned char **p, unsigned char *end)
    -
    const char * mountpoint
    Definition: libwebsockets.h:1980
    -
    const char * http_proxy_address
    Definition: libwebsockets.h:1603
    +
    const char * mountpoint
    Definition: libwebsockets.h:2010
    +
    const char * http_proxy_address
    Definition: libwebsockets.h:1633
    rsa_context key
    Definition: libwebsockets.h:239
    -
    const char * ssl_cert_filepath
    Definition: libwebsockets.h:1587
    -
    const char * ecdh_curve
    Definition: libwebsockets.h:1658
    -
    int cgi_timeout
    Definition: libwebsockets.h:1998
    -
    Definition: libwebsockets.h:1968
    -
    Definition: libwebsockets.h:1444
    +
    const char * ssl_cert_filepath
    Definition: libwebsockets.h:1617
    +
    const char * ecdh_curve
    Definition: libwebsockets.h:1688
    +
    int cgi_timeout
    Definition: libwebsockets.h:2028
    +
    Definition: libwebsockets.h:1998
    +
    Definition: libwebsockets.h:1474
    Definition: libwebsockets.h:432
    Definition: libwebsockets.h:588
    LWS_VISIBLE LWS_EXTERN unsigned char lws_get_reserved_bits(struct lws *wsi)
    @@ -304,177 +304,178 @@ $(document).ready(function(){initNavTree('libwebsockets_8h_source.html','');});
    LWS_VISIBLE LWS_EXTERN struct lws *LWS_WARN_UNUSED_RESULT lws_client_connect(struct lws_context *clients, const char *address, int port, int ssl_connection, const char *path, const char *host, const char *origin, const char *protocol, int ietf_version_or_minus_one) LWS_WARN_DEPRECATED
    Definition: libwebsockets.h:767
    LWS_VISIBLE LWS_EXTERN int lwsws_get_config_vhosts(struct lws_context *context, struct lws_context_creation_info *info, const char *d, char **config_strings, int *len)
    -
    Definition: libwebsockets.h:1527
    +
    Definition: libwebsockets.h:1557
    LWS_VISIBLE LWS_EXTERN int lwsl_timestamp(int level, char *p, int len)
    Definition: libwebsockets.h:1005
    -
    Definition: libwebsockets.h:1539
    -
    uv_timer_t timeout_email
    Definition: libwebsockets.h:4274
    -
    Definition: libwebsockets.h:1509
    -
    short max_http_header_pool
    Definition: libwebsockets.h:1640
    +
    Definition: libwebsockets.h:1569
    +
    uv_timer_t timeout_email
    Definition: libwebsockets.h:4304
    +
    Definition: libwebsockets.h:1539
    +
    short max_http_header_pool
    Definition: libwebsockets.h:1670
    LWS_VISIBLE LWS_EXTERN int lws_chunked_html_process(struct lws_process_html_args *args, struct lws_process_html_state *s)
    -
    char * p
    Definition: libwebsockets.h:2497
    +
    char * p
    Definition: libwebsockets.h:2527
    x509_crt ca
    Definition: libwebsockets.h:237
    -
    size_t per_session_data_size
    Definition: libwebsockets.h:1290
    +
    size_t per_session_data_size
    Definition: libwebsockets.h:1320
    Definition: libwebsockets.h:572
    -
    const struct lws_protocol_vhost_options * reject_service_keywords
    Definition: libwebsockets.h:1712
    -
    lwsgs_smtp_states
    Definition: libwebsockets.h:4228
    -
    Definition: libwebsockets.h:1521
    +
    const struct lws_protocol_vhost_options * reject_service_keywords
    Definition: libwebsockets.h:1742
    +
    lwsgs_smtp_states
    Definition: libwebsockets.h:4258
    +
    Definition: libwebsockets.h:1551
    Definition: libwebsockets.h:845
    LWS_VISIBLE LWS_EXTERN int lws_snprintf(char *str, size_t size, const char *format,...)
    LWS_VISIBLE LWS_EXTERN struct lws * lws_adopt_socket_vhost_readbuf(struct lws_vhost *vhost, lws_sockfd_type accept_fd, const char *readbuf, size_t len)
    Definition: libwebsockets.h:731
    -
    Definition: libwebsockets.h:1282
    +
    Definition: libwebsockets.h:1312
    Definition: libwebsockets.h:577
    LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT lws_http_redirect(struct lws *wsi, int code, const unsigned char *loc, int len, unsigned char **p, unsigned char *end)
    -
    unsigned int count_threads
    Definition: libwebsockets.h:1647
    -
    const char * email
    Definition: libwebsockets.h:1467
    +
    unsigned int count_threads
    Definition: libwebsockets.h:1677
    +
    const char * email
    Definition: libwebsockets.h:1497
    LWS_VISIBLE LWS_EXTERN int lws_get_random(struct lws_context *context, void *buf, int len)
    Definition: libwebsockets.h:559
    -
    uv_connect_t email_connect_req
    Definition: libwebsockets.h:4276
    -
    const char * server_string
    Definition: libwebsockets.h:1678
    -
    Definition: libwebsockets.h:1532
    +
    uv_connect_t email_connect_req
    Definition: libwebsockets.h:4306
    +
    const char * server_string
    Definition: libwebsockets.h:1708
    +
    Definition: libwebsockets.h:1562
    SHORT events
    Definition: libwebsockets.h:419
    Definition: libwebsockets.h:736
    -
    Definition: libwebsockets.h:1516
    -
    const char * vhost_name
    Definition: libwebsockets.h:1660
    -
    Definition: libwebsockets.h:1969
    +
    Definition: libwebsockets.h:1546
    +
    const char * vhost_name
    Definition: libwebsockets.h:1690
    +
    Definition: libwebsockets.h:1999
    LWS_VISIBLE LWS_EXTERN const struct lws_protocols * lws_get_protocol(struct lws *wsi)
    -
    Definition: libwebsockets.h:1442
    -
    Definition: libwebsockets.h:1464
    -
    unsigned int fd_limit_per_thread
    Definition: libwebsockets.h:1649
    +
    Definition: libwebsockets.h:1472
    +
    Definition: libwebsockets.h:1494
    +
    unsigned int fd_limit_per_thread
    Definition: libwebsockets.h:1679
    LWS_VISIBLE LWS_EXTERN int lws_cgi_write_split_stdout_headers(struct lws *wsi)
    -
    lws_gs_event
    Definition: libwebsockets.h:1458
    +
    lws_gs_event
    Definition: libwebsockets.h:1488
    LWS_VISIBLE LWS_EXTERN int lws_finalize_startup(struct lws_context *context)
    -
    int ka_interval
    Definition: libwebsockets.h:1624
    -
    Definition: libwebsockets.h:1441
    -
    int uid
    Definition: libwebsockets.h:1610
    -
    Definition: libwebsockets.h:2889
    +
    int ka_interval
    Definition: libwebsockets.h:1654
    +
    Definition: libwebsockets.h:1471
    +
    int uid
    Definition: libwebsockets.h:1640
    +
    Definition: libwebsockets.h:2919
    LWS_VISIBLE LWS_EXTERN int lws_b64_encode_string(const char *in, int in_len, char *out, int out_size)
    LWS_VISIBLE LWS_EXTERN void * lws_context_user(struct lws_context *context)
    -
    const char * name
    Definition: libwebsockets.h:1283
    +
    const char * name
    Definition: libwebsockets.h:1313
    LWS_VISIBLE LWS_EXTERN int lws_init_vhost_client_ssl(const struct lws_context_creation_info *info, struct lws_vhost *vhost)
    -
    Definition: libwebsockets.h:4234
    -
    unsigned int http_proxy_port
    Definition: libwebsockets.h:1606
    +
    Definition: libwebsockets.h:4264
    +
    unsigned int http_proxy_port
    Definition: libwebsockets.h:1636
    LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT lws_partial_buffered(struct lws *wsi)
    -
    unsigned int timeout_secs
    Definition: libwebsockets.h:1653
    -
    int port
    Definition: libwebsockets.h:1563
    +
    unsigned int timeout_secs
    Definition: libwebsockets.h:1683
    +
    int port
    Definition: libwebsockets.h:1593
    LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT lws_parse_uri(char *p, const char **prot, const char **ads, int *port, const char **path)
    -
    unsigned int options
    Definition: libwebsockets.h:1612
    +
    unsigned int options
    Definition: libwebsockets.h:1642
    LWS_VISIBLE LWS_EXTERN int lws_spa_get_length(struct lws_spa *spa, int n)
    -
    const struct lws_protocol_vhost_options * options
    Definition: libwebsockets.h:1954
    +
    const struct lws_protocol_vhost_options * options
    Definition: libwebsockets.h:1984
    int prev_events
    Definition: libwebsockets.h:534
    -
    int keepalive_timeout
    Definition: libwebsockets.h:1670
    -
    Definition: libwebsockets.h:1448
    -
    Definition: libwebsockets.h:1109
    -
    const struct lws_protocol_vhost_options * headers
    Definition: libwebsockets.h:1708
    -
    Definition: libwebsockets.h:2686
    +
    int keepalive_timeout
    Definition: libwebsockets.h:1700
    +
    Definition: libwebsockets.h:1478
    +
    Definition: libwebsockets.h:1139
    +
    const struct lws_protocol_vhost_options * headers
    Definition: libwebsockets.h:1738
    +
    Definition: libwebsockets.h:2716
    LWS_VISIBLE LWS_EXTERN int lws_write(struct lws *wsi, unsigned char *buf, size_t len, enum lws_write_protocol protocol)
    -
    const struct lws_protocol_vhost_options * pvo
    Definition: libwebsockets.h:1667
    -
    const char * basic_auth_login_file
    Definition: libwebsockets.h:2012
    -
    const char * host
    Definition: libwebsockets.h:2061
    -
    Definition: libwebsockets.h:1118
    +
    const struct lws_protocol_vhost_options * pvo
    Definition: libwebsockets.h:1697
    +
    const char * basic_auth_login_file
    Definition: libwebsockets.h:2042
    +
    const char * host
    Definition: libwebsockets.h:2091
    +
    Definition: libwebsockets.h:1148
    Definition: libwebsockets.h:598
    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:4031
    +
    int len
    Definition: libwebsockets.h:4061
    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:1568
    -
    Definition: libwebsockets.h:4090
    +
    const char * iface
    Definition: libwebsockets.h:1598
    +
    Definition: libwebsockets.h:4120
    LWS_VISIBLE LWS_EXTERN void lwsl_hexdump(void *buf, size_t len)
    Definition: libwebsockets.h:1010
    -
    lws_spa_fileupload_states
    Definition: libwebsockets.h:2884
    +
    lws_spa_fileupload_states
    Definition: libwebsockets.h:2914
    LWS_VISIBLE LWS_EXTERN int lws_service_fd(struct lws_context *context, struct lws_pollfd *pollfd)
    LWS_VISIBLE LWS_EXTERN int lws_callback_vhost_protocols(struct lws *wsi, int reason, void *in, int len)
    Definition: libwebsockets.h:556
    Definition: libwebsockets.h:565
    LWS_VISIBLE LWS_EXTERN const char * lws_sql_purify(char *escaped, const char *string, int len)
    -
    uv_tcp_t email_client
    Definition: libwebsockets.h:4277
    +
    uv_tcp_t email_client
    Definition: libwebsockets.h:4307
    Definition: libwebsockets.h:417
    Definition: libwebsockets.h:669
    -
    lws_filefd_type(* open)(struct lws *wsi, const char *filename, unsigned long *filelen, int flags)
    Definition: libwebsockets.h:4091
    -
    lws_write_protocol
    Definition: libwebsockets.h:3231
    -
    const char * client_offer
    Definition: libwebsockets.h:1195
    -
    int(* read)(struct lws *wsi, lws_filefd_type fd, unsigned long *amount, unsigned char *buf, unsigned long len)
    Definition: libwebsockets.h:4101
    +
    lws_filefd_type(* open)(struct lws *wsi, const char *filename, unsigned long *filelen, int flags)
    Definition: libwebsockets.h:4121
    +
    lws_write_protocol
    Definition: libwebsockets.h:3261
    +
    const char * client_offer
    Definition: libwebsockets.h:1225
    +
    int(* read)(struct lws *wsi, lws_filefd_type fd, unsigned long *amount, unsigned char *buf, unsigned long len)
    Definition: libwebsockets.h:4131
    LWS_VISIBLE LWS_EXTERN void lws_cancel_service(struct lws_context *context)
    -
    Definition: libwebsockets.h:2885
    +
    Definition: libwebsockets.h:2915
    Definition: libwebsockets.h:570
    -
    const char * origin
    Definition: libwebsockets.h:1982
    -
    const char * name
    Definition: libwebsockets.h:1110
    +
    const char * origin
    Definition: libwebsockets.h:2012
    +
    const char * name
    Definition: libwebsockets.h:1140
    LWS_VISIBLE LWS_EXTERN int lws_serve_http_file(struct lws *wsi, const char *file, const char *content_type, const char *other_headers, int other_headers_len)
    LWS_VISIBLE LWS_EXTERN void lws_email_check(struct lws_email *email)
    LWS_VISIBLE LWS_EXTERN int lws_set_proxy(struct lws_vhost *vhost, const char *proxy)
    LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT lws_frame_is_binary(struct lws *wsi)
    LWS_VISIBLE LWS_EXTERN int lws_hdr_copy(struct lws *wsi, char *dest, int len, enum lws_token_indexes h)
    Definition: libwebsockets.h:746
    -
    const char * name
    Definition: libwebsockets.h:1193
    -
    Definition: libwebsockets.h:4233
    +
    const char * name
    Definition: libwebsockets.h:1223
    +
    Definition: libwebsockets.h:4263
    short revents
    Definition: libwebsockets.h:435
    -
    lws_extension_callback_function * callback
    Definition: libwebsockets.h:1194
    -
    long ssl_options_set
    Definition: libwebsockets.h:1692
    -
    Definition: libwebsockets.h:1022
    +
    lws_extension_callback_function * callback
    Definition: libwebsockets.h:1224
    +
    long ssl_options_set
    Definition: libwebsockets.h:1722
    +
    Definition: libwebsockets.h:1052
    LWS_VISIBLE LWS_EXTERN const struct lws_protocols * lws_protocol_get(struct lws *wsi) LWS_WARN_DEPRECATED
    -
    unsigned int mask
    Definition: libwebsockets.h:1452
    +
    unsigned int mask
    Definition: libwebsockets.h:1482
    LWS_VISIBLE LWS_EXTERN int lws_email_init(struct lws_email *email, uv_loop_t *loop, int max_content)
    -
    lws_mount_protocols
    Definition: libwebsockets.h:1963
    +
    lws_mount_protocols
    Definition: libwebsockets.h:1993
    LWS_EXTERN int lws_extension_callback_pm_deflate(struct lws_context *context, const struct lws_extension *ext, struct lws *wsi, enum lws_extension_callback_reasons reason, void *user, void *in, size_t len)
    LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT lws_add_http_header_content_length(struct lws *wsi, unsigned long content_length, unsigned char **p, unsigned char *end)
    lws_sockfd_type fd
    Definition: libwebsockets.h:433
    -
    unsigned int max_http_header_data2
    Definition: libwebsockets.h:1687
    -
    Definition: libwebsockets.h:1964
    +
    unsigned int max_http_header_data2
    Definition: libwebsockets.h:1717
    +
    Definition: libwebsockets.h:1994
    LWS_VISIBLE LWS_EXTERN int lws_return_http_status(struct lws *wsi, unsigned int code, const char *html_body)
    LWS_EXTERN LWS_VISIBLE struct lws_vhost * lws_create_vhost(struct lws_context *context, struct lws_context_creation_info *info)
    -
    const struct lws_protocol_vhost_options * interpret
    Definition: libwebsockets.h:1995
    -
    void * external_baggage_free_on_destroy
    Definition: libwebsockets.h:1719
    +
    const struct lws_protocol_vhost_options * interpret
    Definition: libwebsockets.h:2025
    +
    void * external_baggage_free_on_destroy
    Definition: libwebsockets.h:1749
    LWS_VISIBLE LWS_EXTERN int lws_service(struct lws_context *context, int timeout_ms)
    -
    Definition: libwebsockets.h:1514
    + +
    Definition: libwebsockets.h:1544
    LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT lws_http_transaction_completed(struct lws *wsi)
    -
    int count_vars
    Definition: libwebsockets.h:2511
    +
    int count_vars
    Definition: libwebsockets.h:2541
    LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT lws_add_http_header_status(struct lws *wsi, unsigned int code, unsigned char **p, unsigned char *end)
    -
    Definition: libwebsockets.h:2565
    +
    Definition: libwebsockets.h:2595
    LWS_VISIBLE LWS_EXTERN struct lws_context * lws_create_context(struct lws_context_creation_info *info)
    Definition: libwebsockets.h:725
    -
    void * data
    Definition: libwebsockets.h:2509
    -
    char * content
    Definition: libwebsockets.h:4280
    +
    void * data
    Definition: libwebsockets.h:2539
    +
    char * content
    Definition: libwebsockets.h:4310
    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:1582
    -
    Definition: libwebsockets.h:4241
    -
    const char * address
    Definition: libwebsockets.h:2053
    -
    unsigned long(* seek_cur)(struct lws *wsi, lws_filefd_type fd, long offset_from_cur_pos)
    Definition: libwebsockets.h:4098
    -
    void * user
    Definition: libwebsockets.h:1311
    +
    const struct lws_token_limits * token_limits
    Definition: libwebsockets.h:1612
    +
    Definition: libwebsockets.h:4271
    +
    const char * address
    Definition: libwebsockets.h:2083
    +
    unsigned long(* seek_cur)(struct lws *wsi, lws_filefd_type fd, long offset_from_cur_pos)
    Definition: libwebsockets.h:4128
    +
    void * user
    Definition: libwebsockets.h:1341
    int events
    Definition: libwebsockets.h:533
    LWS_VISIBLE LWS_EXTERN unsigned int lws_http_client_http_response(struct lws *wsi)
    -
    int(* on_get_body)(struct lws_email *email, char *buf, int len)
    Definition: libwebsockets.h:4267
    -
    Definition: libwebsockets.h:1970
    -
    void * user
    Definition: libwebsockets.h:1614
    -
    Definition: libwebsockets.h:4237
    -
    Definition: libwebsockets.h:3254
    -
    char * token
    Definition: libwebsockets.h:2566
    +
    int(* on_get_body)(struct lws_email *email, char *buf, int len)
    Definition: libwebsockets.h:4297
    +
    Definition: libwebsockets.h:2000
    +
    void * user
    Definition: libwebsockets.h:1644
    +
    Definition: libwebsockets.h:4267
    +
    Definition: libwebsockets.h:3284
    +
    char * token
    Definition: libwebsockets.h:2596
    LWS_VISIBLE LWS_EXTERN void * lws_protocol_vh_priv_get(struct lws_vhost *vhost, const struct lws_protocols *prot)
    -
    int count_protocols
    Definition: libwebsockets.h:1394
    -
    void * l
    Definition: libwebsockets.h:1409
    -
    const char * ssl_private_key_filepath
    Definition: libwebsockets.h:1591
    -
    int max_len
    Definition: libwebsockets.h:2499
    +
    int count_protocols
    Definition: libwebsockets.h:1424
    +
    void * l
    Definition: libwebsockets.h:1439
    +
    const char * ssl_private_key_filepath
    Definition: libwebsockets.h:1621
    +
    int max_len
    Definition: libwebsockets.h:2529
    Definition: libwebsockets.h:727
    -
    const struct lws_protocol_vhost_options * next
    Definition: libwebsockets.h:1953
    +
    const struct lws_protocol_vhost_options * next
    Definition: libwebsockets.h:1983
    Definition: libwebsockets.h:738
    LWS_VISIBLE LWS_EXTERN void lws_rx_flow_allow_all_protocol(const struct lws_context *context, const struct lws_protocols *protocol)
    -
    Definition: libwebsockets.h:2505
    +
    Definition: libwebsockets.h:2535
    LWS_VISIBLE LWS_EXTERN const char *LWS_WARN_UNUSED_RESULT lws_canonical_hostname(struct lws_context *context)
    Definition: libwebsockets.h:937
    -
    const char * ssl_ca_filepath
    Definition: libwebsockets.h:1597
    -
    lws_client_connect_ssl_connection_flags
    Definition: libwebsockets.h:2040
    -
    int gid
    Definition: libwebsockets.h:1608
    -
    struct lws_vhost * vhost
    Definition: libwebsockets.h:2085
    -
    int lws_callback_function(struct lws *wsi, enum lws_callback_reasons reason, void *user, void *in, size_t len)
    Definition: libwebsockets.h:1044
    +
    const char * ssl_ca_filepath
    Definition: libwebsockets.h:1627
    +
    lws_client_connect_ssl_connection_flags
    Definition: libwebsockets.h:2070
    +
    int gid
    Definition: libwebsockets.h:1638
    +
    struct lws_vhost * vhost
    Definition: libwebsockets.h:2115
    +
    int lws_callback_function(struct lws *wsi, enum lws_callback_reasons reason, void *user, void *in, size_t len)
    Definition: libwebsockets.h:1074
    LWS_VISIBLE LWS_EXTERN void lws_cancel_service_pt(struct lws *wsi)
    -
    Definition: libwebsockets.h:1534
    +
    Definition: libwebsockets.h:1564
    Definition: libwebsockets.h:606
    -
    Definition: libwebsockets.h:4232
    -
    unsigned int api_magic
    Definition: libwebsockets.h:1392
    -
    Definition: libwebsockets.h:1537
    +
    Definition: libwebsockets.h:4262
    +
    unsigned int api_magic
    Definition: libwebsockets.h:1422
    +
    Definition: libwebsockets.h:1567
    LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT lws_send_pipe_choked(struct lws *wsi)
    -
    Definition: libwebsockets.h:4235
    -
    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:2906
    +
    Definition: libwebsockets.h:4265
    +
    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:2936
    diff --git a/doc/html/navtreedata.js b/doc/html/navtreedata.js index 44de1928..d37cd0f6 100644 --- a/doc/html/navtreedata.js +++ b/doc/html/navtreedata.js @@ -136,8 +136,8 @@ var NAVTREEINDEX = "annotated.html", "group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a4933347a821e73c3f1e13fb6bfc7ad93", "group__service.html#ga29c246707997ab7a466aa709aecd2d7b", -"group__wsstatus.html#ga08e9ee165fca503fd9427d55cfecac37", -"structlws__extension.html#afa21f3b3c8c2c9212a276c52b680c3af" +"group__wsclose.html#ggae399c571df32ba532c0ca67da9284985af90cb98d983ad3d4c79df9b6f3d4a4d2", +"structlws__extension.html#a1e5018c883d85176f5c2152176843f9e" ]; var SYNCONMSG = 'click to disable panel synchronisation'; diff --git a/doc/html/navtreeindex0.js b/doc/html/navtreeindex0.js index 169df5d1..c5d2427b 100644 --- a/doc/html/navtreeindex0.js +++ b/doc/html/navtreeindex0.js @@ -178,8 +178,8 @@ var NAVTREEINDEX0 = "group__callback-when-writeable.html#ga8570860e191b62db264f2bac67354ea8":[11,0,0,0,61], "group__callback-when-writeable.html#ga941caaa468bc507b1cae52275f58800d":[9,1,2], "group__callback-when-writeable.html#ga941caaa468bc507b1cae52275f58800d":[11,0,0,0,59], -"group__callback-when-writeable.html#gaa709e02a10558753c851e58f1e2c16ba":[9,1,7], "group__callback-when-writeable.html#gaa709e02a10558753c851e58f1e2c16ba":[11,0,0,0,107], +"group__callback-when-writeable.html#gaa709e02a10558753c851e58f1e2c16ba":[9,1,7], "group__callback-when-writeable.html#gaad3d524a84d2be08ac85153bc158504b":[11,0,0,0,58], "group__callback-when-writeable.html#gabbe4655c7eeb3eb1671b2323ec6b3107":[9,1,3], "group__callback-when-writeable.html#gabbe4655c7eeb3eb1671b2323ec6b3107":[11,0,0,0,60], @@ -223,10 +223,10 @@ var NAVTREEINDEX0 = "group__context-and-vhost.html#ga41c2d763f78cc248df3b9f8645dbd2a5":[9,4,3], "group__context-and-vhost.html#ga7e9d5405547a457d86e0b4f0ae2bb1c4":[9,4,12], "group__context-and-vhost.html#ga7e9d5405547a457d86e0b4f0ae2bb1c4":[11,0,0,0,151], -"group__context-and-vhost.html#ga8db03e19a372e34ac25cf21af894a02c":[11,0,0,0,169], "group__context-and-vhost.html#ga8db03e19a372e34ac25cf21af894a02c":[9,4,13], -"group__context-and-vhost.html#ga8ee0314028755f1ddfa9428e09b4fddb":[9,4,5], +"group__context-and-vhost.html#ga8db03e19a372e34ac25cf21af894a02c":[11,0,0,0,169], "group__context-and-vhost.html#ga8ee0314028755f1ddfa9428e09b4fddb":[11,0,0,0,76], +"group__context-and-vhost.html#ga8ee0314028755f1ddfa9428e09b4fddb":[9,4,5], "group__context-and-vhost.html#ga94e6cc2223c4eec316b13bcebc3628b6":[9,4,11], "group__context-and-vhost.html#ga94e6cc2223c4eec316b13bcebc3628b6":[11,0,0,0,124], "group__context-and-vhost.html#ga98d88c9080fd89c37114363a6474ea73":[9,4,14], diff --git a/doc/html/navtreeindex1.js b/doc/html/navtreeindex1.js index e032622b..95010a52 100644 --- a/doc/html/navtreeindex1.js +++ b/doc/html/navtreeindex1.js @@ -156,8 +156,8 @@ var NAVTREEINDEX1 = "group__http.html#ga8fbf01e473ac421fc33ad9f8da8b8a25":[9,6,7], "group__http.html#gac8a4a71240857dc6b2ed70456b6923f4":[11,0,0,0,137], "group__http.html#gac8a4a71240857dc6b2ed70456b6923f4":[9,6,9], -"group__http.html#gad27aed6c66a41b2b89ffe4da2a309e8a":[11,0,0,0,117], "group__http.html#gad27aed6c66a41b2b89ffe4da2a309e8a":[9,6,8], +"group__http.html#gad27aed6c66a41b2b89ffe4da2a309e8a":[11,0,0,0,117], "group__httpft.html":[9,6,2], "group__httpft.html#ga29e1123f6d56cd777b3e5bf9ca40f9e5":[11,0,0,0,142], "group__httpft.html#gab393a06d3d2722af4c3f8b06842c80d7":[11,0,0,0,141], @@ -205,8 +205,8 @@ var NAVTREEINDEX1 = "group__misc.html#ga9f37d0e357de2ab4170723fcdb665d21":[9,8,10], "group__misc.html#gaa194584fff9698f3b280658f770ccd0f":[11,0,0,0,172], "group__misc.html#gaa194584fff9698f3b280658f770ccd0f":[9,8,11], -"group__misc.html#gab321ed812f46f6dc7ef9e3ca6f00cf1b":[9,8,9], "group__misc.html#gab321ed812f46f6dc7ef9e3ca6f00cf1b":[11,0,0,0,148], +"group__misc.html#gab321ed812f46f6dc7ef9e3ca6f00cf1b":[9,8,9], "group__misc.html#gac6abfc0b2bd5b2f09281a4432bb2f5f0":[9,8,4], "group__misc.html#gac6abfc0b2bd5b2f09281a4432bb2f5f0":[11,0,0,0,98], "group__misc.html#gacae4d7b6a8d22e4c2d82ff8b12c1e234":[9,8,1], @@ -216,8 +216,8 @@ var NAVTREEINDEX1 = "group__net.html":[9,9], "group__net.html#ga092e5f473b3347f03ffeef8a950080f3":[9,9,1], "group__net.html#ga092e5f473b3347f03ffeef8a950080f3":[11,0,0,0,101], -"group__net.html#ga869d8bdffb0f2a7ce08e3ce10d6be3d8":[9,9,3], "group__net.html#ga869d8bdffb0f2a7ce08e3ce10d6be3d8":[11,0,0,0,119], +"group__net.html#ga869d8bdffb0f2a7ce08e3ce10d6be3d8":[9,9,3], "group__net.html#gad01014fed09759741b6d23afccfdaacc":[9,9,2], "group__net.html#gad01014fed09759741b6d23afccfdaacc":[11,0,0,0,102], "group__net.html#gad0df22db2be9fc65a667a1e83f9a92a4":[9,9,0], @@ -225,8 +225,8 @@ var NAVTREEINDEX1 = "group__pur.html":[9,12], "group__pur.html#ga9cc82f06e5ae7e71458626d7a39a5865":[11,0,0,0,161], "group__pur.html#ga9cc82f06e5ae7e71458626d7a39a5865":[9,12,1], -"group__pur.html#gab15187efcfa256b7c928562c182b92a3":[11,0,0,0,125], "group__pur.html#gab15187efcfa256b7c928562c182b92a3":[9,12,0], +"group__pur.html#gab15187efcfa256b7c928562c182b92a3":[11,0,0,0,125], "group__sending-data.html":[9,13], "group__sending-data.html#ga98b099cf8c1c7e38ad78501f270e193d":[9,13,0], "group__sending-data.html#ga98b099cf8c1c7e38ad78501f270e193d":[11,0,0,0,36], @@ -245,8 +245,8 @@ var NAVTREEINDEX1 = "group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193dabb6705e1d1327cdda5025be28f07712e":[9,13,0,3], "group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193dabb6705e1d1327cdda5025be28f07712e":[11,0,0,0,36,3], "group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193dae7d8a025a65524652fe9e24c2654c935":[11,0,0,0,36,6], -"group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193daf6486c0dba50c44198100717721d9ab2":[11,0,0,0,36,1], "group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193daf6486c0dba50c44198100717721d9ab2":[9,13,0,1], +"group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193daf6486c0dba50c44198100717721d9ab2":[11,0,0,0,36,1], "group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193dafe5a38e940ce56708ac814627e9c0917":[9,13,0,4], "group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193dafe5a38e940ce56708ac814627e9c0917":[11,0,0,0,36,7], "group__service.html":[9,0] diff --git a/doc/html/navtreeindex2.js b/doc/html/navtreeindex2.js index 204b6ed4..43f24ef3 100644 --- a/doc/html/navtreeindex2.js +++ b/doc/html/navtreeindex2.js @@ -24,43 +24,43 @@ var NAVTREEINDEX2 = "group__smtp.html":[9,14], "group__smtp.html#ga116be79bf44f9dc2a97f46e051fe4dc0":[9,14,1], "group__smtp.html#ga116be79bf44f9dc2a97f46e051fe4dc0":[11,0,0,0,38], -"group__smtp.html#ga25298a5afc1074e13b2d5711a86432b2":[11,0,0,0,84], "group__smtp.html#ga25298a5afc1074e13b2d5711a86432b2":[9,14,3], -"group__smtp.html#ga5e535e346d92a9daf00be33abf79d4eb":[11,0,0,0,83], +"group__smtp.html#ga25298a5afc1074e13b2d5711a86432b2":[11,0,0,0,84], "group__smtp.html#ga5e535e346d92a9daf00be33abf79d4eb":[9,14,2], +"group__smtp.html#ga5e535e346d92a9daf00be33abf79d4eb":[11,0,0,0,83], "group__smtp.html#ga77fc9b56a1bb39484844981ec375fc29":[9,14,4], "group__smtp.html#ga77fc9b56a1bb39484844981ec375fc29":[11,0,0,0,85], "group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a1dfec948a864205cec875f63cbe0d4ad":[9,14,1,3], "group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a1dfec948a864205cec875f63cbe0d4ad":[11,0,0,0,38,3], "group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a29e5b0ecf75375b5a643faa3d6222b7c":[9,14,1,0], "group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a29e5b0ecf75375b5a643faa3d6222b7c":[11,0,0,0,38,0], -"group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a2c2ed16ffc572326e3040684084b21d5":[11,0,0,0,38,8], "group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a2c2ed16ffc572326e3040684084b21d5":[9,14,1,8], -"group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a38fba41f28d754e38079b31418a86a69":[9,14,1,7], +"group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a2c2ed16ffc572326e3040684084b21d5":[11,0,0,0,38,8], "group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a38fba41f28d754e38079b31418a86a69":[11,0,0,0,38,7], -"group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a85e3c452950c09a79086bff4b9be5c14":[11,0,0,0,38,6], +"group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a38fba41f28d754e38079b31418a86a69":[9,14,1,7], "group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a85e3c452950c09a79086bff4b9be5c14":[9,14,1,6], +"group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a85e3c452950c09a79086bff4b9be5c14":[11,0,0,0,38,6], "group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a929bb4623ff3f585108aba2a1b047fab":[9,14,1,4], "group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a929bb4623ff3f585108aba2a1b047fab":[11,0,0,0,38,4], "group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0aae20a0cb95b97a70f6b45d0ed2d5be83":[9,14,1,5], "group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0aae20a0cb95b97a70f6b45d0ed2d5be83":[11,0,0,0,38,5], "group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0ab61778f70ecac007b334bb14942eb41d":[9,14,1,2], "group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0ab61778f70ecac007b334bb14942eb41d":[11,0,0,0,38,2], -"group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0ab89442b7a3ca2b94c3cdcf33756eb933":[9,14,1,1], "group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0ab89442b7a3ca2b94c3cdcf33756eb933":[11,0,0,0,38,1], +"group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0ab89442b7a3ca2b94c3cdcf33756eb933":[9,14,1,1], "group__sock-adopt.html":[9,15], "group__sock-adopt.html#ga18747e81ff49df2076e7cd4f131f967c":[11,0,0,0,52], "group__sock-adopt.html#ga18747e81ff49df2076e7cd4f131f967c":[9,15,2], -"group__sock-adopt.html#ga5ed5fd251ac0ed46798af341c33bf067":[11,0,0,0,53], "group__sock-adopt.html#ga5ed5fd251ac0ed46798af341c33bf067":[9,15,3], +"group__sock-adopt.html#ga5ed5fd251ac0ed46798af341c33bf067":[11,0,0,0,53], "group__sock-adopt.html#gab2d045df0f81afe00891aaed312d552b":[11,0,0,0,51], "group__sock-adopt.html#gab2d045df0f81afe00891aaed312d552b":[9,15,1], -"group__sock-adopt.html#gabe71b7462afb21c767bdc67334f305af":[11,0,0,0,50], "group__sock-adopt.html#gabe71b7462afb21c767bdc67334f305af":[9,15,0], +"group__sock-adopt.html#gabe71b7462afb21c767bdc67334f305af":[11,0,0,0,50], "group__timeout.html":[9,3], "group__timeout.html#ga2c0aa4b9c3c55bae7b35cbfac3246c87":[11,0,0,0,39], -"group__timeout.html#gaced9f9237f6172fed9f730a2af51345a":[11,0,0,0,152], "group__timeout.html#gaced9f9237f6172fed9f730a2af51345a":[9,3,0], +"group__timeout.html#gaced9f9237f6172fed9f730a2af51345a":[11,0,0,0,152], "group__timeout.html#gga2c0aa4b9c3c55bae7b35cbfac3246c87a0d6b956db11acb6d263af3ea054a914e":[11,0,0,0,39,12], "group__timeout.html#gga2c0aa4b9c3c55bae7b35cbfac3246c87a0eef059426f37d00b75142d4dc3e25e3":[11,0,0,0,39,3], "group__timeout.html#gga2c0aa4b9c3c55bae7b35cbfac3246c87a1104c39d0177378713a9332ab7a9d7fe":[11,0,0,0,39,4], @@ -90,8 +90,8 @@ var NAVTREEINDEX2 = "group__usercb.html#gad4fcb82e68d60ffacca61a3f783a0a2f":[9,16,0], "group__usercb.html#gad62860e19975ba4c4af401c3cdb6abf7":[11,0,0,0,23], "group__usercb.html#gad62860e19975ba4c4af401c3cdb6abf7":[9,16,1], -"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a026502768778b8d79d62dd0fe4375fc6":[11,0,0,0,23,17], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a026502768778b8d79d62dd0fe4375fc6":[9,16,1,17], +"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a026502768778b8d79d62dd0fe4375fc6":[11,0,0,0,23,17], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a0418587d5083bb4850faa438648496ba":[11,0,0,0,23,49], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a06006e98d27e1e884364d88317f83493":[11,0,0,0,23,22], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a06006e98d27e1e884364d88317f83493":[9,16,1,22], @@ -99,33 +99,35 @@ var NAVTREEINDEX2 = "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a0e9e3dd667c0c42cdbe1a3d921f4fd79":[9,16,1,36], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a136a7cec11c3afd13245623bd84e76c9":[11,0,0,0,23,9], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a136a7cec11c3afd13245623bd84e76c9":[9,16,1,9], +"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a17620dd6cb920b9b6daeae63575be08b":[11,0,0,0,23,58], +"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a17620dd6cb920b9b6daeae63575be08b":[9,16,1,41], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a182a4a14c3278784505cea6d516a8308":[11,0,0,0,23,47], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a1ce5b22039ca37ee224d00047596ea46":[11,0,0,0,23,26], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a1ce5b22039ca37ee224d00047596ea46":[9,16,1,26], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a1df60f314710236f9b53efbf468da768":[11,0,0,0,23,33], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a1df60f314710236f9b53efbf468da768":[9,16,1,33], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a23b90b5e5146e760bc3123ae1fd2a6e5":[11,0,0,0,23,40], -"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a24d39bf1cfc0bad9d92da9ac1717e439":[9,16,1,0], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a24d39bf1cfc0bad9d92da9ac1717e439":[11,0,0,0,23,0], +"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a24d39bf1cfc0bad9d92da9ac1717e439":[9,16,1,0], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a2db02fc6e1c17ab62b52109d1aa9d738":[11,0,0,0,23,7], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a2db02fc6e1c17ab62b52109d1aa9d738":[9,16,1,7], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a2fce9a8608220f32abbf1422a5498804":[11,0,0,0,23,14], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a2fce9a8608220f32abbf1422a5498804":[9,16,1,14], -"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a390da3639296660a78cc1a5dcb19037e":[9,16,1,25], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a390da3639296660a78cc1a5dcb19037e":[11,0,0,0,23,25], +"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a390da3639296660a78cc1a5dcb19037e":[9,16,1,25], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a45d538082dec32dbecfe9d9a05ddfecd":[11,0,0,0,23,50], -"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a48a9590e5e18c7920282e094a0bfd9d8":[9,16,1,4], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a48a9590e5e18c7920282e094a0bfd9d8":[11,0,0,0,23,4], -"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a492c1b1c0ac0ed980042ee732fe2990c":[11,0,0,0,23,6], +"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a48a9590e5e18c7920282e094a0bfd9d8":[9,16,1,4], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a492c1b1c0ac0ed980042ee732fe2990c":[9,16,1,6], +"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a492c1b1c0ac0ed980042ee732fe2990c":[11,0,0,0,23,6], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a54269ca88508e6efd3afdb9d360a9caa":[11,0,0,0,23,28], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a54269ca88508e6efd3afdb9d360a9caa":[9,16,1,28], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a659539cfa65c66e0d813113b09900d31":[11,0,0,0,23,42], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a6a09ee9c01c4a233aedbe6697e29cc01":[11,0,0,0,23,44], -"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a75199176c82c1a56e4a6bbf1cc30c12c":[9,16,1,18], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a75199176c82c1a56e4a6bbf1cc30c12c":[11,0,0,0,23,18], -"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a7e12418eec9bce85735e6460176ab604":[9,16,1,3], +"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a75199176c82c1a56e4a6bbf1cc30c12c":[9,16,1,18], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a7e12418eec9bce85735e6460176ab604":[11,0,0,0,23,3], +"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a7e12418eec9bce85735e6460176ab604":[9,16,1,3], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a7ec8e2e9557ee02a4fc9f7dec7e2babc":[11,0,0,0,23,11], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a7ec8e2e9557ee02a4fc9f7dec7e2babc":[9,16,1,11], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a838b18d255c1b94a533287ba302a2eba":[9,16,1,5], @@ -135,10 +137,10 @@ var NAVTREEINDEX2 = "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a89862929a72bff65257ca1d51a0fce4d":[11,0,0,0,23,52], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a8e8b2e6dbeac76d8d126947d2166a514":[11,0,0,0,23,10], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a8e8b2e6dbeac76d8d126947d2166a514":[9,16,1,10], -"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a909cc2a7018864b0b71abacc4058fd8f":[9,16,1,24], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a909cc2a7018864b0b71abacc4058fd8f":[11,0,0,0,23,24], -"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a982579753e70e59a9ea13ce628ac891a":[11,0,0,0,23,58], -"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a982579753e70e59a9ea13ce628ac891a":[9,16,1,41], +"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a909cc2a7018864b0b71abacc4058fd8f":[9,16,1,24], +"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a982579753e70e59a9ea13ce628ac891a":[11,0,0,0,23,59], +"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a982579753e70e59a9ea13ce628ac891a":[9,16,1,42], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aa46f705dcf97502e95627ffde614f98b":[11,0,0,0,23,37], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aa46f705dcf97502e95627ffde614f98b":[9,16,1,37], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aa536e574a642ff3ab9e12bff7ba2c6a2":[9,16,1,2], @@ -167,28 +169,28 @@ var NAVTREEINDEX2 = "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aca834dc035b7f7486f9ce40fde54fe9e":[9,16,1,30], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7accd8753672d319a30b4b4c2fb775e84d":[11,0,0,0,23,20], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7accd8753672d319a30b4b4c2fb775e84d":[9,16,1,20], -"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ad5d34583e3556e153eda91620b48cc49":[9,16,1,27], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ad5d34583e3556e153eda91620b48cc49":[11,0,0,0,23,27], +"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ad5d34583e3556e153eda91620b48cc49":[9,16,1,27], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ad724974204d51d688f569c5d387b967d":[11,0,0,0,23,43], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ad87774f1c7784cf632e1e2f5b51036e1":[11,0,0,0,23,48], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ad8c6207b0c4e732f3d507f0fb79370e8":[9,16,1,1], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ad8c6207b0c4e732f3d507f0fb79370e8":[11,0,0,0,23,1], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7adfb41c92e2522712207ef7f2462b5e34":[11,0,0,0,23,31], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7adfb41c92e2522712207ef7f2462b5e34":[9,16,1,31], -"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ae4986291b7a810fe290851d73bebeb1c":[11,0,0,0,23,21], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ae4986291b7a810fe290851d73bebeb1c":[9,16,1,21], -"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ae5ad65d779b7eab32ab67ceff91a3bac":[11,0,0,0,23,23], +"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ae4986291b7a810fe290851d73bebeb1c":[11,0,0,0,23,21], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ae5ad65d779b7eab32ab67ceff91a3bac":[9,16,1,23], -"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ae8d1de0bb56e03aa58cb4d44b18edd2e":[9,16,1,12], +"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ae5ad65d779b7eab32ab67ceff91a3bac":[11,0,0,0,23,23], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ae8d1de0bb56e03aa58cb4d44b18edd2e":[11,0,0,0,23,12], +"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ae8d1de0bb56e03aa58cb4d44b18edd2e":[9,16,1,12], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ae9734e1d7af2abf291665ce9e4a728d3":[11,0,0,0,23,19], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ae9734e1d7af2abf291665ce9e4a728d3":[9,16,1,19], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aeb0cec65ec82a713cd01e9ca9aeeb5e6":[11,0,0,0,23,57], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aeb0cec65ec82a713cd01e9ca9aeeb5e6":[9,16,1,40], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7af6cf80e57aae8ba0a57a5c456b1fe026":[11,0,0,0,23,55], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7afc4b2f72cc9e424a750b506ce0cc4310":[11,0,0,0,23,51], -"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7afd8fd77a1cc9405fcb4f26915d7f2d01":[9,16,1,29], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7afd8fd77a1cc9405fcb4f26915d7f2d01":[11,0,0,0,23,29], +"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7afd8fd77a1cc9405fcb4f26915d7f2d01":[9,16,1,29], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7afedadfb3cde37a8ea4c84ed535f26d09":[11,0,0,0,23,16], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7afedadfb3cde37a8ea4c84ed535f26d09":[9,16,1,16], "group__uv.html":[9,22], @@ -219,21 +221,21 @@ var NAVTREEINDEX2 = "group__wsclose.html":[9,17], "group__wsclose.html#gaa1c863415d1783cd8de7938aa6efa262":[9,17,1], "group__wsclose.html#gaa1c863415d1783cd8de7938aa6efa262":[11,0,0,0,74], -"group__wsclose.html#gae399c571df32ba532c0ca67da9284985":[11,0,0,0,26], "group__wsclose.html#gae399c571df32ba532c0ca67da9284985":[9,17,0], +"group__wsclose.html#gae399c571df32ba532c0ca67da9284985":[11,0,0,0,26], "group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a1bb501d212fa4d57053db681b1dfab98":[11,0,0,0,26,3], "group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a1bb501d212fa4d57053db681b1dfab98":[9,17,0,2], -"group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a2e1f0113494a58e762eed3d22e7080d8":[11,0,0,0,26,10], "group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a2e1f0113494a58e762eed3d22e7080d8":[9,17,0,9], +"group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a2e1f0113494a58e762eed3d22e7080d8":[11,0,0,0,26,10], "group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a32c38edab10d1379febac0c479ab2e9c":[11,0,0,0,26,14], -"group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a3ffa38d5081b85fb739e02a747ccf2c4":[9,17,0,0], "group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a3ffa38d5081b85fb739e02a747ccf2c4":[11,0,0,0,26,1], -"group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a462c99b05459df700919cfd3f53c8276":[9,17,0,3], +"group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a3ffa38d5081b85fb739e02a747ccf2c4":[9,17,0,0], "group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a462c99b05459df700919cfd3f53c8276":[11,0,0,0,26,4], +"group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a462c99b05459df700919cfd3f53c8276":[9,17,0,3], "group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a4b8a3b7ce6f731e5248e4b0fb64a5044":[9,17,0,5], "group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a4b8a3b7ce6f731e5248e4b0fb64a5044":[11,0,0,0,26,6], -"group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a68b3d34bebd88547dcfa5cadba0acd6c":[11,0,0,0,26,7], "group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a68b3d34bebd88547dcfa5cadba0acd6c":[9,17,0,6], +"group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a68b3d34bebd88547dcfa5cadba0acd6c":[11,0,0,0,26,7], "group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a7aef2da0062da606eeb35aaca5cf9050":[11,0,0,0,26,8], "group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a7aef2da0062da606eeb35aaca5cf9050":[9,17,0,7], "group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a9737a68759e739856b150ff9dfa30218":[11,0,0,0,26,2], @@ -247,7 +249,5 @@ var NAVTREEINDEX2 = "group__wsclose.html#ggae399c571df32ba532c0ca67da9284985ad09e68295eabdddcba4e332fbea70ae5":[9,17,0,8], "group__wsclose.html#ggae399c571df32ba532c0ca67da9284985ad2b477a91c8445bf34ecd43977f9b390":[9,17,0,12], "group__wsclose.html#ggae399c571df32ba532c0ca67da9284985ad2b477a91c8445bf34ecd43977f9b390":[11,0,0,0,26,13], -"group__wsclose.html#ggae399c571df32ba532c0ca67da9284985af90cb98d983ad3d4c79df9b6f3d4a4d2":[11,0,0,0,26,5], -"group__wsclose.html#ggae399c571df32ba532c0ca67da9284985af90cb98d983ad3d4c79df9b6f3d4a4d2":[9,17,0,4], -"group__wsstatus.html":[9,18] +"group__wsclose.html#ggae399c571df32ba532c0ca67da9284985af90cb98d983ad3d4c79df9b6f3d4a4d2":[9,17,0,4] }; diff --git a/doc/html/navtreeindex3.js b/doc/html/navtreeindex3.js index 88ceebc9..d11df63c 100644 --- a/doc/html/navtreeindex3.js +++ b/doc/html/navtreeindex3.js @@ -1,19 +1,21 @@ var NAVTREEINDEX3 = { -"group__wsstatus.html#ga08e9ee165fca503fd9427d55cfecac37":[11,0,0,0,121], +"group__wsclose.html#ggae399c571df32ba532c0ca67da9284985af90cb98d983ad3d4c79df9b6f3d4a4d2":[11,0,0,0,26,5], +"group__wsstatus.html":[9,18], "group__wsstatus.html#ga08e9ee165fca503fd9427d55cfecac37":[9,18,3], +"group__wsstatus.html#ga08e9ee165fca503fd9427d55cfecac37":[11,0,0,0,121], "group__wsstatus.html#ga26a140623d202dd2bf2004deb6994baa":[11,0,0,0,122], "group__wsstatus.html#ga26a140623d202dd2bf2004deb6994baa":[9,18,4], "group__wsstatus.html#ga2bb3655329b4651cd06f79ee3a764421":[11,0,0,0,140], "group__wsstatus.html#ga2bb3655329b4651cd06f79ee3a764421":[9,18,6], "group__wsstatus.html#ga3df5045656dfb6b0e63a38de2dca79d2":[9,18,1], "group__wsstatus.html#ga3df5045656dfb6b0e63a38de2dca79d2":[11,0,0,0,106], -"group__wsstatus.html#ga4ad226d5e01024b4046f4a5a37199aa1":[9,18,2], "group__wsstatus.html#ga4ad226d5e01024b4046f4a5a37199aa1":[11,0,0,0,120], +"group__wsstatus.html#ga4ad226d5e01024b4046f4a5a37199aa1":[9,18,2], "group__wsstatus.html#gaccd9c59336efad8af0554f79cc5966fd":[11,0,0,0,93], "group__wsstatus.html#gaccd9c59336efad8af0554f79cc5966fd":[9,18,0], -"group__wsstatus.html#gaeca4afc94b1f026034f99cbba37e2f85":[9,18,5], "group__wsstatus.html#gaeca4afc94b1f026034f99cbba37e2f85":[11,0,0,0,131], +"group__wsstatus.html#gaeca4afc94b1f026034f99cbba37e2f85":[9,18,5], "hierarchy.html":[10,2], "index.html":[], "index.html":[0], @@ -247,7 +249,5 @@ var NAVTREEINDEX3 = "structlws__ext__options.html":[9,5,0], "structlws__ext__options.html#a1769e4a9805bbdda227821e9578ddc7e":[9,5,0,0], "structlws__ext__options.html#a7c4dbd62dbeba63a9d50d2306bd1cc61":[9,5,0,1], -"structlws__extension.html":[9,5,2], -"structlws__extension.html#a1e5018c883d85176f5c2152176843f9e":[9,5,2,2], -"structlws__extension.html#a36b06c213aedb02bf9a402651751855b":[9,5,2,1] +"structlws__extension.html":[9,5,2] }; diff --git a/doc/html/navtreeindex4.js b/doc/html/navtreeindex4.js index 335e7c8c..b539faf7 100644 --- a/doc/html/navtreeindex4.js +++ b/doc/html/navtreeindex4.js @@ -1,5 +1,7 @@ var NAVTREEINDEX4 = { +"structlws__extension.html#a1e5018c883d85176f5c2152176843f9e":[9,5,2,2], +"structlws__extension.html#a36b06c213aedb02bf9a402651751855b":[9,5,2,1], "structlws__extension.html#afa21f3b3c8c2c9212a276c52b680c3af":[9,5,2,0], "structlws__gs__event__args.html":[9,10,0,3], "structlws__gs__event__args.html#a2bec693d8a43730d487004a44326178b":[9,10,0,3,2], @@ -73,10 +75,10 @@ var NAVTREEINDEX4 = "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#abc714ddb4171756fc8196e9823a1e21c":[9,4,2,1], -"structlws__protocol__vhost__options.html#acf9db77f8eb64cd4e314be9b43d8a8b9":[9,4,0,0,0], "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#acf9db77f8eb64cd4e314be9b43d8a8b9":[9,4,0,0,0], "structlws__protocol__vhost__options.html#afd99fbc90be51ea2465b550c2ec47822":[9,4,0,0,2], +"structlws__protocol__vhost__options.html#afd99fbc90be51ea2465b550c2ec47822":[9,4,2,2], "structlws__protocols.html":[9,10,1], "structlws__protocols.html#a0d1d4996d81b2f5e125bcec981e461c5":[9,10,1,4], "structlws__protocols.html#a0e63edb457a613c3fa4271e0a8f19624":[9,10,1,2], @@ -94,8 +96,8 @@ var NAVTREEINDEX4 = "structlws__token__limits.html#a6ec712306cbf8585bce7a56758a3ceff":[9,6,4,1,0], "structlws__tokens.html":[9,6,4,0], "structlws__tokens.html":[9,6,6], -"structlws__tokens.html#a855b7375d1d58516c0ecd4b60e9a7766":[9,6,4,0,1], "structlws__tokens.html#a855b7375d1d58516c0ecd4b60e9a7766":[9,6,6,1], +"structlws__tokens.html#a855b7375d1d58516c0ecd4b60e9a7766":[9,6,4,0,1], "structlws__tokens.html#a9f3635412bc71a5cb78e9862b55f10cd":[9,6,4,0,0], "structlws__tokens.html#a9f3635412bc71a5cb78e9862b55f10cd":[9,6,6,0], "structlwsgw__hash.html":[9,10,0,1], diff --git a/lib/client-handshake.c b/lib/client-handshake.c index 603a4595..67b2b4f9 100644 --- a/lib/client-handshake.c +++ b/lib/client-handshake.c @@ -113,8 +113,9 @@ lws_client_connect_2(struct lws *wsi) } else #endif { - struct addrinfo ai, *res, *result; + struct addrinfo ai, *res, *result = NULL; void *p = NULL; + unsigned char *p1; memset (&ai, 0, sizeof ai); ai.ai_family = PF_UNSPEC; @@ -134,16 +135,20 @@ lws_client_connect_2(struct lws *wsi) p = &((struct sockaddr_in *)res->ai_addr)->sin_addr; break; } - res = res->ai_next; } if (!p) { lwsl_err("Couldn't identify address\n"); freeaddrinfo(result); + cce = "unable to lookup address"; goto oom4; } + p1 = p; + lwsl_err("getaddrinfo %s -> %d.%d.%d.%d\n", ads, + p1[0], p1[1], p1[2], p1[3]); + server_addr4.sin_family = AF_INET; server_addr4.sin_addr = *((struct in_addr *)p); bzero(&server_addr4.sin_zero, 8); @@ -161,6 +166,7 @@ lws_client_connect_2(struct lws *wsi) if (!lws_socket_is_valid(wsi->sock)) { lwsl_warn("Unable to open socket\n"); + cce = "unable to open socket"; goto oom4; } @@ -198,8 +204,10 @@ lws_client_connect_2(struct lws *wsi) AWAITING_TIMEOUT); n = lws_socket_bind(wsi->vhost, wsi->sock, 0, wsi->vhost->iface); - if (n < 0) + if (n < 0) { + cce = "unable to bind socket"; goto failed; + } } #ifdef LWS_USE_IPV6 @@ -224,21 +232,26 @@ lws_client_connect_2(struct lws *wsi) lwsl_client("nonblocking connect retry (errno = %d)\n", LWS_ERRNO); - if (lws_plat_check_connection_error(wsi)) + if (lws_plat_check_connection_error(wsi)) { + cce = "socket connect failed"; goto failed; + } /* * must do specifically a POLLOUT poll to hear * about the connect completion */ - if (lws_change_pollfd(wsi, 0, LWS_POLLOUT)) + if (lws_change_pollfd(wsi, 0, LWS_POLLOUT)) { + cce = "POLLOUT set failed"; goto failed; + } return wsi; } if (LWS_ERRNO != LWS_EISCONN) { - lwsl_debug("Connect failed errno=%d\n", LWS_ERRNO); + lwsl_notice("Connect failed errno=%d\n", LWS_ERRNO); + cce = "connect failed"; goto failed; } } @@ -264,6 +277,7 @@ lws_client_connect_2(struct lws *wsi) MSG_NOSIGNAL); if (n < 0) { lwsl_debug("ERROR writing to proxy socket\n"); + cce = "proxy write failed"; goto failed; } @@ -294,8 +308,10 @@ lws_client_connect_2(struct lws *wsi) pfd.revents = LWS_POLLIN; n = lws_service_fd(context, &pfd); - if (n < 0) + if (n < 0) { + cce = "first service failed"; goto failed; + } if (n) /* returns 1 on failure after closing wsi */ return NULL; @@ -305,8 +321,9 @@ oom4: /* we're closing, losing some rx is OK */ if (wsi->u.hdr.ah) wsi->u.hdr.ah->rxpos = wsi->u.hdr.ah->rxlen; - - if (wsi->mode == LWSCM_HTTP_CLIENT) { + if (wsi->mode == LWSCM_HTTP_CLIENT || + wsi->mode == LWSCM_HTTP_CLIENT_ACCEPTED || + wsi->mode == LWSCM_WSCL_WAITING_CONNECT) { wsi->vhost->protocols[0].callback(wsi, LWS_CALLBACK_CLIENT_CONNECTION_ERROR, wsi->user_space, (void *)cce, strlen(cce)); @@ -314,13 +331,18 @@ oom4: } /* take care that we might be inserted in fds already */ if (wsi->position_in_fds_table != -1) - goto failed; + goto failed1; lws_header_table_detach(wsi, 0); lws_free(wsi); return NULL; failed: + wsi->vhost->protocols[0].callback(wsi, + LWS_CALLBACK_CLIENT_CONNECTION_ERROR, + wsi->user_space, (void *)cce, strlen(cce)); + wsi->already_did_cce = 1; +failed1: lws_close_free_wsi(wsi, LWS_CLOSE_STATUS_NOSTATUS); return NULL; diff --git a/lib/client.c b/lib/client.c index 045d87b2..0431e4de 100755 --- a/lib/client.c +++ b/lib/client.c @@ -346,7 +346,12 @@ static void strtolower(char *s) { while (*s) { +#ifdef LWS_PLAT_OPTEE + int tolower_optee(int c); + *s = tolower_optee((int)*s); +#else *s = tolower((int)*s); +#endif s++; } } diff --git a/lib/context.c b/lib/context.c index cab33516..cf2537ce 100644 --- a/lib/context.c +++ b/lib/context.c @@ -137,7 +137,7 @@ lws_protocol_init(struct lws_context *context) memset(&wsi, 0, sizeof(wsi)); wsi.context = context; - lwsl_notice("%s\n", __func__); + lwsl_info("%s\n", __func__); while (vh) { wsi.vhost = vh; @@ -308,6 +308,10 @@ static const struct lws_protocols protocols_dummy[] = { { NULL, NULL, 0, 0 } /* terminator */ }; +#ifdef LWS_PLAT_OPTEE +#undef LWS_HAVE_GETENV +#endif + LWS_VISIBLE struct lws_vhost * lws_create_vhost(struct lws_context *context, struct lws_context_creation_info *info) @@ -514,13 +518,10 @@ lws_create_vhost(struct lws_context *context, } else vh->log_fd = (int)LWS_INVALID_FILE; #endif - if (lws_context_init_server_ssl(info, vh)) goto bail; - if (lws_context_init_client_ssl(info, vh)) goto bail; - if (lws_context_init_server(info, vh)) goto bail; @@ -531,7 +532,6 @@ lws_create_vhost(struct lws_context *context, } vh1 = &(*vh1)->vhost_next; }; - /* for the case we are adding a vhost much later, after server init */ if (context->protocol_init_done) @@ -571,6 +571,9 @@ lws_create_context(struct lws_context_creation_info *info) lwsl_notice("Initial logging level %d\n", log_level); lwsl_notice("Libwebsockets version: %s\n", library_version); +#if defined(GCC_VER) + lwsl_notice("Compiled with %s\n", GCC_VER); +#endif #if LWS_POSIX #ifdef LWS_USE_IPV6 if (!lws_check_opt(info->options, LWS_SERVER_OPTION_DISABLE_IPV6)) @@ -580,8 +583,10 @@ lws_create_context(struct lws_context_creation_info *info) #else lwsl_notice("IPV6 not compiled in\n"); #endif +#ifndef LWS_PLAT_OPTEE lws_feature_status_libev(info); lws_feature_status_libuv(info); +#endif #endif lwsl_info(" LWS_DEF_HEADER_LEN : %u\n", LWS_DEF_HEADER_LEN); lwsl_info(" LWS_MAX_PROTOCOLS : %u\n", LWS_MAX_PROTOCOLS); diff --git a/lib/libwebsockets.c b/lib/libwebsockets.c index edd0d96c..d0810750 100755 --- a/lib/libwebsockets.c +++ b/lib/libwebsockets.c @@ -39,8 +39,12 @@ #endif int log_level = LLL_ERR | LLL_WARN | LLL_NOTICE; -static void (*lwsl_emit)(int level, const char *line) = lwsl_emit_stderr; - +static void (*lwsl_emit)(int level, const char *line) +#ifndef LWS_PLAT_OPTEE + = lwsl_emit_stderr +#endif + ; +#ifndef LWS_PLAT_OPTEE static const char * const log_level_names[] = { "ERR", "WARN", @@ -53,6 +57,7 @@ static const char * const log_level_names[] = { "CLIENT", "LATENCY", }; +#endif void lws_free_wsi(struct lws *wsi) @@ -644,6 +649,7 @@ interface_to_sa(struct lws_vhost *vh, const char *ifname, struct sockaddr_in *ad } #endif +#ifndef LWS_PLAT_OPTEE #if LWS_POSIX static int lws_get_addresses(struct lws_vhost *vh, void *ads, char *name, @@ -729,6 +735,7 @@ lws_get_addresses(struct lws_vhost *vh, void *ads, char *name, } #endif + LWS_VISIBLE const char * lws_get_peer_simple(struct lws *wsi, char *name, int namelen) { @@ -770,11 +777,13 @@ lws_get_peer_simple(struct lws *wsi, char *name, int namelen) #endif #endif } +#endif LWS_VISIBLE void lws_get_peer_addresses(struct lws *wsi, lws_sockfd_type fd, char *name, int name_len, char *rip, int rip_len) { +#ifndef LWS_PLAT_OPTEE #if LWS_POSIX socklen_t len; #ifdef LWS_USE_IPV6 @@ -810,14 +819,15 @@ lws_get_peer_addresses(struct lws *wsi, lws_sockfd_type fd, char *name, bail: lws_latency(context, wsi, "lws_get_peer_addresses", ret, 1); -#else +#endif +#endif (void)wsi; (void)fd; (void)name; (void)name_len; (void)rip; (void)rip_len; -#endif + } LWS_EXTERN void * @@ -1129,6 +1139,7 @@ lws_ensure_user_space(struct lws *wsi) LWS_VISIBLE int lwsl_timestamp(int level, char *p, int len) { +#ifndef LWS_PLAT_OPTEE time_t o_now = time(NULL); unsigned long long now; struct tm *ptm = NULL; @@ -1166,10 +1177,11 @@ lwsl_timestamp(int level, char *p, int len) (int)(now % 10000), log_level_names[n]); return n; } - +#endif return 0; } +#ifndef LWS_PLAT_OPTEE LWS_VISIBLE void lwsl_emit_stderr(int level, const char *line) { #if !defined(LWS_WITH_ESP8266) @@ -1179,6 +1191,7 @@ LWS_VISIBLE void lwsl_emit_stderr(int level, const char *line) fprintf(stderr, "%s%s", buf, line); #endif } +#endif LWS_VISIBLE void _lws_logv(int filter, const char *format, va_list vl) { @@ -1511,7 +1524,9 @@ lws_socket_bind(struct lws_vhost *vhost, lws_sockfd_type sockfd, int port, struct sockaddr_in6 serv_addr6; #endif struct sockaddr_in serv_addr4; +#ifndef LWS_PLAT_OPTEE socklen_t len = sizeof(struct sockaddr); +#endif int n; struct sockaddr_in sin; struct sockaddr *v; @@ -1612,9 +1627,11 @@ lws_socket_bind(struct lws_vhost *vhost, lws_sockfd_type sockfd, int port, return -1; } +#ifndef LWS_PLAT_OPTEE if (getsockname(sockfd, (struct sockaddr *)&sin, &len) == -1) lwsl_warn("getsockname: %s\n", strerror(LWS_ERRNO)); else +#endif port = ntohs(sin.sin_port); #endif diff --git a/lib/libwebsockets.h b/lib/libwebsockets.h index b501e01e..5c102f8f 100644 --- a/lib/libwebsockets.h +++ b/lib/libwebsockets.h @@ -166,7 +166,7 @@ struct sockaddr_in; #define LWS_INLINE inline #define LWS_O_RDONLY O_RDONLY -#if !defined(MBED_OPERATORS) && !defined(LWS_WITH_ESP8266) +#if !defined(MBED_OPERATORS) && !defined(LWS_WITH_ESP8266) && !defined(OPTEE_TA) #include #include #define LWS_INVALID_FILE -1 @@ -216,9 +216,11 @@ struct sockaddr_in; #ifdef _WIN32 #define random rand #else +#if !defined(OPTEE_TA) #include #include #endif +#endif #ifdef LWS_OPENSSL_SUPPORT diff --git a/lib/lws-plat-optee.c b/lib/lws-plat-optee.c new file mode 100644 index 00000000..9ec25ef3 --- /dev/null +++ b/lib/lws-plat-optee.c @@ -0,0 +1,328 @@ +#include "private-libwebsockets.h" + +/* + * included from libwebsockets.c for OPTEE builds + */ + +void TEE_GenerateRandom(void *randomBuffer, uint32_t randomBufferLen); + +unsigned long long time_in_microseconds(void) +{ + return ((unsigned long long)time(NULL)) * 1000000; +} +#if 0 +LWS_VISIBLE int +lws_get_random(struct lws_context *context, void *buf, int len) +{ + TEE_GenerateRandom(buf, len); + + return len; +} +#endif +LWS_VISIBLE int +lws_send_pipe_choked(struct lws *wsi) +{ +#if 0 + struct lws_pollfd fds; + + /* treat the fact we got a truncated send pending as if we're choked */ + if (wsi->trunc_len) + return 1; + + fds.fd = wsi->sock; + fds.events = POLLOUT; + fds.revents = 0; + + if (poll(&fds, 1, 0) != 1) + return 1; + + if ((fds.revents & POLLOUT) == 0) + return 1; +#endif + /* okay to send another packet without blocking */ + + return 0; +} + +LWS_VISIBLE int +lws_poll_listen_fd(struct lws_pollfd *fd) +{ +// return poll(fd, 1, 0); + + return 0; +} + +LWS_VISIBLE void +lws_cancel_service_pt(struct lws *wsi) +{ +#if 0 + struct lws_context_per_thread *pt = &wsi->context->pt[(int)wsi->tsi]; + char buf = 0; + + if (write(pt->dummy_pipe_fds[1], &buf, sizeof(buf)) != 1) + lwsl_err("Cannot write to dummy pipe"); +#endif +} + +LWS_VISIBLE void +lws_cancel_service(struct lws_context *context) +{ +#if 0 + struct lws_context_per_thread *pt = &context->pt[0]; + char buf = 0, m = context->count_threads; + + while (m--) { + if (write(pt->dummy_pipe_fds[1], &buf, sizeof(buf)) != 1) + lwsl_err("Cannot write to dummy pipe"); + pt++; + } +#endif +} +#if 0 +LWS_VISIBLE void lwsl_emit_syslog(int level, const char *line) +{ + IMSG("%d: %s\n", level, line); +} +#endif + +LWS_VISIBLE LWS_EXTERN int +_lws_plat_service_tsi(struct lws_context *context, int timeout_ms, int tsi) +{ + struct lws_context_per_thread *pt; + int n = -1, m, c; + //char buf; + + /* stay dead once we are dead */ + + if (!context || !context->vhost_list) + return 1; + + pt = &context->pt[tsi]; + + if (timeout_ms < 0) + goto faked_service; + + if (!context->service_tid_detected) { + struct lws _lws; + + memset(&_lws, 0, sizeof(_lws)); + _lws.context = context; + + context->service_tid_detected = + context->vhost_list->protocols[0].callback( + &_lws, LWS_CALLBACK_GET_THREAD_ID, NULL, NULL, 0); + } + context->service_tid = context->service_tid_detected; + + /* + * is there anybody with pending stuff that needs service forcing? + */ + if (!lws_service_adjust_timeout(context, 1, tsi)) { + lwsl_notice("%s: doing forced service\n", __func__); + /* -1 timeout means just do forced service */ + _lws_plat_service_tsi(context, -1, pt->tid); + /* still somebody left who wants forced service? */ + if (!lws_service_adjust_timeout(context, 1, pt->tid)) + /* yes... come back again quickly */ + timeout_ms = 0; + } +#if 1 + n = poll(pt->fds, pt->fds_count, timeout_ms); + +#ifdef LWS_OPENSSL_SUPPORT + if (!pt->rx_draining_ext_list && + !lws_ssl_anybody_has_buffered_read_tsi(context, tsi) && !n) { +#else + if (!pt->rx_draining_ext_list && !n) /* poll timeout */ { +#endif + lws_service_fd_tsi(context, NULL, tsi); + return 0; + } +#endif +faked_service: + m = lws_service_flag_pending(context, tsi); + if (m) + c = -1; /* unknown limit */ + else + if (n < 0) { + if (LWS_ERRNO != LWS_EINTR) + return -1; + return 0; + } else + c = n; + + /* any socket with events to service? */ + for (n = 0; n < pt->fds_count && c; n++) { + if (!pt->fds[n].revents) + continue; + + c--; +#if 0 + if (pt->fds[n].fd == pt->dummy_pipe_fds[0]) { + if (read(pt->fds[n].fd, &buf, 1) != 1) + lwsl_err("Cannot read from dummy pipe."); + continue; + } +#endif + m = lws_service_fd_tsi(context, &pt->fds[n], tsi); + if (m < 0) + return -1; + /* if something closed, retry this slot */ + if (m) + n--; + } + + return 0; +} + +LWS_VISIBLE int +lws_plat_check_connection_error(struct lws *wsi) +{ + return 0; +} + +LWS_VISIBLE int +lws_plat_service(struct lws_context *context, int timeout_ms) +{ + return _lws_plat_service_tsi(context, timeout_ms, 0); +} + +LWS_VISIBLE int +lws_plat_set_socket_options(struct lws_vhost *vhost, int fd) +{ + return 0; +} + +LWS_VISIBLE void +lws_plat_drop_app_privileges(struct lws_context_creation_info *info) +{ +} + +LWS_VISIBLE int +lws_plat_context_early_init(void) +{ + return 0; +} + +LWS_VISIBLE void +lws_plat_context_early_destroy(struct lws_context *context) +{ +} + +LWS_VISIBLE void +lws_plat_context_late_destroy(struct lws_context *context) +{ + if (context->lws_lookup) + lws_free(context->lws_lookup); +} + +/* cast a struct sockaddr_in6 * into addr for ipv6 */ + +LWS_VISIBLE int +lws_interface_to_sa(int ipv6, const char *ifname, struct sockaddr_in *addr, + size_t addrlen) +{ + return -1; +} + +LWS_VISIBLE void +lws_plat_insert_socket_into_fds(struct lws_context *context, struct lws *wsi) +{ + struct lws_context_per_thread *pt = &context->pt[(int)wsi->tsi]; + + pt->fds[pt->fds_count++].revents = 0; +} + +LWS_VISIBLE void +lws_plat_delete_socket_from_fds(struct lws_context *context, + struct lws *wsi, int m) +{ + struct lws_context_per_thread *pt = &context->pt[(int)wsi->tsi]; + + pt->fds_count--; +} + +LWS_VISIBLE void +lws_plat_service_periodic(struct lws_context *context) +{ +} + +LWS_VISIBLE int +lws_plat_change_pollfd(struct lws_context *context, + struct lws *wsi, struct lws_pollfd *pfd) +{ + return 0; +} + +LWS_VISIBLE const char * +lws_plat_inet_ntop(int af, const void *src, char *dst, int cnt) +{ + //return inet_ntop(af, src, dst, cnt); + return "lws_plat_inet_ntop"; +} + +static lws_filefd_type +_lws_plat_file_open(struct lws *wsi, const char *filename, + unsigned long *filelen, int flags) +{ + return 0; +} + +static int +_lws_plat_file_close(struct lws *wsi, lws_filefd_type fd) +{ + return 0; +} + +unsigned long +_lws_plat_file_seek_cur(struct lws *wsi, lws_filefd_type fd, long offset) +{ + return 0; +} + +static int +_lws_plat_file_read(struct lws *wsi, lws_filefd_type fd, unsigned long *amount, + unsigned char *buf, unsigned long len) +{ + + return 0; +} + +static int +_lws_plat_file_write(struct lws *wsi, lws_filefd_type fd, unsigned long *amount, + unsigned char *buf, unsigned long len) +{ + + return 0; +} + + +LWS_VISIBLE int +lws_plat_init(struct lws_context *context, + struct lws_context_creation_info *info) +{ + /* master context has the global fd lookup array */ + context->lws_lookup = lws_zalloc(sizeof(struct lws *) * + context->max_fds); + if (context->lws_lookup == NULL) { + lwsl_err("OOM on lws_lookup array for %d connections\n", + context->max_fds); + return 1; + } + + lwsl_notice(" mem: platform fd map: %5u bytes\n", + sizeof(struct lws *) * context->max_fds); + + context->fops.open = _lws_plat_file_open; + context->fops.close = _lws_plat_file_close; + context->fops.seek_cur = _lws_plat_file_seek_cur; + context->fops.read = _lws_plat_file_read; + context->fops.write = _lws_plat_file_write; + +#ifdef LWS_WITH_PLUGINS + if (info->plugin_dirs) + lws_plat_plugins_init(context, info->plugin_dirs); +#endif + + return 0; +} diff --git a/lib/service.c b/lib/service.c index 7f5aa7a3..076293b0 100644 --- a/lib/service.c +++ b/lib/service.c @@ -366,10 +366,10 @@ lws_service_timeout_check(struct lws *wsi, unsigned int sec) /* no need to log normal idle keepalive timeout */ if (wsi->pending_timeout != PENDING_TIMEOUT_HTTP_KEEPALIVE_IDLE) - lwsl_notice("wsi %p: TIMEDOUT WAITING on %d (did hdr %d, ah %p, wl %d, pfd events %d)\n", + lwsl_notice("wsi %p: TIMEDOUT WAITING on %d (did hdr %d, ah %p, wl %d, pfd events %d) %llu vs %llu\n", (void *)wsi, wsi->pending_timeout, wsi->hdr_parsing_completed, wsi->u.hdr.ah, - pt->ah_wait_list_length, n); + pt->ah_wait_list_length, n, (unsigned long long)sec, (unsigned long long)wsi->pending_timeout_limit); //#endif /* * Since he failed a timeout, he already had a chance to do @@ -546,8 +546,10 @@ lws_http_client_read(struct lws *wsi, char **buf, int *len) /* allow the source to signal he has data again next time */ lws_change_pollfd(wsi, 0, LWS_POLLIN); - if (rlen == LWS_SSL_CAPABLE_ERROR) + if (rlen == LWS_SSL_CAPABLE_ERROR) { + lwsl_notice("%s: SSL capable error\n", __func__); return -1; + } if (rlen <= 0) return 0; @@ -568,14 +570,18 @@ spin_chunks: break; } n = char_to_hex((*buf)[0]); - if (n < 0) + if (n < 0) { + lwsl_debug("chunking failure\n"); return -1; + } wsi->chunk_remaining <<= 4; wsi->chunk_remaining |= n; break; case ELCP_CR: - if ((*buf)[0] != '\x0a') + if ((*buf)[0] != '\x0a') { + lwsl_debug("chunking failure\n"); return -1; + } wsi->chunk_parser = ELCP_CONTENT; lwsl_info("chunk %d\n", wsi->chunk_remaining); if (wsi->chunk_remaining) @@ -587,8 +593,11 @@ spin_chunks: break; case ELCP_POST_CR: - if ((*buf)[0] != '\x0d') + if ((*buf)[0] != '\x0d') { + lwsl_debug("chunking failure\n"); + return -1; + } wsi->chunk_parser = ELCP_POST_LF; break; @@ -626,8 +635,11 @@ spin_chunks: #endif if (user_callback_handle_rxflow(wsi->protocol->callback, wsi, LWS_CALLBACK_RECEIVE_CLIENT_HTTP_READ, - wsi->user_space, *buf, n)) + wsi->user_space, *buf, n)) { + lwsl_debug("%s: LWS_CALLBACK_RECEIVE_CLIENT_HTTP_READ returned -1\n", __func__); + return -1; + } if (wsi->chunked && wsi->chunk_remaining) { (*buf) += n; @@ -652,11 +664,15 @@ spin_chunks: completed: if (user_callback_handle_rxflow(wsi->protocol->callback, wsi, LWS_CALLBACK_COMPLETED_CLIENT_HTTP, - wsi->user_space, NULL, 0)) + wsi->user_space, NULL, 0)) { + lwsl_debug("Completed call returned -1\n"); return -1; + } - if (lws_http_transaction_completed_client(wsi)) + if (lws_http_transaction_completed_client(wsi)) { + lwsl_notice("%s: transaction completed says -1\n", __func__); return -1; + } return 0; } @@ -695,12 +711,14 @@ lws_service_fd_tsi(struct lws_context *context, struct lws_pollfd *pollfd, int t lws_plat_service_periodic(context); /* retire unused deprecated context */ +#ifndef LWS_PLAT_OPTEE #if LWS_POSIX && !defined(_WIN32) if (context->deprecated && !context->count_wsi_allocated) { lwsl_notice("%s: ending deprecated context\n", __func__); kill(getpid(), SIGINT); return 0; } +#endif #endif /* global timeout check once per second */ @@ -992,8 +1010,10 @@ drain: if (user_callback_handle_rxflow( wsi->protocol->callback, wsi, LWS_CALLBACK_RECEIVE_CLIENT_HTTP, - wsi->user_space, NULL, 0)) + wsi->user_space, NULL, 0)) { + lwsl_debug("LWS_CALLBACK_RECEIVE_CLIENT_HTTP closed it\n"); goto close_and_handled; + } } #endif /* @@ -1113,8 +1133,10 @@ drain: break; #else if ((pollfd->revents & LWS_POLLOUT) && - lws_handle_POLLOUT_event(wsi, pollfd)) + lws_handle_POLLOUT_event(wsi, pollfd)) { + lwsl_debug("POLLOUT event closed it\n"); goto close_and_handled; + } n = lws_client_socket_service(context, wsi, pollfd); if (n) diff --git a/lib/ssl-client.c b/lib/ssl-client.c index 0ce654bd..6c53384e 100644 --- a/lib/ssl-client.c +++ b/lib/ssl-client.c @@ -216,6 +216,7 @@ lws_ssl_client_connect1(struct lws *wsi) n = SSL_connect(wsi->ssl); #endif #endif + lws_latency(context, wsi, "SSL_connect LWSCM_WSCL_ISSUE_HANDSHAKE", n, n > 0); @@ -245,6 +246,17 @@ some_wait: return 0; /* no error */ } + + { + struct lws_context_per_thread *pt = &context->pt[(int)wsi->tsi]; + char *p = (char *)&pt->serv_buf[0]; + char *sb = p; + + lwsl_err("ssl hs1 error, X509_V_ERR = %d: %s\n", + n, ERR_error_string(n, sb)); + lws_ssl_elaborate_error(); + } + n = -1; } @@ -298,6 +310,8 @@ lws_ssl_client_connect2(struct lws *wsi) n = SSL_connect(wsi->ssl); #endif #endif + lwsl_notice("%s: SSL_connect says %d\n", __func__, n); + lws_latency(context, wsi, "SSL_connect LWSCM_WSCL_WAITING_SSL", n, n > 0); @@ -305,6 +319,8 @@ lws_ssl_client_connect2(struct lws *wsi) n = lws_ssl_get_error(wsi, n); if (n == SSL_ERROR_WANT_READ) { + lwsl_info("SSL_connect WANT_READ... retrying\n"); + wsi->mode = LWSCM_WSCL_WAITING_SSL; return 0; /* no error */ @@ -330,6 +346,7 @@ lws_ssl_client_connect2(struct lws *wsi) return 0; /* no error */ } + n = -1; } @@ -376,6 +393,8 @@ lws_ssl_client_connect2(struct lws *wsi) n == X509_V_ERR_CERT_HAS_EXPIRED) && wsi->use_ssl & LCCSCF_ALLOW_EXPIRED) { lwsl_notice("accepting expired certificate\n"); + } else if (n == X509_V_ERR_CERT_NOT_YET_VALID) { + lwsl_notice("Cert is from the future... probably our clock... accepting...\n"); } else { lwsl_err("server's cert didn't look good, X509_V_ERR = %d: %s\n", n, ERR_error_string(n, sb)); @@ -468,11 +487,13 @@ int lws_context_init_client_ssl(struct lws_context_creation_info *info, } else if (!SSL_CTX_load_verify_locations( vhost->ssl_client_ctx, info->ssl_ca_filepath, - NULL)) + NULL)) { lwsl_err( "Unable to load SSL Client certs " "file from %s -- client ssl isn't " "going to work", info->ssl_ca_filepath); + lws_ssl_elaborate_error(); + } else lwsl_info("loaded ssl_ca_filepath\n"); @@ -483,29 +504,31 @@ int lws_context_init_client_ssl(struct lws_context_creation_info *info, /* support for client-side certificate authentication */ if (info->ssl_cert_filepath) { + lwsl_notice("%s: doing cert filepath\n", __func__); n = SSL_CTX_use_certificate_chain_file(vhost->ssl_client_ctx, info->ssl_cert_filepath); - if (n != 1) { - lwsl_err("problem getting cert '%s' %lu: %s\n", - info->ssl_cert_filepath, - ERR_get_error(), - ERR_error_string(ERR_get_error(), - (char *)vhost->context->pt[0].serv_buf)); + if (n < 1) { + lwsl_err("problem %d getting cert '%s'\n", n, + info->ssl_cert_filepath); + lws_ssl_elaborate_error(); return 1; } + lwsl_notice("Loaded client cert %s\n", info->ssl_cert_filepath); } + if (info->ssl_private_key_filepath) { + lwsl_notice("%s: doing private key filepath\n", __func__); lws_ssl_bind_passphrase(vhost->ssl_client_ctx, info); /* set the private key from KeyFile */ if (SSL_CTX_use_PrivateKey_file(vhost->ssl_client_ctx, info->ssl_private_key_filepath, SSL_FILETYPE_PEM) != 1) { - lwsl_err("use_PrivateKey_file '%s' %lu: %s\n", - info->ssl_private_key_filepath, - ERR_get_error(), - ERR_error_string(ERR_get_error(), - (char *)vhost->context->pt[0].serv_buf)); + lwsl_err("use_PrivateKey_file '%s'\n", + info->ssl_private_key_filepath); + lws_ssl_elaborate_error(); return 1; } + lwsl_notice("Loaded client cert private key %s\n", + info->ssl_private_key_filepath); /* verify private key */ if (!SSL_CTX_check_private_key(vhost->ssl_client_ctx)) { diff --git a/lib/ssl.c b/lib/ssl.c index d66875c7..613d835b 100644 --- a/lib/ssl.c +++ b/lib/ssl.c @@ -103,8 +103,12 @@ char* lws_ssl_get_error_string(int status, int ret, char *buf, size_t len) { snprintf(buf, len, "SSL_ERROR_SYSCALL: EOF"); return buf; case -1: - snprintf(buf, len, "SSL_ERROR_SYSCALL: %s", strerror(errno)); - return buf; +#ifndef LWS_PLAT_OPTEE + snprintf(buf, len, "SSL_ERROR_SYSCALL: %s", strerror(errno)); +#else + snprintf(buf, len, "SSL_ERROR_SYSCALL: %d", errno); +#endif + return buf; default: return strncpy(buf, "SSL_ERROR_SYSCALL", len); } @@ -186,10 +190,14 @@ lws_context_init_ssl_library(struct lws_context_creation_info *info) #else #if defined(LWS_USE_MBEDTLS) lwsl_notice(" Compiled with mbedTLS support\n"); +#else +#if defined(LWS_USE_BORINGSSL) + lwsl_notice(" Compiled with BoringSSL support\n"); #else lwsl_notice(" Compiled with OpenSSL support\n"); #endif #endif +#endif #endif if (!lws_check_opt(info->options, LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT)) { @@ -203,6 +211,9 @@ lws_context_init_ssl_library(struct lws_context_creation_info *info) #else #if defined(LWS_USE_MBEDTLS) #else + + lwsl_notice("Doing SSL library init\n"); + SSL_library_init(); OpenSSL_add_all_algorithms(); @@ -324,14 +335,23 @@ lws_ssl_capable_read(struct lws *wsi, unsigned char *buf, int len) #endif /* manpage: returning 0 means connection shut down */ - if (!n) + if (!n) { + lwsl_err("%s failed: %s\n",__func__, + ERR_error_string(lws_ssl_get_error(wsi, 0), NULL)); + lws_decode_ssl_error(); + return LWS_SSL_CAPABLE_ERROR; + } if (n < 0) { n = lws_ssl_get_error(wsi, n); if (n == SSL_ERROR_WANT_READ || n == SSL_ERROR_WANT_WRITE) return LWS_SSL_CAPABLE_MORE_SERVICE; + lwsl_err("%s failed2: %s\n",__func__, + ERR_error_string(lws_ssl_get_error(wsi, 0), NULL)); + lws_decode_ssl_error(); + return LWS_SSL_CAPABLE_ERROR; } @@ -424,6 +444,10 @@ lws_ssl_capable_write(struct lws *wsi, unsigned char *buf, int len) lws_set_blocking_send(wsi); return LWS_SSL_CAPABLE_MORE_SERVICE; } + lwsl_err("%s failed: %s\n",__func__, + ERR_error_string(lws_ssl_get_error(wsi, 0), NULL)); + lws_decode_ssl_error(); + return LWS_SSL_CAPABLE_ERROR; } diff --git a/lws_config.h.in b/lws_config.h.in index 6b0f5b24..97fec5cd 100644 --- a/lws_config.h.in +++ b/lws_config.h.in @@ -15,6 +15,7 @@ /* Also define to 1 (in addition to USE_WOLFSSL) when using the (older) CyaSSL library */ #cmakedefine USE_OLD_CYASSL +#cmakedefine LWS_USE_BORINGSSL #cmakedefine LWS_USE_MBEDTLS #cmakedefine LWS_USE_POLARSSL @@ -117,4 +118,8 @@ /* SMTP */ #cmakedefine LWS_WITH_SMTP +/* OPTEE */ +#cmakedefine LWS_PLAT_OPTEE + + ${LWS_SIZEOFPTR_CODE}