From: Andy Green Date: Thu, 10 Jan 2013 11:50:35 +0000 (+0800) Subject: introduce logging api and convert all library output to use it X-Git-Tag: accepted/2.0/20130307.220733~283 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=de9e4a872b7d94ca4d69b83244741781058c1f14;p=profile%2Fivi%2Flibwebsockets.git introduce logging api and convert all library output to use it - multiple debug context calls lwsl_ err, warn, debug, parser, ext, client - api added to set which contexts output to stderr using a bitfield log_level - --disable-debug on configure removes all code that is not err or warn severity - err and warn contexts always output to stderr unless disabled by log_level - err and warn enabled by default in log_level Signed-off-by: Andy Green --- diff --git a/configure.ac b/configure.ac index ab0e639..8afdd4d 100644 --- a/configure.ac +++ b/configure.ac @@ -109,6 +109,18 @@ AC_ARG_ENABLE(noping, AM_CONDITIONAL(NOPING, test x$noping = xyes) +# +# +# +AC_ARG_ENABLE(debug, + [ --disable-debug Stops debug-related code from even being compiled in, useful for best speed], + [ disable_debug=yes + ]) + +if test "x$disable_debug" != "xyes" ; then +CFLAGS="$CFLAGS -D_DEBUG" +fi +AM_CONDITIONAL(DISABLE_DEBUG, test x$disable_debug = xyes) # Checks for header files. diff --git a/lib/base64-decode.c b/lib/base64-decode.c index 95d4ba4..3baab3b 100644 --- a/lib/base64-decode.c +++ b/lib/base64-decode.c @@ -41,6 +41,7 @@ #include #include +#include static const char encode[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" "abcdefghijklmnopqrstuvwxyz0123456789+/"; @@ -169,7 +170,7 @@ lws_b64_selftest(void) n = lws_b64_encode_string(plaintext[test], strlen(plaintext[test]), buf, sizeof buf); if (n != strlen(coded[test]) || strcmp(buf, coded[test])) { - fprintf(stderr, "Failed lws_b64 encode selftest " + lwsl_err("Failed lws_b64 encode selftest " "%d result '%s' %d\n", test, buf, n); return -1; } @@ -178,7 +179,7 @@ lws_b64_selftest(void) n = lws_b64_decode_string(coded[test], buf, sizeof buf); if (n != strlen(plaintext[test]) || strcmp(buf, plaintext[test])) { - fprintf(stderr, "Failed lws_b64 decode selftest " + lwsl_err("Failed lws_b64 decode selftest " "%d result '%s' %d\n", test, buf, n); return -1; } diff --git a/lib/client-handshake.c b/lib/client-handshake.c index 751edaa..15c4b13 100644 --- a/lib/client-handshake.c +++ b/lib/client-handshake.c @@ -16,7 +16,7 @@ struct libwebsocket *__libwebsocket_client_connect_2( struct protoent *tcp_proto; #endif - debug("__libwebsocket_client_connect_2\n"); + lwsl_client("__libwebsocket_client_connect_2\n"); wsi->candidate_children_list = NULL; @@ -41,19 +41,18 @@ struct libwebsocket *__libwebsocket_client_connect_2( * prepare the actual connection (to the proxy, if any) */ - debug("__libwebsocket_client_connect_2: address %s", wsi->c_address); + lwsl_client("__libwebsocket_client_connect_2: address %s", wsi->c_address); server_hostent = gethostbyname(wsi->c_address); if (server_hostent == NULL) { - fprintf(stderr, "Unable to get host name from %s\n", - wsi->c_address); + lwsl_err("Unable to get host name from %s\n", wsi->c_address); goto oom4; } wsi->sock = socket(AF_INET, SOCK_STREAM, 0); if (wsi->sock < 0) { - fprintf(stderr, "Unable to open socket\n"); + lwsl_warn("Unable to open socket\n"); goto oom4; } @@ -79,7 +78,7 @@ struct libwebsocket *__libwebsocket_client_connect_2( if (connect(wsi->sock, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) == -1) { - fprintf(stderr, "Connect failed\n"); + lwsl_debug("Connect failed\n"); #ifdef WIN32 closesocket(wsi->sock); #else @@ -88,7 +87,7 @@ struct libwebsocket *__libwebsocket_client_connect_2( goto oom4; } - debug("connected\n"); + lwsl_client("connected\n"); /* into fd -> wsi hashtable */ @@ -116,7 +115,7 @@ struct libwebsocket *__libwebsocket_client_connect_2( #else close(wsi->sock); #endif - fprintf(stderr, "ERROR writing to proxy socket\n"); + lwsl_debug("ERROR writing to proxy socket\n"); goto bail1; } @@ -202,7 +201,7 @@ libwebsocket_client_connect(struct libwebsocket_context *context, int handled; #ifndef LWS_OPENSSL_SUPPORT if (ssl_connection) { - fprintf(stderr, "libwebsockets not configured for ssl\n"); + lwsl_err("libwebsockets not configured for ssl\n"); return NULL; } #endif @@ -298,8 +297,7 @@ libwebsocket_client_connect(struct libwebsocket_context *context, wsi->xor_mask = xor_mask_05; break; default: - fprintf(stderr, - "Client ietf version %d not supported\n", + lwsl_parser("Client ietf version %d not supported\n", wsi->ietf_spec_revision); goto oom4; } @@ -337,7 +335,7 @@ libwebsocket_client_connect(struct libwebsocket_context *context, } if (handled) { - debug("libwebsocket_client_connect: ext handling conn\n"); + lwsl_client("libwebsocket_client_connect: ext handling conn\n"); libwebsocket_set_timeout(wsi, PENDING_TIMEOUT_AWAITING_EXTENSION_CONNECT_RESPONSE, AWAITING_TIMEOUT); @@ -346,7 +344,7 @@ libwebsocket_client_connect(struct libwebsocket_context *context, return wsi; } - debug("libwebsocket_client_connect: direct conn\n"); + lwsl_client("libwebsocket_client_connect: direct conn\n"); return __libwebsocket_client_connect_2(context, wsi); diff --git a/lib/extension-deflate-frame.c b/lib/extension-deflate-frame.c index 8ae5171..c8ba423 100644 --- a/lib/extension-deflate-frame.c +++ b/lib/extension-deflate-frame.c @@ -36,7 +36,7 @@ int lws_extension_callback_deflate_frame( conn->zs_in.opaque = conn->zs_out.opaque = Z_NULL; n = inflateInit2(&conn->zs_in, -LWS_ZLIB_WINDOW_BITS); if (n != Z_OK) { - fprintf(stderr, "deflateInit returned %d", n); + lwsl_ext("deflateInit returned %d", n); return 1; } n = deflateInit2(&conn->zs_out, @@ -47,7 +47,7 @@ int lws_extension_callback_deflate_frame( -LWS_ZLIB_WINDOW_BITS, LWS_ZLIB_MEMLEVEL, Z_DEFAULT_STRATEGY); if (n != Z_OK) { - fprintf(stderr, "deflateInit2 returned %d", n); + lwsl_ext("deflateInit2 returned %d", n); return 1; } conn->buf_pre_used = 0; @@ -68,10 +68,10 @@ int lws_extension_callback_deflate_frame( LWS_SEND_BUFFER_POST_PADDING); if (!conn->buf_out) goto bail; - fprintf(stderr, "zlibs constructed\n"); + lwsl_ext("zlibs constructed\n"); break; bail: - fprintf(stderr, "Out of mem\n"); + lwsl_err("Out of mem\n"); (void)inflateEnd(&conn->zs_in); (void)deflateEnd(&conn->zs_out); return -1; @@ -88,7 +88,7 @@ bail: conn->compressed_out = 0; (void)inflateEnd(&conn->zs_in); (void)deflateEnd(&conn->zs_out); - fprintf(stderr, "zlibs destructed\n"); + lwsl_ext("zlibs destructed\n"); break; case LWS_EXT_CALLBACK_PAYLOAD_RX: @@ -113,7 +113,7 @@ bail: conn->buf_pre = (unsigned char *)malloc(total_payload + 4); if (!conn->buf_pre) { - fprintf(stderr, "Out of memory\n"); + lwsl_err("Out of memory\n"); return -1; } } @@ -162,7 +162,7 @@ bail: * screwed.. close the connection... we will get a * destroy callback to take care of closing nicely */ - fprintf(stderr, "zlib error inflate %d: %s", + lwsl_ext("zlib error inflate %d: %s", n, conn->zs_in.msg); return -1; } @@ -196,7 +196,7 @@ bail: * screwed.. close the connection... we will get a * destroy callback to take care of closing nicely */ - fprintf(stderr, "zlib error deflate"); + lwsl_ext("zlib error deflate"); return -1; } @@ -216,7 +216,7 @@ bail: conn->buf_out_length + LWS_SEND_BUFFER_POST_PADDING); if (!new_buf) { - fprintf(stderr, "Out of memory\n"); + lwsl_err("Out of memory\n"); return -1; } memcpy(new_buf + LWS_SEND_BUFFER_PRE_PADDING, diff --git a/lib/extension-deflate-stream.c b/lib/extension-deflate-stream.c index 17aee49..c54a0ab 100644 --- a/lib/extension-deflate-stream.c +++ b/lib/extension-deflate-stream.c @@ -32,7 +32,7 @@ int lws_extension_callback_deflate_stream( conn->zs_in.opaque = conn->zs_out.opaque = Z_NULL; n = inflateInit2(&conn->zs_in, -LWS_ZLIB_WINDOW_BITS); if (n != Z_OK) { - fprintf(stderr, "deflateInit returned %d\n", n); + lwsl_err("deflateInit returned %d\n", n); return 1; } n = deflateInit2(&conn->zs_out, @@ -40,17 +40,17 @@ int lws_extension_callback_deflate_stream( -LWS_ZLIB_WINDOW_BITS, LWS_ZLIB_MEMLEVEL, Z_DEFAULT_STRATEGY); if (n != Z_OK) { - fprintf(stderr, "deflateInit returned %d\n", n); + lwsl_err("deflateInit returned %d\n", n); return 1; } - debug("zlibs constructed\n"); + lwsl_ext("zlibs constructed\n"); conn->remaining_in = 0; break; case LWS_EXT_CALLBACK_DESTROY: (void)inflateEnd(&conn->zs_in); (void)deflateEnd(&conn->zs_out); - debug("zlibs destructed\n"); + lwsl_ext("zlibs destructed\n"); break; case LWS_EXT_CALLBACK_PACKET_RX_PREPARSE: @@ -84,7 +84,7 @@ int lws_extension_callback_deflate_stream( * screwed.. close the connection... we will get a * destroy callback to take care of closing nicely */ - fprintf(stderr, "zlib error inflate %d\n", n); + lwsl_err("zlib error inflate %d\n", n); return -1; } @@ -136,7 +136,7 @@ int lws_extension_callback_deflate_stream( * screwed.. close the connection... we will get a * destroy callback to take care of closing nicely */ - fprintf(stderr, "zlib error deflate\n"); + lwsl_ext("zlib error deflate\n"); return -1; } diff --git a/lib/extension-x-google-mux.c b/lib/extension-x-google-mux.c index f1e7dfd..2be0d80 100644 --- a/lib/extension-x-google-mux.c +++ b/lib/extension-x-google-mux.c @@ -154,7 +154,7 @@ lws_extension_x_google_mux_parser(struct libwebsocket_context *context, int n; void *v; -// fprintf(stderr, "XRX: %02X %d %d\n", c, conn->state, conn->length); +// lwsl_debug("XRX: %02X %d %d\n", c, conn->state, conn->length); /* * [ ] @@ -164,7 +164,7 @@ lws_extension_x_google_mux_parser(struct libwebsocket_context *context, switch (conn->state) { case LWS_EXT_XGM_STATE__MUX_BLOCK_1: -// fprintf(stderr, "LWS_EXT_XGM_STATE__MUX_BLOCK_1: opc=%d channel=%d\n", c & 7, c >> 3); +// lwsl_ext("LWS_EXT_XGM_STATE__MUX_BLOCK_1: opc=%d channel=%d\n", c & 7, c >> 3); conn->block_subopcode = (enum lws_ext_x_goole_mux__mux_opcodes)(c & 7); conn->block_subchannel = (c >> 3) & 0x1f; conn->ignore_cmd = 0; @@ -184,7 +184,7 @@ lws_extension_x_google_mux_parser(struct libwebsocket_context *context, conn->block_subchannel |= c; interpret: -// fprintf(stderr, "LWS_EXT_XGM_STATE__MUX_BLOCK_3: subchannel=%d\n", conn->block_subchannel); +// lwsl_ext("LWS_EXT_XGM_STATE__MUX_BLOCK_3: subchannel=%d\n", conn->block_subchannel); ongoing_subchannel = conn->block_subchannel; /* @@ -229,7 +229,7 @@ interpret: conn->state = LWS_EXT_XGM_STATE__FLOWCONTROL_1; break; default: - fprintf(stderr, "xgm: unknown subopcode\n"); + lwsl_ext("xgm: unknown subopcode\n"); return -1; } break; @@ -285,14 +285,14 @@ interpret: if (conn->block_subchannel == 0 || conn->block_subchannel >= (sizeof(conn->wsi_children) / sizeof(conn->wsi_children[0]))) { - fprintf(stderr, "Illegal subchannel %d in " + lwsl_ext("Illegal subchannel %d in " "LWS_EXT_XGM_STATE__ADDCHANNEL_HEADERS, ignoring", conn->block_subchannel); conn->ignore_cmd = 1; } if (conn->block_subchannel == 1 && !conn->original_ch1_closed) { - fprintf(stderr, "illegal request to add ch1 when it's still live, ignoring\n"); + lwsl_ext("illegal request to add ch1 when it's still live, ignoring\n"); conn->ignore_cmd = 1; } @@ -362,7 +362,7 @@ interpret: wsi_child->user_space = malloc( wsi_child->protocol->per_session_data_size); if (wsi_child->user_space == NULL) { - fprintf(stderr, "Out of memory for " + lwsl_ext("Out of memory for " "conn user space\n"); goto bail2; } @@ -447,7 +447,7 @@ bail2: child_conn = (struct lws_ext_x_google_mux_conn *)lws_get_extension_user_matching_ext(wsi_child, this_ext); if (!child_conn) { - fprintf(stderr, "wsi_child %p has no child conn!", (void *)wsi_child); + lwsl_ext("wsi_child %p has no child conn!", (void *)wsi_child); break; } child_conn->wsi_parent = wsi; @@ -468,7 +468,7 @@ bail2: wsi_child->user_space = malloc( wsi_child->protocol->per_session_data_size); if (wsi_child->user_space == NULL) { - fprintf(stderr, "Out of memory for " + lwsl_err("Out of memory for " "conn user space\n"); break; } @@ -519,7 +519,7 @@ bail2: case LWS_EXT_XGM_STATE__DATA: -// fprintf(stderr, "LWS_EXT_XGM_STATE__DATA in\n"); +// lwsl_debug("LWS_EXT_XGM_STATE__DATA in\n"); /* * we have cooked websocket frame content following just like @@ -533,15 +533,15 @@ bail2: * afterwards */ if (conn->block_subchannel - MUX_REAL_CHILD_INDEX_OFFSET >= conn->highest_child_subchannel) { - fprintf(stderr, "Illegal subchannel %d\n", conn->block_subchannel); + lwsl_ext("Illegal subchannel %d\n", conn->block_subchannel); return -1; } - // fprintf(stderr, "LWS_EXT_XGM_STATE__DATA: ch %d\n", conn->block_subchannel); + // lwsl_debug("LWS_EXT_XGM_STATE__DATA: ch %d\n", conn->block_subchannel); if (conn->block_subchannel == 1) { if (conn->original_ch1_closed) { - fprintf(stderr, "data sent to closed ch1\n"); + lwsl_debug("data sent to closed ch1\n"); return -1; } wsi_child = wsi; @@ -549,7 +549,7 @@ bail2: wsi_child = conn->wsi_children[conn->block_subchannel - MUX_REAL_CHILD_INDEX_OFFSET]; if (!wsi_child) { - fprintf(stderr, "Bad subchannel %d\n", conn->block_subchannel); + lwsl_ext("Bad subchannel %d\n", conn->block_subchannel); return -1; } @@ -561,7 +561,7 @@ bail2: case LWS_CONNMODE_WS_CLIENT_ISSUE_HANDSHAKE: case LWS_CONNMODE_WS_CLIENT_WAITING_SERVER_REPLY: case LWS_CONNMODE_WS_CLIENT: -// fprintf(stderr, " client\n"); +// lwsl_ext(" client\n"); if (libwebsocket_client_rx_sm(wsi_child, c) < 0) { libwebsocket_close_and_free_session( context, @@ -574,7 +574,7 @@ bail2: /* server is receiving from client */ default: -// fprintf(stderr, " server\n"); +// lwsl_ext(" server\n"); if (libwebsocket_rx_sm(wsi_child, c) < 0) { muxdebug("probs\n"); libwebsocket_close_and_free_session( @@ -726,7 +726,7 @@ int lws_extension_callback_x_google_mux( if (parent_conn->highest_child_subchannel >= (sizeof(parent_conn->wsi_children) / sizeof(parent_conn->wsi_children[0]))) { - fprintf(stderr, "Can't add any more children\n"); + lwsl_ext("Can't add any more children\n"); continue; } /* @@ -786,7 +786,7 @@ int lws_extension_callback_x_google_mux( conn->original_ch1_closed = 1; - fprintf(stderr, "original mux parent channel closing\n"); + lwsl_ext("original mux parent channel closing\n"); parent_conn = conn; } else { @@ -811,14 +811,14 @@ int lws_extension_callback_x_google_mux( /* if he has children, don't let him close for real! */ if (done) { - fprintf(stderr, "VETO closure\n"); + lwsl_ext("VETO closure\n"); return 1; } /* no children, ch1 is closed, let him destroy himself */ if (conn->subchannel == 1) - fprintf(stderr, "ALLOW closure of mux parent\n"); + lwsl_ext("ALLOW closure of mux parent\n"); break; @@ -837,7 +837,7 @@ int lws_extension_callback_x_google_mux( conn->original_ch1_closed = 1; - fprintf(stderr, "original mux parent channel closing\n"); + lwsl_ext("original mux parent channel closing\n"); parent_conn = conn; wsi_parent = wsi; @@ -1023,7 +1023,7 @@ handle_additions: */ if (conn->original_ch1_closed) { - fprintf(stderr, "Trying to send on dead original ch1\n"); + lwsl_ext("Trying to send on dead original ch1\n"); return 0; } @@ -1038,7 +1038,7 @@ handle_additions: */ if (!conn->wsi_parent) { - // fprintf(stderr, "conn %p has no parent\n", (void *)conn); + // lwsl_ext("conn %p has no parent\n", (void *)conn); return 0; } @@ -1058,7 +1058,7 @@ handle_additions: */ if (!parent_conn->sticky_mux_used) { - // fprintf(stderr, "parent in singular mode\n"); + // lwsl_ext("parent in singular mode\n"); return 0; } } diff --git a/lib/handshake.c b/lib/handshake.c index f3918b5..a34d032 100644 --- a/lib/handshake.c +++ b/lib/handshake.c @@ -65,7 +65,7 @@ interpret_key(const char *key, unsigned long *result) } if (rem) { - fprintf(stderr, "nonzero handshake remainder\n"); + lwsl_warn("nonzero handshake remainder\n"); return -1; } @@ -111,7 +111,7 @@ handshake_00(struct libwebsocket_context *context, struct libwebsocket *wsi) wsi->utf8_token[WSI_TOKEN_GET_URI].token_len + wsi->utf8_token[WSI_TOKEN_PROTOCOL].token_len); if (!response) { - fprintf(stderr, "Out of memory for response buffer\n"); + lwsl_err("Out of memory for response buffer\n"); goto bail; } @@ -174,14 +174,14 @@ handshake_00(struct libwebsocket_context *context, struct libwebsocket *wsi) /* it's complete: go ahead and send it */ - _debug("issuing response packet %d len\n", (int)(p - response)); + lwsl_parser("issuing response packet %d len\n", (int)(p - response)); #ifdef _DEBUG fwrite(response, 1, p - response, stderr); #endif n = libwebsocket_write(wsi, (unsigned char *)response, p - response, LWS_WRITE_HTTP); if (n < 0) { - fprintf(stderr, "ERROR writing to socket"); + lwsl_debug("ERROR writing to socket"); goto bail; } @@ -233,14 +233,14 @@ handshake_0405(struct libwebsocket_context *context, struct libwebsocket *wsi) if (!wsi->utf8_token[WSI_TOKEN_HOST].token_len || !wsi->utf8_token[WSI_TOKEN_KEY].token_len) { - _debug("handshake_04 missing pieces\n"); + lwsl_parser("handshake_04 missing pieces\n"); /* completed header processing, but missing some bits */ goto bail; } if (wsi->utf8_token[WSI_TOKEN_KEY].token_len >= MAX_WEBSOCKET_04_KEY_LEN) { - fprintf(stderr, "Client sent handshake key longer " + lwsl_warn("Client sent handshake key longer " "than max supported %d\n", MAX_WEBSOCKET_04_KEY_LEN); goto bail; } @@ -256,7 +256,7 @@ handshake_0405(struct libwebsocket_context *context, struct libwebsocket *wsi) accept_len = lws_b64_encode_string((char *)hash, 20, accept_buf, sizeof accept_buf); if (accept_len < 0) { - fprintf(stderr, "Base64 encoded hash too long\n"); + lwsl_warn("Base64 encoded hash too long\n"); goto bail; } @@ -274,7 +274,7 @@ handshake_0405(struct libwebsocket_context *context, struct libwebsocket *wsi) wsi->utf8_token[WSI_TOKEN_CONNECTION].token_len + wsi->utf8_token[WSI_TOKEN_PROTOCOL].token_len); if (!response) { - fprintf(stderr, "Out of memory for response buffer\n"); + lwsl_err("Out of memory for response buffer\n"); goto bail; } @@ -294,7 +294,7 @@ handshake_0405(struct libwebsocket_context *context, struct libwebsocket *wsi) n = libwebsockets_get_random(wsi->protocol->owning_server, hash, 16); if (n != 16) { - fprintf(stderr, "Unable to read random device %s %d\n", + lwsl_err("Unable to read random device %s %d\n", SYSTEM_RANDOM_FILEPATH, n); if (wsi->user_space) free(wsi->user_space); @@ -306,7 +306,7 @@ handshake_0405(struct libwebsocket_context *context, struct libwebsocket *wsi) nonce_len = lws_b64_encode_string((const char *)hash, 16, nonce_buf, sizeof nonce_buf); if (nonce_len < 0) { - fprintf(stderr, "Failed to base 64 encode the nonce\n"); + lwsl_err("Failed to base 64 encode the nonce\n"); if (wsi->user_space) free(wsi->user_space); goto bail; @@ -336,7 +336,7 @@ handshake_0405(struct libwebsocket_context *context, struct libwebsocket *wsi) */ c = wsi->utf8_token[WSI_TOKEN_EXTENSIONS].token; - debug("wsi->utf8_token[WSI_TOKEN_EXTENSIONS].token = %s\n", + lwsl_parser("wsi->utf8_token[WSI_TOKEN_EXTENSIONS].token = %s\n", wsi->utf8_token[WSI_TOKEN_EXTENSIONS].token); wsi->count_active_extensions = 0; n = 0; @@ -425,7 +425,7 @@ handshake_0405(struct libwebsocket_context *context, struct libwebsocket *wsi) wsi->count_active_extensions], NULL, 0); wsi->count_active_extensions++; - debug("wsi->count_active_extensions <- %d", + lwsl_parser("wsi->count_active_extensions <- %d", wsi->count_active_extensions); ext++; @@ -469,14 +469,14 @@ handshake_0405(struct libwebsocket_context *context, struct libwebsocket *wsi) /* okay send the handshake response accepting the connection */ - _debug("issuing response packet %d len\n", (int)(p - response)); + lwsl_parser("issuing response packet %d len\n", (int)(p - response)); #ifdef DEBUG fwrite(response, 1, p - response, stderr); #endif n = libwebsocket_write(wsi, (unsigned char *)response, p - response, LWS_WRITE_HTTP); if (n < 0) { - fprintf(stderr, "ERROR writing to socket"); + lwsl_debug("ERROR writing to socket"); goto bail; } @@ -549,9 +549,9 @@ libwebsocket_read(struct libwebsocket_context *context, /* fallthru */ case WSI_STATE_HTTP_HEADERS: - _debug("issuing %d bytes to parser\n", (int)len); + lwsl_parser("issuing %d bytes to parser\n", (int)len); #ifdef _DEBUG - fwrite(buf, 1, len, stderr); + //fwrite(buf, 1, len, stderr); #endif switch (wsi->mode) { @@ -576,9 +576,9 @@ libwebsocket_read(struct libwebsocket_context *context, if (wsi->parser_state != WSI_PARSING_COMPLETE) break; - debug("seem to be serving, mode is %d\n", wsi->mode); + lwsl_parser("seem to be serving, mode is %d\n", wsi->mode); - debug("libwebsocket_parse sees parsing complete\n"); + lwsl_parser("libwebsocket_parse sees parsing complete\n"); /* is this websocket protocol or normal http 1.0? */ @@ -595,7 +595,7 @@ libwebsocket_read(struct libwebsocket_context *context, } if (!wsi->protocol) - fprintf(stderr, "NULL protocol at libwebsocket_read\n"); + lwsl_err("NULL protocol at libwebsocket_read\n"); /* * It's websocket @@ -621,10 +621,10 @@ libwebsocket_read(struct libwebsocket_context *context, if (wsi->protocol->callback == NULL) { if (wsi->utf8_token[WSI_TOKEN_PROTOCOL].token == NULL) - fprintf(stderr, "[no protocol] " + lwsl_err("[no protocol] " "not supported (use NULL .name)\n"); else - fprintf(stderr, "Requested protocol %s " + lwsl_err("Requested protocol %s " "not supported\n", wsi->utf8_token[WSI_TOKEN_PROTOCOL].token); goto bail; @@ -647,7 +647,7 @@ libwebsocket_read(struct libwebsocket_context *context, if ((wsi->protocol->callback)(wsi->protocol->owning_server, wsi, LWS_CALLBACK_FILTER_PROTOCOL_CONNECTION, &wsi->utf8_token[0], NULL, 0)) { - fprintf(stderr, "User code denied connection\n"); + lwsl_warn("User code denied connection\n"); goto bail; } @@ -665,7 +665,7 @@ libwebsocket_read(struct libwebsocket_context *context, break; case 4: /* 04 */ wsi->xor_mask = xor_mask_04; - _debug("libwebsocket_parse calling handshake_04\n"); + lwsl_parser("libwebsocket_parse calling handshake_04\n"); if (handshake_0405(context, wsi)) goto bail; break; @@ -675,18 +675,18 @@ libwebsocket_read(struct libwebsocket_context *context, case 8: case 13: wsi->xor_mask = xor_mask_05; - _debug("libwebsocket_parse calling handshake_04\n"); + lwsl_parser("libwebsocket_parse calling handshake_04\n"); if (handshake_0405(context, wsi)) goto bail; break; default: - fprintf(stderr, "Unknown client spec version %d\n", + lwsl_warn("Unknown client spec version %d\n", wsi->ietf_spec_revision); goto bail; } - debug("accepted v%02d connection\n", + lwsl_parser("accepted v%02d connection\n", wsi->ietf_spec_revision); break; diff --git a/lib/libwebsockets.c b/lib/libwebsockets.c index d099a69..b0e7a6d 100644 --- a/lib/libwebsockets.c +++ b/lib/libwebsockets.c @@ -43,6 +43,18 @@ int openssl_websocket_private_data_index; #endif #endif +static int log_level = LLL_ERR | LLL_WARN; +static const char *log_level_names[] = { + "ERR", + "WARN", + "INFO", + "DEBUG", + "PARSER", + "HEADER", + "EXTENSION", + "CLIENT", +}; + /* * In-place str to lower case */ @@ -77,7 +89,7 @@ insert_wsi(struct libwebsocket_context *context, struct libwebsocket *wsi) int h = LWS_FD_HASH(wsi->sock); if (context->fd_hashtable[h].length == MAX_CLIENTS - 1) { - fprintf(stderr, "hash table overflow\n"); + lwsl_err("hash table overflow\n"); return 1; } @@ -104,7 +116,7 @@ delete_from_fd(struct libwebsocket_context *context, int fd) return 0; } - fprintf(stderr, "Failed to find fd %d requested for " + lwsl_err("Failed to find fd %d requested for " "delete in hashtable\n", fd); return 1; } @@ -118,7 +130,7 @@ libwebsockets_decode_ssl_error(void) while ((err = ERR_get_error()) != 0) { ERR_error_string_n(err, buf, sizeof(buf)); - fprintf(stderr, "*** %s\n", buf); + lwsl_err("*** %s\n", buf); } } #endif @@ -198,7 +210,7 @@ libwebsocket_close_and_free_session(struct libwebsocket_context *context, */ if (m) { - debug("extension vetoed close\n"); + lwsl_ext("extension vetoed close\n"); return; } } @@ -228,8 +240,7 @@ libwebsocket_close_and_free_session(struct libwebsocket_context *context, LWS_EXT_CALLBACK_FLUSH_PENDING_TX, wsi->active_extensions_user[n], &eff_buf, 0); if (m < 0) { - fprintf(stderr, "Extension reports " - "fatal error\n"); + lwsl_ext("Extension reports fatal error\n"); goto just_kill_connection; } if (m) @@ -263,7 +274,7 @@ libwebsocket_close_and_free_session(struct libwebsocket_context *context, if (old_state == WSI_STATE_ESTABLISHED && reason != LWS_CLOSE_STATUS_NOSTATUS) { - debug("sending close indication...\n"); + lwsl_debug("sending close indication...\n"); n = libwebsocket_write(wsi, &buf[LWS_SEND_BUFFER_PRE_PADDING], 0, LWS_WRITE_CLOSE); @@ -280,7 +291,7 @@ libwebsocket_close_and_free_session(struct libwebsocket_context *context, libwebsocket_set_timeout(wsi, PENDING_TIMEOUT_CLOSE_ACK, AWAITING_TIMEOUT); - debug("sent close indication, awaiting ack\n"); + lwsl_debug("sent close indication, awaiting ack\n"); return; } @@ -290,7 +301,7 @@ libwebsocket_close_and_free_session(struct libwebsocket_context *context, just_kill_connection: - debug("libwebsocket_close_and_free_session: just_kill_connection\n"); + lwsl_debug("libwebsocket_close_and_free_session: just_kill_connection\n"); /* * we won't be servicing or receiving anything further from this guy @@ -327,11 +338,11 @@ just_kill_connection: ((old_state == WSI_STATE_ESTABLISHED) || (old_state == WSI_STATE_RETURNED_CLOSE_ALREADY) || (old_state == WSI_STATE_AWAITING_CLOSE_ACK))) { - debug("calling back CLOSED\n"); + lwsl_debug("calling back CLOSED\n"); wsi->protocol->callback(context, wsi, LWS_CALLBACK_CLOSED, wsi->user_space, NULL, 0); } else - debug("not calling back closed, old_state=%d\n", old_state); + lwsl_debug("not calling back closed, old_state=%d\n", old_state); /* deallocate any active extension contexts */ @@ -369,7 +380,7 @@ just_kill_connection: if (wsi->c_address) free(wsi->c_address); -/* fprintf(stderr, "closing fd=%d\n", wsi->sock); */ +/* lwsl_info("closing fd=%d\n", wsi->sock); */ #ifdef LWS_OPENSSL_SUPPORT if (wsi->ssl) { @@ -635,7 +646,7 @@ lws_handle_POLLOUT_event(struct libwebsocket_context *context, LWS_EXT_CALLBACK_PACKET_TX_PRESEND, wsi->active_extensions_user[n], &eff_buf, 0); if (m < 0) { - fprintf(stderr, "ext reports fatal error\n"); + lwsl_err("ext reports fatal error\n"); return -1; } if (m) @@ -669,7 +680,7 @@ lws_handle_POLLOUT_event(struct libwebsocket_context *context, /* no we could add more */ continue; - debug("choked in POLLOUT service\n"); + lwsl_info("choked in POLLOUT service\n"); /* * Yes, he's choked. Leave the POLLOUT masked on so we will @@ -735,7 +746,7 @@ libwebsocket_service_timeout_check(struct libwebsocket_context *context, */ if (sec > wsi->pending_timeout_limit) { - debug("TIMEDOUT WAITING\n"); + lwsl_info("TIMEDOUT WAITING\n"); libwebsocket_close_and_free_session(context, wsi, LWS_CLOSE_STATUS_NOSTATUS); } @@ -749,7 +760,7 @@ libwebsocket_create_new_server_wsi(struct libwebsocket_context *context) new_wsi = (struct libwebsocket *)malloc(sizeof(struct libwebsocket)); if (new_wsi == NULL) { - fprintf(stderr, "Out of memory for new connection\n"); + lwsl_err("Out of memory for new connection\n"); return NULL; } @@ -809,7 +820,7 @@ libwebsockets_generate_client_handshake(struct libwebsocket_context *context, n = libwebsockets_get_random(context, hash, 16); if (n != 16) { - fprintf(stderr, "Unable to read from random dev %s\n", + lwsl_err("Unable to read from random dev %s\n", SYSTEM_RANDOM_FILEPATH); free(wsi->c_path); free(wsi->c_host); @@ -986,7 +997,7 @@ libwebsockets_generate_client_handshake(struct libwebsocket_context *context, } if (n) { /* an extension vetos us */ - debug("ext %s vetoed\n", (char *)ext->name); + lwsl_ext("ext %s vetoed\n", (char *)ext->name); ext++; continue; } @@ -1097,28 +1108,28 @@ lws_client_interpret_server_handshake(struct libwebsocket_context *context, !wsi->utf8_token[WSI_TOKEN_CONNECTION].token_len || (!wsi->utf8_token[WSI_TOKEN_PROTOCOL].token_len && wsi->c_protocol != NULL)) { - debug("libwebsocket_client_handshake " + lwsl_parser("libwebsocket_client_handshake " "missing required header(s)\n"); pkt[len] = '\0'; - debug("%s", pkt); + lwsl_parser("%s", pkt); goto bail3; } strtolower(wsi->utf8_token[WSI_TOKEN_HTTP].token); if (strncmp(wsi->utf8_token[WSI_TOKEN_HTTP].token, "101", 3)) { - fprintf(stderr, "libwebsocket_client_handshake " + lwsl_warn("libwebsocket_client_handshake " "server sent bad HTTP response '%s'\n", wsi->utf8_token[WSI_TOKEN_HTTP].token); goto bail3; } if (wsi->utf8_token[WSI_TOKEN_CHALLENGE].token_len < 16) { - fprintf(stderr, "libwebsocket_client_handshake " + lwsl_parser("libwebsocket_client_handshake " "challenge reply too short %d\n", wsi->utf8_token[ WSI_TOKEN_CHALLENGE].token_len); pkt[len] = '\0'; - debug("%s", pkt); + lwsl_parser("%s", pkt); goto bail3; } @@ -1131,17 +1142,17 @@ lws_client_interpret_server_handshake(struct libwebsocket_context *context, * Now let's confirm it sent all the necessary headers */ #if 0 - fprintf(stderr, "WSI_TOKEN_HTTP: %d\n", + lwsl_parser("WSI_TOKEN_HTTP: %d\n", wsi->utf8_token[WSI_TOKEN_HTTP].token_len); - fprintf(stderr, "WSI_TOKEN_UPGRADE: %d\n", + lwsl_parser("WSI_TOKEN_UPGRADE: %d\n", wsi->utf8_token[WSI_TOKEN_UPGRADE].token_len); - fprintf(stderr, "WSI_TOKEN_CONNECTION: %d\n", + lwsl_parser("WSI_TOKEN_CONNECTION: %d\n", wsi->utf8_token[WSI_TOKEN_CONNECTION].token_len); - fprintf(stderr, "WSI_TOKEN_ACCEPT: %d\n", + lwsl_parser("WSI_TOKEN_ACCEPT: %d\n", wsi->utf8_token[WSI_TOKEN_ACCEPT].token_len); - fprintf(stderr, "WSI_TOKEN_NONCE: %d\n", + lwsl_parser("WSI_TOKEN_NONCE: %d\n", wsi->utf8_token[WSI_TOKEN_NONCE].token_len); - fprintf(stderr, "WSI_TOKEN_PROTOCOL: %d\n", + lwsl_parser("WSI_TOKEN_PROTOCOL: %d\n", wsi->utf8_token[WSI_TOKEN_PROTOCOL].token_len); #endif if (!wsi->utf8_token[WSI_TOKEN_HTTP].token_len || @@ -1152,10 +1163,10 @@ lws_client_interpret_server_handshake(struct libwebsocket_context *context, wsi->ietf_spec_revision == 4) || (!wsi->utf8_token[WSI_TOKEN_PROTOCOL].token_len && wsi->c_protocol != NULL)) { - debug("libwebsocket_client_handshake " + lwsl_parser("libwebsocket_client_handshake " "missing required header(s)\n"); pkt[len] = '\0'; - debug("%s", pkt); + lwsl_parser("%s", pkt); goto bail3; } @@ -1166,7 +1177,7 @@ lws_client_interpret_server_handshake(struct libwebsocket_context *context, strtolower(wsi->utf8_token[WSI_TOKEN_HTTP].token); if (strncmp(wsi->utf8_token[WSI_TOKEN_HTTP].token, "101", 3)) { - fprintf(stderr, "libwebsocket_client_handshake " + lwsl_warn("libwebsocket_client_handshake " "server sent bad HTTP response '%s'\n", wsi->utf8_token[WSI_TOKEN_HTTP].token); goto bail3; @@ -1175,7 +1186,7 @@ lws_client_interpret_server_handshake(struct libwebsocket_context *context, strtolower(wsi->utf8_token[WSI_TOKEN_UPGRADE].token); if (strcmp(wsi->utf8_token[WSI_TOKEN_UPGRADE].token, "websocket")) { - fprintf(stderr, "libwebsocket_client_handshake server " + lwsl_warn("libwebsocket_client_handshake server " "sent bad Upgrade header '%s'\n", wsi->utf8_token[WSI_TOKEN_UPGRADE].token); goto bail3; @@ -1184,7 +1195,7 @@ lws_client_interpret_server_handshake(struct libwebsocket_context *context, strtolower(wsi->utf8_token[WSI_TOKEN_CONNECTION].token); if (strcmp(wsi->utf8_token[WSI_TOKEN_CONNECTION].token, "upgrade")) { - fprintf(stderr, "libwebsocket_client_handshake server " + lwsl_warn("libwebsocket_client_handshake server " "sent bad Connection hdr '%s'\n", wsi->utf8_token[WSI_TOKEN_CONNECTION].token); goto bail3; @@ -1193,10 +1204,10 @@ lws_client_interpret_server_handshake(struct libwebsocket_context *context, select_protocol: pc = wsi->c_protocol; if (pc == NULL) - fprintf(stderr, "lws_client_interpret_server_handshake: " + lwsl_parser("lws_client_interpret_server_handshake: " "NULL c_protocol\n"); else - debug("lws_client_interpret_server_handshake: " + lwsl_parser("lws_client_interpret_server_handshake: " "cPprotocol='%s'\n", pc); /* @@ -1206,7 +1217,7 @@ select_protocol: if (!wsi->utf8_token[WSI_TOKEN_PROTOCOL].token_len) { - fprintf(stderr, "lws_client_interpret_server_handshake " + lwsl_warn("lws_client_interpret_server_handshake " "WSI_TOKEN_PROTOCOL is null\n"); /* * no protocol name to work from, @@ -1239,7 +1250,7 @@ select_protocol: free(wsi->c_protocol); if (!okay) { - fprintf(stderr, "libwebsocket_client_handshake server " + lwsl_err("libwebsocket_client_handshake server " "sent bad protocol '%s'\n", wsi->utf8_token[WSI_TOKEN_PROTOCOL].token); goto bail2; @@ -1260,7 +1271,7 @@ select_protocol: } if (wsi->protocol == NULL) { - fprintf(stderr, "libwebsocket_client_handshake server " + lwsl_err("libwebsocket_client_handshake server " "requested protocol '%s', which we " "said we supported but we don't!\n", wsi->utf8_token[WSI_TOKEN_PROTOCOL].token); @@ -1273,7 +1284,7 @@ check_extensions: /* instantiate the accepted extensions */ if (!wsi->utf8_token[WSI_TOKEN_EXTENSIONS].token_len) { - debug("no client extenstions allowed by server\n"); + lwsl_ext("no client extenstions allowed by server\n"); goto check_accept; } @@ -1303,7 +1314,7 @@ check_extensions: /* check we actually support it */ - debug("checking client ext %s\n", ext_name); + lwsl_ext("checking client ext %s\n", ext_name); n = 0; ext = wsi->protocol->owning_server->extensions; @@ -1316,7 +1327,7 @@ check_extensions: n = 1; - debug("instantiating client ext %s\n", ext_name); + lwsl_ext("instantiating client ext %s\n", ext_name); /* instantiate the extension on this conn */ @@ -1344,7 +1355,7 @@ check_extensions: } if (n == 0) { - fprintf(stderr, "Server said we should use" + lwsl_warn("Server said we should use" "an unknown extension '%s'!\n", ext_name); goto bail2; } @@ -1359,10 +1370,10 @@ check_accept: if (memcmp(wsi->initial_handshake_hash_base64, wsi->utf8_token[WSI_TOKEN_CHALLENGE].token, 16)) { - fprintf(stderr, "libwebsocket_client_handshake " + lwsl_warn("libwebsocket_client_handshake " "failed 00 challenge compare\n"); pkt[len] = '\0'; - fprintf(stderr, "%s", pkt); + lwsl_warn("%s", pkt); goto bail2; } @@ -1375,7 +1386,7 @@ check_accept: if (strcmp(wsi->utf8_token[WSI_TOKEN_ACCEPT].token, wsi->initial_handshake_hash_base64)) { - fprintf(stderr, "libwebsocket_client_handshake server " + lwsl_warn("libwebsocket_client_handshake server " "sent bad ACCEPT '%s' vs computed '%s'\n", wsi->utf8_token[WSI_TOKEN_ACCEPT].token, wsi->initial_handshake_hash_base64); @@ -1411,7 +1422,7 @@ accept_ok: wsi->state = WSI_STATE_ESTABLISHED; wsi->mode = LWS_CONNMODE_WS_CLIENT; - _debug("handshake OK for protocol %s\n", wsi->protocol->name); + lwsl_debug("handshake OK for protocol %s\n", wsi->protocol->name); /* call him back to inform him he is up */ @@ -1534,7 +1545,7 @@ libwebsocket_service_fd(struct libwebsocket_context *context, break; if (context->fds_count >= MAX_CLIENTS) { - fprintf(stderr, "too busy to accept new client\n"); + lwsl_warn("too busy to accept new client\n"); break; } @@ -1544,7 +1555,7 @@ libwebsocket_service_fd(struct libwebsocket_context *context, accept_fd = accept(pollfd->fd, (struct sockaddr *)&cli_addr, &clilen); if (accept_fd < 0) { - debug("ERROR on accept: %d\n", strerror(errno)); + lwsl_warn("ERROR on accept: %d\n", strerror(errno)); return -1; } @@ -1562,7 +1573,7 @@ libwebsocket_service_fd(struct libwebsocket_context *context, if ((context->protocols[0].callback)(context, wsi, LWS_CALLBACK_FILTER_NETWORK_CONNECTION, (void *)(long)accept_fd, NULL, 0)) { - debug("Callback denied network connection\n"); + lwsl_debug("Callback denied network connection\n"); #ifdef WIN32 closesocket(accept_fd); #else @@ -1593,7 +1604,7 @@ libwebsocket_service_fd(struct libwebsocket_context *context, new_wsi->ssl = SSL_new(context->ssl_ctx); if (new_wsi->ssl == NULL) { - fprintf(stderr, "SSL_new failed: %s\n", + lwsl_err("SSL_new failed: %s\n", ERR_error_string(SSL_get_error( new_wsi->ssl, 0), NULL)); libwebsockets_decode_ssl_error(); @@ -1615,7 +1626,7 @@ libwebsocket_service_fd(struct libwebsocket_context *context, * ssl params which fail then retry * and succeed */ - _debug("SSL_accept failed skt %u: %s\n", + lwsl_debug("SSL_accept failed skt %u: %s\n", pollfd->fd, ERR_error_string(SSL_get_error( new_wsi->ssl, n), NULL)); @@ -1630,14 +1641,14 @@ libwebsocket_service_fd(struct libwebsocket_context *context, break; } - _debug("accepted new SSL conn " + lwsl_debug("accepted new SSL conn " "port %u on fd=%d SSL ver %s\n", ntohs(cli_addr.sin_port), accept_fd, SSL_get_version(new_wsi->ssl)); } else #endif - _debug("accepted new conn port %u on fd=%d\n", + lwsl_debug("accepted new conn port %u on fd=%d\n", ntohs(cli_addr.sin_port), accept_fd); insert_wsi(context, new_wsi); @@ -1672,12 +1683,12 @@ libwebsocket_service_fd(struct libwebsocket_context *context, accept_fd = accept(pollfd->fd, (struct sockaddr *)&cli_addr, &clilen); if (accept_fd < 0) { - debug("ERROR on accept\n"); + lwsl_warn("ERROR on accept %d\n", accept_fd); return -1; } if (context->fds_count >= MAX_CLIENTS) { - fprintf(stderr, "too busy to accept new broadcast " + lwsl_err("too busy to accept new broadcast " "proxy client\n"); #ifdef WIN32 closesocket(accept_fd); @@ -1719,7 +1730,7 @@ libwebsocket_service_fd(struct libwebsocket_context *context, if (pollfd->revents & (POLLERR | POLLHUP)) { - _debug("Session Socket %p (fd=%d) dead\n", + lwsl_debug("Session Socket %p (fd=%d) dead\n", (void *)wsi, pollfd->fd); libwebsocket_close_and_free_session(context, wsi, @@ -1750,7 +1761,7 @@ libwebsocket_service_fd(struct libwebsocket_context *context, len = read(pollfd->fd, buf + LWS_SEND_BUFFER_PRE_PADDING, MAX_BROADCAST_PAYLOAD); if (len < 0) { - fprintf(stderr, "Error reading broadcast payload\n"); + lwsl_err("Error reading broadcast payload\n"); break; } @@ -1800,7 +1811,7 @@ libwebsocket_service_fd(struct libwebsocket_context *context, if (pollfd->revents & (POLLERR | POLLHUP)) { - fprintf(stderr, "Proxy connection %p (fd=%d) dead\n", + lwsl_warn("Proxy connection %p (fd=%d) dead\n", (void *)wsi, pollfd->fd); libwebsocket_close_and_free_session(context, wsi, @@ -1812,7 +1823,7 @@ libwebsocket_service_fd(struct libwebsocket_context *context, if (n < 0) { libwebsocket_close_and_free_session(context, wsi, LWS_CLOSE_STATUS_NOSTATUS); - fprintf(stderr, "ERROR reading from proxy socket\n"); + lwsl_err("ERROR reading from proxy socket\n"); return 1; } @@ -1820,7 +1831,7 @@ libwebsocket_service_fd(struct libwebsocket_context *context, if (strcmp(pkt, "HTTP/1.0 200 ") != 0) { libwebsocket_close_and_free_session(context, wsi, LWS_CLOSE_STATUS_NOSTATUS); - fprintf(stderr, "ERROR from proxy: %s\n", pkt); + lwsl_err("ERROR from proxy: %s\n", pkt); return 1; } @@ -1853,7 +1864,7 @@ libwebsocket_service_fd(struct libwebsocket_context *context, * run into the connection timeout or win */ - fprintf(stderr, "SSL connect error %s\n", + lwsl_err("SSL connect error %s\n", ERR_error_string(ERR_get_error(), ssl_err_buf)); return 0; @@ -1864,7 +1875,7 @@ libwebsocket_service_fd(struct libwebsocket_context *context, n != X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT || wsi->use_ssl != 2)) { - fprintf(stderr, "server's cert didn't " + lwsl_err("server's cert didn't " "look good %d\n", n); libwebsocket_close_and_free_session(context, wsi, LWS_CLOSE_STATUS_NOSTATUS); @@ -1888,7 +1899,7 @@ libwebsocket_service_fd(struct libwebsocket_context *context, n = send(wsi->sock, pkt, p - pkt, 0); if (n < 0) { - fprintf(stderr, "ERROR writing to client socket\n"); + lwsl_debug("ERROR writing to client socket\n"); libwebsocket_close_and_free_session(context, wsi, LWS_CLOSE_STATUS_NOSTATUS); return 1; @@ -1907,7 +1918,7 @@ libwebsocket_service_fd(struct libwebsocket_context *context, if (pollfd->revents & (POLLERR | POLLHUP)) { - fprintf(stderr, "Server connection %p (fd=%d) dead\n", + lwsl_debug("Server connection %p (fd=%d) dead\n", (void *)wsi, pollfd->fd); goto bail3; @@ -1971,13 +1982,11 @@ bail3: return 1; case LWS_CONNMODE_WS_CLIENT_WAITING_EXTENSION_CONNECT: - fprintf(stderr, - "LWS_CONNMODE_WS_CLIENT_WAITING_EXTENSION_CONNECT\n"); + lwsl_ext("LWS_CONNMODE_WS_CLIENT_WAITING_EXTENSION_CONNECT\n"); break; case LWS_CONNMODE_WS_CLIENT_PENDING_CANDIDATE_CHILD: - fprintf(stderr, - "LWS_CONNMODE_WS_CLIENT_PENDING_CANDIDATE_CHILD\n"); + lwsl_ext("LWS_CONNMODE_WS_CLIENT_PENDING_CANDIDATE_CHILD\n"); break; @@ -1988,7 +1997,7 @@ bail3: if (pollfd->revents & (POLLERR | POLLHUP)) { - fprintf(stderr, "Session Socket %p (fd=%d) dead\n", + lwsl_debug("Session Socket %p (fd=%d) dead\n", (void *)wsi, pollfd->fd); libwebsocket_close_and_free_session(context, wsi, @@ -2023,7 +2032,7 @@ read_pending: recv(pollfd->fd, buf, sizeof buf, 0); if (eff_buf.token_len < 0) { - fprintf(stderr, "Socket read returned %d\n", + lwsl_debug("Socket read returned %d\n", eff_buf.token_len); if (errno != EINTR && errno != EAGAIN) libwebsocket_close_and_free_session(context, @@ -2062,7 +2071,7 @@ read_pending: wsi->active_extensions_user[n], &eff_buf, 0); if (m < 0) { - fprintf(stderr, + lwsl_ext( "Extension reports fatal error\n"); libwebsocket_close_and_free_session( context, wsi, @@ -2215,7 +2224,7 @@ libwebsocket_service(struct libwebsocket_context *context, int timeout_ms) if (n < 0) { /* - fprintf(stderr, "Listen Socket dead\n"); + lwsl_err("Listen Socket dead\n"); */ return -1; } @@ -2312,7 +2321,7 @@ libwebsocket_callback_on_writable(struct libwebsocket_context *context, } if (n == context->fds_count) - fprintf(stderr, "libwebsocket_callback_on_writable: " + lwsl_err("libwebsocket_callback_on_writable: " "failed to find socket %d\n", wsi->sock); /* external POLL support via protocol 0 */ @@ -2431,8 +2440,7 @@ libwebsocket_rx_flow_control(struct libwebsocket *wsi, int enable) (void *)(long)wsi->sock, NULL, POLLIN); #if 0 - fprintf(stderr, "libwebsocket_rx_flow_control " - "unable to find socket\n"); + lwsl_err("libwebsocket_rx_flow_control unable to find socket\n"); #endif return 1; } @@ -2573,6 +2581,8 @@ libwebsocket_create_context(int port, const char *interf, char ssl_err_buf[512]; #endif + lwsl_info("Initial logging level %d\n", log_level); + #ifdef _WIN32 { WORD wVersionRequested; @@ -2587,8 +2597,7 @@ libwebsocket_create_context(int port, const char *interf, if (err != 0) { /* Tell the user that we could not find a usable */ /* Winsock DLL. */ - fprintf(stderr, "WSAStartup failed with error: %d\n", - err); + lwsl_err("WSAStartup failed with error: %d\n", err); return NULL; } @@ -2605,7 +2614,7 @@ libwebsocket_create_context(int port, const char *interf, context = (struct libwebsocket_context *) malloc(sizeof(struct libwebsocket_context)); if (!context) { - fprintf(stderr, "No memory for websocket context\n"); + lwsl_err("No memory for websocket context\n"); return NULL; } context->protocols = protocols; @@ -2623,7 +2632,7 @@ libwebsocket_create_context(int port, const char *interf, #else context->fd_random = open(SYSTEM_RANDOM_FILEPATH, O_RDONLY); if (context->fd_random < 0) { - fprintf(stderr, "Unable to open random device %s %d\n", + lwsl_err("Unable to open random device %s %d\n", SYSTEM_RANDOM_FILEPATH, context->fd_random); return NULL; } @@ -2654,7 +2663,7 @@ libwebsocket_create_context(int port, const char *interf, if (strlen(hostname) < sizeof(sa.sa_data) - 1) { strcpy(sa.sa_data, hostname); - // fprintf(stderr, "my host name is %s\n", sa.sa_data); + // lwsl_debug("my host name is %s\n", sa.sa_data); n = getnameinfo(&sa, sizeof(sa), hostname, (sizeof hostname) - 1, NULL, 0, 0); } @@ -2668,7 +2677,7 @@ libwebsocket_create_context(int port, const char *interf, strncpy(context->canonical_hostname, hostname, sizeof context->canonical_hostname - 1); - // fprintf(stderr, "context->canonical_hostname = %s\n", + // lwsl_debug("context->canonical_hostname = %s\n", // context->canonical_hostname); } @@ -2683,13 +2692,13 @@ libwebsocket_create_context(int port, const char *interf, p = strchr(context->http_proxy_address, ':'); if (p == NULL) { - fprintf(stderr, "http_proxy needs to be ads:port\n"); + lwsl_err("http_proxy needs to be ads:port\n"); return NULL; } *p = '\0'; context->http_proxy_port = atoi(p + 1); - fprintf(stderr, "Using proxy %s:%u\n", + lwsl_debug("Using proxy %s:%u\n", context->http_proxy_address, context->http_proxy_port); } @@ -2700,19 +2709,17 @@ libwebsocket_create_context(int port, const char *interf, context->use_ssl = ssl_cert_filepath != NULL && ssl_private_key_filepath != NULL; if (context->use_ssl) - fprintf(stderr, " Compiled with SSL support, " - "using it\n"); + lwsl_info(" Compiled with SSL support, using it\n"); else - fprintf(stderr, " Compiled with SSL support, " - "not using it\n"); + lwsl_info(" Compiled with SSL support, not using it\n"); #else if (ssl_cert_filepath != NULL && ssl_private_key_filepath != NULL) { - fprintf(stderr, " Not compiled for OpenSSl support!\n"); + lwsl_info(" Not compiled for OpenSSl support!\n"); return NULL; } - fprintf(stderr, " Compiled without SSL support, " + lwsl_info(" Compiled without SSL support, " "serving unencrypted\n"); #endif } @@ -2743,13 +2750,13 @@ libwebsocket_create_context(int port, const char *interf, method = (SSL_METHOD *)SSLv23_server_method(); if (!method) { - fprintf(stderr, "problem creating ssl method: %s\n", + lwsl_err("problem creating ssl method: %s\n", ERR_error_string(ERR_get_error(), ssl_err_buf)); return NULL; } context->ssl_ctx = SSL_CTX_new(method); /* create context */ if (!context->ssl_ctx) { - fprintf(stderr, "problem creating ssl context: %s\n", + lwsl_err("problem creating ssl context: %s\n", ERR_error_string(ERR_get_error(), ssl_err_buf)); return NULL; } @@ -2765,14 +2772,14 @@ libwebsocket_create_context(int port, const char *interf, if (port == CONTEXT_PORT_NO_LISTEN) { method = (SSL_METHOD *)SSLv23_client_method(); if (!method) { - fprintf(stderr, "problem creating ssl method: %s\n", + lwsl_err("problem creating ssl method: %s\n", ERR_error_string(ERR_get_error(), ssl_err_buf)); return NULL; } /* create context */ context->ssl_client_ctx = SSL_CTX_new(method); if (!context->ssl_client_ctx) { - fprintf(stderr, "problem creating ssl context: %s\n", + lwsl_err("problem creating ssl context: %s\n", ERR_error_string(ERR_get_error(), ssl_err_buf)); return NULL; } @@ -2788,7 +2795,7 @@ libwebsocket_create_context(int port, const char *interf, if (!SSL_CTX_load_verify_locations( context->ssl_client_ctx, NULL, LWS_OPENSSL_CLIENT_CERTS)) - fprintf(stderr, + lwsl_err( "Unable to load SSL Client certs from %s " "(set by --with-client-cert-dir= in configure) -- " " client ssl isn't going to work", @@ -2797,7 +2804,7 @@ libwebsocket_create_context(int port, const char *interf, if (!SSL_CTX_load_verify_locations( context->ssl_client_ctx, ssl_ca_filepath, NULL)) - fprintf(stderr, + lwsl_err( "Unable to load SSL Client certs " "file from %s -- client ssl isn't " "going to work", ssl_ca_filepath); @@ -2840,7 +2847,7 @@ libwebsocket_create_context(int port, const char *interf, n = SSL_CTX_use_certificate_chain_file(context->ssl_ctx, ssl_cert_filepath); if (n != 1) { - fprintf(stderr, "problem getting cert '%s': %s\n", + lwsl_err("problem getting cert '%s': %s\n", ssl_cert_filepath, ERR_error_string(ERR_get_error(), ssl_err_buf)); return NULL; @@ -2848,14 +2855,14 @@ libwebsocket_create_context(int port, const char *interf, /* set the private key from KeyFile */ if (SSL_CTX_use_PrivateKey_file(context->ssl_ctx, ssl_private_key_filepath, SSL_FILETYPE_PEM) != 1) { - fprintf(stderr, "ssl problem getting key '%s': %s\n", + lwsl_err("ssl problem getting key '%s': %s\n", ssl_private_key_filepath, ERR_error_string(ERR_get_error(), ssl_err_buf)); return NULL; } /* verify private key */ if (!SSL_CTX_check_private_key(context->ssl_ctx)) { - fprintf(stderr, "Private SSL key doesn't match cert\n"); + lwsl_err("Private SSL key doesn't match cert\n"); return NULL; } @@ -2879,7 +2886,7 @@ libwebsocket_create_context(int port, const char *interf, sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd < 0) { - fprintf(stderr, "ERROR opening socket"); + lwsl_err("ERROR opening socket"); return NULL; } @@ -2904,7 +2911,7 @@ libwebsocket_create_context(int port, const char *interf, n = bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)); if (n < 0) { - fprintf(stderr, "ERROR on binding to port %d (%d %d)\n", + lwsl_err("ERROR on binding to port %d (%d %d)\n", port, n, errno); return NULL; } @@ -2917,7 +2924,7 @@ libwebsocket_create_context(int port, const char *interf, insert_wsi(context, wsi); listen(sockfd, SOMAXCONN); - fprintf(stderr, " Listening on port %d\n", port); + lwsl_info(" Listening on port %d\n", port); /* list in the internal poll array */ @@ -2940,10 +2947,10 @@ libwebsocket_create_context(int port, const char *interf, #else if (gid != -1) if (setgid(gid)) - fprintf(stderr, "setgid: %s\n", strerror(errno)); + lwsl_warn("setgid: %s\n", strerror(errno)); if (uid != -1) if (setuid(uid)) - fprintf(stderr, "setuid: %s\n", strerror(errno)); + lwsl_warn("setuid: %s\n", strerror(errno)); #endif /* set up our internal broadcast trigger sockets per-protocol */ @@ -2952,7 +2959,8 @@ libwebsocket_create_context(int port, const char *interf, protocols[context->count_protocols].callback; context->count_protocols++) { - _debug(" Protocol: %s\n", protocols[context->count_protocols].name); + lwsl_parser(" Protocol: %s\n", + protocols[context->count_protocols].name); protocols[context->count_protocols].owning_server = context; protocols[context->count_protocols].protocol_index = @@ -2960,7 +2968,7 @@ libwebsocket_create_context(int port, const char *interf, fd = socket(AF_INET, SOCK_STREAM, 0); if (fd < 0) { - fprintf(stderr, "ERROR opening socket"); + lwsl_err("ERROR opening socket"); return NULL; } @@ -2975,7 +2983,7 @@ libwebsocket_create_context(int port, const char *interf, n = bind(fd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)); if (n < 0) { - fprintf(stderr, "ERROR on binding to port %d (%d %d)\n", + lwsl_err("ERROR on binding to port %d (%d %d)\n", port, n, errno); return NULL; } @@ -2983,14 +2991,14 @@ libwebsocket_create_context(int port, const char *interf, slen = sizeof cli_addr; n = getsockname(fd, (struct sockaddr *)&cli_addr, &slen); if (n < 0) { - fprintf(stderr, "getsockname failed\n"); + lwsl_err("getsockname failed\n"); return NULL; } protocols[context->count_protocols].broadcast_socket_port = ntohs(cli_addr.sin_port); listen(fd, 5); - _debug(" Protocol %s broadcast socket %d\n", + lwsl_debug(" Protocol %s broadcast socket %d\n", protocols[context->count_protocols].name, ntohs(cli_addr.sin_port)); @@ -3030,7 +3038,7 @@ libwebsocket_create_context(int port, const char *interf, if (extensions) { while (extensions->callback) { - debug(" Extension: %s\n", extensions->name); + lwsl_ext(" Extension: %s\n", extensions->name); extensions->callback(context, extensions, NULL, (enum libwebsocket_extension_callback_reasons)m, NULL, NULL, 0); @@ -3078,7 +3086,7 @@ libwebsockets_fork_service_loop(struct libwebsocket_context *context) for (p = 0; p < context->count_protocols; p++) { fd = socket(AF_INET, SOCK_STREAM, 0); if (fd < 0) { - fprintf(stderr, "Unable to create socket\n"); + lwsl_err("Unable to create socket\n"); return -1; } cli_addr.sin_family = AF_INET; @@ -3088,7 +3096,7 @@ libwebsockets_fork_service_loop(struct libwebsocket_context *context) n = connect(fd, (struct sockaddr *)&cli_addr, sizeof cli_addr); if (n < 0) { - fprintf(stderr, "Unable to connect to " + lwsl_err("Unable to connect to " "broadcast socket %d, %s\n", n, strerror(errno)); return -1; @@ -3256,8 +3264,7 @@ libwebsocket_ensure_user_space(struct libwebsocket *wsi) wsi->user_space = malloc( wsi->protocol->per_session_data_size); if (wsi->user_space == NULL) { - fprintf(stderr, "Out of memory for " - "conn user space\n"); + lwsl_err("Out of memory for conn user space\n"); return NULL; } memset(wsi->user_space, 0, @@ -3265,3 +3272,36 @@ libwebsocket_ensure_user_space(struct libwebsocket *wsi) } return wsi->user_space; } + +void _lws_log(int filter, const char *format, ...) +{ + va_list ap; + int n; + + if (!(log_level & filter)) + return; + + for (n = 0; n < LLL_COUNT; n++) + if (filter == (1 << n)) { + fprintf(stderr, "%s: ", log_level_names[n]); + break; + } + + va_start(ap, format); + vfprintf(stderr, format, ap); + va_end(ap); +} + +/** + * lws_set_log_level() - Set the logging bitfield + * @level: OR together the LLL_ debug contexts you want output from + * + * + * defaults to err and warn contexts enabled + */ + +void lws_set_log_level(int level) +{ + log_level = level; +} + diff --git a/lib/libwebsockets.h b/lib/libwebsockets.h index 0e06670..25aa554 100644 --- a/lib/libwebsockets.h +++ b/lib/libwebsockets.h @@ -62,6 +62,19 @@ typedef int ssize_t; #define CONTEXT_PORT_NO_LISTEN 0 #define MAX_MUX_RECURSION 2 +enum lws_log_levels { + LLL_ERR = 1 << 0, + LLL_WARN = 1 << 1, + LLL_INFO = 1 << 2, + LLL_DEBUG = 1 << 3, + LLL_PARSER = 1 << 4, + LLL_HEADER = 1 << 5, + LLL_EXT = 1 << 6, + LLL_CLIENT = 1 << 7, + + LLL_COUNT = 8 /* set to count of valid flags */ +}; + enum libwebsocket_context_options { LWS_SERVER_OPTION_DEFEAT_CLIENT_MASK = 1, LWS_SERVER_OPTION_REQUIRE_VALID_OPENSSL_CLIENT_CERT = 2, @@ -641,7 +654,8 @@ struct libwebsocket_extension { void * per_context_private_data; }; - +LWS_EXTERN +void lws_set_log_level(int level); LWS_EXTERN struct libwebsocket_context * libwebsocket_create_context(int port, const char * interf, diff --git a/lib/parsers.c b/lib/parsers.c index c5017a7..04173d7 100644 --- a/lib/parsers.c +++ b/lib/parsers.c @@ -77,7 +77,7 @@ int libwebsocket_parse(struct libwebsocket *wsi, unsigned char c) case WSI_TOKEN_HTTP: case WSI_TOKEN_MUXURL: - _debug("WSI_TOKEN_(%d) '%c'\n", wsi->parser_state, c); + lwsl_parser("WSI_TOKEN_(%d) '%c'\n", wsi->parser_state, c); /* collect into malloc'd buffers */ /* optional space swallow */ @@ -88,7 +88,7 @@ int libwebsocket_parse(struct libwebsocket *wsi, unsigned char c) if (wsi->parser_state == WSI_TOKEN_GET_URI && c == ' ') { wsi->utf8_token[wsi->parser_state].token[ wsi->utf8_token[wsi->parser_state].token_len] = '\0'; -// debug("uri '%s'\n", wsi->utf8_token[wsi->parser_state].token); +// lwsl_parser("uri '%s'\n", wsi->utf8_token[wsi->parser_state].token); wsi->parser_state = WSI_TOKEN_SKIPPING; break; } @@ -115,7 +115,7 @@ int libwebsocket_parse(struct libwebsocket *wsi, unsigned char c) wsi->utf8_token[wsi->parser_state].token[ wsi->utf8_token[wsi->parser_state].token_len] = '\0'; wsi->parser_state = WSI_TOKEN_SKIPPING_SAW_CR; - _debug("*\n"); + lwsl_parser("*\n"); break; } @@ -156,7 +156,7 @@ int libwebsocket_parse(struct libwebsocket *wsi, unsigned char c) /* For any supported protocol we have enough payload */ - _debug("Setting WSI_PARSING_COMPLETE\n"); + lwsl_parser("Setting WSI_PARSING_COMPLETE\n"); wsi->parser_state = WSI_PARSING_COMPLETE; break; @@ -171,7 +171,7 @@ int libwebsocket_parse(struct libwebsocket *wsi, unsigned char c) /* collecting and checking a name part */ case WSI_TOKEN_NAME_PART: - _debug("WSI_TOKEN_NAME_PART '%c'\n", c); + lwsl_parser("WSI_TOKEN_NAME_PART '%c'\n", c); if (wsi->name_buffer_pos == sizeof(wsi->name_buffer) - 1) { /* name bigger than we can handle, skip until next */ @@ -186,7 +186,7 @@ int libwebsocket_parse(struct libwebsocket *wsi, unsigned char c) continue; if (strcasecmp(lws_tokens[n].token, wsi->name_buffer)) continue; - _debug("known hdr '%s'\n", wsi->name_buffer); + lwsl_parser("known hdr '%s'\n", wsi->name_buffer); /* * WSORIGIN is protocol equiv to ORIGIN, @@ -213,7 +213,7 @@ int libwebsocket_parse(struct libwebsocket *wsi, unsigned char c) if (wsi->parser_state == WSI_TOKEN_NAME_PART) { if (c == ':') { - debug("skipping unknown header '%s'\n", + lwsl_parser("skipping unknown header '%s'\n", wsi->name_buffer); wsi->parser_state = WSI_TOKEN_SKIPPING; break; @@ -221,7 +221,7 @@ int libwebsocket_parse(struct libwebsocket *wsi, unsigned char c) if (c == ' ' && !wsi->utf8_token[WSI_TOKEN_GET_URI].token_len) { - debug("unknown method '%s'\n", + lwsl_parser("unknown method '%s'\n", wsi->name_buffer); wsi->parser_state = WSI_TOKEN_GET_URI; wsi->current_alloc_len = LWS_INITIAL_HDR_ALLOC; @@ -238,7 +238,7 @@ int libwebsocket_parse(struct libwebsocket *wsi, unsigned char c) if (!wsi->utf8_token[WSI_TOKEN_UPGRADE].token_len) { /* they're HTTP headers, not websocket upgrade! */ - _debug("Setting WSI_PARSING_COMPLETE " + lwsl_parser("Setting WSI_PARSING_COMPLETE " "from http headers\n"); wsi->parser_state = WSI_PARSING_COMPLETE; } @@ -247,7 +247,7 @@ int libwebsocket_parse(struct libwebsocket *wsi, unsigned char c) if (wsi->utf8_token[WSI_TOKEN_VERSION].token_len && atoi(wsi->utf8_token[WSI_TOKEN_VERSION].token) >= 4) { - _debug("04 header completed\n"); + lwsl_parser("04 header completed\n"); wsi->parser_state = WSI_PARSING_COMPLETE; wsi->utf8_token[WSI_TOKEN_CHALLENGE].token_len = 0; free(wsi->utf8_token[WSI_TOKEN_CHALLENGE].token); @@ -257,7 +257,7 @@ int libwebsocket_parse(struct libwebsocket *wsi, unsigned char c) /* client parser? */ if (wsi->ietf_spec_revision >= 4) { - _debug("04 header completed\n"); + lwsl_parser("04 header completed\n"); wsi->parser_state = WSI_PARSING_COMPLETE; } @@ -265,12 +265,12 @@ int libwebsocket_parse(struct libwebsocket *wsi, unsigned char c) /* skipping arg part of a name we didn't recognize */ case WSI_TOKEN_SKIPPING: - _debug("WSI_TOKEN_SKIPPING '%c'\n", c); + lwsl_parser("WSI_TOKEN_SKIPPING '%c'\n", c); if (c == '\x0d') wsi->parser_state = WSI_TOKEN_SKIPPING_SAW_CR; break; case WSI_TOKEN_SKIPPING_SAW_CR: - _debug("WSI_TOKEN_SKIPPING_SAW_CR '%c'\n", c); + lwsl_parser("WSI_TOKEN_SKIPPING_SAW_CR '%c'\n", c); if (c == '\x0a') wsi->parser_state = WSI_TOKEN_NAME_PART; else @@ -279,7 +279,7 @@ int libwebsocket_parse(struct libwebsocket *wsi, unsigned char c) break; /* we're done, ignore anything else */ case WSI_PARSING_COMPLETE: - _debug("WSI_PARSING_COMPLETE '%c'\n", c); + lwsl_parser("WSI_PARSING_COMPLETE '%c'\n", c); break; default: /* keep gcc happy */ @@ -323,7 +323,7 @@ libwebsocket_rx_sm(struct libwebsocket *wsi, unsigned char c) int m; #if 0 - fprintf(stderr, "RX: %02X ", c); + lwsl_debug("RX: %02X ", c); #endif switch (wsi->lws_rx_parse_state) { @@ -359,7 +359,7 @@ libwebsocket_rx_sm(struct libwebsocket *wsi, unsigned char c) goto handle_first; default: - fprintf(stderr, "libwebsocket_rx_sm doesn't know " + lwsl_warn("libwebsocket_rx_sm doesn't know " "about spec version %d\n", wsi->ietf_spec_revision); break; } @@ -498,7 +498,7 @@ handle_first: wsi->opcode = LWS_WS_OPCODE_07__BINARY_FRAME; break; default: - fprintf(stderr, "reserved opcodes not " + lwsl_warn("reserved opcodes not " "usable pre v7 protocol\n"); return -1; } @@ -516,8 +516,7 @@ handle_first: c = wsi->xor_mask(wsi, c); if ((c & 0x80) && wsi->ietf_spec_revision < 7) { - fprintf(stderr, "Frame has extensions " - "set illegally 2\n"); + lwsl_warn("Frame has extensions set illegally 2\n"); /* kill the connection */ return -1; } @@ -576,7 +575,7 @@ handle_first: if (wsi->ietf_spec_revision < 7) c = wsi->xor_mask(wsi, c); if (c & 0x80) { - fprintf(stderr, "b63 of length must be zero\n"); + lwsl_warn("b63 of length must be zero\n"); /* kill the connection */ return -1; } @@ -671,16 +670,16 @@ issue: if (c) break; - _debug("Seen that client is requesting " + lwsl_parser("Seen that client is requesting " "a v76 close, sending ack\n"); buf[0] = 0xff; buf[1] = 0; n = libwebsocket_write(wsi, buf, 2, LWS_WRITE_HTTP); if (n < 0) { - fprintf(stderr, "ERROR writing to socket"); + lwsl_warn("ERROR writing to socket"); return -1; } - _debug(" v76 close ack sent, server closing skt\n"); + lwsl_parser(" v76 close ack sent, server closing skt\n"); /* returning < 0 will get it closed in parent */ return -1; @@ -741,7 +740,7 @@ spill: * layer? If so service it and hide it from the user callback */ - _debug("spill on %s\n", wsi->protocol->name); + lwsl_parser("spill on %s\n", wsi->protocol->name); switch (wsi->opcode) { case LWS_WS_OPCODE_07__CLOSE: @@ -751,10 +750,10 @@ spill: * fine he has told us he is closing too, let's * finish our close */ - _debug("seen client close ack\n"); + lwsl_parser("seen client close ack\n"); return -1; } - debug("server sees client close packet\n"); + lwsl_parser("server sees client close packet\n"); /* parrot the close packet payload back */ n = libwebsocket_write(wsi, (unsigned char *) &wsi->rx_user_buffer[LWS_SEND_BUFFER_PRE_PADDING], @@ -786,7 +785,7 @@ spill: default: - _debug("passing opcode %x up to exts\n", wsi->opcode); + lwsl_parser("passing opcode %x up to exts\n", wsi->opcode); /* * It's something special we can't understand here. @@ -811,7 +810,7 @@ spill: } if (!handled) - fprintf(stderr, "Unhandled extended opcode " + lwsl_ext("Unhandled extended opcode " "0x%x - ignoring frame\n", wsi->opcode); wsi->rx_user_buffer_head = 0; @@ -836,7 +835,7 @@ spill: wsi->active_extensions_user[n], &eff_buf, 0); if (m < 0) { - fprintf(stderr, + lwsl_ext( "Extension '%s' failed to handle payload!", wsi->active_extensions[n]->name); return -1; @@ -853,7 +852,7 @@ spill: eff_buf.token, eff_buf.token_len); else - fprintf(stderr, "No callback on payload spill!"); + lwsl_err("No callback on payload spill!"); } wsi->rx_user_buffer_head = 0; @@ -864,7 +863,7 @@ spill: illegal_ctl_length: - fprintf(stderr, "Control frame asking for " + lwsl_warn("Control frame asking for " "extended length is illegal\n"); /* kill the connection */ return -1; @@ -880,7 +879,7 @@ int libwebsocket_client_rx_sm(struct libwebsocket *wsi, unsigned char c) struct lws_tokens eff_buf; int m; - _debug(" CRX: %02X %d\n", c, wsi->lws_rx_parse_state); + lwsl_parser(" CRX: %02X %d\n", c, wsi->lws_rx_parse_state); switch (wsi->lws_rx_parse_state) { case LWS_RXPS_NEW: @@ -977,7 +976,7 @@ int libwebsocket_client_rx_sm(struct libwebsocket *wsi, unsigned char c) LWS_WS_OPCODE_07__BINARY_FRAME; break; default: - fprintf(stderr, "reserved opcodes not " + lwsl_warn("reserved opcodes not " "usable pre v7 protocol\n"); return -1; } @@ -990,7 +989,7 @@ int libwebsocket_client_rx_sm(struct libwebsocket *wsi, unsigned char c) break; default: - fprintf(stderr, "client_rx_sm doesn't know how " + lwsl_err("client_rx_sm doesn't know how " "to handle spec version %02d\n", wsi->ietf_spec_revision); break; @@ -1001,8 +1000,7 @@ int libwebsocket_client_rx_sm(struct libwebsocket *wsi, unsigned char c) case LWS_RXPS_04_FRAME_HDR_LEN: if ((c & 0x80) && wsi->ietf_spec_revision < 7) { - fprintf(stderr, - "Frame has extensions set illegally 4\n"); + lwsl_warn("Frame has extensions set illegally 4\n"); /* kill the connection */ return -1; } @@ -1063,7 +1061,7 @@ int libwebsocket_client_rx_sm(struct libwebsocket *wsi, unsigned char c) case LWS_RXPS_04_FRAME_HDR_LEN64_8: if (c & 0x80) { - fprintf(stderr, "b63 of length must be zero\n"); + lwsl_warn("b63 of length must be zero\n"); /* kill the connection */ return -1; } @@ -1186,16 +1184,16 @@ issue: if (c) break; - _debug("Seen that client is requesting " + lwsl_parser("Seen that client is requesting " "a v76 close, sending ack\n"); buf[0] = 0xff; buf[1] = 0; n = libwebsocket_write(wsi, buf, 2, LWS_WRITE_HTTP); if (n < 0) { - fprintf(stderr, "ERROR writing to socket"); + lwsl_warn("ERROR writing to socket"); return -1; } - _debug(" v76 close ack sent, server closing skt\n"); + lwsl_parser(" v76 close ack sent, server closing skt\n"); /* returning < 0 will get it closed in parent */ return -1; @@ -1234,15 +1232,15 @@ spill: * fine he has told us he is closing too, let's * finish our close */ - debug("seen server's close ack\n"); + lwsl_parser("seen server's close ack\n"); return -1; } - _debug("client sees server close packet len = %d\n", wsi->rx_user_buffer_head); + lwsl_parser("client sees server close packet len = %d\n", wsi->rx_user_buffer_head); /* parrot the close packet payload back */ n = libwebsocket_write(wsi, (unsigned char *) &wsi->rx_user_buffer[LWS_SEND_BUFFER_PRE_PADDING], wsi->rx_user_buffer_head, LWS_WRITE_CLOSE); - _debug("client writing close ack returned %d\n", n); + lwsl_parser("client writing close ack returned %d\n", n); wsi->state = WSI_STATE_RETURNED_CLOSE_ALREADY; /* close the connection */ return -1; @@ -1270,7 +1268,7 @@ spill: default: - debug("Reserved opcode 0x%2X\n", wsi->opcode); + lwsl_parser("Reserved opcode 0x%2X\n", wsi->opcode); /* * It's something special we can't understand here. * Pass the payload up to the extension's parsing @@ -1293,7 +1291,7 @@ spill: } if (!handled) { - fprintf(stderr, "Unhandled extended opcode " + lwsl_ext("Unhandled extended opcode " "0x%x - ignoring frame\n", wsi->opcode); wsi->rx_user_buffer_head = 0; @@ -1323,7 +1321,7 @@ spill: wsi->active_extensions_user[n], &eff_buf, 0); if (m < 0) { - fprintf(stderr, + lwsl_ext( "Extension '%s' failed to handle payload!", wsi->active_extensions[n]->name); return -1; @@ -1346,7 +1344,7 @@ already_done: wsi->rx_user_buffer_head = 0; break; default: - fprintf(stderr, "client rx illegal state\n"); + lwsl_err("client rx illegal state\n"); return 1; } @@ -1354,7 +1352,7 @@ already_done: illegal_ctl_length: - fprintf(stderr, "Control frame asking for " + lwsl_warn("Control frame asking for " "extended length is illegal\n"); /* kill the connection */ return -1; @@ -1369,10 +1367,10 @@ int libwebsocket_interpret_incoming_packet(struct libwebsocket *wsi, size_t n; #ifdef DEBUG - fprintf(stderr, "received %d byte packet\n", (int)len); + lwsl_parser("received %d byte packet\n", (int)len); for (n = 0; n < len; n++) - fprintf(stderr, "%02X ", buf[n]); - fprintf(stderr, "\n"); + lwsl_parser("%02X ", buf[n]); + lwsl_parser("\n"); #endif /* let the rx protocol state machine have as much as it needs */ @@ -1397,7 +1395,7 @@ libwebsocket_0405_frame_mask_generate(struct libwebsocket *wsi) n = libwebsockets_get_random(wsi->protocol->owning_server, wsi->frame_masking_nonce_04, 4); if (n != 4) { - fprintf(stderr, "Unable to read from random device %s %d\n", + lwsl_parser("Unable to read from random device %s %d\n", SYSTEM_RANDOM_FILEPATH, n); return 1; } @@ -1432,32 +1430,32 @@ void lws_stderr_hexdump(unsigned char *buf, size_t len) int m; int start; - fprintf(stderr, "\n"); + lwsl_parser("\n"); for (n = 0; n < len;) { start = n; - fprintf(stderr, "%04X: ", start); + lwsl_debug("%04X: ", start); for (m = 0; m < 16 && n < len; m++) - fprintf(stderr, "%02X ", buf[n++]); + lwsl_debug("%02X ", buf[n++]); while (m++ < 16) - fprintf(stderr, " "); + lwsl_debug(" "); - fprintf(stderr, " "); + lwsl_debug(" "); for (m = 0; m < 16 && (start + m) < len; m++) { if (buf[start + m] >= ' ' && buf[start + m] <= 127) - fprintf(stderr, "%c", buf[start + m]); + lwsl_debug("%c", buf[start + m]); else - fprintf(stderr, "."); + lwsl_debug("."); } while (m++ < 16) - fprintf(stderr, " "); + lwsl_debug(" "); - fprintf(stderr, "\n"); + lwsl_debug("\n"); } - fprintf(stderr, "\n"); + lwsl_debug("\n"); } int lws_issue_raw(struct libwebsocket *wsi, unsigned char *buf, size_t len) @@ -1480,24 +1478,24 @@ int lws_issue_raw(struct libwebsocket *wsi, unsigned char *buf, size_t len) LWS_EXT_CALLBACK_PACKET_TX_DO_SEND, wsi->active_extensions_user[n], &buf, len); if (m < 0) { - fprintf(stderr, "Extension reports fatal error\n"); + lwsl_ext("Extension reports fatal error\n"); return -1; } if (m) /* handled */ { -/* fprintf(stderr, "ext sent it\n"); */ +/* lwsl_ext("ext sent it\n"); */ return 0; } } if (!wsi->sock) - fprintf(stderr, "** error 0 sock but expected to send\n"); + lwsl_warn("** error 0 sock but expected to send\n"); /* * nope, send it on the socket directly */ #if 0 - fprintf(stderr, " TX: "); + lwsl_debug(" TX: "); lws_stderr_hexdump(buf, len); #endif @@ -1505,16 +1503,14 @@ int lws_issue_raw(struct libwebsocket *wsi, unsigned char *buf, size_t len) if (wsi->ssl) { n = SSL_write(wsi->ssl, buf, len); if (n < 0) { - fprintf(stderr, - "ERROR writing to socket\n"); + lwsl_debug("ERROR writing to socket\n"); return -1; } } else { #endif n = send(wsi->sock, buf, len, MSG_NOSIGNAL); if (n < 0) { - fprintf(stderr, - "ERROR writing to socket\n"); + lwsl_debug("ERROR writing to socket\n"); return -1; } #ifdef LWS_OPENSSL_SUPPORT @@ -1556,7 +1552,7 @@ lws_issue_raw_ext_access(struct libwebsocket *wsi, LWS_EXT_CALLBACK_PACKET_TX_PRESEND, wsi->active_extensions_user[n], &eff_buf, 0); if (m < 0) { - fprintf(stderr, "Extension: fatal error\n"); + lwsl_ext("Extension: fatal error\n"); return -1; } if (m) @@ -1574,7 +1570,7 @@ lws_issue_raw_ext_access(struct libwebsocket *wsi, eff_buf.token_len)) return -1; - _debug("written %d bytes to client\n", eff_buf.token_len); + lwsl_parser("written %d bytes to client\n", eff_buf.token_len); /* no extension has more to spill */ @@ -1594,7 +1590,7 @@ lws_issue_raw_ext_access(struct libwebsocket *wsi, /* no we could add more */ continue; - debug("choked\n"); + lwsl_debug("choked\n"); /* * Yes, he's choked. Don't spill the rest now get a callback @@ -1649,7 +1645,7 @@ int libwebsocket_write(struct libwebsocket *wsi, unsigned char *buf, int m; if (len == 0 && protocol != LWS_WRITE_CLOSE) { - fprintf(stderr, "zero length libwebsocket_write attempt\n"); + lwsl_warn("zero length libwebsocket_write attempt\n"); return 0; } @@ -1768,13 +1764,13 @@ int libwebsocket_write(struct libwebsocket *wsi, unsigned char *buf, switch (wsi->mode) { case LWS_CONNMODE_WS_SERVING: /* - fprintf(stderr, "LWS_WRITE_CLOSE S\n"); + lwsl_debug("LWS_WRITE_CLOSE S\n"); */ buf[0] = 'S'; break; case LWS_CONNMODE_WS_CLIENT: /* - fprintf(stderr, "LWS_WRITE_CLOSE C\n"); + lwsl_debug("LWS_WRITE_CLOSE C\n"); */ buf[0] = 'C'; break; @@ -1813,7 +1809,7 @@ int libwebsocket_write(struct libwebsocket *wsi, unsigned char *buf, n = LWS_WS_OPCODE_07__PONG; break; default: - fprintf(stderr, "libwebsocket_write: unknown write " + lwsl_warn("libwebsocket_write: unknown write " "opcode / protocol\n"); return -1; } @@ -1873,7 +1869,7 @@ int libwebsocket_write(struct libwebsocket *wsi, unsigned char *buf, wsi->xor_mask != xor_no_mask) { if (libwebsocket_0405_frame_mask_generate(wsi)) { - fprintf(stderr, "libwebsocket_write: " + lwsl_err("libwebsocket_write: " "frame mask generation failed\n"); return 1; } @@ -1932,11 +1928,11 @@ int libwebsocket_write(struct libwebsocket *wsi, unsigned char *buf, send_raw: #if 0 - fprintf(stderr, "send %ld: ", len + post); + lwsl_debug("send %ld: ", len + post); for (n = -pre; n < ((int)len + post); n++) - fprintf(stderr, "%02X ", buf[n]); + lwsl_debug("%02X ", buf[n]); - fprintf(stderr, "\n"); + lwsl_debug("\n"); #endif if (protocol == LWS_WRITE_HTTP) { diff --git a/lib/private-libwebsockets.h b/lib/private-libwebsockets.h index 1139f7f..2cc0358 100644 --- a/lib/private-libwebsockets.h +++ b/lib/private-libwebsockets.h @@ -78,35 +78,34 @@ #include #endif - #include "libwebsockets.h" -#if 0 -#define _DEBUG -#endif +extern void _lws_log(int filter, const char *format, ...); +/* warn and log are always compiled in */ +#define lwsl_warn(...) _lws_log(LLL_WARN, __VA_ARGS__) +#define lwsl_err(...) _lws_log(LLL_ERR, __VA_ARGS__) + +/* + * weaker logging can be deselected at configure time using disable_debug + * that gets rid of the overhead of checking while keeping _warn and _err + * active + */ #ifdef _DEBUG -#ifdef WIN32 -#define _debug(...) lws_log(LWS_LOG_DEBUG, __VA_ARGS__) -#else -static inline +#define lwsl_info(...) _lws_log(LLL_INFO, __VA_ARGS__) +#define lwsl_debug(...) _lws_log(LLL_DEBUG, __VA_ARGS__) +#define lwsl_parser(...) _lws_log(LLL_PARSER, __VA_ARGS__) +#define lwsl_header(...) _lws_log(LLL_HEADER, __VA_ARGS__) +#define lwsl_ext(...) _lws_log(LLL_HEADER, __VA_ARGS__) +#define lwsl_client(...) _lws_log(LLL_CLIENT, __VA_ARGS__) +#else /* no debug */ +#define lwsl_info(...) +#define lwsl_debug(...) +#define lwsl_parser(...) +#define lwsl_header(...) +#define lwsl_ext(...) +#define lwsl_client(...) #endif -void debug(const char *format, ...) -{ - va_list ap; - va_start(ap, format); vfprintf(stderr, format, ap); va_end(ap); -} -#else -#ifdef WIN32 -#define _debug(...) -#else -static inline -void _debug(const char *format, ...) -{ -} -#endif -#endif - /* * Mac OSX as well as iOS do not define the MSG_NOSIGNAL flag, diff --git a/libwebsockets-api-doc.html b/libwebsockets-api-doc.html index 5f245bb..b41b4c7 100644 --- a/libwebsockets-api-doc.html +++ b/libwebsockets-api-doc.html @@ -350,6 +350,21 @@ having to take any care about data visibility between the processes, it'll "just work".
+

lws_set_log_level - Set the logging bitfield

+void +lws_set_log_level +(int level) +

Arguments

+
+
level +
OR together the LLL_ debug contexts you want output from +
+

Description

+
+

+defaults to err and warn contexts enabled +

+

libwebsocket_write - Apply protocol then write data to client

int libwebsocket_write