From 4faf938bf201c80f692a1a3989c8cdcbcc1d7273 Mon Sep 17 00:00:00 2001 From: Steve Fan <29133953+stevefan1999-personal@users.noreply.github.com> Date: Sun, 30 Dec 2018 20:37:45 +0800 Subject: [PATCH 1/8] Add base CMake config --- .idea/codeStyles/codeStyleConfig.xml | 5 + CMakeLists.txt | 937 +++++++++++++++++++++++++++ 2 files changed, 942 insertions(+) create mode 100644 .idea/codeStyles/codeStyleConfig.xml create mode 100644 CMakeLists.txt diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml new file mode 100644 index 0000000..79ee123 --- /dev/null +++ b/.idea/codeStyles/codeStyleConfig.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..9591731 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,937 @@ +cmake_minimum_required(VERSION 3.12) +project(lowjs) + +set(CMAKE_CXX_STANDARD 14) + +include_directories(app) +include_directories(deps/c-ares) +include_directories(deps/c-ares/test) +include_directories(deps/c-ares/test/gmock-1.8.0/gmock) +include_directories(deps/c-ares/test/gmock-1.8.0/gtest) +include_directories(deps/duktape/examples/alloc-hybrid) +include_directories(deps/duktape/examples/alloc-logging) +include_directories(deps/duktape/examples/alloc-torture) +include_directories(deps/duktape/examples/cmdline) +include_directories(deps/duktape/examples/codepage-conv) +include_directories(deps/duktape/examples/debug-trans-dvalue) +include_directories(deps/duktape/examples/debug-trans-socket) +include_directories(deps/duktape/examples/eventloop) +include_directories(deps/duktape/extras/alloc-pool) +include_directories(deps/duktape/extras/cbor) +include_directories(deps/duktape/extras/console) +include_directories(deps/duktape/extras/duk-v1-compat) +include_directories(deps/duktape/extras/logging) +include_directories(deps/duktape/extras/minimal-printf) +include_directories(deps/duktape/extras/module-duktape) +include_directories(deps/duktape/extras/module-node) +include_directories(deps/duktape/extras/print-alert) +include_directories(deps/duktape/src-input) +include_directories(deps/duktape/util) +include_directories(deps/mbedtls/configs) +include_directories(deps/mbedtls/doxygen) +include_directories(deps/mbedtls/doxygen/input) +include_directories(deps/mbedtls/include) +include_directories(deps/mbedtls/include/mbedtls) +include_directories(examples/low_with_native_module) +include_directories(include) +include_directories(src) + +add_executable(lowjs + app/low_config.h + app/main.c + deps/c-ares/test/gmock-1.8.0/gmock/gmock.h + deps/c-ares/test/gmock-1.8.0/gtest/gtest.h + deps/c-ares/test/gmock-1.8.0/gmock-gtest-all.cc + deps/c-ares/test/ares-fuzz.c + deps/c-ares/test/ares-test-ai.h + deps/c-ares/test/ares-test-fuzz-name.c + deps/c-ares/test/ares-test-fuzz.c + deps/c-ares/test/ares-test-init.cc + deps/c-ares/test/ares-test-internal.cc + deps/c-ares/test/ares-test-live-ai.cc + deps/c-ares/test/ares-test-live.cc + deps/c-ares/test/ares-test-main.cc + deps/c-ares/test/ares-test-misc.cc + deps/c-ares/test/ares-test-mock-ai.cc + deps/c-ares/test/ares-test-mock.cc + deps/c-ares/test/ares-test-ns.cc + deps/c-ares/test/ares-test-parse-a.cc + deps/c-ares/test/ares-test-parse-aaaa.cc + deps/c-ares/test/ares-test-parse-mx.cc + deps/c-ares/test/ares-test-parse-naptr.cc + deps/c-ares/test/ares-test-parse-ns.cc + deps/c-ares/test/ares-test-parse-ptr.cc + deps/c-ares/test/ares-test-parse-soa.cc + deps/c-ares/test/ares-test-parse-srv.cc + deps/c-ares/test/ares-test-parse-txt.cc + deps/c-ares/test/ares-test-parse.cc + deps/c-ares/test/ares-test.cc + deps/c-ares/test/ares-test.h + deps/c-ares/test/dns-dump.cc + deps/c-ares/test/dns-proto-test.cc + deps/c-ares/test/dns-proto.cc + deps/c-ares/test/dns-proto.h + deps/c-ares/acountry.c + deps/c-ares/adig.c + deps/c-ares/ahost.c + deps/c-ares/ares.h + deps/c-ares/ares__close_sockets.c + deps/c-ares/ares__get_hostent.c + deps/c-ares/ares__read_line.c + deps/c-ares/ares__timeval.c + deps/c-ares/ares_android.c + deps/c-ares/ares_android.h + deps/c-ares/ares_cancel.c + deps/c-ares/ares_create_query.c + deps/c-ares/ares_data.c + deps/c-ares/ares_data.h + deps/c-ares/ares_destroy.c + deps/c-ares/ares_dns.h + deps/c-ares/ares_expand_name.c + deps/c-ares/ares_expand_string.c + deps/c-ares/ares_fds.c + deps/c-ares/ares_free_hostent.c + deps/c-ares/ares_free_string.c + deps/c-ares/ares_getaddrinfo.c + deps/c-ares/ares_getenv.c + deps/c-ares/ares_getenv.h + deps/c-ares/ares_gethostbyaddr.c + deps/c-ares/ares_gethostbyname.c + deps/c-ares/ares_getnameinfo.c + deps/c-ares/ares_getopt.c + deps/c-ares/ares_getopt.h + deps/c-ares/ares_getsock.c + deps/c-ares/ares_inet_net_pton.h + deps/c-ares/ares_init.c + deps/c-ares/ares_iphlpapi.h + deps/c-ares/ares_ipv6.h + deps/c-ares/ares_library_init.c + deps/c-ares/ares_library_init.h + deps/c-ares/ares_llist.c + deps/c-ares/ares_llist.h + deps/c-ares/ares_mkquery.c + deps/c-ares/ares_nowarn.c + deps/c-ares/ares_nowarn.h + deps/c-ares/ares_options.c + deps/c-ares/ares_parse_a_reply.c + deps/c-ares/ares_parse_aaaa_reply.c + deps/c-ares/ares_parse_mx_reply.c + deps/c-ares/ares_parse_naptr_reply.c + deps/c-ares/ares_parse_ns_reply.c + deps/c-ares/ares_parse_ptr_reply.c + deps/c-ares/ares_parse_soa_reply.c + deps/c-ares/ares_parse_srv_reply.c + deps/c-ares/ares_parse_txt_reply.c + deps/c-ares/ares_platform.c + deps/c-ares/ares_platform.h + deps/c-ares/ares_private.h + deps/c-ares/ares_process.c + deps/c-ares/ares_query.c + deps/c-ares/ares_rules.h + deps/c-ares/ares_search.c + deps/c-ares/ares_send.c + deps/c-ares/ares_setup.h + deps/c-ares/ares_strcasecmp.c + deps/c-ares/ares_strcasecmp.h + deps/c-ares/ares_strdup.c + deps/c-ares/ares_strdup.h + deps/c-ares/ares_strerror.c + deps/c-ares/ares_strsplit.c + deps/c-ares/ares_strsplit.h + deps/c-ares/ares_timeout.c + deps/c-ares/ares_version.c + deps/c-ares/ares_version.h + deps/c-ares/ares_writev.c + deps/c-ares/ares_writev.h + deps/c-ares/bitncmp.c + deps/c-ares/bitncmp.h + deps/c-ares/config-dos.h + deps/c-ares/config-win32.h + deps/c-ares/inet_net_pton.c + deps/c-ares/inet_ntop.c + deps/c-ares/nameser.h + deps/c-ares/setup_once.h + deps/c-ares/windows_port.c + deps/duktape/dukweb/dukweb.c + deps/duktape/examples/alloc-hybrid/duk_alloc_hybrid.c + deps/duktape/examples/alloc-hybrid/duk_alloc_hybrid.h + deps/duktape/examples/alloc-logging/duk_alloc_logging.c + deps/duktape/examples/alloc-logging/duk_alloc_logging.h + deps/duktape/examples/alloc-torture/duk_alloc_torture.c + deps/duktape/examples/alloc-torture/duk_alloc_torture.h + deps/duktape/examples/cmdline/duk_cmdline.c + deps/duktape/examples/cmdline/duk_cmdline.h + deps/duktape/examples/cmdline/duk_cmdline_lowmem.c + deps/duktape/examples/codepage-conv/duk_codepage_conv.c + deps/duktape/examples/codepage-conv/duk_codepage_conv.h + deps/duktape/examples/codepage-conv/test.c + deps/duktape/examples/cpp-exceptions/cpp_exceptions.cpp + deps/duktape/examples/debug-trans-dvalue/duk_trans_dvalue.c + deps/duktape/examples/debug-trans-dvalue/duk_trans_dvalue.h + deps/duktape/examples/debug-trans-dvalue/test.c + deps/duktape/examples/debug-trans-socket/duk_trans_socket.h + deps/duktape/examples/debug-trans-socket/duk_trans_socket_unix.c + deps/duktape/examples/debug-trans-socket/duk_trans_socket_windows.c + deps/duktape/examples/dummy-date-provider/dummy_date_provider.c + deps/duktape/examples/eval/eval.c + deps/duktape/examples/eventloop/c_eventloop.c + deps/duktape/examples/eventloop/c_eventloop.h + deps/duktape/examples/eventloop/fileio.c + deps/duktape/examples/eventloop/main.c + deps/duktape/examples/eventloop/ncurses.c + deps/duktape/examples/eventloop/poll.c + deps/duktape/examples/eventloop/socket.c + deps/duktape/examples/guide/primecheck.c + deps/duktape/examples/guide/processlines.c + deps/duktape/examples/guide/uppercase.c + deps/duktape/examples/hello/hello.c + deps/duktape/examples/hello/hello_ptrcomp.c + deps/duktape/examples/jxpretty/jxpretty.c + deps/duktape/examples/sandbox/sandbox.c + deps/duktape/extras/alloc-pool/duk_alloc_pool.c + deps/duktape/extras/alloc-pool/duk_alloc_pool.h + deps/duktape/extras/alloc-pool/ptrcomp_fixup.h + deps/duktape/extras/alloc-pool/test.c + deps/duktape/extras/cbor/duk_cbor.c + deps/duktape/extras/cbor/duk_cbor.h + deps/duktape/extras/cbor/jsoncbor.c + deps/duktape/extras/console/duk_console.c + deps/duktape/extras/console/duk_console.h + deps/duktape/extras/console/test.c + deps/duktape/extras/duk-v1-compat/duk_v1_compat.c + deps/duktape/extras/duk-v1-compat/duk_v1_compat.h + deps/duktape/extras/duk-v1-compat/test.c + deps/duktape/extras/logging/duk_logging.c + deps/duktape/extras/logging/duk_logging.h + deps/duktape/extras/logging/test.c + deps/duktape/extras/minimal-printf/duk_minimal_printf.c + deps/duktape/extras/minimal-printf/duk_minimal_printf.h + deps/duktape/extras/minimal-printf/test.c + deps/duktape/extras/module-duktape/duk_module_duktape.c + deps/duktape/extras/module-duktape/duk_module_duktape.h + deps/duktape/extras/module-duktape/test.c + deps/duktape/extras/module-node/duk_module_node.c + deps/duktape/extras/module-node/duk_module_node.h + deps/duktape/extras/module-node/test.c + deps/duktape/extras/print-alert/duk_print_alert.c + deps/duktape/extras/print-alert/duk_print_alert.h + deps/duktape/extras/print-alert/test.c + deps/duktape/misc/arridx_unsigned.c + deps/duktape/misc/c_hex_esc.c + deps/duktape/misc/clang_aliasing.c + deps/duktape/misc/clang_cast_align.c + deps/duktape/misc/cxx_static_const.c + deps/duktape/misc/float_cast.c + deps/duktape/misc/literal_intern_test.c + deps/duktape/misc/preproc_compare1.c + deps/duktape/misc/preproc_compare2.c + deps/duktape/misc/preproc_compare3.c + deps/duktape/misc/preproc_compare4.c + deps/duktape/misc/shift_warning.c + deps/duktape/misc/splitmix64.c + deps/duktape/misc/splitmix64_test.c + deps/duktape/misc/tcc_zerosign1.c + deps/duktape/misc/tcc_zerosign2.c + deps/duktape/misc/test_mandel2.c + deps/duktape/misc/testdefs.c + deps/duktape/misc/union_initializer.c + deps/duktape/misc/xoroshiro128plus.c + deps/duktape/misc/xoroshiro128plus_test.c + deps/duktape/runtests/api_testcase_main.c + deps/duktape/src-input/duk_alloc_default.c + deps/duktape/src-input/duk_api_buffer.c + deps/duktape/src-input/duk_api_bytecode.c + deps/duktape/src-input/duk_api_call.c + deps/duktape/src-input/duk_api_codec.c + deps/duktape/src-input/duk_api_compile.c + deps/duktape/src-input/duk_api_debug.c + deps/duktape/src-input/duk_api_heap.c + deps/duktape/src-input/duk_api_inspect.c + deps/duktape/src-input/duk_api_internal.h + deps/duktape/src-input/duk_api_memory.c + deps/duktape/src-input/duk_api_object.c + deps/duktape/src-input/duk_api_random.c + deps/duktape/src-input/duk_api_stack.c + deps/duktape/src-input/duk_api_string.c + deps/duktape/src-input/duk_api_time.c + deps/duktape/src-input/duk_bi_array.c + deps/duktape/src-input/duk_bi_boolean.c + deps/duktape/src-input/duk_bi_buffer.c + deps/duktape/src-input/duk_bi_date.c + deps/duktape/src-input/duk_bi_date_unix.c + deps/duktape/src-input/duk_bi_date_windows.c + deps/duktape/src-input/duk_bi_duktape.c + deps/duktape/src-input/duk_bi_encoding.c + deps/duktape/src-input/duk_bi_error.c + deps/duktape/src-input/duk_bi_function.c + deps/duktape/src-input/duk_bi_global.c + deps/duktape/src-input/duk_bi_json.c + deps/duktape/src-input/duk_bi_math.c + deps/duktape/src-input/duk_bi_number.c + deps/duktape/src-input/duk_bi_object.c + deps/duktape/src-input/duk_bi_performance.c + deps/duktape/src-input/duk_bi_pointer.c + deps/duktape/src-input/duk_bi_promise.c + deps/duktape/src-input/duk_bi_protos.h + deps/duktape/src-input/duk_bi_proxy.c + deps/duktape/src-input/duk_bi_reflect.c + deps/duktape/src-input/duk_bi_regexp.c + deps/duktape/src-input/duk_bi_string.c + deps/duktape/src-input/duk_bi_symbol.c + deps/duktape/src-input/duk_bi_thread.c + deps/duktape/src-input/duk_bi_thrower.c + deps/duktape/src-input/duk_dblunion.h + deps/duktape/src-input/duk_debug.h + deps/duktape/src-input/duk_debug_fixedbuffer.c + deps/duktape/src-input/duk_debug_macros.c + deps/duktape/src-input/duk_debug_vsnprintf.c + deps/duktape/src-input/duk_debugger.c + deps/duktape/src-input/duk_debugger.h + deps/duktape/src-input/duk_error.h + deps/duktape/src-input/duk_error_augment.c + deps/duktape/src-input/duk_error_longjmp.c + deps/duktape/src-input/duk_error_macros.c + deps/duktape/src-input/duk_error_misc.c + deps/duktape/src-input/duk_error_throw.c + deps/duktape/src-input/duk_exception.h + deps/duktape/src-input/duk_forwdecl.h + deps/duktape/src-input/duk_harray.h + deps/duktape/src-input/duk_hboundfunc.h + deps/duktape/src-input/duk_hbuffer.h + deps/duktape/src-input/duk_hbuffer_alloc.c + deps/duktape/src-input/duk_hbuffer_ops.c + deps/duktape/src-input/duk_hbufobj.h + deps/duktape/src-input/duk_hbufobj_misc.c + deps/duktape/src-input/duk_hcompfunc.h + deps/duktape/src-input/duk_heap.h + deps/duktape/src-input/duk_heap_alloc.c + deps/duktape/src-input/duk_heap_finalize.c + deps/duktape/src-input/duk_heap_hashstring.c + deps/duktape/src-input/duk_heap_markandsweep.c + deps/duktape/src-input/duk_heap_memory.c + deps/duktape/src-input/duk_heap_misc.c + deps/duktape/src-input/duk_heap_refcount.c + deps/duktape/src-input/duk_heap_stringcache.c + deps/duktape/src-input/duk_heap_stringtable.c + deps/duktape/src-input/duk_heaphdr.h + deps/duktape/src-input/duk_henv.h + deps/duktape/src-input/duk_hnatfunc.h + deps/duktape/src-input/duk_hobject.h + deps/duktape/src-input/duk_hobject_alloc.c + deps/duktape/src-input/duk_hobject_class.c + deps/duktape/src-input/duk_hobject_enum.c + deps/duktape/src-input/duk_hobject_misc.c + deps/duktape/src-input/duk_hobject_pc2line.c + deps/duktape/src-input/duk_hobject_props.c + deps/duktape/src-input/duk_hproxy.h + deps/duktape/src-input/duk_hstring.h + deps/duktape/src-input/duk_hstring_misc.c + deps/duktape/src-input/duk_hthread.h + deps/duktape/src-input/duk_hthread_alloc.c + deps/duktape/src-input/duk_hthread_builtins.c + deps/duktape/src-input/duk_hthread_misc.c + deps/duktape/src-input/duk_hthread_stacks.c + deps/duktape/src-input/duk_internal.h + deps/duktape/src-input/duk_jmpbuf.h + deps/duktape/src-input/duk_js.h + deps/duktape/src-input/duk_js_arith.c + deps/duktape/src-input/duk_js_bytecode.h + deps/duktape/src-input/duk_js_call.c + deps/duktape/src-input/duk_js_compiler.c + deps/duktape/src-input/duk_js_compiler.h + deps/duktape/src-input/duk_js_executor.c + deps/duktape/src-input/duk_js_ops.c + deps/duktape/src-input/duk_js_var.c + deps/duktape/src-input/duk_json.h + deps/duktape/src-input/duk_lexer.c + deps/duktape/src-input/duk_lexer.h + deps/duktape/src-input/duk_numconv.c + deps/duktape/src-input/duk_numconv.h + deps/duktape/src-input/duk_refcount.h + deps/duktape/src-input/duk_regexp.h + deps/duktape/src-input/duk_regexp_compiler.c + deps/duktape/src-input/duk_regexp_executor.c + deps/duktape/src-input/duk_replacements.c + deps/duktape/src-input/duk_replacements.h + deps/duktape/src-input/duk_selftest.c + deps/duktape/src-input/duk_selftest.h + deps/duktape/src-input/duk_strings.h + deps/duktape/src-input/duk_tval.c + deps/duktape/src-input/duk_tval.h + deps/duktape/src-input/duk_unicode.h + deps/duktape/src-input/duk_unicode_support.c + deps/duktape/src-input/duk_unicode_tables.c + deps/duktape/src-input/duk_util.h + deps/duktape/src-input/duk_util_bitdecoder.c + deps/duktape/src-input/duk_util_bitencoder.c + deps/duktape/src-input/duk_util_bufwriter.c + deps/duktape/src-input/duk_util_cast.c + deps/duktape/src-input/duk_util_double.c + deps/duktape/src-input/duk_util_hashbytes.c + deps/duktape/src-input/duk_util_memory.c + deps/duktape/src-input/duk_util_misc.c + deps/duktape/src-input/duk_util_tinyrandom.c + deps/duktape/tests/api/test-all-public-symbols.c + deps/duktape/tests/api/test-base64.c + deps/duktape/tests/api/test-buffer-to-string.c + deps/duktape/tests/api/test-buffer-zeroed.c + deps/duktape/tests/api/test-bufferobject-dynamic-safety.c + deps/duktape/tests/api/test-bufferobject-example-1.c + deps/duktape/tests/api/test-bufferobject-initial.c + deps/duktape/tests/api/test-bug-bufferobject-arraybuffer-offset-length.c + deps/duktape/tests/api/test-bug-is-constructor-call-empty-callstack.c + deps/duktape/tests/api/test-bug-is-fixed-dynamic-buffer-nullptr.c + deps/duktape/tests/api/test-bug-is-primitive-invalid-index-gh337.c + deps/duktape/tests/api/test-bug-multithread-valgrind.c + deps/duktape/tests/api/test-bug-object-binding-proxy.c + deps/duktape/tests/api/test-bug-peval-pcompile-nofile.c + deps/duktape/tests/api/test-bug-push-buffer-maxsize.c + deps/duktape/tests/api/test-bug-push-buffer-semicolon.c + deps/duktape/tests/api/test-bug-push-sprintf-va-copy.c + deps/duktape/tests/api/test-bug-push-string-maxsize.c + deps/duktape/tests/api/test-bug-refzero-rescue-queue.c + deps/duktape/tests/api/test-bug-set-cfunc-name.c + deps/duktape/tests/api/test-bug-set-top-wrap.c + deps/duktape/tests/api/test-bug-tailcall-preventyield-assert.c + deps/duktape/tests/api/test-c-constructor.c + deps/duktape/tests/api/test-call-method.c + deps/duktape/tests/api/test-call-prop.c + deps/duktape/tests/api/test-call.c + deps/duktape/tests/api/test-charcodeat.c + deps/duktape/tests/api/test-check-require-stack-top.c + deps/duktape/tests/api/test-check-require-stack.c + deps/duktape/tests/api/test-check-type-mask.c + deps/duktape/tests/api/test-check-type.c + deps/duktape/tests/api/test-compact.c + deps/duktape/tests/api/test-compile-file.c + deps/duktape/tests/api/test-compile-filename.c + deps/duktape/tests/api/test-compile-shebang.c + deps/duktape/tests/api/test-compile-string.c + deps/duktape/tests/api/test-compile.c + deps/duktape/tests/api/test-concat.c + deps/duktape/tests/api/test-copy.c + deps/duktape/tests/api/test-debugger-notify.c + deps/duktape/tests/api/test-decode-string.c + deps/duktape/tests/api/test-def-prop-convenience.c + deps/duktape/tests/api/test-def-prop-virtual.c + deps/duktape/tests/api/test-def-prop.c + deps/duktape/tests/api/test-del-prop.c + deps/duktape/tests/api/test-dev-api-verbose-error-messages-gh441.c + deps/duktape/tests/api/test-dev-cfunc-name.c + deps/duktape/tests/api/test-dev-cmodule-guide.c + deps/duktape/tests/api/test-dev-constructor-augment.c + deps/duktape/tests/api/test-dev-error-fileline-blame-gh455.c + deps/duktape/tests/api/test-dev-finalizer-rerun.c + deps/duktape/tests/api/test-dev-finalizer-rescue-unwind.c + deps/duktape/tests/api/test-dev-func-bind-name-notstring.c + deps/duktape/tests/api/test-dev-func-tostring.c + deps/duktape/tests/api/test-dev-getpropc-inherited-_value.c + deps/duktape/tests/api/test-dev-global-object-proxy.c + deps/duktape/tests/api/test-dev-internal-key-access.c + deps/duktape/tests/api/test-dev-internal-property-basics.c + deps/duktape/tests/api/test-dev-lightfunc-bound.c + deps/duktape/tests/api/test-dev-lightfunc-toobject-varargs.c + deps/duktape/tests/api/test-dev-lightfunc.c + deps/duktape/tests/api/test-dev-override-duktapec-func-getters.c + deps/duktape/tests/api/test-dev-plain-buffer.c + deps/duktape/tests/api/test-dev-prototype-loop.c + deps/duktape/tests/api/test-dev-return-types.c + deps/duktape/tests/api/test-dev-rom-builtins-1.c + deps/duktape/tests/api/test-dev-set-duktapec-func-length.c + deps/duktape/tests/api/test-dev-set-duktapec-func-name.c + deps/duktape/tests/api/test-dev-string-intern-side-effect.c + deps/duktape/tests/api/test-dev-symbol-basic.c + deps/duktape/tests/api/test-dev-valstack-checked-size-call.c + deps/duktape/tests/api/test-dev-write-duktapec-func-length.c + deps/duktape/tests/api/test-dev-write-duktapec-func-name.c + deps/duktape/tests/api/test-dump-context.c + deps/duktape/tests/api/test-dump-load-basic.c + deps/duktape/tests/api/test-dump-load-bound.c + deps/duktape/tests/api/test-dump-load-fastint.c + deps/duktape/tests/api/test-dump-load-inner-func-length.c + deps/duktape/tests/api/test-dup.c + deps/duktape/tests/api/test-enum-gh1592.c + deps/duktape/tests/api/test-enum.c + deps/duktape/tests/api/test-equals-strict-equals.c + deps/duktape/tests/api/test-errhandler.c + deps/duktape/tests/api/test-error-convenience.c + deps/duktape/tests/api/test-error.c + deps/duktape/tests/api/test-eval-file.c + deps/duktape/tests/api/test-eval-filename.c + deps/duktape/tests/api/test-eval-strictness.c + deps/duktape/tests/api/test-eval-string.c + deps/duktape/tests/api/test-eval-this-binding.c + deps/duktape/tests/api/test-eval.c + deps/duktape/tests/api/test-external-buffer.c + deps/duktape/tests/api/test-fatal-return.c + deps/duktape/tests/api/test-fatal.c + deps/duktape/tests/api/test-freeze.c + deps/duktape/tests/api/test-frontpage.c + deps/duktape/tests/api/test-gc.c + deps/duktape/tests/api/test-get-boolean-default.c + deps/duktape/tests/api/test-get-boolean.c + deps/duktape/tests/api/test-get-buffer-data-default.c + deps/duktape/tests/api/test-get-buffer-data.c + deps/duktape/tests/api/test-get-buffer-default.c + deps/duktape/tests/api/test-get-buffer.c + deps/duktape/tests/api/test-get-c-function-default.c + deps/duktape/tests/api/test-get-c-function.c + deps/duktape/tests/api/test-get-context-default.c + deps/duktape/tests/api/test-get-context.c + deps/duktape/tests/api/test-get-error-code-is-error.c + deps/duktape/tests/api/test-get-global-heapptr.c + deps/duktape/tests/api/test-get-global-literal.c + deps/duktape/tests/api/test-get-global-string.c + deps/duktape/tests/api/test-get-heapptr-default.c + deps/duktape/tests/api/test-get-int-default.c + deps/duktape/tests/api/test-get-int.c + deps/duktape/tests/api/test-get-length.c + deps/duktape/tests/api/test-get-memory-functions.c + deps/duktape/tests/api/test-get-now.c + deps/duktape/tests/api/test-get-number-default.c + deps/duktape/tests/api/test-get-number.c + deps/duktape/tests/api/test-get-pointer-default.c + deps/duktape/tests/api/test-get-pointer.c + deps/duktape/tests/api/test-get-prop-desc.c + deps/duktape/tests/api/test-get-prop.c + deps/duktape/tests/api/test-get-require-push-heapptr.c + deps/duktape/tests/api/test-get-require-top-index.c + deps/duktape/tests/api/test-get-set-finalizer.c + deps/duktape/tests/api/test-get-set-magic.c + deps/duktape/tests/api/test-get-set-prototype.c + deps/duktape/tests/api/test-get-set-top.c + deps/duktape/tests/api/test-get-string-default.c + deps/duktape/tests/api/test-get-string.c + deps/duktape/tests/api/test-get-uint-default.c + deps/duktape/tests/api/test-get-uint.c + deps/duktape/tests/api/test-global-stash.c + deps/duktape/tests/api/test-has-prop.c + deps/duktape/tests/api/test-heap-lifecycle-basic.c + deps/duktape/tests/api/test-heap-stash.c + deps/duktape/tests/api/test-hello-world.c + deps/duktape/tests/api/test-hex.c + deps/duktape/tests/api/test-indirect-eval.c + deps/duktape/tests/api/test-insert.c + deps/duktape/tests/api/test-inspect-callstack-entry.c + deps/duktape/tests/api/test-inspect-value.c + deps/duktape/tests/api/test-instanceof-hasinstance.c + deps/duktape/tests/api/test-instanceof-no-prototype.c + deps/duktape/tests/api/test-instanceof.c + deps/duktape/tests/api/test-is-buffer-data.c + deps/duktape/tests/api/test-is-calls.c + deps/duktape/tests/api/test-is-constructor-call.c + deps/duktape/tests/api/test-is-strict.c + deps/duktape/tests/api/test-is-symbol.c + deps/duktape/tests/api/test-join.c + deps/duktape/tests/api/test-json-fastpath.c + deps/duktape/tests/api/test-json.c + deps/duktape/tests/api/test-logging.c + deps/duktape/tests/api/test-magic-modify-during-call.c + deps/duktape/tests/api/test-map-string.c + deps/duktape/tests/api/test-memory-funcs.c + deps/duktape/tests/api/test-new.c + deps/duktape/tests/api/test-normalize-index.c + deps/duktape/tests/api/test-opt-boolean.c + deps/duktape/tests/api/test-opt-buffer-data.c + deps/duktape/tests/api/test-opt-buffer.c + deps/duktape/tests/api/test-opt-c-function.c + deps/duktape/tests/api/test-opt-context.c + deps/duktape/tests/api/test-opt-heapptr.c + deps/duktape/tests/api/test-opt-int.c + deps/duktape/tests/api/test-opt-number.c + deps/duktape/tests/api/test-opt-pointer.c + deps/duktape/tests/api/test-opt-string.c + deps/duktape/tests/api/test-opt-uint.c + deps/duktape/tests/api/test-pcall-invalid-nargs.c + deps/duktape/tests/api/test-pcall-method-invalid-nargs.c + deps/duktape/tests/api/test-pcall-method-nargs.c + deps/duktape/tests/api/test-pcall-method.c + deps/duktape/tests/api/test-pcall-nargs.c + deps/duktape/tests/api/test-pcall-prop-invalid-nargs.c + deps/duktape/tests/api/test-pcall-prop-nargs.c + deps/duktape/tests/api/test-pcall-prop-obj-is-key.c + deps/duktape/tests/api/test-pcall-prop.c + deps/duktape/tests/api/test-pcall.c + deps/duktape/tests/api/test-pcompile-invalid-stack.c + deps/duktape/tests/api/test-peval-invalid-stack.c + deps/duktape/tests/api/test-pnew-invalid-nargs.c + deps/duktape/tests/api/test-poppers.c + deps/duktape/tests/api/test-print-replacement.c + deps/duktape/tests/api/test-proxy-apply.c + deps/duktape/tests/api/test-proxy-basic.c + deps/duktape/tests/api/test-proxy-construct.c + deps/duktape/tests/api/test-push-array.c + deps/duktape/tests/api/test-push-arraybuffer.c + deps/duktape/tests/api/test-push-bare-object.c + deps/duktape/tests/api/test-push-buffer-object-disabled.c + deps/duktape/tests/api/test-push-buffer-object.c + deps/duktape/tests/api/test-push-buffer.c + deps/duktape/tests/api/test-push-cfunc.c + deps/duktape/tests/api/test-push-current-function.c + deps/duktape/tests/api/test-push-current-thread.c + deps/duktape/tests/api/test-push-error-object.c + deps/duktape/tests/api/test-push-global.c + deps/duktape/tests/api/test-push-heapptr-finalize-list.c + deps/duktape/tests/api/test-push-literal.c + deps/duktape/tests/api/test-push-new-target.c + deps/duktape/tests/api/test-push-object.c + deps/duktape/tests/api/test-push-proxy.c + deps/duktape/tests/api/test-push-sprintf.c + deps/duktape/tests/api/test-push-this.c + deps/duktape/tests/api/test-push-thread.c + deps/duktape/tests/api/test-push-vsprintf.c + deps/duktape/tests/api/test-pushers.c + deps/duktape/tests/api/test-put-func-num-list.c + deps/duktape/tests/api/test-put-global-heapptr.c + deps/duktape/tests/api/test-put-global-literal.c + deps/duktape/tests/api/test-put-global-string.c + deps/duktape/tests/api/test-put-prop-primbase.c + deps/duktape/tests/api/test-put-prop-target-value-same.c + deps/duktape/tests/api/test-put-prop.c + deps/duktape/tests/api/test-random.c + deps/duktape/tests/api/test-regexp-nonbmp-charclass.c + deps/duktape/tests/api/test-remove.c + deps/duktape/tests/api/test-replace.c + deps/duktape/tests/api/test-require-boolean.c + deps/duktape/tests/api/test-require-buffer-data.c + deps/duktape/tests/api/test-require-buffer.c + deps/duktape/tests/api/test-require-c-function.c + deps/duktape/tests/api/test-require-context.c + deps/duktape/tests/api/test-require-int.c + deps/duktape/tests/api/test-require-lstring.c + deps/duktape/tests/api/test-require-null.c + deps/duktape/tests/api/test-require-number.c + deps/duktape/tests/api/test-require-object.c + deps/duktape/tests/api/test-require-pointer.c + deps/duktape/tests/api/test-require-string.c + deps/duktape/tests/api/test-require-undefined.c + deps/duktape/tests/api/test-resize-buffer.c + deps/duktape/tests/api/test-safe-call-invalid-nargs.c + deps/duktape/tests/api/test-safe-call-invalid-nrets.c + deps/duktape/tests/api/test-safe-call-reserve.c + deps/duktape/tests/api/test-safe-call-retbase-padding.c + deps/duktape/tests/api/test-safe-call.c + deps/duktape/tests/api/test-safe-to-string.c + deps/duktape/tests/api/test-samevalue.c + deps/duktape/tests/api/test-seal.c + deps/duktape/tests/api/test-set-global-object.c + deps/duktape/tests/api/test-set-length.c + deps/duktape/tests/api/test-steal-buffer.c + deps/duktape/tests/api/test-substring.c + deps/duktape/tests/api/test-suspend-resume-pthread.c + deps/duktape/tests/api/test-suspend-resume.c + deps/duktape/tests/api/test-swap.c + deps/duktape/tests/api/test-symbol-getownpropertysymbols.c + deps/duktape/tests/api/test-symbol-macros.c + deps/duktape/tests/api/test-thread-stash.c + deps/duktape/tests/api/test-throw.c + deps/duktape/tests/api/test-time-components.c + deps/duktape/tests/api/test-to-boolean.c + deps/duktape/tests/api/test-to-buffer.c + deps/duktape/tests/api/test-to-fixed-dynamic-buffer.c + deps/duktape/tests/api/test-to-int-uint.c + deps/duktape/tests/api/test-to-int32-uint32-uint16.c + deps/duktape/tests/api/test-to-lstring.c + deps/duktape/tests/api/test-to-null.c + deps/duktape/tests/api/test-to-number.c + deps/duktape/tests/api/test-to-object.c + deps/duktape/tests/api/test-to-pointer.c + deps/duktape/tests/api/test-to-primitive.c + deps/duktape/tests/api/test-to-string.c + deps/duktape/tests/api/test-to-undefined.c + deps/duktape/tests/api/test-trim.c + deps/duktape/tests/api/test-typedarray-set-overlap.c + deps/duktape/tests/api/test-types.c + deps/duktape/tests/api/test-validate-index.c + deps/duktape/tests/api/test-xcopy-xmove.c + deps/duktape/tests/emscripten/fizzbuzz.c + deps/duktape/tests/emscripten/fmod.c + deps/duktape/tests/emscripten/helloworld.c + deps/duktape/tests/emscripten/mandelbrot.c + deps/duktape/util/check_align.c + deps/duktape/util/dukweb_fixup.h + deps/duktape/util/makeduk_duklow_fixup.h + deps/mbedtls/configs/config-ccm-psk-tls1_2.h + deps/mbedtls/configs/config-mini-tls1_1.h + deps/mbedtls/configs/config-no-entropy.h + deps/mbedtls/configs/config-suite-b.h + deps/mbedtls/configs/config-thread.h + deps/mbedtls/doxygen/input/doc_encdec.h + deps/mbedtls/doxygen/input/doc_hashing.h + deps/mbedtls/doxygen/input/doc_mainpage.h + deps/mbedtls/doxygen/input/doc_rng.h + deps/mbedtls/doxygen/input/doc_ssltls.h + deps/mbedtls/doxygen/input/doc_tcpip.h + deps/mbedtls/doxygen/input/doc_x509.h + deps/mbedtls/include/mbedtls/aes.h + deps/mbedtls/include/mbedtls/aesni.h + deps/mbedtls/include/mbedtls/arc4.h + deps/mbedtls/include/mbedtls/aria.h + deps/mbedtls/include/mbedtls/asn1.h + deps/mbedtls/include/mbedtls/asn1write.h + deps/mbedtls/include/mbedtls/base64.h + deps/mbedtls/include/mbedtls/bignum.h + deps/mbedtls/include/mbedtls/blowfish.h + deps/mbedtls/include/mbedtls/bn_mul.h + deps/mbedtls/include/mbedtls/camellia.h + deps/mbedtls/include/mbedtls/ccm.h + deps/mbedtls/include/mbedtls/certs.h + deps/mbedtls/include/mbedtls/chacha20.h + deps/mbedtls/include/mbedtls/chachapoly.h + deps/mbedtls/include/mbedtls/check_config.h + deps/mbedtls/include/mbedtls/cipher.h + deps/mbedtls/include/mbedtls/cipher_internal.h + deps/mbedtls/include/mbedtls/cmac.h + deps/mbedtls/include/mbedtls/compat-1.3.h + deps/mbedtls/include/mbedtls/config.h + deps/mbedtls/include/mbedtls/ctr_drbg.h + deps/mbedtls/include/mbedtls/debug.h + deps/mbedtls/include/mbedtls/des.h + deps/mbedtls/include/mbedtls/dhm.h + deps/mbedtls/include/mbedtls/ecdh.h + deps/mbedtls/include/mbedtls/ecdsa.h + deps/mbedtls/include/mbedtls/ecjpake.h + deps/mbedtls/include/mbedtls/ecp.h + deps/mbedtls/include/mbedtls/ecp_internal.h + deps/mbedtls/include/mbedtls/entropy.h + deps/mbedtls/include/mbedtls/entropy_poll.h + deps/mbedtls/include/mbedtls/error.h + deps/mbedtls/include/mbedtls/gcm.h + deps/mbedtls/include/mbedtls/havege.h + deps/mbedtls/include/mbedtls/hkdf.h + deps/mbedtls/include/mbedtls/hmac_drbg.h + deps/mbedtls/include/mbedtls/md.h + deps/mbedtls/include/mbedtls/md2.h + deps/mbedtls/include/mbedtls/md4.h + deps/mbedtls/include/mbedtls/md5.h + deps/mbedtls/include/mbedtls/md_internal.h + deps/mbedtls/include/mbedtls/memory_buffer_alloc.h + deps/mbedtls/include/mbedtls/net.h + deps/mbedtls/include/mbedtls/net_sockets.h + deps/mbedtls/include/mbedtls/nist_kw.h + deps/mbedtls/include/mbedtls/oid.h + deps/mbedtls/include/mbedtls/padlock.h + deps/mbedtls/include/mbedtls/pem.h + deps/mbedtls/include/mbedtls/pk.h + deps/mbedtls/include/mbedtls/pk_internal.h + deps/mbedtls/include/mbedtls/pkcs11.h + deps/mbedtls/include/mbedtls/pkcs12.h + deps/mbedtls/include/mbedtls/pkcs5.h + deps/mbedtls/include/mbedtls/platform.h + deps/mbedtls/include/mbedtls/platform_time.h + deps/mbedtls/include/mbedtls/platform_util.h + deps/mbedtls/include/mbedtls/poly1305.h + deps/mbedtls/include/mbedtls/ripemd160.h + deps/mbedtls/include/mbedtls/rsa.h + deps/mbedtls/include/mbedtls/rsa_internal.h + deps/mbedtls/include/mbedtls/sha1.h + deps/mbedtls/include/mbedtls/sha256.h + deps/mbedtls/include/mbedtls/sha512.h + deps/mbedtls/include/mbedtls/ssl.h + deps/mbedtls/include/mbedtls/ssl_cache.h + deps/mbedtls/include/mbedtls/ssl_ciphersuites.h + deps/mbedtls/include/mbedtls/ssl_cookie.h + deps/mbedtls/include/mbedtls/ssl_internal.h + deps/mbedtls/include/mbedtls/ssl_ticket.h + deps/mbedtls/include/mbedtls/threading.h + deps/mbedtls/include/mbedtls/timing.h + deps/mbedtls/include/mbedtls/version.h + deps/mbedtls/include/mbedtls/x509.h + deps/mbedtls/include/mbedtls/x509_crl.h + deps/mbedtls/include/mbedtls/x509_crt.h + deps/mbedtls/include/mbedtls/x509_csr.h + deps/mbedtls/include/mbedtls/xtea.h + deps/mbedtls/library/aes.c + deps/mbedtls/library/aesni.c + deps/mbedtls/library/arc4.c + deps/mbedtls/library/aria.c + deps/mbedtls/library/asn1parse.c + deps/mbedtls/library/asn1write.c + deps/mbedtls/library/base64.c + deps/mbedtls/library/bignum.c + deps/mbedtls/library/blowfish.c + deps/mbedtls/library/camellia.c + deps/mbedtls/library/ccm.c + deps/mbedtls/library/certs.c + deps/mbedtls/library/chacha20.c + deps/mbedtls/library/chachapoly.c + deps/mbedtls/library/cipher.c + deps/mbedtls/library/cipher_wrap.c + deps/mbedtls/library/cmac.c + deps/mbedtls/library/ctr_drbg.c + deps/mbedtls/library/debug.c + deps/mbedtls/library/des.c + deps/mbedtls/library/dhm.c + deps/mbedtls/library/ecdh.c + deps/mbedtls/library/ecdsa.c + deps/mbedtls/library/ecjpake.c + deps/mbedtls/library/ecp.c + deps/mbedtls/library/ecp_curves.c + deps/mbedtls/library/entropy.c + deps/mbedtls/library/entropy_poll.c + deps/mbedtls/library/error.c + deps/mbedtls/library/gcm.c + deps/mbedtls/library/havege.c + deps/mbedtls/library/hkdf.c + deps/mbedtls/library/hmac_drbg.c + deps/mbedtls/library/md.c + deps/mbedtls/library/md2.c + deps/mbedtls/library/md4.c + deps/mbedtls/library/md5.c + deps/mbedtls/library/md_wrap.c + deps/mbedtls/library/memory_buffer_alloc.c + deps/mbedtls/library/net_sockets.c + deps/mbedtls/library/nist_kw.c + deps/mbedtls/library/oid.c + deps/mbedtls/library/padlock.c + deps/mbedtls/library/pem.c + deps/mbedtls/library/pk.c + deps/mbedtls/library/pk_wrap.c + deps/mbedtls/library/pkcs11.c + deps/mbedtls/library/pkcs12.c + deps/mbedtls/library/pkcs5.c + deps/mbedtls/library/pkparse.c + deps/mbedtls/library/pkwrite.c + deps/mbedtls/library/platform.c + deps/mbedtls/library/platform_util.c + deps/mbedtls/library/poly1305.c + deps/mbedtls/library/ripemd160.c + deps/mbedtls/library/rsa.c + deps/mbedtls/library/rsa_internal.c + deps/mbedtls/library/sha1.c + deps/mbedtls/library/sha256.c + deps/mbedtls/library/sha512.c + deps/mbedtls/library/ssl_cache.c + deps/mbedtls/library/ssl_ciphersuites.c + deps/mbedtls/library/ssl_cli.c + deps/mbedtls/library/ssl_cookie.c + deps/mbedtls/library/ssl_srv.c + deps/mbedtls/library/ssl_ticket.c + deps/mbedtls/library/ssl_tls.c + deps/mbedtls/library/threading.c + deps/mbedtls/library/timing.c + deps/mbedtls/library/version.c + deps/mbedtls/library/version_features.c + deps/mbedtls/library/x509.c + deps/mbedtls/library/x509_create.c + deps/mbedtls/library/x509_crl.c + deps/mbedtls/library/x509_crt.c + deps/mbedtls/library/x509_csr.c + deps/mbedtls/library/x509write_crt.c + deps/mbedtls/library/x509write_csr.c + deps/mbedtls/library/xtea.c + deps/mbedtls/programs/aes/aescrypt2.c + deps/mbedtls/programs/aes/crypt_and_hash.c + deps/mbedtls/programs/hash/generic_sum.c + deps/mbedtls/programs/hash/hello.c + deps/mbedtls/programs/pkey/dh_client.c + deps/mbedtls/programs/pkey/dh_genprime.c + deps/mbedtls/programs/pkey/dh_server.c + deps/mbedtls/programs/pkey/ecdh_curve25519.c + deps/mbedtls/programs/pkey/ecdsa.c + deps/mbedtls/programs/pkey/gen_key.c + deps/mbedtls/programs/pkey/key_app.c + deps/mbedtls/programs/pkey/key_app_writer.c + deps/mbedtls/programs/pkey/mpi_demo.c + deps/mbedtls/programs/pkey/pk_decrypt.c + deps/mbedtls/programs/pkey/pk_encrypt.c + deps/mbedtls/programs/pkey/pk_sign.c + deps/mbedtls/programs/pkey/pk_verify.c + deps/mbedtls/programs/pkey/rsa_decrypt.c + deps/mbedtls/programs/pkey/rsa_encrypt.c + deps/mbedtls/programs/pkey/rsa_genkey.c + deps/mbedtls/programs/pkey/rsa_sign.c + deps/mbedtls/programs/pkey/rsa_sign_pss.c + deps/mbedtls/programs/pkey/rsa_verify.c + deps/mbedtls/programs/pkey/rsa_verify_pss.c + deps/mbedtls/programs/random/gen_entropy.c + deps/mbedtls/programs/random/gen_random_ctr_drbg.c + deps/mbedtls/programs/random/gen_random_havege.c + deps/mbedtls/programs/ssl/dtls_client.c + deps/mbedtls/programs/ssl/dtls_server.c + deps/mbedtls/programs/ssl/mini_client.c + deps/mbedtls/programs/ssl/ssl_client1.c + deps/mbedtls/programs/ssl/ssl_client2.c + deps/mbedtls/programs/ssl/ssl_fork_server.c + deps/mbedtls/programs/ssl/ssl_mail_client.c + deps/mbedtls/programs/ssl/ssl_pthread_server.c + deps/mbedtls/programs/ssl/ssl_server.c + deps/mbedtls/programs/ssl/ssl_server2.c + deps/mbedtls/programs/test/benchmark.c + deps/mbedtls/programs/test/cpp_dummy_build.cpp + deps/mbedtls/programs/test/selftest.c + deps/mbedtls/programs/test/ssl_cert_test.c + deps/mbedtls/programs/test/udp_proxy.c + deps/mbedtls/programs/test/zeroize.c + deps/mbedtls/programs/util/pem2der.c + deps/mbedtls/programs/util/strerror.c + deps/mbedtls/programs/x509/cert_app.c + deps/mbedtls/programs/x509/cert_req.c + deps/mbedtls/programs/x509/cert_write.c + deps/mbedtls/programs/x509/crl_app.c + deps/mbedtls/programs/x509/req_app.c + deps/mbedtls/programs/wince_main.c + examples/low_with_native_module/main.c + examples/low_with_native_module/native_adder.c + examples/low_with_native_module/native_adder.h + include/low.h + src/low_alloc.cpp + src/low_alloc.h + src/low_crypto.cpp + src/low_crypto.h + src/low_data_thread.cpp + src/low_data_thread.h + src/low_dns.cpp + src/low_dns.h + src/low_fs.cpp + src/low_fs.h + src/low_fs_misc.cpp + src/low_fs_misc.h + src/low_http.cpp + src/low_http.h + src/low_loop.cpp + src/low_loop.h + src/low_main.cpp + src/low_main.h + src/low_module.cpp + src/low_module.h + src/low_native.cpp + src/low_native_aux.cpp + src/low_native_aux.h + src/low_net.cpp + src/low_net.h + src/low_process.cpp + src/low_process.h + src/low_system.cpp + src/low_system.h + src/low_tls.cpp + src/low_tls.h + src/low_web_thread.cpp + src/low_web_thread.h + src/LowCryptoHash.cpp + src/LowCryptoHash.h + src/LowDataCallback.h + src/LowDNSResolver.cpp + src/LowDNSResolver.h + src/LowDNSWorker.cpp + src/LowDNSWorker.h + src/LowFD.h + src/LowFile.cpp + src/LowFile.h + src/LowFSMisc.cpp + src/LowFSMisc.h + src/LowHTTPDirect.cpp + src/LowHTTPDirect.h + src/LowLoopCallback.h + src/LowServerSocket.cpp + src/LowServerSocket.h + src/LowSignalHandler.cpp + src/LowSignalHandler.h + src/LowSocket.cpp + src/LowSocket.h + src/LowSocketDirect.h + src/LowTLSContext.cpp + src/LowTLSContext.h + test/bugs/duk_crash_TR20180627.c + test/bugs/duk_crash_TR20180706.c + util/dukc.c) From 2fd9066803fa3e244f50aefbc7fb1d1ffe038a4b Mon Sep 17 00:00:00 2001 From: Steve Fan <29133953+stevefan1999-personal@users.noreply.github.com> Date: Mon, 31 Dec 2018 17:22:55 +0800 Subject: [PATCH 2/8] Basic CMake Support & Code Style clean-up --- .idea/codeStyles/Project.xml | 71 +++ .idea/lowjs.iml | 2 + .idea/misc.xml | 7 + .idea/modules.xml | 8 + .idea/saveactions_settings.xml | 13 + .idea/vcs.xml | 9 + CMakeLists.txt | 1097 +++++--------------------------- deps/c-ares | 2 +- deps/duktape | 2 +- deps/mbedtls | 2 +- src/LowCryptoHash.cpp | 40 +- src/LowCryptoHash.h | 33 +- src/LowDNSResolver.cpp | 1 + src/LowDNSResolver.h | 129 ++-- src/LowDNSWorker.cpp | 115 ++-- src/LowDNSWorker.h | 29 +- src/LowDataCallback.h | 32 +- src/LowFD.h | 115 ++-- src/LowFSMisc.cpp | 204 +++--- src/LowFSMisc.h | 77 +-- src/LowFile.cpp | 152 +++-- src/LowFile.h | 78 +-- src/LowHTTPDirect.cpp | 508 ++++++++------- src/LowHTTPDirect.h | 131 ++-- src/LowLoopCallback.h | 60 +- src/LowServerSocket.cpp | 56 +- src/LowServerSocket.h | 32 +- src/LowSignalHandler.cpp | 56 +- src/LowSignalHandler.h | 14 +- src/LowSocket.cpp | 567 ++++++++++------- src/LowSocket.h | 171 +++-- src/LowSocketDirect.h | 17 +- src/LowTLSContext.cpp | 85 +-- src/LowTLSContext.h | 63 +- src/low_alloc.cpp | 10 +- src/low_alloc.h | 15 +- src/low_crypto.cpp | 55 +- src/low_crypto.h | 2 + src/low_data_thread.cpp | 128 ++-- src/low_data_thread.h | 8 +- src/low_dns.cpp | 41 +- src/low_dns.h | 6 + src/low_fs.cpp | 266 +++++--- src/low_fs.h | 11 +- src/low_fs_misc.cpp | 108 +++- src/low_fs_misc.h | 12 + src/low_http.cpp | 102 +-- src/low_http.h | 3 +- src/low_loop.cpp | 129 ++-- src/low_loop.h | 16 +- src/low_main.cpp | 161 +++-- src/low_main.h | 95 +-- src/low_module.cpp | 405 ++++++------ src/low_module.h | 15 +- src/low_native.cpp | 115 ++-- src/low_native_aux.cpp | 24 +- src/low_native_aux.h | 3 +- src/low_net.cpp | 98 +-- src/low_net.h | 3 + src/low_process.cpp | 20 +- src/low_process.h | 2 + src/low_system.cpp | 731 +++++++++++---------- src/low_system.h | 17 +- src/low_tls.cpp | 57 +- src/low_tls.h | 1 + src/low_web_thread.cpp | 447 +++++++------ src/low_web_thread.h | 5 +- 67 files changed, 3563 insertions(+), 3526 deletions(-) create mode 100644 .idea/codeStyles/Project.xml create mode 100644 .idea/lowjs.iml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/saveactions_settings.xml create mode 100644 .idea/vcs.xml diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml new file mode 100644 index 0000000..243415c --- /dev/null +++ b/.idea/codeStyles/Project.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/lowjs.iml b/.idea/lowjs.iml new file mode 100644 index 0000000..f08604b --- /dev/null +++ b/.idea/lowjs.iml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..8822db8 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..7b29195 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/saveactions_settings.xml b/.idea/saveactions_settings.xml new file mode 100644 index 0000000..66129c1 --- /dev/null +++ b/.idea/saveactions_settings.xml @@ -0,0 +1,13 @@ + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..6831ec8 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index 9591731..5add52a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,937 +1,170 @@ cmake_minimum_required(VERSION 3.12) project(lowjs) -set(CMAKE_CXX_STANDARD 14) +if (UNIX AND NOT APPLE) + set(BUILD_SHARED_LIBS OFF) +endif () -include_directories(app) -include_directories(deps/c-ares) -include_directories(deps/c-ares/test) -include_directories(deps/c-ares/test/gmock-1.8.0/gmock) -include_directories(deps/c-ares/test/gmock-1.8.0/gtest) -include_directories(deps/duktape/examples/alloc-hybrid) -include_directories(deps/duktape/examples/alloc-logging) -include_directories(deps/duktape/examples/alloc-torture) -include_directories(deps/duktape/examples/cmdline) -include_directories(deps/duktape/examples/codepage-conv) -include_directories(deps/duktape/examples/debug-trans-dvalue) -include_directories(deps/duktape/examples/debug-trans-socket) -include_directories(deps/duktape/examples/eventloop) -include_directories(deps/duktape/extras/alloc-pool) -include_directories(deps/duktape/extras/cbor) -include_directories(deps/duktape/extras/console) -include_directories(deps/duktape/extras/duk-v1-compat) -include_directories(deps/duktape/extras/logging) -include_directories(deps/duktape/extras/minimal-printf) -include_directories(deps/duktape/extras/module-duktape) -include_directories(deps/duktape/extras/module-node) -include_directories(deps/duktape/extras/print-alert) -include_directories(deps/duktape/src-input) -include_directories(deps/duktape/util) -include_directories(deps/mbedtls/configs) -include_directories(deps/mbedtls/doxygen) -include_directories(deps/mbedtls/doxygen/input) -include_directories(deps/mbedtls/include) -include_directories(deps/mbedtls/include/mbedtls) -include_directories(examples/low_with_native_module) -include_directories(include) -include_directories(src) +find_package(Threads REQUIRED) -add_executable(lowjs - app/low_config.h - app/main.c - deps/c-ares/test/gmock-1.8.0/gmock/gmock.h - deps/c-ares/test/gmock-1.8.0/gtest/gtest.h - deps/c-ares/test/gmock-1.8.0/gmock-gtest-all.cc - deps/c-ares/test/ares-fuzz.c - deps/c-ares/test/ares-test-ai.h - deps/c-ares/test/ares-test-fuzz-name.c - deps/c-ares/test/ares-test-fuzz.c - deps/c-ares/test/ares-test-init.cc - deps/c-ares/test/ares-test-internal.cc - deps/c-ares/test/ares-test-live-ai.cc - deps/c-ares/test/ares-test-live.cc - deps/c-ares/test/ares-test-main.cc - deps/c-ares/test/ares-test-misc.cc - deps/c-ares/test/ares-test-mock-ai.cc - deps/c-ares/test/ares-test-mock.cc - deps/c-ares/test/ares-test-ns.cc - deps/c-ares/test/ares-test-parse-a.cc - deps/c-ares/test/ares-test-parse-aaaa.cc - deps/c-ares/test/ares-test-parse-mx.cc - deps/c-ares/test/ares-test-parse-naptr.cc - deps/c-ares/test/ares-test-parse-ns.cc - deps/c-ares/test/ares-test-parse-ptr.cc - deps/c-ares/test/ares-test-parse-soa.cc - deps/c-ares/test/ares-test-parse-srv.cc - deps/c-ares/test/ares-test-parse-txt.cc - deps/c-ares/test/ares-test-parse.cc - deps/c-ares/test/ares-test.cc - deps/c-ares/test/ares-test.h - deps/c-ares/test/dns-dump.cc - deps/c-ares/test/dns-proto-test.cc - deps/c-ares/test/dns-proto.cc - deps/c-ares/test/dns-proto.h - deps/c-ares/acountry.c - deps/c-ares/adig.c - deps/c-ares/ahost.c - deps/c-ares/ares.h - deps/c-ares/ares__close_sockets.c - deps/c-ares/ares__get_hostent.c - deps/c-ares/ares__read_line.c - deps/c-ares/ares__timeval.c - deps/c-ares/ares_android.c - deps/c-ares/ares_android.h - deps/c-ares/ares_cancel.c - deps/c-ares/ares_create_query.c - deps/c-ares/ares_data.c - deps/c-ares/ares_data.h - deps/c-ares/ares_destroy.c - deps/c-ares/ares_dns.h - deps/c-ares/ares_expand_name.c - deps/c-ares/ares_expand_string.c - deps/c-ares/ares_fds.c - deps/c-ares/ares_free_hostent.c - deps/c-ares/ares_free_string.c - deps/c-ares/ares_getaddrinfo.c - deps/c-ares/ares_getenv.c - deps/c-ares/ares_getenv.h - deps/c-ares/ares_gethostbyaddr.c - deps/c-ares/ares_gethostbyname.c - deps/c-ares/ares_getnameinfo.c - deps/c-ares/ares_getopt.c - deps/c-ares/ares_getopt.h - deps/c-ares/ares_getsock.c - deps/c-ares/ares_inet_net_pton.h - deps/c-ares/ares_init.c - deps/c-ares/ares_iphlpapi.h - deps/c-ares/ares_ipv6.h - deps/c-ares/ares_library_init.c - deps/c-ares/ares_library_init.h - deps/c-ares/ares_llist.c - deps/c-ares/ares_llist.h - deps/c-ares/ares_mkquery.c - deps/c-ares/ares_nowarn.c - deps/c-ares/ares_nowarn.h - deps/c-ares/ares_options.c - deps/c-ares/ares_parse_a_reply.c - deps/c-ares/ares_parse_aaaa_reply.c - deps/c-ares/ares_parse_mx_reply.c - deps/c-ares/ares_parse_naptr_reply.c - deps/c-ares/ares_parse_ns_reply.c - deps/c-ares/ares_parse_ptr_reply.c - deps/c-ares/ares_parse_soa_reply.c - deps/c-ares/ares_parse_srv_reply.c - deps/c-ares/ares_parse_txt_reply.c - deps/c-ares/ares_platform.c - deps/c-ares/ares_platform.h - deps/c-ares/ares_private.h - deps/c-ares/ares_process.c - deps/c-ares/ares_query.c - deps/c-ares/ares_rules.h - deps/c-ares/ares_search.c - deps/c-ares/ares_send.c - deps/c-ares/ares_setup.h - deps/c-ares/ares_strcasecmp.c - deps/c-ares/ares_strcasecmp.h - deps/c-ares/ares_strdup.c - deps/c-ares/ares_strdup.h - deps/c-ares/ares_strerror.c - deps/c-ares/ares_strsplit.c - deps/c-ares/ares_strsplit.h - deps/c-ares/ares_timeout.c - deps/c-ares/ares_version.c - deps/c-ares/ares_version.h - deps/c-ares/ares_writev.c - deps/c-ares/ares_writev.h - deps/c-ares/bitncmp.c - deps/c-ares/bitncmp.h - deps/c-ares/config-dos.h - deps/c-ares/config-win32.h - deps/c-ares/inet_net_pton.c - deps/c-ares/inet_ntop.c - deps/c-ares/nameser.h - deps/c-ares/setup_once.h - deps/c-ares/windows_port.c - deps/duktape/dukweb/dukweb.c - deps/duktape/examples/alloc-hybrid/duk_alloc_hybrid.c - deps/duktape/examples/alloc-hybrid/duk_alloc_hybrid.h - deps/duktape/examples/alloc-logging/duk_alloc_logging.c - deps/duktape/examples/alloc-logging/duk_alloc_logging.h - deps/duktape/examples/alloc-torture/duk_alloc_torture.c - deps/duktape/examples/alloc-torture/duk_alloc_torture.h - deps/duktape/examples/cmdline/duk_cmdline.c - deps/duktape/examples/cmdline/duk_cmdline.h - deps/duktape/examples/cmdline/duk_cmdline_lowmem.c - deps/duktape/examples/codepage-conv/duk_codepage_conv.c - deps/duktape/examples/codepage-conv/duk_codepage_conv.h - deps/duktape/examples/codepage-conv/test.c - deps/duktape/examples/cpp-exceptions/cpp_exceptions.cpp - deps/duktape/examples/debug-trans-dvalue/duk_trans_dvalue.c - deps/duktape/examples/debug-trans-dvalue/duk_trans_dvalue.h - deps/duktape/examples/debug-trans-dvalue/test.c - deps/duktape/examples/debug-trans-socket/duk_trans_socket.h - deps/duktape/examples/debug-trans-socket/duk_trans_socket_unix.c - deps/duktape/examples/debug-trans-socket/duk_trans_socket_windows.c - deps/duktape/examples/dummy-date-provider/dummy_date_provider.c - deps/duktape/examples/eval/eval.c - deps/duktape/examples/eventloop/c_eventloop.c - deps/duktape/examples/eventloop/c_eventloop.h - deps/duktape/examples/eventloop/fileio.c - deps/duktape/examples/eventloop/main.c - deps/duktape/examples/eventloop/ncurses.c - deps/duktape/examples/eventloop/poll.c - deps/duktape/examples/eventloop/socket.c - deps/duktape/examples/guide/primecheck.c - deps/duktape/examples/guide/processlines.c - deps/duktape/examples/guide/uppercase.c - deps/duktape/examples/hello/hello.c - deps/duktape/examples/hello/hello_ptrcomp.c - deps/duktape/examples/jxpretty/jxpretty.c - deps/duktape/examples/sandbox/sandbox.c - deps/duktape/extras/alloc-pool/duk_alloc_pool.c - deps/duktape/extras/alloc-pool/duk_alloc_pool.h - deps/duktape/extras/alloc-pool/ptrcomp_fixup.h - deps/duktape/extras/alloc-pool/test.c - deps/duktape/extras/cbor/duk_cbor.c - deps/duktape/extras/cbor/duk_cbor.h - deps/duktape/extras/cbor/jsoncbor.c - deps/duktape/extras/console/duk_console.c - deps/duktape/extras/console/duk_console.h - deps/duktape/extras/console/test.c - deps/duktape/extras/duk-v1-compat/duk_v1_compat.c - deps/duktape/extras/duk-v1-compat/duk_v1_compat.h - deps/duktape/extras/duk-v1-compat/test.c - deps/duktape/extras/logging/duk_logging.c - deps/duktape/extras/logging/duk_logging.h - deps/duktape/extras/logging/test.c - deps/duktape/extras/minimal-printf/duk_minimal_printf.c - deps/duktape/extras/minimal-printf/duk_minimal_printf.h - deps/duktape/extras/minimal-printf/test.c - deps/duktape/extras/module-duktape/duk_module_duktape.c - deps/duktape/extras/module-duktape/duk_module_duktape.h - deps/duktape/extras/module-duktape/test.c - deps/duktape/extras/module-node/duk_module_node.c - deps/duktape/extras/module-node/duk_module_node.h - deps/duktape/extras/module-node/test.c - deps/duktape/extras/print-alert/duk_print_alert.c - deps/duktape/extras/print-alert/duk_print_alert.h - deps/duktape/extras/print-alert/test.c - deps/duktape/misc/arridx_unsigned.c - deps/duktape/misc/c_hex_esc.c - deps/duktape/misc/clang_aliasing.c - deps/duktape/misc/clang_cast_align.c - deps/duktape/misc/cxx_static_const.c - deps/duktape/misc/float_cast.c - deps/duktape/misc/literal_intern_test.c - deps/duktape/misc/preproc_compare1.c - deps/duktape/misc/preproc_compare2.c - deps/duktape/misc/preproc_compare3.c - deps/duktape/misc/preproc_compare4.c - deps/duktape/misc/shift_warning.c - deps/duktape/misc/splitmix64.c - deps/duktape/misc/splitmix64_test.c - deps/duktape/misc/tcc_zerosign1.c - deps/duktape/misc/tcc_zerosign2.c - deps/duktape/misc/test_mandel2.c - deps/duktape/misc/testdefs.c - deps/duktape/misc/union_initializer.c - deps/duktape/misc/xoroshiro128plus.c - deps/duktape/misc/xoroshiro128plus_test.c - deps/duktape/runtests/api_testcase_main.c - deps/duktape/src-input/duk_alloc_default.c - deps/duktape/src-input/duk_api_buffer.c - deps/duktape/src-input/duk_api_bytecode.c - deps/duktape/src-input/duk_api_call.c - deps/duktape/src-input/duk_api_codec.c - deps/duktape/src-input/duk_api_compile.c - deps/duktape/src-input/duk_api_debug.c - deps/duktape/src-input/duk_api_heap.c - deps/duktape/src-input/duk_api_inspect.c - deps/duktape/src-input/duk_api_internal.h - deps/duktape/src-input/duk_api_memory.c - deps/duktape/src-input/duk_api_object.c - deps/duktape/src-input/duk_api_random.c - deps/duktape/src-input/duk_api_stack.c - deps/duktape/src-input/duk_api_string.c - deps/duktape/src-input/duk_api_time.c - deps/duktape/src-input/duk_bi_array.c - deps/duktape/src-input/duk_bi_boolean.c - deps/duktape/src-input/duk_bi_buffer.c - deps/duktape/src-input/duk_bi_date.c - deps/duktape/src-input/duk_bi_date_unix.c - deps/duktape/src-input/duk_bi_date_windows.c - deps/duktape/src-input/duk_bi_duktape.c - deps/duktape/src-input/duk_bi_encoding.c - deps/duktape/src-input/duk_bi_error.c - deps/duktape/src-input/duk_bi_function.c - deps/duktape/src-input/duk_bi_global.c - deps/duktape/src-input/duk_bi_json.c - deps/duktape/src-input/duk_bi_math.c - deps/duktape/src-input/duk_bi_number.c - deps/duktape/src-input/duk_bi_object.c - deps/duktape/src-input/duk_bi_performance.c - deps/duktape/src-input/duk_bi_pointer.c - deps/duktape/src-input/duk_bi_promise.c - deps/duktape/src-input/duk_bi_protos.h - deps/duktape/src-input/duk_bi_proxy.c - deps/duktape/src-input/duk_bi_reflect.c - deps/duktape/src-input/duk_bi_regexp.c - deps/duktape/src-input/duk_bi_string.c - deps/duktape/src-input/duk_bi_symbol.c - deps/duktape/src-input/duk_bi_thread.c - deps/duktape/src-input/duk_bi_thrower.c - deps/duktape/src-input/duk_dblunion.h - deps/duktape/src-input/duk_debug.h - deps/duktape/src-input/duk_debug_fixedbuffer.c - deps/duktape/src-input/duk_debug_macros.c - deps/duktape/src-input/duk_debug_vsnprintf.c - deps/duktape/src-input/duk_debugger.c - deps/duktape/src-input/duk_debugger.h - deps/duktape/src-input/duk_error.h - deps/duktape/src-input/duk_error_augment.c - deps/duktape/src-input/duk_error_longjmp.c - deps/duktape/src-input/duk_error_macros.c - deps/duktape/src-input/duk_error_misc.c - deps/duktape/src-input/duk_error_throw.c - deps/duktape/src-input/duk_exception.h - deps/duktape/src-input/duk_forwdecl.h - deps/duktape/src-input/duk_harray.h - deps/duktape/src-input/duk_hboundfunc.h - deps/duktape/src-input/duk_hbuffer.h - deps/duktape/src-input/duk_hbuffer_alloc.c - deps/duktape/src-input/duk_hbuffer_ops.c - deps/duktape/src-input/duk_hbufobj.h - deps/duktape/src-input/duk_hbufobj_misc.c - deps/duktape/src-input/duk_hcompfunc.h - deps/duktape/src-input/duk_heap.h - deps/duktape/src-input/duk_heap_alloc.c - deps/duktape/src-input/duk_heap_finalize.c - deps/duktape/src-input/duk_heap_hashstring.c - deps/duktape/src-input/duk_heap_markandsweep.c - deps/duktape/src-input/duk_heap_memory.c - deps/duktape/src-input/duk_heap_misc.c - deps/duktape/src-input/duk_heap_refcount.c - deps/duktape/src-input/duk_heap_stringcache.c - deps/duktape/src-input/duk_heap_stringtable.c - deps/duktape/src-input/duk_heaphdr.h - deps/duktape/src-input/duk_henv.h - deps/duktape/src-input/duk_hnatfunc.h - deps/duktape/src-input/duk_hobject.h - deps/duktape/src-input/duk_hobject_alloc.c - deps/duktape/src-input/duk_hobject_class.c - deps/duktape/src-input/duk_hobject_enum.c - deps/duktape/src-input/duk_hobject_misc.c - deps/duktape/src-input/duk_hobject_pc2line.c - deps/duktape/src-input/duk_hobject_props.c - deps/duktape/src-input/duk_hproxy.h - deps/duktape/src-input/duk_hstring.h - deps/duktape/src-input/duk_hstring_misc.c - deps/duktape/src-input/duk_hthread.h - deps/duktape/src-input/duk_hthread_alloc.c - deps/duktape/src-input/duk_hthread_builtins.c - deps/duktape/src-input/duk_hthread_misc.c - deps/duktape/src-input/duk_hthread_stacks.c - deps/duktape/src-input/duk_internal.h - deps/duktape/src-input/duk_jmpbuf.h - deps/duktape/src-input/duk_js.h - deps/duktape/src-input/duk_js_arith.c - deps/duktape/src-input/duk_js_bytecode.h - deps/duktape/src-input/duk_js_call.c - deps/duktape/src-input/duk_js_compiler.c - deps/duktape/src-input/duk_js_compiler.h - deps/duktape/src-input/duk_js_executor.c - deps/duktape/src-input/duk_js_ops.c - deps/duktape/src-input/duk_js_var.c - deps/duktape/src-input/duk_json.h - deps/duktape/src-input/duk_lexer.c - deps/duktape/src-input/duk_lexer.h - deps/duktape/src-input/duk_numconv.c - deps/duktape/src-input/duk_numconv.h - deps/duktape/src-input/duk_refcount.h - deps/duktape/src-input/duk_regexp.h - deps/duktape/src-input/duk_regexp_compiler.c - deps/duktape/src-input/duk_regexp_executor.c - deps/duktape/src-input/duk_replacements.c - deps/duktape/src-input/duk_replacements.h - deps/duktape/src-input/duk_selftest.c - deps/duktape/src-input/duk_selftest.h - deps/duktape/src-input/duk_strings.h - deps/duktape/src-input/duk_tval.c - deps/duktape/src-input/duk_tval.h - deps/duktape/src-input/duk_unicode.h - deps/duktape/src-input/duk_unicode_support.c - deps/duktape/src-input/duk_unicode_tables.c - deps/duktape/src-input/duk_util.h - deps/duktape/src-input/duk_util_bitdecoder.c - deps/duktape/src-input/duk_util_bitencoder.c - deps/duktape/src-input/duk_util_bufwriter.c - deps/duktape/src-input/duk_util_cast.c - deps/duktape/src-input/duk_util_double.c - deps/duktape/src-input/duk_util_hashbytes.c - deps/duktape/src-input/duk_util_memory.c - deps/duktape/src-input/duk_util_misc.c - deps/duktape/src-input/duk_util_tinyrandom.c - deps/duktape/tests/api/test-all-public-symbols.c - deps/duktape/tests/api/test-base64.c - deps/duktape/tests/api/test-buffer-to-string.c - deps/duktape/tests/api/test-buffer-zeroed.c - deps/duktape/tests/api/test-bufferobject-dynamic-safety.c - deps/duktape/tests/api/test-bufferobject-example-1.c - deps/duktape/tests/api/test-bufferobject-initial.c - deps/duktape/tests/api/test-bug-bufferobject-arraybuffer-offset-length.c - deps/duktape/tests/api/test-bug-is-constructor-call-empty-callstack.c - deps/duktape/tests/api/test-bug-is-fixed-dynamic-buffer-nullptr.c - deps/duktape/tests/api/test-bug-is-primitive-invalid-index-gh337.c - deps/duktape/tests/api/test-bug-multithread-valgrind.c - deps/duktape/tests/api/test-bug-object-binding-proxy.c - deps/duktape/tests/api/test-bug-peval-pcompile-nofile.c - deps/duktape/tests/api/test-bug-push-buffer-maxsize.c - deps/duktape/tests/api/test-bug-push-buffer-semicolon.c - deps/duktape/tests/api/test-bug-push-sprintf-va-copy.c - deps/duktape/tests/api/test-bug-push-string-maxsize.c - deps/duktape/tests/api/test-bug-refzero-rescue-queue.c - deps/duktape/tests/api/test-bug-set-cfunc-name.c - deps/duktape/tests/api/test-bug-set-top-wrap.c - deps/duktape/tests/api/test-bug-tailcall-preventyield-assert.c - deps/duktape/tests/api/test-c-constructor.c - deps/duktape/tests/api/test-call-method.c - deps/duktape/tests/api/test-call-prop.c - deps/duktape/tests/api/test-call.c - deps/duktape/tests/api/test-charcodeat.c - deps/duktape/tests/api/test-check-require-stack-top.c - deps/duktape/tests/api/test-check-require-stack.c - deps/duktape/tests/api/test-check-type-mask.c - deps/duktape/tests/api/test-check-type.c - deps/duktape/tests/api/test-compact.c - deps/duktape/tests/api/test-compile-file.c - deps/duktape/tests/api/test-compile-filename.c - deps/duktape/tests/api/test-compile-shebang.c - deps/duktape/tests/api/test-compile-string.c - deps/duktape/tests/api/test-compile.c - deps/duktape/tests/api/test-concat.c - deps/duktape/tests/api/test-copy.c - deps/duktape/tests/api/test-debugger-notify.c - deps/duktape/tests/api/test-decode-string.c - deps/duktape/tests/api/test-def-prop-convenience.c - deps/duktape/tests/api/test-def-prop-virtual.c - deps/duktape/tests/api/test-def-prop.c - deps/duktape/tests/api/test-del-prop.c - deps/duktape/tests/api/test-dev-api-verbose-error-messages-gh441.c - deps/duktape/tests/api/test-dev-cfunc-name.c - deps/duktape/tests/api/test-dev-cmodule-guide.c - deps/duktape/tests/api/test-dev-constructor-augment.c - deps/duktape/tests/api/test-dev-error-fileline-blame-gh455.c - deps/duktape/tests/api/test-dev-finalizer-rerun.c - deps/duktape/tests/api/test-dev-finalizer-rescue-unwind.c - deps/duktape/tests/api/test-dev-func-bind-name-notstring.c - deps/duktape/tests/api/test-dev-func-tostring.c - deps/duktape/tests/api/test-dev-getpropc-inherited-_value.c - deps/duktape/tests/api/test-dev-global-object-proxy.c - deps/duktape/tests/api/test-dev-internal-key-access.c - deps/duktape/tests/api/test-dev-internal-property-basics.c - deps/duktape/tests/api/test-dev-lightfunc-bound.c - deps/duktape/tests/api/test-dev-lightfunc-toobject-varargs.c - deps/duktape/tests/api/test-dev-lightfunc.c - deps/duktape/tests/api/test-dev-override-duktapec-func-getters.c - deps/duktape/tests/api/test-dev-plain-buffer.c - deps/duktape/tests/api/test-dev-prototype-loop.c - deps/duktape/tests/api/test-dev-return-types.c - deps/duktape/tests/api/test-dev-rom-builtins-1.c - deps/duktape/tests/api/test-dev-set-duktapec-func-length.c - deps/duktape/tests/api/test-dev-set-duktapec-func-name.c - deps/duktape/tests/api/test-dev-string-intern-side-effect.c - deps/duktape/tests/api/test-dev-symbol-basic.c - deps/duktape/tests/api/test-dev-valstack-checked-size-call.c - deps/duktape/tests/api/test-dev-write-duktapec-func-length.c - deps/duktape/tests/api/test-dev-write-duktapec-func-name.c - deps/duktape/tests/api/test-dump-context.c - deps/duktape/tests/api/test-dump-load-basic.c - deps/duktape/tests/api/test-dump-load-bound.c - deps/duktape/tests/api/test-dump-load-fastint.c - deps/duktape/tests/api/test-dump-load-inner-func-length.c - deps/duktape/tests/api/test-dup.c - deps/duktape/tests/api/test-enum-gh1592.c - deps/duktape/tests/api/test-enum.c - deps/duktape/tests/api/test-equals-strict-equals.c - deps/duktape/tests/api/test-errhandler.c - deps/duktape/tests/api/test-error-convenience.c - deps/duktape/tests/api/test-error.c - deps/duktape/tests/api/test-eval-file.c - deps/duktape/tests/api/test-eval-filename.c - deps/duktape/tests/api/test-eval-strictness.c - deps/duktape/tests/api/test-eval-string.c - deps/duktape/tests/api/test-eval-this-binding.c - deps/duktape/tests/api/test-eval.c - deps/duktape/tests/api/test-external-buffer.c - deps/duktape/tests/api/test-fatal-return.c - deps/duktape/tests/api/test-fatal.c - deps/duktape/tests/api/test-freeze.c - deps/duktape/tests/api/test-frontpage.c - deps/duktape/tests/api/test-gc.c - deps/duktape/tests/api/test-get-boolean-default.c - deps/duktape/tests/api/test-get-boolean.c - deps/duktape/tests/api/test-get-buffer-data-default.c - deps/duktape/tests/api/test-get-buffer-data.c - deps/duktape/tests/api/test-get-buffer-default.c - deps/duktape/tests/api/test-get-buffer.c - deps/duktape/tests/api/test-get-c-function-default.c - deps/duktape/tests/api/test-get-c-function.c - deps/duktape/tests/api/test-get-context-default.c - deps/duktape/tests/api/test-get-context.c - deps/duktape/tests/api/test-get-error-code-is-error.c - deps/duktape/tests/api/test-get-global-heapptr.c - deps/duktape/tests/api/test-get-global-literal.c - deps/duktape/tests/api/test-get-global-string.c - deps/duktape/tests/api/test-get-heapptr-default.c - deps/duktape/tests/api/test-get-int-default.c - deps/duktape/tests/api/test-get-int.c - deps/duktape/tests/api/test-get-length.c - deps/duktape/tests/api/test-get-memory-functions.c - deps/duktape/tests/api/test-get-now.c - deps/duktape/tests/api/test-get-number-default.c - deps/duktape/tests/api/test-get-number.c - deps/duktape/tests/api/test-get-pointer-default.c - deps/duktape/tests/api/test-get-pointer.c - deps/duktape/tests/api/test-get-prop-desc.c - deps/duktape/tests/api/test-get-prop.c - deps/duktape/tests/api/test-get-require-push-heapptr.c - deps/duktape/tests/api/test-get-require-top-index.c - deps/duktape/tests/api/test-get-set-finalizer.c - deps/duktape/tests/api/test-get-set-magic.c - deps/duktape/tests/api/test-get-set-prototype.c - deps/duktape/tests/api/test-get-set-top.c - deps/duktape/tests/api/test-get-string-default.c - deps/duktape/tests/api/test-get-string.c - deps/duktape/tests/api/test-get-uint-default.c - deps/duktape/tests/api/test-get-uint.c - deps/duktape/tests/api/test-global-stash.c - deps/duktape/tests/api/test-has-prop.c - deps/duktape/tests/api/test-heap-lifecycle-basic.c - deps/duktape/tests/api/test-heap-stash.c - deps/duktape/tests/api/test-hello-world.c - deps/duktape/tests/api/test-hex.c - deps/duktape/tests/api/test-indirect-eval.c - deps/duktape/tests/api/test-insert.c - deps/duktape/tests/api/test-inspect-callstack-entry.c - deps/duktape/tests/api/test-inspect-value.c - deps/duktape/tests/api/test-instanceof-hasinstance.c - deps/duktape/tests/api/test-instanceof-no-prototype.c - deps/duktape/tests/api/test-instanceof.c - deps/duktape/tests/api/test-is-buffer-data.c - deps/duktape/tests/api/test-is-calls.c - deps/duktape/tests/api/test-is-constructor-call.c - deps/duktape/tests/api/test-is-strict.c - deps/duktape/tests/api/test-is-symbol.c - deps/duktape/tests/api/test-join.c - deps/duktape/tests/api/test-json-fastpath.c - deps/duktape/tests/api/test-json.c - deps/duktape/tests/api/test-logging.c - deps/duktape/tests/api/test-magic-modify-during-call.c - deps/duktape/tests/api/test-map-string.c - deps/duktape/tests/api/test-memory-funcs.c - deps/duktape/tests/api/test-new.c - deps/duktape/tests/api/test-normalize-index.c - deps/duktape/tests/api/test-opt-boolean.c - deps/duktape/tests/api/test-opt-buffer-data.c - deps/duktape/tests/api/test-opt-buffer.c - deps/duktape/tests/api/test-opt-c-function.c - deps/duktape/tests/api/test-opt-context.c - deps/duktape/tests/api/test-opt-heapptr.c - deps/duktape/tests/api/test-opt-int.c - deps/duktape/tests/api/test-opt-number.c - deps/duktape/tests/api/test-opt-pointer.c - deps/duktape/tests/api/test-opt-string.c - deps/duktape/tests/api/test-opt-uint.c - deps/duktape/tests/api/test-pcall-invalid-nargs.c - deps/duktape/tests/api/test-pcall-method-invalid-nargs.c - deps/duktape/tests/api/test-pcall-method-nargs.c - deps/duktape/tests/api/test-pcall-method.c - deps/duktape/tests/api/test-pcall-nargs.c - deps/duktape/tests/api/test-pcall-prop-invalid-nargs.c - deps/duktape/tests/api/test-pcall-prop-nargs.c - deps/duktape/tests/api/test-pcall-prop-obj-is-key.c - deps/duktape/tests/api/test-pcall-prop.c - deps/duktape/tests/api/test-pcall.c - deps/duktape/tests/api/test-pcompile-invalid-stack.c - deps/duktape/tests/api/test-peval-invalid-stack.c - deps/duktape/tests/api/test-pnew-invalid-nargs.c - deps/duktape/tests/api/test-poppers.c - deps/duktape/tests/api/test-print-replacement.c - deps/duktape/tests/api/test-proxy-apply.c - deps/duktape/tests/api/test-proxy-basic.c - deps/duktape/tests/api/test-proxy-construct.c - deps/duktape/tests/api/test-push-array.c - deps/duktape/tests/api/test-push-arraybuffer.c - deps/duktape/tests/api/test-push-bare-object.c - deps/duktape/tests/api/test-push-buffer-object-disabled.c - deps/duktape/tests/api/test-push-buffer-object.c - deps/duktape/tests/api/test-push-buffer.c - deps/duktape/tests/api/test-push-cfunc.c - deps/duktape/tests/api/test-push-current-function.c - deps/duktape/tests/api/test-push-current-thread.c - deps/duktape/tests/api/test-push-error-object.c - deps/duktape/tests/api/test-push-global.c - deps/duktape/tests/api/test-push-heapptr-finalize-list.c - deps/duktape/tests/api/test-push-literal.c - deps/duktape/tests/api/test-push-new-target.c - deps/duktape/tests/api/test-push-object.c - deps/duktape/tests/api/test-push-proxy.c - deps/duktape/tests/api/test-push-sprintf.c - deps/duktape/tests/api/test-push-this.c - deps/duktape/tests/api/test-push-thread.c - deps/duktape/tests/api/test-push-vsprintf.c - deps/duktape/tests/api/test-pushers.c - deps/duktape/tests/api/test-put-func-num-list.c - deps/duktape/tests/api/test-put-global-heapptr.c - deps/duktape/tests/api/test-put-global-literal.c - deps/duktape/tests/api/test-put-global-string.c - deps/duktape/tests/api/test-put-prop-primbase.c - deps/duktape/tests/api/test-put-prop-target-value-same.c - deps/duktape/tests/api/test-put-prop.c - deps/duktape/tests/api/test-random.c - deps/duktape/tests/api/test-regexp-nonbmp-charclass.c - deps/duktape/tests/api/test-remove.c - deps/duktape/tests/api/test-replace.c - deps/duktape/tests/api/test-require-boolean.c - deps/duktape/tests/api/test-require-buffer-data.c - deps/duktape/tests/api/test-require-buffer.c - deps/duktape/tests/api/test-require-c-function.c - deps/duktape/tests/api/test-require-context.c - deps/duktape/tests/api/test-require-int.c - deps/duktape/tests/api/test-require-lstring.c - deps/duktape/tests/api/test-require-null.c - deps/duktape/tests/api/test-require-number.c - deps/duktape/tests/api/test-require-object.c - deps/duktape/tests/api/test-require-pointer.c - deps/duktape/tests/api/test-require-string.c - deps/duktape/tests/api/test-require-undefined.c - deps/duktape/tests/api/test-resize-buffer.c - deps/duktape/tests/api/test-safe-call-invalid-nargs.c - deps/duktape/tests/api/test-safe-call-invalid-nrets.c - deps/duktape/tests/api/test-safe-call-reserve.c - deps/duktape/tests/api/test-safe-call-retbase-padding.c - deps/duktape/tests/api/test-safe-call.c - deps/duktape/tests/api/test-safe-to-string.c - deps/duktape/tests/api/test-samevalue.c - deps/duktape/tests/api/test-seal.c - deps/duktape/tests/api/test-set-global-object.c - deps/duktape/tests/api/test-set-length.c - deps/duktape/tests/api/test-steal-buffer.c - deps/duktape/tests/api/test-substring.c - deps/duktape/tests/api/test-suspend-resume-pthread.c - deps/duktape/tests/api/test-suspend-resume.c - deps/duktape/tests/api/test-swap.c - deps/duktape/tests/api/test-symbol-getownpropertysymbols.c - deps/duktape/tests/api/test-symbol-macros.c - deps/duktape/tests/api/test-thread-stash.c - deps/duktape/tests/api/test-throw.c - deps/duktape/tests/api/test-time-components.c - deps/duktape/tests/api/test-to-boolean.c - deps/duktape/tests/api/test-to-buffer.c - deps/duktape/tests/api/test-to-fixed-dynamic-buffer.c - deps/duktape/tests/api/test-to-int-uint.c - deps/duktape/tests/api/test-to-int32-uint32-uint16.c - deps/duktape/tests/api/test-to-lstring.c - deps/duktape/tests/api/test-to-null.c - deps/duktape/tests/api/test-to-number.c - deps/duktape/tests/api/test-to-object.c - deps/duktape/tests/api/test-to-pointer.c - deps/duktape/tests/api/test-to-primitive.c - deps/duktape/tests/api/test-to-string.c - deps/duktape/tests/api/test-to-undefined.c - deps/duktape/tests/api/test-trim.c - deps/duktape/tests/api/test-typedarray-set-overlap.c - deps/duktape/tests/api/test-types.c - deps/duktape/tests/api/test-validate-index.c - deps/duktape/tests/api/test-xcopy-xmove.c - deps/duktape/tests/emscripten/fizzbuzz.c - deps/duktape/tests/emscripten/fmod.c - deps/duktape/tests/emscripten/helloworld.c - deps/duktape/tests/emscripten/mandelbrot.c - deps/duktape/util/check_align.c - deps/duktape/util/dukweb_fixup.h - deps/duktape/util/makeduk_duklow_fixup.h - deps/mbedtls/configs/config-ccm-psk-tls1_2.h - deps/mbedtls/configs/config-mini-tls1_1.h - deps/mbedtls/configs/config-no-entropy.h - deps/mbedtls/configs/config-suite-b.h - deps/mbedtls/configs/config-thread.h - deps/mbedtls/doxygen/input/doc_encdec.h - deps/mbedtls/doxygen/input/doc_hashing.h - deps/mbedtls/doxygen/input/doc_mainpage.h - deps/mbedtls/doxygen/input/doc_rng.h - deps/mbedtls/doxygen/input/doc_ssltls.h - deps/mbedtls/doxygen/input/doc_tcpip.h - deps/mbedtls/doxygen/input/doc_x509.h - deps/mbedtls/include/mbedtls/aes.h - deps/mbedtls/include/mbedtls/aesni.h - deps/mbedtls/include/mbedtls/arc4.h - deps/mbedtls/include/mbedtls/aria.h - deps/mbedtls/include/mbedtls/asn1.h - deps/mbedtls/include/mbedtls/asn1write.h - deps/mbedtls/include/mbedtls/base64.h - deps/mbedtls/include/mbedtls/bignum.h - deps/mbedtls/include/mbedtls/blowfish.h - deps/mbedtls/include/mbedtls/bn_mul.h - deps/mbedtls/include/mbedtls/camellia.h - deps/mbedtls/include/mbedtls/ccm.h - deps/mbedtls/include/mbedtls/certs.h - deps/mbedtls/include/mbedtls/chacha20.h - deps/mbedtls/include/mbedtls/chachapoly.h - deps/mbedtls/include/mbedtls/check_config.h - deps/mbedtls/include/mbedtls/cipher.h - deps/mbedtls/include/mbedtls/cipher_internal.h - deps/mbedtls/include/mbedtls/cmac.h - deps/mbedtls/include/mbedtls/compat-1.3.h - deps/mbedtls/include/mbedtls/config.h - deps/mbedtls/include/mbedtls/ctr_drbg.h - deps/mbedtls/include/mbedtls/debug.h - deps/mbedtls/include/mbedtls/des.h - deps/mbedtls/include/mbedtls/dhm.h - deps/mbedtls/include/mbedtls/ecdh.h - deps/mbedtls/include/mbedtls/ecdsa.h - deps/mbedtls/include/mbedtls/ecjpake.h - deps/mbedtls/include/mbedtls/ecp.h - deps/mbedtls/include/mbedtls/ecp_internal.h - deps/mbedtls/include/mbedtls/entropy.h - deps/mbedtls/include/mbedtls/entropy_poll.h - deps/mbedtls/include/mbedtls/error.h - deps/mbedtls/include/mbedtls/gcm.h - deps/mbedtls/include/mbedtls/havege.h - deps/mbedtls/include/mbedtls/hkdf.h - deps/mbedtls/include/mbedtls/hmac_drbg.h - deps/mbedtls/include/mbedtls/md.h - deps/mbedtls/include/mbedtls/md2.h - deps/mbedtls/include/mbedtls/md4.h - deps/mbedtls/include/mbedtls/md5.h - deps/mbedtls/include/mbedtls/md_internal.h - deps/mbedtls/include/mbedtls/memory_buffer_alloc.h - deps/mbedtls/include/mbedtls/net.h - deps/mbedtls/include/mbedtls/net_sockets.h - deps/mbedtls/include/mbedtls/nist_kw.h - deps/mbedtls/include/mbedtls/oid.h - deps/mbedtls/include/mbedtls/padlock.h - deps/mbedtls/include/mbedtls/pem.h - deps/mbedtls/include/mbedtls/pk.h - deps/mbedtls/include/mbedtls/pk_internal.h - deps/mbedtls/include/mbedtls/pkcs11.h - deps/mbedtls/include/mbedtls/pkcs12.h - deps/mbedtls/include/mbedtls/pkcs5.h - deps/mbedtls/include/mbedtls/platform.h - deps/mbedtls/include/mbedtls/platform_time.h - deps/mbedtls/include/mbedtls/platform_util.h - deps/mbedtls/include/mbedtls/poly1305.h - deps/mbedtls/include/mbedtls/ripemd160.h - deps/mbedtls/include/mbedtls/rsa.h - deps/mbedtls/include/mbedtls/rsa_internal.h - deps/mbedtls/include/mbedtls/sha1.h - deps/mbedtls/include/mbedtls/sha256.h - deps/mbedtls/include/mbedtls/sha512.h - deps/mbedtls/include/mbedtls/ssl.h - deps/mbedtls/include/mbedtls/ssl_cache.h - deps/mbedtls/include/mbedtls/ssl_ciphersuites.h - deps/mbedtls/include/mbedtls/ssl_cookie.h - deps/mbedtls/include/mbedtls/ssl_internal.h - deps/mbedtls/include/mbedtls/ssl_ticket.h - deps/mbedtls/include/mbedtls/threading.h - deps/mbedtls/include/mbedtls/timing.h - deps/mbedtls/include/mbedtls/version.h - deps/mbedtls/include/mbedtls/x509.h - deps/mbedtls/include/mbedtls/x509_crl.h - deps/mbedtls/include/mbedtls/x509_crt.h - deps/mbedtls/include/mbedtls/x509_csr.h - deps/mbedtls/include/mbedtls/xtea.h - deps/mbedtls/library/aes.c - deps/mbedtls/library/aesni.c - deps/mbedtls/library/arc4.c - deps/mbedtls/library/aria.c - deps/mbedtls/library/asn1parse.c - deps/mbedtls/library/asn1write.c - deps/mbedtls/library/base64.c - deps/mbedtls/library/bignum.c - deps/mbedtls/library/blowfish.c - deps/mbedtls/library/camellia.c - deps/mbedtls/library/ccm.c - deps/mbedtls/library/certs.c - deps/mbedtls/library/chacha20.c - deps/mbedtls/library/chachapoly.c - deps/mbedtls/library/cipher.c - deps/mbedtls/library/cipher_wrap.c - deps/mbedtls/library/cmac.c - deps/mbedtls/library/ctr_drbg.c - deps/mbedtls/library/debug.c - deps/mbedtls/library/des.c - deps/mbedtls/library/dhm.c - deps/mbedtls/library/ecdh.c - deps/mbedtls/library/ecdsa.c - deps/mbedtls/library/ecjpake.c - deps/mbedtls/library/ecp.c - deps/mbedtls/library/ecp_curves.c - deps/mbedtls/library/entropy.c - deps/mbedtls/library/entropy_poll.c - deps/mbedtls/library/error.c - deps/mbedtls/library/gcm.c - deps/mbedtls/library/havege.c - deps/mbedtls/library/hkdf.c - deps/mbedtls/library/hmac_drbg.c - deps/mbedtls/library/md.c - deps/mbedtls/library/md2.c - deps/mbedtls/library/md4.c - deps/mbedtls/library/md5.c - deps/mbedtls/library/md_wrap.c - deps/mbedtls/library/memory_buffer_alloc.c - deps/mbedtls/library/net_sockets.c - deps/mbedtls/library/nist_kw.c - deps/mbedtls/library/oid.c - deps/mbedtls/library/padlock.c - deps/mbedtls/library/pem.c - deps/mbedtls/library/pk.c - deps/mbedtls/library/pk_wrap.c - deps/mbedtls/library/pkcs11.c - deps/mbedtls/library/pkcs12.c - deps/mbedtls/library/pkcs5.c - deps/mbedtls/library/pkparse.c - deps/mbedtls/library/pkwrite.c - deps/mbedtls/library/platform.c - deps/mbedtls/library/platform_util.c - deps/mbedtls/library/poly1305.c - deps/mbedtls/library/ripemd160.c - deps/mbedtls/library/rsa.c - deps/mbedtls/library/rsa_internal.c - deps/mbedtls/library/sha1.c - deps/mbedtls/library/sha256.c - deps/mbedtls/library/sha512.c - deps/mbedtls/library/ssl_cache.c - deps/mbedtls/library/ssl_ciphersuites.c - deps/mbedtls/library/ssl_cli.c - deps/mbedtls/library/ssl_cookie.c - deps/mbedtls/library/ssl_srv.c - deps/mbedtls/library/ssl_ticket.c - deps/mbedtls/library/ssl_tls.c - deps/mbedtls/library/threading.c - deps/mbedtls/library/timing.c - deps/mbedtls/library/version.c - deps/mbedtls/library/version_features.c - deps/mbedtls/library/x509.c - deps/mbedtls/library/x509_create.c - deps/mbedtls/library/x509_crl.c - deps/mbedtls/library/x509_crt.c - deps/mbedtls/library/x509_csr.c - deps/mbedtls/library/x509write_crt.c - deps/mbedtls/library/x509write_csr.c - deps/mbedtls/library/xtea.c - deps/mbedtls/programs/aes/aescrypt2.c - deps/mbedtls/programs/aes/crypt_and_hash.c - deps/mbedtls/programs/hash/generic_sum.c - deps/mbedtls/programs/hash/hello.c - deps/mbedtls/programs/pkey/dh_client.c - deps/mbedtls/programs/pkey/dh_genprime.c - deps/mbedtls/programs/pkey/dh_server.c - deps/mbedtls/programs/pkey/ecdh_curve25519.c - deps/mbedtls/programs/pkey/ecdsa.c - deps/mbedtls/programs/pkey/gen_key.c - deps/mbedtls/programs/pkey/key_app.c - deps/mbedtls/programs/pkey/key_app_writer.c - deps/mbedtls/programs/pkey/mpi_demo.c - deps/mbedtls/programs/pkey/pk_decrypt.c - deps/mbedtls/programs/pkey/pk_encrypt.c - deps/mbedtls/programs/pkey/pk_sign.c - deps/mbedtls/programs/pkey/pk_verify.c - deps/mbedtls/programs/pkey/rsa_decrypt.c - deps/mbedtls/programs/pkey/rsa_encrypt.c - deps/mbedtls/programs/pkey/rsa_genkey.c - deps/mbedtls/programs/pkey/rsa_sign.c - deps/mbedtls/programs/pkey/rsa_sign_pss.c - deps/mbedtls/programs/pkey/rsa_verify.c - deps/mbedtls/programs/pkey/rsa_verify_pss.c - deps/mbedtls/programs/random/gen_entropy.c - deps/mbedtls/programs/random/gen_random_ctr_drbg.c - deps/mbedtls/programs/random/gen_random_havege.c - deps/mbedtls/programs/ssl/dtls_client.c - deps/mbedtls/programs/ssl/dtls_server.c - deps/mbedtls/programs/ssl/mini_client.c - deps/mbedtls/programs/ssl/ssl_client1.c - deps/mbedtls/programs/ssl/ssl_client2.c - deps/mbedtls/programs/ssl/ssl_fork_server.c - deps/mbedtls/programs/ssl/ssl_mail_client.c - deps/mbedtls/programs/ssl/ssl_pthread_server.c - deps/mbedtls/programs/ssl/ssl_server.c - deps/mbedtls/programs/ssl/ssl_server2.c - deps/mbedtls/programs/test/benchmark.c - deps/mbedtls/programs/test/cpp_dummy_build.cpp - deps/mbedtls/programs/test/selftest.c - deps/mbedtls/programs/test/ssl_cert_test.c - deps/mbedtls/programs/test/udp_proxy.c - deps/mbedtls/programs/test/zeroize.c - deps/mbedtls/programs/util/pem2der.c - deps/mbedtls/programs/util/strerror.c - deps/mbedtls/programs/x509/cert_app.c - deps/mbedtls/programs/x509/cert_req.c - deps/mbedtls/programs/x509/cert_write.c - deps/mbedtls/programs/x509/crl_app.c - deps/mbedtls/programs/x509/req_app.c - deps/mbedtls/programs/wince_main.c - examples/low_with_native_module/main.c - examples/low_with_native_module/native_adder.c - examples/low_with_native_module/native_adder.h - include/low.h - src/low_alloc.cpp - src/low_alloc.h - src/low_crypto.cpp - src/low_crypto.h - src/low_data_thread.cpp - src/low_data_thread.h - src/low_dns.cpp - src/low_dns.h - src/low_fs.cpp - src/low_fs.h - src/low_fs_misc.cpp - src/low_fs_misc.h - src/low_http.cpp - src/low_http.h - src/low_loop.cpp - src/low_loop.h - src/low_main.cpp - src/low_main.h - src/low_module.cpp - src/low_module.h - src/low_native.cpp - src/low_native_aux.cpp - src/low_native_aux.h - src/low_net.cpp - src/low_net.h - src/low_process.cpp - src/low_process.h - src/low_system.cpp - src/low_system.h - src/low_tls.cpp - src/low_tls.h - src/low_web_thread.cpp - src/low_web_thread.h - src/LowCryptoHash.cpp - src/LowCryptoHash.h - src/LowDataCallback.h - src/LowDNSResolver.cpp - src/LowDNSResolver.h - src/LowDNSWorker.cpp - src/LowDNSWorker.h - src/LowFD.h - src/LowFile.cpp - src/LowFile.h - src/LowFSMisc.cpp - src/LowFSMisc.h - src/LowHTTPDirect.cpp - src/LowHTTPDirect.h - src/LowLoopCallback.h - src/LowServerSocket.cpp - src/LowServerSocket.h - src/LowSignalHandler.cpp - src/LowSignalHandler.h - src/LowSocket.cpp - src/LowSocket.h - src/LowSocketDirect.h - src/LowTLSContext.cpp - src/LowTLSContext.h - test/bugs/duk_crash_TR20180627.c - test/bugs/duk_crash_TR20180706.c - util/dukc.c) +set(CMAKE_CXX_STANDARD 11) +set(DEP_DUK ${PROJECT_SOURCE_DIR}/deps/duktape) +set(DEP_ARES ${PROJECT_SOURCE_DIR}/deps/c-ares) +set(DEP_MBED ${PROJECT_SOURCE_DIR}/deps/mbedtls) + +set(ENABLE_TESTING OFF) +set(CARES_STATIC ON) +set(CARES_SHARED OFF) +add_subdirectory(${DEP_MBED}) +add_subdirectory(${DEP_ARES}) + +set(MBEDTLS_INCLUDE_DIRS ${DEP_MBED}/include) + +set(DUK_BUILD_FLAGS + "-DDUK_USE_FATAL_HANDLER" + "-DDUK_USE_GLOBAL_BUILTIN" + "-DDUK_USE_BOOLEAN_BUILTIN" + "-DDUK_USE_ARRAY_BUILTIN" + "-DDUK_USE_OBJECT_BUILTIN" + "-DDUK_USE_FUNCTION_BUILTIN" + "-DDUK_USE_STRING_BUILTIN" + "-DDUK_USE_NUMBER_BUILTIN" + "-DDUK_USE_DATE_BUILTIN" + "-DDUK_USE_REGEXP_SUPPORT" + "-DDUK_USE_MATH_BUILTIN" + "-DDUK_USE_JSON_BUILTIN" + "-DDUK_USE_BUFFEROBJECT_SUPPORT" + "-DDUK_USE_ENCODING_BUILTINS" + "-DDUK_USE_PERFORMANCE_BUILTIN" + "-DDUK_USE_OBJECT_BUILTIN" + "-DDUK_USE_ES6_PROXY" + "-DDUK_USE_GLOBAL_BINDING" + "-DDUK_USE_SYMBOL_BUILTIN" + "-DDUK_USE_SECTION_B" + ) + +add_custom_command( + COMMENT "Making duktape" VERBATIM + WORKING_DIRECTORY ${DEP_DUK} + OUTPUT ${DEP_DUK}/src-low/duktape.c + DEPENDS "${DEP_DUK}/src-input/" + COMMAND rm -rf ${DEP_DUK}/src-low + COMMAND python tools/configure.py --output-directory=src-low ${DUK_BUILD_FLAGS} +) + +add_custom_command( + COMMENT "Installing Node modules" VERBATIM + WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} + OUTPUT ${PROJECT_SOURCE_DIR}/node_modules/ + DEPENDS "${PROJECT_SOURCE_DIR}/package.json" + COMMAND pnpm install +) + +add_custom_command( + COMMENT "Making JavaScript modules" VERBATIM + WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} + OUTPUT ${PROJECT_SOURCE_DIR}/lib/ + DEPENDS dukc ${PROJECT_SOURCE_DIR}/node_modules/ + COMMAND rm -rf lib lib_js/build + COMMAND cd lib_js && node ../node_modules/typescript/bin/tsc + COMMAND mkdir lib + COMMAND ./util/dukc lib_js/build lib +) + +add_custom_target( + lowjs_lib + DEPENDS ${PROJECT_SOURCE_DIR}/lib/ +) + +# dukc +add_executable( + dukc + ${PROJECT_SOURCE_DIR}/util/dukc.c +) +target_include_directories( + dukc + PRIVATE ${DEP_DUK}/src-low/ +) +target_link_libraries( + dukc + duktape m +) +set_target_properties(dukc PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/util) + +# duktape +add_library( + duktape STATIC + ${DEP_DUK}/src-low/duktape.c +) +target_include_directories( + duktape + PRIVATE ${DEP_DUK}/src-low/ +) + +# lowjs +file(GLOB lowjs_src + ${PROJECT_SOURCE_DIR}/src/*.c + ${PROJECT_SOURCE_DIR}/src/*.h + ${PROJECT_SOURCE_DIR}/src/*.cpp + ) + +add_library( + lowjs STATIC + ${lowjs_src} +) + +target_include_directories( + lowjs + PRIVATE ${PROJECT_SOURCE_DIR}/include + PRIVATE ${PROJECT_SOURCE_DIR}/app + PUBLIC ${DEP_DUK}/src-low/ + PUBLIC ${MBEDTLS_INCLUDE_DIRS} +) +target_link_libraries( + lowjs + mbedtls duktape c-ares m ${CMAKE_THREAD_LIBS_INIT} + -static-libstdc++ -static-libgcc +) + +add_dependencies( + lowjs + mbedtls duktape c-ares +) + +# lowjs_main +add_executable( + lowjs_main + ${PROJECT_SOURCE_DIR}/app/main.c +) +target_include_directories( + lowjs_main + PRIVATE ${PROJECT_SOURCE_DIR}/include + PRIVATE ${PROJECT_SOURCE_DIR}/app + PUBLIC ${DEP_DUK}/src-low/ +) +target_link_libraries( + lowjs_main + lowjs +) +add_dependencies(lowjs_main lowjs_lib) + +# lowjs_with_native_modules +file(GLOB lowjs_with_native_modules_src + ${PROJECT_SOURCE_DIR}/examples/low_with_native_module/*.c + ) + +add_executable( + lowjs_with_native_modules + ${lowjs_with_native_modules_src} +) +target_include_directories( + lowjs_with_native_modules + PRIVATE ${PROJECT_SOURCE_DIR}/include + PRIVATE ${PROJECT_SOURCE_DIR}/app + PUBLIC ${DEP_DUK}/src-low/ +) +target_link_libraries( + lowjs_with_native_modules + lowjs +) +add_dependencies(lowjs_with_native_modules lowjs_lib) diff --git a/deps/c-ares b/deps/c-ares index 330b364..b688805 160000 --- a/deps/c-ares +++ b/deps/c-ares @@ -1 +1 @@ -Subproject commit 330b364a9c12d82f7bb443509f92072e55465749 +Subproject commit b68880542360484368b49eca9dc6145318eb6b28 diff --git a/deps/duktape b/deps/duktape index f74b692..b062b50 160000 --- a/deps/duktape +++ b/deps/duktape @@ -1 +1 @@ -Subproject commit f74b692f724d655026a91eeac69d546e8eca6f47 +Subproject commit b062b50ab13c4a835d1403a3c39df97557bf09c4 diff --git a/deps/mbedtls b/deps/mbedtls index 53546ea..fb1972d 160000 --- a/deps/mbedtls +++ b/deps/mbedtls @@ -1 +1 @@ -Subproject commit 53546ea099f6f53d0be653a64accd250e170337f +Subproject commit fb1972db23da39bd11d4f9c9ea6266eee665605b diff --git a/src/LowCryptoHash.cpp b/src/LowCryptoHash.cpp index 2eedc16..15f5481 100644 --- a/src/LowCryptoHash.cpp +++ b/src/LowCryptoHash.cpp @@ -11,23 +11,22 @@ // LowCryptoHash::LowCryptoHash // ----------------------------------------------------------------------------- -LowCryptoHash::LowCryptoHash(low_main_t *low, - const mbedtls_md_info_t *info, - unsigned char *key, - int key_len) : - mLow(low), - mIndex(-1), mHMAC(key ? true : false), mOutputSize(info->size) +LowCryptoHash::LowCryptoHash(low_main_t *low, const mbedtls_md_info_t *info, unsigned char *key, int key_len) : mLow( + low), mIndex(-1), mHMAC(key ? true : false), mOutputSize(info->size) { mbedtls_md_init(&mContext); int res = mbedtls_md_setup(&mContext, info, mHMAC ? 1 : 0); - if(res != 0) + if (res != 0) + { duk_generic_error(mLow->duk_ctx, "mbedtls error code #%d", res); + } - res = mHMAC ? mbedtls_md_hmac_starts(&mContext, key, key_len) - : mbedtls_md_starts(&mContext); - if(res != 0) + res = mHMAC ? mbedtls_md_hmac_starts(&mContext, key, key_len) : mbedtls_md_starts(&mContext); + if (res != 0) + { duk_generic_error(mLow->duk_ctx, "mbedtls error code #%d", res); + } } // ----------------------------------------------------------------------------- @@ -38,11 +37,12 @@ LowCryptoHash::~LowCryptoHash() { mbedtls_md_free(&mContext); - if(mIndex >= 0) + if (mIndex >= 0) { - if(mIndex >= mLow->cryptoHashes.size() || - mLow->cryptoHashes[mIndex] != this) + if (mIndex >= mLow->cryptoHashes.size() || mLow->cryptoHashes[mIndex] != this) + { printf("assertion error at LowCryptoHash\n"); + } mLow->cryptoHashes[mIndex] = NULL; } @@ -54,10 +54,11 @@ LowCryptoHash::~LowCryptoHash() void LowCryptoHash::Update(unsigned char *data, int len) { - int res = mHMAC ? mbedtls_md_hmac_update(&mContext, data, len) - : mbedtls_md_update(&mContext, data, len); - if(res != 0) + int res = mHMAC ? mbedtls_md_hmac_update(&mContext, data, len) : mbedtls_md_update(&mContext, data, len); + if (res != 0) + { duk_generic_error(mLow->duk_ctx, "mbedtls error code #%d", res); + } } // ----------------------------------------------------------------------------- @@ -66,8 +67,9 @@ void LowCryptoHash::Update(unsigned char *data, int len) void LowCryptoHash::Digest(unsigned char *data, int len) { - int res = mHMAC ? mbedtls_md_hmac_finish(&mContext, data) - : mbedtls_md_finish(&mContext, data); - if(res != 0) + int res = mHMAC ? mbedtls_md_hmac_finish(&mContext, data) : mbedtls_md_finish(&mContext, data); + if (res != 0) + { duk_generic_error(mLow->duk_ctx, "mbedtls error code #%d", res); + } } \ No newline at end of file diff --git a/src/LowCryptoHash.h b/src/LowCryptoHash.h index 5ad6367..0ddf04f 100644 --- a/src/LowCryptoHash.h +++ b/src/LowCryptoHash.h @@ -13,28 +13,29 @@ using namespace std; class LowCryptoHash { - public: - LowCryptoHash(low_main_t *low, - const mbedtls_md_info_t *info, - unsigned char *key, - int key_len); - ~LowCryptoHash(); +public: + LowCryptoHash(low_main_t *low, const mbedtls_md_info_t *info, unsigned char *key, int key_len); - void SetIndex(int index) { mIndex = index; } + ~LowCryptoHash(); - void Update(unsigned char *data, int len); - void Digest(unsigned char *data, int len); + void SetIndex(int index) + { mIndex = index; } - int OutputSize() { return mOutputSize; } + void Update(unsigned char *data, int len); - private: - low_main_t *mLow; - int mIndex; + void Digest(unsigned char *data, int len); - mbedtls_md_context_t mContext; + int OutputSize() + { return mOutputSize; } - bool mHMAC; - int mOutputSize; +private: + low_main_t *mLow; + int mIndex; + + mbedtls_md_context_t mContext; + + bool mHMAC; + int mOutputSize; }; #endif /* __LOWCRYPTOHASH_H__ */ \ No newline at end of file diff --git a/src/LowDNSResolver.cpp b/src/LowDNSResolver.cpp index 4ce9f8c..a8257a8 100644 --- a/src/LowDNSResolver.cpp +++ b/src/LowDNSResolver.cpp @@ -3,6 +3,7 @@ // ----------------------------------------------------------------------------- #include "low_config.h" + #if LOW_INCLUDE_CARES_RESOLVER #include "LowDNSResolver.h" diff --git a/src/LowDNSResolver.h b/src/LowDNSResolver.h index 97891e5..1614dfd 100644 --- a/src/LowDNSResolver.h +++ b/src/LowDNSResolver.h @@ -13,94 +13,105 @@ struct low_main_t; class LowDNSResolver { - friend class LowDNSResolver_Query; - friend class LowDNSResolver_GetHostByAddr; + friend class LowDNSResolver_Query; - public: - LowDNSResolver(low_main_t *low); - virtual ~LowDNSResolver(); + friend class LowDNSResolver_GetHostByAddr; - bool Init(); - void Cancel(); +public: + LowDNSResolver(low_main_t *low); - struct ares_addr_port_node *GetServers(int &err); - int SetServers(struct ares_addr_port_node *list); + virtual ~LowDNSResolver(); - ares_channel &Channel() { return mChannel; } - bool IsActive() { return mActiveQueries != 0; } + bool Init(); - static int AresErr(int err); + void Cancel(); - private: - low_main_t *mLow; + struct ares_addr_port_node *GetServers(int &err); - ares_channel mChannel; - int mIndex, mActiveQueries; + int SetServers(struct ares_addr_port_node *list); + + ares_channel &Channel() + { return mChannel; } + + bool IsActive() + { return mActiveQueries != 0; } + + static int AresErr(int err); + +private: + low_main_t *mLow; + + ares_channel mChannel; + int mIndex, mActiveQueries; }; class LowDNSResolver_Query : public LowLoopCallback { - public: - LowDNSResolver_Query(LowDNSResolver *resolver); - virtual ~LowDNSResolver_Query(); +public: + LowDNSResolver_Query(LowDNSResolver *resolver); - void Resolve(const char *hostname, const char *type, bool ttl, int refIndex, int callIndex); + virtual ~LowDNSResolver_Query(); - protected: - virtual bool OnLoop(); + void Resolve(const char *hostname, const char *type, bool ttl, int refIndex, int callIndex); - private: - void Callback(int status, int timeouts, unsigned char *abuf, int alen); - static void CallbackStatic(void *arg, int status, int timeouts, unsigned char *abuf, int alen) - { - ((LowDNSResolver_Query *)arg)->Callback(status, timeouts, abuf, alen); - } +protected: + virtual bool OnLoop(); - private: - LowDNSResolver *mResolver; - low_main_t *mLow; - ares_channel mChannel; +private: + void Callback(int status, int timeouts, unsigned char *abuf, int alen); - bool mTTL; - int mDNSType; + static void CallbackStatic(void *arg, int status, int timeouts, unsigned char *abuf, int alen) + { + ((LowDNSResolver_Query *) arg)->Callback(status, timeouts, abuf, alen); + } - int mRefID, mCallID, mError; - const char *mSyscall; +private: + LowDNSResolver *mResolver; + low_main_t *mLow; + ares_channel mChannel; - unsigned char *mData; - int mLen; + bool mTTL; + int mDNSType; - void *mDataFree, *mAresFree; - struct hostent *mHostFree; + int mRefID, mCallID, mError; + const char *mSyscall; + + unsigned char *mData; + int mLen; + + void *mDataFree, *mAresFree; + struct hostent *mHostFree; }; class LowDNSResolver_GetHostByAddr : public LowLoopCallback { - public: - LowDNSResolver_GetHostByAddr(LowDNSResolver *resolver); - virtual ~LowDNSResolver_GetHostByAddr(); +public: + LowDNSResolver_GetHostByAddr(LowDNSResolver *resolver); + + virtual ~LowDNSResolver_GetHostByAddr(); + + int Resolve(const char *hostname, int refIndex, int callIndex); - int Resolve(const char *hostname, int refIndex, int callIndex); +protected: + virtual bool OnLoop(); - protected: - virtual bool OnLoop(); +private: + void Callback(int status, int timeouts, struct hostent *hostent); - private: - void Callback(int status, int timeouts, struct hostent *hostent); - static void CallbackStatic(void *arg, int status, int timeouts, struct hostent *hostent) - { - ((LowDNSResolver_GetHostByAddr *)arg)->Callback(status, timeouts, hostent); - } + static void CallbackStatic(void *arg, int status, int timeouts, struct hostent *hostent) + { + ((LowDNSResolver_GetHostByAddr *) arg)->Callback(status, timeouts, hostent); + } - private: - LowDNSResolver *mResolver; - low_main_t *mLow; - ares_channel mChannel; +private: + LowDNSResolver *mResolver; + low_main_t *mLow; + ares_channel mChannel; - int mRefID, mCallID, mError; - const char *mSyscall; + int mRefID, mCallID, mError; + const char *mSyscall; - char **mResult; + char **mResult; }; #endif /* __LOWDNSRESOLVER_H__ */ diff --git a/src/LowDNSWorker.cpp b/src/LowDNSWorker.cpp index 9391c9d..4a1e20f 100644 --- a/src/LowDNSWorker.cpp +++ b/src/LowDNSWorker.cpp @@ -17,8 +17,7 @@ // LowDNSWorker::LowDNSWorker // ----------------------------------------------------------------------------- -LowDNSWorker::LowDNSWorker(low_main_t *low) - : LowLoopCallback(low), LowDataCallback(low), mLow(low), mResult(NULL) +LowDNSWorker::LowDNSWorker(low_main_t *low) : LowLoopCallback(low), LowDataCallback(low), mLow(low), mResult(NULL) { } @@ -30,15 +29,16 @@ LowDNSWorker::~LowDNSWorker() { low_data_clear_callback(mLow, this); if (mResult) + { freeaddrinfo(mResult); + } } // ----------------------------------------------------------------------------- // LowDNSWorker::Lookup // ----------------------------------------------------------------------------- -bool LowDNSWorker::Lookup(const char *host, int family, int hints, - int callIndex) +bool LowDNSWorker::Lookup(const char *host, int family, int hints, int callIndex) { if (strlen(host) >= sizeof(mHost)) { @@ -53,8 +53,10 @@ bool LowDNSWorker::Lookup(const char *host, int family, int hints, mHints = hints; mLookupService = false; mCallID = low_add_stash(mLow, callIndex); - if(!mCallID) + if (!mCallID) + { return false; + } mLow->run_ref++; low_data_set_callback(mLow, this, LOW_DATA_THREAD_PRIORITY_MODIFY); @@ -79,8 +81,10 @@ bool LowDNSWorker::LookupService(const char *ip, int port, int callIndex) mPort = port; mLookupService = true; mCallID = low_add_stash(mLow, callIndex); - if(!mCallID) + if (!mCallID) + { return false; + } mLow->run_ref++; low_data_set_callback(mLow, this, LOW_DATA_THREAD_PRIORITY_MODIFY); @@ -118,10 +122,14 @@ bool LowDNSWorker::OnLoop() while (info) { if (info->ai_family == AF_INET || info->ai_family == AF_INET6) + { break; + } } if (!info) + { mError = ENODATA; + } } if (mError) @@ -140,21 +148,17 @@ bool LowDNSWorker::OnLoop() addrinfo *info = mResult; while (info) { - if ((info->ai_family == AF_INET || - info->ai_family == AF_INET6) && - inet_ntop(info->ai_family, - info->ai_family == AF_INET - ? (void *)&((sockaddr_in *)info->ai_addr) - ->sin_addr.s_addr - : (void *)((sockaddr_in6 *)info->ai_addr) - ->sin6_addr.s6_addr, - mHost, sizeof(mHost)) != NULL) + if ((info->ai_family == AF_INET || info->ai_family == AF_INET6) && inet_ntop(info->ai_family, + info->ai_family == AF_INET + ? (void *) &((sockaddr_in *) info->ai_addr)->sin_addr.s_addr + : (void *) ((sockaddr_in6 *) info->ai_addr)->sin6_addr.s6_addr, + mHost, sizeof(mHost)) != + NULL) { duk_push_object(mLow->duk_ctx); duk_push_string(mLow->duk_ctx, mHost); duk_put_prop_string(mLow->duk_ctx, -2, "address"); - duk_push_int(mLow->duk_ctx, - info->ai_family == AF_INET ? 4 : 6); + duk_push_int(mLow->duk_ctx, info->ai_family == AF_INET ? 4 : 6); duk_put_prop_string(mLow->duk_ctx, -2, "family"); duk_put_prop_index(mLow->duk_ctx, -2, arr_len++); } @@ -195,7 +199,7 @@ bool LowDNSWorker::OnData() if (isIPv4) { - sockaddr_in *addr_in = (sockaddr_in *)&addr; + sockaddr_in *addr_in = (sockaddr_in * ) & addr; addr_in->sin_family = AF_INET; if (inet_pton(AF_INET, mIP, &addr_in->sin_addr) != 1) @@ -222,8 +226,7 @@ bool LowDNSWorker::OnData() addrLen = sizeof(sockaddr_in6); } - err = getnameinfo((sockaddr *)&addr, addrLen, mHost, sizeof(mHost), - mService, sizeof(mService), 0); + err = getnameinfo((sockaddr * ) & addr, addrLen, mHost, sizeof(mHost), mService, sizeof(mService), 0); #endif /* LOW_ESP32_LWIP_SPECIALITIES */ } else @@ -237,44 +240,44 @@ bool LowDNSWorker::OnData() switch (err) { #if !LOW_ESP32_LWIP_SPECIALITIES - case EAI_ADDRFAMILY: - case EAI_SOCKTYPE: - err = LOW_EBADFAMILY; // should not happen, as we control this - break; - case EAI_BADFLAGS: - err = LOW_EBADFLAGS; - break; - case EAI_AGAIN: - err = EAGAIN; - break; - case EAI_NODATA: - err = LOW_ENODATA; - break; - case EAI_OVERFLOW: - err = LOW_EUNKNOWN; - break; - case EAI_SYSTEM: - err = errno; - break; + case EAI_ADDRFAMILY: + case EAI_SOCKTYPE: + err = LOW_EBADFAMILY; // should not happen, as we control this + break; + case EAI_BADFLAGS: + err = LOW_EBADFLAGS; + break; + case EAI_AGAIN: + err = EAGAIN; + break; + case EAI_NODATA: + err = LOW_ENODATA; + break; + case EAI_OVERFLOW: + err = LOW_EUNKNOWN; + break; + case EAI_SYSTEM: + err = errno; + break; #endif /* LOW_ESP32_LWIP_SPECIALITIES */ - case EAI_SERVICE: - err = LOW_EBADFAMILY; // should not happen, as we control this - break; - case EAI_FAIL: - err = LOW_ESERVFAIL; - break; - case EAI_FAMILY: - err = LOW_EBADFAMILY; - break; - case EAI_MEMORY: - err = LOW_ENOMEM; - break; - case EAI_NONAME: - err = LOW_ENONAME; - break; - default: - err = LOW_EUNKNOWN; + case EAI_SERVICE: + err = LOW_EBADFAMILY; // should not happen, as we control this + break; + case EAI_FAIL: + err = LOW_ESERVFAIL; + break; + case EAI_FAMILY: + err = LOW_EBADFAMILY; + break; + case EAI_MEMORY: + err = LOW_ENOMEM; + break; + case EAI_NONAME: + err = LOW_ENONAME; + break; + default: + err = LOW_EUNKNOWN; } mError = err; diff --git a/src/LowDNSWorker.h b/src/LowDNSWorker.h index 298a6f0..3ba8234 100644 --- a/src/LowDNSWorker.h +++ b/src/LowDNSWorker.h @@ -15,26 +15,29 @@ struct low_main_t; class LowDNSWorker : public LowLoopCallback, public LowDataCallback { public: - LowDNSWorker(low_main_t *low); - virtual ~LowDNSWorker(); + LowDNSWorker(low_main_t *low); - bool Lookup(const char *host, int family, int hints, int callIndex); - bool LookupService(const char *ip, int port, int callIndex); + virtual ~LowDNSWorker(); + + bool Lookup(const char *host, int family, int hints, int callIndex); + + bool LookupService(const char *ip, int port, int callIndex); protected: - virtual bool OnLoop(); - virtual bool OnData(); + virtual bool OnLoop(); + + virtual bool OnData(); private: - low_main_t *mLow; + low_main_t *mLow; - char mIP[INET_ADDRSTRLEN]; - char mHost[64], mService[64]; - int mFamily, mHints, mPort, mCallID; - bool mLookupService; - int mError; + char mIP[INET_ADDRSTRLEN]; + char mHost[64], mService[64]; + int mFamily, mHints, mPort, mCallID; + bool mLookupService; + int mError; - struct addrinfo *mResult; + struct addrinfo *mResult; }; #endif /* __LOWDNSWORKER_H__ */ \ No newline at end of file diff --git a/src/LowDataCallback.h b/src/LowDataCallback.h index a21bf58..efdf130 100644 --- a/src/LowDataCallback.h +++ b/src/LowDataCallback.h @@ -9,29 +9,31 @@ struct low_main_t; class LowDataCallback { - friend void *low_data_thread_main(void *arg); - friend bool low_reset(low_main_t *low); - friend void low_data_set_callback(low_main_t *low, - LowDataCallback *callback, int priority); - friend void low_data_clear_callback(low_main_t *low, - LowDataCallback *callback); + friend void *low_data_thread_main(void *arg); + + friend bool low_reset(low_main_t *low); + + friend void low_data_set_callback(low_main_t *low, LowDataCallback *callback, int priority); + + friend void low_data_clear_callback(low_main_t *low, LowDataCallback *callback); public: - LowDataCallback(low_main_t *low) - : mLow(low), mNext(nullptr), mDataClearOnReset(true) - { - } - virtual ~LowDataCallback() { low_data_clear_callback(mLow, this); } + LowDataCallback(low_main_t *low) : mLow(low), mNext(nullptr), mDataClearOnReset(true) + { + } + + virtual ~LowDataCallback() + { low_data_clear_callback(mLow, this); } protected: - virtual bool OnData() = 0; + virtual bool OnData() = 0; private: - low_main_t *mLow; - LowDataCallback *mNext; + low_main_t *mLow; + LowDataCallback *mNext; protected: - bool mDataClearOnReset; + bool mDataClearOnReset; }; #endif /* __LOWDATACALLBACK_H__ */ \ No newline at end of file diff --git a/src/LowFD.h b/src/LowFD.h index ad2c48b..fed84ff 100644 --- a/src/LowFD.h +++ b/src/LowFD.h @@ -10,71 +10,86 @@ enum LowFDType { - LOWFD_TYPE_FILE, - LOWFD_TYPE_SERVER, - LOWFD_TYPE_SOCKET, - LOWFD_TYPE_CUSTOM + LOWFD_TYPE_FILE, LOWFD_TYPE_SERVER, LOWFD_TYPE_SOCKET, LOWFD_TYPE_CUSTOM }; class LowFD { - friend void *low_web_thread_main(void *arg); - friend bool low_reset(low_main_t *low); - friend void low_web_set_poll_events(low_main_t *low, LowFD *fd, - short events); - friend void low_web_clear_poll(low_main_t *low, LowFD *fd); - friend void low_web_mark_delete(low_main_t *low, LowFD *fd); + friend void *low_web_thread_main(void *arg); + + friend bool low_reset(low_main_t *low); + + friend void low_web_set_poll_events(low_main_t *low, LowFD *fd, short events); + + friend void low_web_clear_poll(low_main_t *low, LowFD *fd); + + friend void low_web_mark_delete(low_main_t *low, LowFD *fd); public: - LowFD(low_main_t *low, LowFDType type, int fd = -1) - : mLow(low), mFD(fd), mAdvertisedFD(-1), mFDType(type), - mMarkDelete(false), mPollIndex(-1), mPollEvents(0), - mNextChanged(nullptr), mFDClearOnReset(true) - { - } - virtual ~LowFD() - { - if(mAdvertisedFD >= 0) - mLow->fds.erase(mAdvertisedFD); - low_web_clear_poll(mLow, this); - } - - virtual void Read(int pos, unsigned char *data, int len, int callIndex) = 0; - virtual void Write(int pos, unsigned char *data, int len, - int callIndex) = 0; - virtual bool Close(int callIndex) = 0; - - LowFDType FDType() { return mFDType; } - int &FD() { return mFD; } - int PollEvents() { return mPollEvents; } - - void SetFD(int fd) { mFD = fd; } - void AdvertiseFD() - { - if(mAdvertisedFD >= 0) - mLow->fds.erase(mAdvertisedFD); - mAdvertisedFD = mFD; - if(mAdvertisedFD >= 0) - mLow->fds[mAdvertisedFD] = this; - } + LowFD(low_main_t *low, LowFDType type, int fd = -1) : mLow(low), mFD(fd), mAdvertisedFD(-1), mFDType(type), + mMarkDelete(false), mPollIndex(-1), mPollEvents(0), + mNextChanged(nullptr), mFDClearOnReset(true) + { + } + + virtual ~LowFD() + { + if (mAdvertisedFD >= 0) + { + mLow->fds.erase(mAdvertisedFD); + } + low_web_clear_poll(mLow, this); + } + + virtual void Read(int pos, unsigned char *data, int len, int callIndex) = 0; + + virtual void Write(int pos, unsigned char *data, int len, int callIndex) = 0; + + virtual bool Close(int callIndex) = 0; + + LowFDType FDType() + { return mFDType; } + + int &FD() + { return mFD; } + + int PollEvents() + { return mPollEvents; } + + void SetFD(int fd) + { mFD = fd; } + + void AdvertiseFD() + { + if (mAdvertisedFD >= 0) + { + mLow->fds.erase(mAdvertisedFD); + } + mAdvertisedFD = mFD; + if (mAdvertisedFD >= 0) + { + mLow->fds[mAdvertisedFD] = this; + } + } protected: - virtual bool OnEvents(short events) { return true; } + virtual bool OnEvents(short events) + { return true; } private: - low_main_t *mLow; + low_main_t *mLow; - int mFD, mAdvertisedFD; - LowFDType mFDType; - bool mMarkDelete; + int mFD, mAdvertisedFD; + LowFDType mFDType; + bool mMarkDelete; - int mPollIndex; - short mPollEvents; + int mPollIndex; + short mPollEvents; - LowFD *mNextChanged; + LowFD *mNextChanged; protected: - bool mFDClearOnReset; + bool mFDClearOnReset; }; #endif /* __LOWFD_H__ */ \ No newline at end of file diff --git a/src/LowFSMisc.cpp b/src/LowFSMisc.cpp index dd55a38..a989eb5 100644 --- a/src/LowFSMisc.cpp +++ b/src/LowFSMisc.cpp @@ -27,9 +27,8 @@ // LowFSMisc::LowFSMisc // ----------------------------------------------------------------------------- -LowFSMisc::LowFSMisc(low_main_t *low) : - LowDataCallback(low), LowLoopCallback(low), mLow(low), mCallID(0), - mOldName(NULL), mNewName(NULL), mFileEntries(NULL) +LowFSMisc::LowFSMisc(low_main_t *low) : LowDataCallback(low), LowLoopCallback(low), mLow(low), mCallID(0), + mOldName(NULL), mNewName(NULL), mFileEntries(NULL) { pthread_mutex_init(&mMutex, NULL); } @@ -43,18 +42,22 @@ LowFSMisc::~LowFSMisc() { low_data_clear_callback(mLow, this); - if(mOldName) + if (mOldName) + { low_free(mOldName); - if(mNewName) + } + if (mNewName) + { low_free(mNewName); - while(mFileEntries) + } + while (mFileEntries) { - char *entry = *(char **)mFileEntries; + char *entry = *(char **) mFileEntries; free(mFileEntries); mFileEntries = entry; } - if(mCallID) + if (mCallID) { low_remove_stash(mLow, mCallID); mLow->run_ref--; @@ -97,7 +100,7 @@ void LowFSMisc::Rename(const char *old_name, const char *new_name) mOldName = low_strdup(old_name); mNewName = low_strdup(new_name); #endif /* LOW_ESP32_LWIP_SPECIALITIES */ - if(!mOldName || !mNewName) + if (!mOldName || !mNewName) { low_push_error(mLow, ENOMEM, "rename"); duk_throw(mLow->duk_ctx); @@ -130,7 +133,7 @@ void LowFSMisc::Unlink(const char *file_name) #else mOldName = low_strdup(file_name); #endif /* LOW_ESP32_LWIP_SPECIALITIES */ - if(!mOldName) + if (!mOldName) { low_push_error(mLow, ENOMEM, "rename"); duk_throw(mLow->duk_ctx); @@ -163,7 +166,7 @@ void LowFSMisc::Stat(const char *file_name) #else mOldName = low_strdup(file_name); #endif /* LOW_ESP32_LWIP_SPECIALITIES */ - if(!mOldName) + if (!mOldName) { low_push_error(mLow, ENOMEM, "rename"); duk_throw(mLow->duk_ctx); @@ -196,7 +199,7 @@ void LowFSMisc::Access(const char *file_name, int mode) #else mOldName = low_strdup(file_name); #endif /* LOW_ESP32_LWIP_SPECIALITIES */ - if(!mOldName) + if (!mOldName) { low_push_error(mLow, ENOMEM, "mkdir"); duk_throw(mLow->duk_ctx); @@ -230,7 +233,7 @@ void LowFSMisc::ReadDir(const char *file_name, bool withFileTypes) #else mOldName = low_strdup(file_name); #endif /* LOW_ESP32_LWIP_SPECIALITIES */ - if(!mOldName) + if (!mOldName) { low_push_error(mLow, ENOMEM, "mkdir"); duk_throw(mLow->duk_ctx); @@ -264,7 +267,7 @@ void LowFSMisc::MkDir(const char *file_name, bool recursive, int mode) #else mOldName = low_strdup(file_name); #endif /* LOW_ESP32_LWIP_SPECIALITIES */ - if(!mOldName) + if (!mOldName) { low_push_error(mLow, ENOMEM, "mkdir"); duk_throw(mLow->duk_ctx); @@ -299,7 +302,7 @@ void LowFSMisc::RmDir(const char *file_name) #else mOldName = low_strdup(file_name); #endif /* LOW_ESP32_LWIP_SPECIALITIES */ - if(!mOldName) + if (!mOldName) { low_push_error(mLow, ENOMEM, "rmdir"); duk_throw(mLow->duk_ctx); @@ -317,17 +320,19 @@ void LowFSMisc::RmDir(const char *file_name) void LowFSMisc::Run(int callIndex) { - if(callIndex) + if (callIndex) { mCallID = low_add_stash(mLow, callIndex); mLow->run_ref++; } else + { pthread_mutex_lock(&mMutex); + } low_data_set_callback(mLow, this, LOW_DATA_THREAD_PRIORITY_MODIFY); - if(!callIndex) + if (!callIndex) { pthread_mutex_lock(&mMutex); OnLoop(); @@ -340,39 +345,44 @@ void LowFSMisc::Run(int callIndex) // ----------------------------------------------------------------------------- #if !LOW_ESP32_LWIP_SPECIALITIES + void LowFSMisc::ReadDir() { DIR *dir = opendir(mOldName); - if(!dir) + if (!dir) { mError = errno; return; } struct dirent dirData, *ent; - while(true) + while (true) { - if(readdir_r(dir, &dirData, &ent) != 0 || !ent) + if (readdir_r(dir, &dirData, &ent) != 0 || !ent) + { break; - if(ent->d_name[0] == '.' && - (ent->d_name[1] == '\0' || (ent->d_name[1] == '.' && ent->d_name[2] == '\0'))) + } + if (ent->d_name[0] == '.' && (ent->d_name[1] == '\0' || (ent->d_name[1] == '.' && ent->d_name[2] == '\0'))) + { continue; + } int len = strlen(ent->d_name); - char *entry = (char *)low_alloc(sizeof(char *) + len + 1); - if(!entry) + char *entry = (char *) low_alloc(sizeof(char *) + len + 1); + if (!entry) { closedir(dir); errno = ENOMEM; return; } - *(char **)entry = mFileEntries; + *(char **) entry = mFileEntries; memcpy(entry + sizeof(char *), ent->d_name, len + 1); mFileEntries = entry; } closedir(dir); } + #endif /* LOW_ESP32_LWIP_SPECIALITIES */ // ----------------------------------------------------------------------------- @@ -387,16 +397,18 @@ int data_rename(char *file_old, char *file_new, bool copy, bool overwrite); bool LowFSMisc::OnData() { - switch(mPhase) + switch (mPhase) { case LOWFSMISC_PHASE_RENAME: mError = 0; #if LOW_ESP32_LWIP_SPECIALITIES - if(data_rename(mOldName, mNewName, false, true) != 0) - mError = errno; + if(data_rename(mOldName, mNewName, false, true) != 0) + mError = errno; #else - if(rename(mOldName, mNewName) != 0) + if (rename(mOldName, mNewName) != 0) + { mError = errno; + } #endif /* LOW_ESP32_LWIP_SPECIALITIES */ low_free(mNewName); @@ -406,22 +418,26 @@ bool LowFSMisc::OnData() case LOWFSMISC_PHASE_UNLINK: mError = 0; #if LOW_ESP32_LWIP_SPECIALITIES - if(data_unlink(mOldName, false, 0) != 0) - mError = errno; + if(data_unlink(mOldName, false, 0) != 0) + mError = errno; #else - if(unlink(mOldName) != 0) + if (unlink(mOldName) != 0) + { mError = errno; + } #endif /* LOW_ESP32_LWIP_SPECIALITIES */ break; case LOWFSMISC_PHASE_RMDIR: mError = 0; #if LOW_ESP32_LWIP_SPECIALITIES - if(data_unlink(mOldName, false, 1) != 0) - mError = errno; + if(data_unlink(mOldName, false, 1) != 0) + mError = errno; #else - if(rmdir(mOldName) != 0) + if (rmdir(mOldName) != 0) + { mError = errno; + } #endif /* LOW_ESP32_LWIP_SPECIALITIES */ break; @@ -433,14 +449,14 @@ bool LowFSMisc::OnData() case LOWFSMISC_PHASE_MKDIR: mError = 0; #if LOW_ESP32_LWIP_SPECIALITIES - if(data_mkdir(mOldName, mRecursive) != 0) - mError = errno; + if(data_mkdir(mOldName, mRecursive) != 0) + mError = errno; #else - if(mRecursive) + if (mRecursive) { - for(int i = 0; mOldName[i]; i++) + for (int i = 0; mOldName[i]; i++) { - if(mOldName[i] == '/') + if (mOldName[i] == '/') { mOldName[i] = '\0'; mkdir(mOldName, mMode); @@ -448,31 +464,39 @@ bool LowFSMisc::OnData() } } } - if(mkdir(mOldName, mMode) != 0) + if (mkdir(mOldName, mMode) != 0) + { mError = errno; + } #endif /* LOW_ESP32_LWIP_SPECIALITIES */ break; case LOWFSMISC_PHASE_STAT: mError = 0; - if(stat(mOldName, &mStat) != 0) - mError = errno; + if (stat(mOldName, &mStat) != 0) + mError = errno; break; case LOWFSMISC_PHASE_ACCESS: mError = 0; - if(access(mOldName, mMode) != 0) + if (access(mOldName, mMode) != 0) + { mError = errno; + } break; } low_free(mOldName); mOldName = NULL; - if(mCallID) + if (mCallID) + { low_loop_set_callback(mLow, this); + } else + { pthread_mutex_unlock(&mMutex); + } return true; } @@ -483,7 +507,7 @@ bool LowFSMisc::OnData() bool LowFSMisc::OnLoop() { bool isAsync = mCallID != 0; - if(isAsync) + if (isAsync) { int callID = mCallID; mCallID = 0; @@ -491,80 +515,100 @@ bool LowFSMisc::OnLoop() low_push_stash(mLow, callID, true); } - if(mError) + if (mError) { - if(mPhase == LOWFSMISC_PHASE_RENAME) + if (mPhase == LOWFSMISC_PHASE_RENAME) + { low_push_error(mLow, mError, "rename"); - else if(mPhase == LOWFSMISC_PHASE_UNLINK) + } + else if (mPhase == LOWFSMISC_PHASE_UNLINK) + { low_push_error(mLow, mError, "unlink"); - else if(mPhase == LOWFSMISC_PHASE_STAT) + } + else if (mPhase == LOWFSMISC_PHASE_STAT) + { low_push_error(mLow, mError, "stat"); - else if(mPhase == LOWFSMISC_PHASE_ACCESS) + } + else if (mPhase == LOWFSMISC_PHASE_ACCESS) + { low_push_error(mLow, mError, "access"); - else if(mPhase == LOWFSMISC_PHASE_READDIR) + } + else if (mPhase == LOWFSMISC_PHASE_READDIR) + { low_push_error(mLow, mError, "readdir"); - else if(mPhase == LOWFSMISC_PHASE_MKDIR) + } + else if (mPhase == LOWFSMISC_PHASE_MKDIR) + { low_push_error(mLow, mError, "mkdir"); - else if(mPhase == LOWFSMISC_PHASE_RMDIR) + } + else if (mPhase == LOWFSMISC_PHASE_RMDIR) + { low_push_error(mLow, mError, "rmdir"); + } else + { low_push_error(mLow, mError, "stat"); + } - if(!isAsync) + if (!isAsync) + { duk_throw(mLow->duk_ctx); + } } - else if(mPhase == LOWFSMISC_PHASE_STAT) + else if (mPhase == LOWFSMISC_PHASE_STAT) { - if(isAsync) + if (isAsync) + { duk_push_null(mLow->duk_ctx); + } duk_push_object(mLow->duk_ctx); #define applyStat(name) {#name, (double)mStat.st_##name} - duk_number_list_entry numberList[] = { - applyStat(dev), - applyStat(ino), - applyStat(mode), - applyStat(nlink), - applyStat(uid), - applyStat(gid), - applyStat(rdev), - applyStat(blksize), - applyStat(blocks), - applyStat(size), - {"atimeMs", mStat.st_atime * 1000.0}, - {"mtimeMs", mStat.st_mtime * 1000.0}, - {"ctimeMs", mStat.st_ctime * 1000.0}, - {NULL, 0.0}}; + duk_number_list_entry numberList[] = {applyStat(dev), applyStat(ino), applyStat(mode), applyStat(nlink), + applyStat(uid), applyStat(gid), applyStat(rdev), applyStat(blksize), + applyStat(blocks), applyStat(size), {"atimeMs", mStat.st_atime * 1000.0}, + {"mtimeMs", mStat.st_mtime * 1000.0}, + {"ctimeMs", mStat.st_ctime * 1000.0}, {NULL, 0.0}}; duk_put_number_list(mLow->duk_ctx, -1, numberList); - if(isAsync) + if (isAsync) + { duk_call(mLow->duk_ctx, 2); + } return false; } - else if(mPhase == LOWFSMISC_PHASE_READDIR) + else if (mPhase == LOWFSMISC_PHASE_READDIR) { - if(isAsync) + if (isAsync) + { duk_push_null(mLow->duk_ctx); + } duk_push_array(mLow->duk_ctx); int i = 0; - while(mFileEntries) + while (mFileEntries) { - char *entry = *(char **)mFileEntries; + char *entry = *(char **) mFileEntries; duk_push_string(mLow->duk_ctx, mFileEntries + sizeof(char *)); duk_put_prop_index(mLow->duk_ctx, -2, i++); mFileEntries = entry; } - if(isAsync) + if (isAsync) + { duk_call(mLow->duk_ctx, 2); + } return false; } - else if(isAsync) + else if (isAsync) + { duk_push_null(mLow->duk_ctx); - if(isAsync) + } + if (isAsync) + { duk_call(mLow->duk_ctx, 1); + } return false; } diff --git a/src/LowFSMisc.h b/src/LowFSMisc.h index 7c171b6..e0d9633 100644 --- a/src/LowFSMisc.h +++ b/src/LowFSMisc.h @@ -18,54 +18,59 @@ struct low_main_t; enum { - LOWFSMISC_PHASE_RENAME, - LOWFSMISC_PHASE_UNLINK, - LOWFSMISC_PHASE_STAT, - LOWFSMISC_PHASE_ACCESS, - LOWFSMISC_PHASE_READDIR, - LOWFSMISC_PHASE_MKDIR, - LOWFSMISC_PHASE_RMDIR + LOWFSMISC_PHASE_RENAME, + LOWFSMISC_PHASE_UNLINK, + LOWFSMISC_PHASE_STAT, + LOWFSMISC_PHASE_ACCESS, + LOWFSMISC_PHASE_READDIR, + LOWFSMISC_PHASE_MKDIR, + LOWFSMISC_PHASE_RMDIR }; -class LowFSMisc - : public LowDataCallback - , public LowLoopCallback +class LowFSMisc : public LowDataCallback, public LowLoopCallback { - public: - LowFSMisc(low_main_t *low); - virtual ~LowFSMisc(); +public: + LowFSMisc(low_main_t *low); - void Rename(const char *old_name, const char *new_name); - void Unlink(const char *file_name); - void Stat(const char *file_name); + virtual ~LowFSMisc(); - void Access(const char *file_name, int mode); - void ReadDir(const char *file_name, bool withFileTypes); - void MkDir(const char *file_name, bool recursive, int mode); - void RmDir(const char *file_name); + void Rename(const char *old_name, const char *new_name); - void Run(int callIndex = 0); + void Unlink(const char *file_name); - protected: - void ReadDir(); + void Stat(const char *file_name); - virtual bool OnData(); - virtual bool OnLoop(); + void Access(const char *file_name, int mode); - private: - low_main_t *mLow; - char *mOldName; - char *mNewName; + void ReadDir(const char *file_name, bool withFileTypes); - struct stat mStat; - bool mWithFileTypes, mRecursive; - int mMode; + void MkDir(const char *file_name, bool recursive, int mode); - int mCallID; - pthread_mutex_t mMutex; + void RmDir(const char *file_name); - int mPhase, mError; - char *mFileEntries; + void Run(int callIndex = 0); + +protected: + void ReadDir(); + + virtual bool OnData(); + + virtual bool OnLoop(); + +private: + low_main_t *mLow; + char *mOldName; + char *mNewName; + + struct stat mStat; + bool mWithFileTypes, mRecursive; + int mMode; + + int mCallID; + pthread_mutex_t mMutex; + + int mPhase, mError; + char *mFileEntries; }; #endif /* __LOWFSMISC_H__ */ diff --git a/src/LowFile.cpp b/src/LowFile.cpp index 419c702..cc71a35 100644 --- a/src/LowFile.cpp +++ b/src/LowFile.cpp @@ -23,18 +23,22 @@ // LowFile::LowFile // ----------------------------------------------------------------------------- -LowFile::LowFile(low_main_t *low, const char *path, int flags, int callID) : - LowFD(low, LOWFD_TYPE_FILE), LowDataCallback(low), LowLoopCallback(low), - mLow(low), mClose(false) +LowFile::LowFile(low_main_t *low, const char *path, int flags, int callID) : LowFD(low, LOWFD_TYPE_FILE), + LowDataCallback(low), LowLoopCallback(low), + mLow(low), mClose(false) { - if(callID) + if (callID) { mCallID = low_add_stash(mLow, callID); - if(mCallID) + if (mCallID) + { mLow->run_ref++; + } } else + { mCallID = 0; + } #if LOW_ESP32_LWIP_SPECIALITIES int len = 32 + strlen(path) + strlen(low->cwd); @@ -66,11 +70,15 @@ LowFile::~LowFile() { low_data_clear_callback(mLow, this); - if(FD() >= 0) + if (FD() >= 0) + { close(FD()); - if(mPath) + } + if (mPath) + { low_free(mPath); - if(mCallID) + } + if (mCallID) { low_remove_stash(mLow, mCallID); mLow->run_ref--; @@ -83,14 +91,14 @@ LowFile::~LowFile() void LowFile::Read(int pos, unsigned char *data, int len, int callIndex) { - if(mClose) + if (mClose) { duk_dup(mLow->duk_ctx, callIndex); low_push_error(mLow, EBADF, "read"); duk_call(mLow->duk_ctx, 1); return; } - if(mPhase != LOWFILE_PHASE_READY) + if (mPhase != LOWFILE_PHASE_READY) { duk_dup(mLow->duk_ctx, callIndex); low_push_error(mLow, EALREADY, "read"); @@ -98,14 +106,18 @@ void LowFile::Read(int pos, unsigned char *data, int len, int callIndex) return; } - if(callIndex != -1) + if (callIndex != -1) { mCallID = low_add_stash(mLow, callIndex); - if(mCallID) + if (mCallID) + { mLow->run_ref++; + } } else + { mCallID = 0; + } mPos = pos; mData = data; @@ -121,14 +133,14 @@ void LowFile::Read(int pos, unsigned char *data, int len, int callIndex) void LowFile::Write(int pos, unsigned char *data, int len, int callIndex) { - if(mClose) + if (mClose) { duk_dup(mLow->duk_ctx, callIndex); low_push_error(mLow, EBADF, "write"); duk_call(mLow->duk_ctx, 1); return; } - if(mPhase != LOWFILE_PHASE_READY) + if (mPhase != LOWFILE_PHASE_READY) { duk_dup(mLow->duk_ctx, callIndex); low_push_error(mLow, EALREADY, "write"); @@ -136,14 +148,18 @@ void LowFile::Write(int pos, unsigned char *data, int len, int callIndex) return; } - if(callIndex != -1) + if (callIndex != -1) { mCallID = low_add_stash(mLow, callIndex); - if(mCallID) + if (mCallID) + { mLow->run_ref++; + } } else + { mCallID = 0; + } mPos = pos; mData = data; @@ -159,14 +175,14 @@ void LowFile::Write(int pos, unsigned char *data, int len, int callIndex) void LowFile::FStat(int callIndex) { - if(mClose) + if (mClose) { duk_dup(mLow->duk_ctx, callIndex); low_push_error(mLow, EBADF, "fstat"); duk_call(mLow->duk_ctx, 1); return; } - if(mPhase != LOWFILE_PHASE_READY) + if (mPhase != LOWFILE_PHASE_READY) { duk_dup(mLow->duk_ctx, callIndex); low_push_error(mLow, EALREADY, "fstat"); @@ -174,14 +190,18 @@ void LowFile::FStat(int callIndex) return; } - if(callIndex != -1) + if (callIndex != -1) { mCallID = low_add_stash(mLow, callIndex); - if(mCallID) + if (mCallID) + { mLow->run_ref++; + } } else + { mCallID = 0; + } mPhase = LOWFILE_PHASE_FSTAT; mDataDone = false; @@ -194,14 +214,14 @@ void LowFile::FStat(int callIndex) bool LowFile::Close(int callIndex) { - if(mClose) + if (mClose) { duk_dup(mLow->duk_ctx, callIndex); low_push_error(mLow, EBADF, "close"); duk_call(mLow->duk_ctx, 1); return true; } - if(mPhase != LOWFILE_PHASE_READY) + if (mPhase != LOWFILE_PHASE_READY) { duk_dup(mLow->duk_ctx, callIndex); low_push_error(mLow, EALREADY, "close"); @@ -216,14 +236,18 @@ bool LowFile::Close(int callIndex) AdvertiseFD(); SetFD(fd); - if(callIndex != -1) + if (callIndex != -1) { mCallID = low_add_stash(mLow, callIndex); - if(mCallID) + if (mCallID) + { mLow->run_ref++; + } } else + { mCallID = 0; + } mPhase = LOWFILE_PHASE_CLOSING; mDataDone = false; @@ -238,7 +262,7 @@ bool LowFile::Close(int callIndex) bool LowFile::OnData() { - switch(mPhase) + switch (mPhase) { case LOWFILE_PHASE_OPENING: SetFD(open(mPath, mFlags, 0666)); @@ -254,18 +278,18 @@ bool LowFile::OnData() case LOWFILE_PHASE_READING: mError = 0; - if(mPos != -1) + if (mPos != -1) { - if(lseek(FD(), mPos, SEEK_SET) != mPos) + if (lseek(FD(), mPos, SEEK_SET) != mPos) { mError = errno; mSyscall = "lseek"; } } - if(!mError) + if (!mError) { mLen = read(FD(), mData, mLen); - if(mLen < 0) + if (mLen < 0) { mError = errno; mSyscall = "read"; @@ -278,18 +302,18 @@ bool LowFile::OnData() case LOWFILE_PHASE_WRITING: mError = 0; - if(mPos != -1) + if (mPos != -1) { - if(lseek(FD(), mPos, SEEK_SET) != mPos) + if (lseek(FD(), mPos, SEEK_SET) != mPos) { mError = errno; mSyscall = "lseek"; } } - if(!mError) + if (!mError) { mLen = write(FD(), mData, mLen); - if(mLen < 0) + if (mLen < 0) { mError = errno; mSyscall = "write"; @@ -309,7 +333,7 @@ bool LowFile::OnData() break; case LOWFILE_PHASE_CLOSING: - if(FD() >= 0) + if (FD() >= 0) { mError = close(FD()) < 0 ? errno : 0; mSyscall = "close"; @@ -329,8 +353,10 @@ bool LowFile::OnData() bool LowFile::OnLoop() { - if(mClose) + if (mClose) + { return false; + } FinishPhase(); return !mClose; } @@ -341,30 +367,37 @@ bool LowFile::OnLoop() bool LowFile::FinishPhase() { - if(mPhase == LOWFILE_PHASE_READY) + if (mPhase == LOWFILE_PHASE_READY) + { return true; - if(!mDataDone) + } + if (!mDataDone) + { return false; + } int phase = mPhase; mPhase = LOWFILE_PHASE_READY; - if(phase == LOWFILE_PHASE_OPENING && !mError) + if (phase == LOWFILE_PHASE_OPENING && !mError) + { AdvertiseFD(); - if((phase == LOWFILE_PHASE_OPENING && mError) || - phase == LOWFILE_PHASE_CLOSING) + } + if ((phase == LOWFILE_PHASE_OPENING && mError) || phase == LOWFILE_PHASE_CLOSING) + { mClose = true; + } - if(mCallID) + if (mCallID) { int callID = mCallID; mCallID = 0; mLow->run_ref--; - switch(phase) + switch (phase) { case LOWFILE_PHASE_OPENING: - if(mError) + if (mError) { low_push_stash(mLow, callID, true); low_push_error(mLow, mError, mSyscall); @@ -383,7 +416,7 @@ bool LowFile::FinishPhase() case LOWFILE_PHASE_READING: case LOWFILE_PHASE_WRITING: low_push_stash(mLow, callID, true); - if(mError) + if (mError) { low_push_error(mLow, mError, mSyscall); duk_call(mLow->duk_ctx, 1); @@ -398,7 +431,7 @@ bool LowFile::FinishPhase() case LOWFILE_PHASE_FSTAT: low_push_stash(mLow, callID, true); - if(mError) + if (mError) { low_push_error(mLow, mError, mSyscall); duk_call(mLow->duk_ctx, 1); @@ -409,21 +442,12 @@ bool LowFile::FinishPhase() duk_push_object(mLow->duk_ctx); #define applyStat(name) {#name, (double)mStat.st_##name} - duk_number_list_entry numberList[] = { - applyStat(dev), - applyStat(ino), - applyStat(mode), - applyStat(nlink), - applyStat(uid), - applyStat(gid), - applyStat(rdev), - applyStat(blksize), - applyStat(blocks), - applyStat(size), - {"atimeMs", mStat.st_atime * 1000.0}, - {"mtimeMs", mStat.st_mtime * 1000.0}, - {"ctimeMs", mStat.st_ctime * 1000.0}, - {NULL, 0.0}}; + duk_number_list_entry numberList[] = {applyStat(dev), applyStat(ino), applyStat(mode), + applyStat(nlink), applyStat(uid), applyStat(gid), + applyStat(rdev), applyStat(blksize), applyStat(blocks), + applyStat(size), {"atimeMs", mStat.st_atime * 1000.0}, + {"mtimeMs", mStat.st_mtime * 1000.0}, + {"ctimeMs", mStat.st_ctime * 1000.0}, {NULL, 0.0}}; duk_put_number_list(mLow->duk_ctx, -1, numberList); duk_call(mLow->duk_ctx, 2); @@ -432,15 +456,19 @@ bool LowFile::FinishPhase() case LOWFILE_PHASE_CLOSING: low_push_stash(mLow, callID, true); - if(mError) + if (mError) + { low_push_error(mLow, mError, mSyscall); + } else + { duk_push_null(mLow->duk_ctx); + } duk_call(mLow->duk_ctx, 1); return true; } } - else if(mError) + else if (mError) { low_push_error(mLow, mError, mSyscall); duk_throw(mLow->duk_ctx); diff --git a/src/LowFile.h b/src/LowFile.h index 676e51e..01ff8d6 100644 --- a/src/LowFile.h +++ b/src/LowFile.h @@ -17,47 +17,49 @@ struct low_main_t; enum { - LOWFILE_PHASE_OPENING, - LOWFILE_PHASE_READY, - LOWFILE_PHASE_READING, - LOWFILE_PHASE_WRITING, - LOWFILE_PHASE_FSTAT, - LOWFILE_PHASE_CLOSING + LOWFILE_PHASE_OPENING, + LOWFILE_PHASE_READY, + LOWFILE_PHASE_READING, + LOWFILE_PHASE_WRITING, + LOWFILE_PHASE_FSTAT, + LOWFILE_PHASE_CLOSING }; -class LowFile - : public LowFD - , public LowDataCallback - , public LowLoopCallback +class LowFile : public LowFD, public LowDataCallback, public LowLoopCallback { - public: - LowFile(low_main_t *low, const char *path, int flags, int callIndex); - virtual ~LowFile(); - - void Read(int pos, unsigned char *data, int len, int callIndex); - void Write(int pos, unsigned char *data, int len, int callIndex); - void FStat(int callIndex); - bool Close(int callIndex); - - bool FinishPhase(); - - protected: - virtual bool OnData(); - virtual bool OnLoop(); - - private: - low_main_t *mLow; - char *mPath; - int mFlags; - - unsigned char *mData; - int mPos, mLen; - struct stat mStat; - int mCallID; - - int mPhase, mError; - const char *mSyscall; - bool mDataDone, mClose; +public: + LowFile(low_main_t *low, const char *path, int flags, int callIndex); + + virtual ~LowFile(); + + void Read(int pos, unsigned char *data, int len, int callIndex); + + void Write(int pos, unsigned char *data, int len, int callIndex); + + void FStat(int callIndex); + + bool Close(int callIndex); + + bool FinishPhase(); + +protected: + virtual bool OnData(); + + virtual bool OnLoop(); + +private: + low_main_t *mLow; + char *mPath; + int mFlags; + + unsigned char *mData; + int mPos, mLen; + struct stat mStat; + int mCallID; + + int mPhase, mError; + const char *mSyscall; + bool mDataDone, mClose; }; #endif /* __LOWFILE_H__ */ \ No newline at end of file diff --git a/src/LowHTTPDirect.cpp b/src/LowHTTPDirect.cpp index 99bdf7d..cd456c9 100644 --- a/src/LowHTTPDirect.cpp +++ b/src/LowHTTPDirect.cpp @@ -14,12 +14,13 @@ // LowHTTPDirect::LowHTTPDirect // ----------------------------------------------------------------------------- -LowHTTPDirect::LowHTTPDirect(low_main_t *low, bool isServer) : - LowLoopCallback(low), mLow(low), mIsServer(isServer), mRequestCallID(0), - mReadCallID(0), mWriteCallID(0), mBytesRead(0), mBytesWritten(0), - mParamFirst(NULL), mParamLast(NULL), mWriteBufferCount(0), mShutdown(false), - mClosed(false), mEraseNextN(false), mReadData(NULL), mRemainingRead(NULL), - mReadError(false), mWriteError(false), mHTTPError(false) +LowHTTPDirect::LowHTTPDirect(low_main_t *low, bool isServer) : LowLoopCallback(low), mLow(low), mIsServer(isServer), + mRequestCallID(0), mReadCallID(0), mWriteCallID(0), + mBytesRead(0), mBytesWritten(0), mParamFirst(NULL), + mParamLast(NULL), mWriteBufferCount(0), mShutdown(false), + mClosed(false), mEraseNextN(false), mReadData(NULL), + mRemainingRead(NULL), mReadError(false), + mWriteError(false), mHTTPError(false) { pthread_mutex_init(&mMutex, NULL); Init(); @@ -31,27 +32,37 @@ LowHTTPDirect::LowHTTPDirect(low_main_t *low, bool isServer) : LowHTTPDirect::~LowHTTPDirect() { - if(mSocket) + if (mSocket) + { mSocket->SetDirect(NULL, 0); + } - if(mRequestCallID) + if (mRequestCallID) + { low_remove_stash(mLow, mRequestCallID); - if(mReadCallID) + } + if (mReadCallID) + { low_remove_stash(mLow, mReadCallID); - if(mWriteCallID) + } + if (mWriteCallID) + { low_remove_stash(mLow, mWriteCallID); + } - while(mParamFirst) + while (mParamFirst) { LowHTTPDirect_ParamData *param = mParamFirst; mParamFirst = mParamFirst->next; low_free(param); } - for(int i = 0; i < mWriteBufferCount; i++) + for (int i = 0; i < mWriteBufferCount; i++) { - if(mWriteBufferStashID[i]) + if (mWriteBufferStashID[i]) + { low_remove_stash(mLow, mWriteBufferStashID[i]); + } } pthread_mutex_destroy(&mMutex); @@ -81,7 +92,7 @@ void LowHTTPDirect::Init() mChunkedEncoding = false; mNoBodyDefault = false; - while(mParamFirst) + while (mParamFirst) { LowHTTPDirect_ParamData *param = mParamFirst; mParamFirst = mParamFirst->next; @@ -92,12 +103,12 @@ void LowHTTPDirect::Init() mWriting = false; mWriteDone = false; - if(mReadCallID) + if (mReadCallID) { low_remove_stash(mLow, mReadCallID); mReadCallID = 0; } - if(mWriteCallID) + if (mWriteCallID) { low_remove_stash(mLow, mWriteCallID); mWriteCallID = 0; @@ -110,18 +121,20 @@ void LowHTTPDirect::Init() void LowHTTPDirect::Detach(bool pushRemainingRead) { - if(pushRemainingRead) + if (pushRemainingRead) { low_web_clear_poll(mLow, mSocket); - if(mRemainingRead) - memcpy(duk_push_fixed_buffer(mLow->duk_ctx, mRemainingReadLen), - mRemainingRead, - mRemainingReadLen); + if (mRemainingRead) + { + memcpy(duk_push_fixed_buffer(mLow->duk_ctx, mRemainingReadLen), mRemainingRead, mRemainingReadLen); + } else + { duk_push_fixed_buffer(mLow->duk_ctx, 0); + } } - if(mSocket) + if (mSocket) { mSocket->SetDirect(NULL, 0); mSocket = NULL; @@ -137,8 +150,10 @@ void LowHTTPDirect::Detach(bool pushRemainingRead) void LowHTTPDirect::SetRequestCallID(int callID) { mRequestCallID = callID; - if(mParamFirst || mClosed) + if (mParamFirst || mClosed) + { low_loop_set_callback(mLow, this); + } } // ----------------------------------------------------------------------------- @@ -147,7 +162,7 @@ void LowHTTPDirect::SetRequestCallID(int callID) void LowHTTPDirect::Read(unsigned char *data, int len, int callIndex) { - if(!mIsRequest || mReadData || !mSocket) + if (!mIsRequest || mReadData || !mSocket) { duk_dup(mLow->duk_ctx, callIndex); low_push_error(mLow, EAGAIN, "read"); @@ -160,31 +175,35 @@ void LowHTTPDirect::Read(unsigned char *data, int len, int callIndex) mReadLen = len; mReadData = data; - if(mRemainingRead && !mClosed) + if (mRemainingRead && !mClosed) { pthread_mutex_unlock(&mMutex); unsigned char *data = mRemainingRead; mRemainingRead = NULL; - if(SocketData(data, mRemainingReadLen, true)) + if (SocketData(data, mRemainingReadLen, true)) + { mSocket->TriggerDirect(LOWSOCKET_TRIGGER_READ); + } } else + { pthread_mutex_unlock(&mMutex); + } - if(mReadPos || mPhase == LOWHTTPDIRECT_PHASE_SENDING_RESPONSE || mClosed || - mReadError || mHTTPError) + if (mReadPos || mPhase == LOWHTTPDIRECT_PHASE_SENDING_RESPONSE || mClosed || mReadError || mHTTPError) { duk_dup(mLow->duk_ctx, callIndex); - if(mReadError || mHTTPError) + if (mReadError || mHTTPError) { low_push_stash(mLow, mRequestCallID, false); - if(mReadError) + if (mReadError) + { mSocket->PushError(0); + } else { - duk_push_error_object( - mLow->duk_ctx, DUK_ERR_ERROR, "HTTP data not valid"); + duk_push_error_object(mLow->duk_ctx, DUK_ERR_ERROR, "HTTP data not valid"); duk_push_string(mLow->duk_ctx, "ERR_HTTP_PARSER"); duk_put_prop_string(mLow->duk_ctx, -2, "code"); } @@ -206,22 +225,24 @@ void LowHTTPDirect::Read(unsigned char *data, int len, int callIndex) duk_push_int(mLow->duk_ctx, read); - if(!mReadPos) + if (!mReadPos) { duk_push_array(mLow->duk_ctx); int arr_ind = 0; - while(mParamFirst) + while (mParamFirst) { pthread_mutex_lock(&mMutex); LowHTTPDirect_ParamData *param = mParamFirst; mParamFirst = mParamFirst->next; - if(!mParamFirst) + if (!mParamFirst) + { mParamLast = NULL; + } pthread_mutex_unlock(&mMutex); int pos = 0; - while(param->data[pos]) + while (param->data[pos]) { int len = param->data[pos]; char next = param->data[pos + 1 + len]; @@ -237,37 +258,40 @@ void LowHTTPDirect::Read(unsigned char *data, int len, int callIndex) low_free(param); } - if(mIsServer) + if (mIsServer) + { duk_call(mLow->duk_ctx, 4); + } else { Detach(); - duk_push_boolean(mLow->duk_ctx, - !mClosed && mWriteDone && - !mWriteBufferCount); + duk_push_boolean(mLow->duk_ctx, !mClosed && mWriteDone && !mWriteBufferCount); duk_call(mLow->duk_ctx, 5); } } else + { duk_call(mLow->duk_ctx, 3); + } } } else + { mReadCallID = low_add_stash(mLow, callIndex); + } } // ----------------------------------------------------------------------------- // LowHTTPDirect::WriteHeaders // ----------------------------------------------------------------------------- -void LowHTTPDirect::WriteHeaders(const char *txt, - int index, - int len, - bool isChunked) +void LowHTTPDirect::WriteHeaders(const char *txt, int index, int len, bool isChunked) { - if((mIsServer && !mIsRequest) || mWriting) + if ((mIsServer && !mIsRequest) || mWriting) + { return; + } pthread_mutex_lock(&mMutex); mWriting = true; @@ -275,11 +299,12 @@ void LowHTTPDirect::WriteHeaders(const char *txt, mWriteLen = len; mWriteChunkedEncoding = isChunked; - mWriteBuffers[0].iov_base = (unsigned char *)txt; + mWriteBuffers[0].iov_base = (unsigned char *) txt; mWriteBuffers[0].iov_len = strlen(txt); - if(isChunked) - mWriteBuffers[0].iov_len -= - 2; // get rid of last \r\n, will be added with chunks + if (isChunked) + { + mWriteBuffers[0].iov_len -= 2; + } // get rid of last \r\n, will be added with chunks mWriteBufferStashID[0] = low_add_stash(mLow, index); mWriteBufferCount = 1; @@ -291,13 +316,9 @@ void LowHTTPDirect::WriteHeaders(const char *txt, // LowHTTPDirect::Write // ----------------------------------------------------------------------------- -void LowHTTPDirect::Write(unsigned char *data, - int len, - int bufferIndex, - int callIndex) +void LowHTTPDirect::Write(unsigned char *data, int len, int bufferIndex, int callIndex) { - if((mIsServer && !mIsRequest) || !mWriting || mWriteBufferCount > 1 || - mWriteCallID || mWriteDone || !mSocket) + if ((mIsServer && !mIsRequest) || !mWriting || mWriteBufferCount > 1 || mWriteCallID || mWriteDone || !mSocket) { duk_dup(mLow->duk_ctx, callIndex); low_push_error(mLow, EAGAIN, "write"); @@ -306,15 +327,14 @@ void LowHTTPDirect::Write(unsigned char *data, } pthread_mutex_lock(&mMutex); - if(len == 0) + if (len == 0) { mWriteDone = true; - if(mWriteChunkedEncoding) + if (mWriteChunkedEncoding) { sprintf(mWriteChunkedHeaderLine, "\r\n0\r\n\r\n"); mWriteBuffers[mWriteBufferCount].iov_base = mWriteChunkedHeaderLine; - mWriteBuffers[mWriteBufferCount].iov_len = - strlen(mWriteChunkedHeaderLine); + mWriteBuffers[mWriteBufferCount].iov_len = strlen(mWriteChunkedHeaderLine); mWriteBufferStashID[mWriteBufferCount] = 0; mWriteBufferCount++; } @@ -323,30 +343,28 @@ void LowHTTPDirect::Write(unsigned char *data, { mWritePos += len; - if(mWriteChunkedEncoding) + if (mWriteChunkedEncoding) { sprintf(mWriteChunkedHeaderLine, "\r\n%x\r\n", len); mWriteBuffers[mWriteBufferCount].iov_base = mWriteChunkedHeaderLine; - mWriteBuffers[mWriteBufferCount].iov_len = - strlen(mWriteChunkedHeaderLine); + mWriteBuffers[mWriteBufferCount].iov_len = strlen(mWriteChunkedHeaderLine); mWriteBufferStashID[mWriteBufferCount] = 0; mWriteBufferCount++; } mWriteBuffers[mWriteBufferCount].iov_base = data; mWriteBuffers[mWriteBufferCount].iov_len = len; - mWriteBufferStashID[mWriteBufferCount] = - low_add_stash(mLow, bufferIndex); + mWriteBufferStashID[mWriteBufferCount] = low_add_stash(mLow, bufferIndex); mWriteBufferCount++; } DoWrite(); pthread_mutex_unlock(&mMutex); - if(!mWriteBufferCount || mWriteError) + if (!mWriteBufferCount || mWriteError) { duk_dup(mLow->duk_ctx, callIndex); - if(mWriteError) + if (mWriteError) { mSocket->PushError(1); mWriteError = false; @@ -362,24 +380,25 @@ void LowHTTPDirect::Write(unsigned char *data, duk_call(mLow->duk_ctx, 2); } - if(!mWriteBufferCount && - mWriteDone) // we need to recheck b/c of duk_call + if (!mWriteBufferCount && mWriteDone) // we need to recheck b/c of duk_call { - if(!mIsServer) + if (!mIsServer) { - if(!mShutdown && !mWriteChunkedEncoding && - (mWriteLen < 0 || mWritePos != mWriteLen)) + if (!mShutdown && !mWriteChunkedEncoding && (mWriteLen < 0 || mWritePos != mWriteLen)) { mSocket->Shutdown(); mShutdown = true; } } - else if((!mWriteChunkedEncoding && - (mWriteLen < 0 || mWritePos != mWriteLen)) || - mPhase != LOWHTTPDIRECT_PHASE_SENDING_RESPONSE) + else if ((!mWriteChunkedEncoding && (mWriteLen < 0 || mWritePos != mWriteLen)) || + mPhase != LOWHTTPDIRECT_PHASE_SENDING_RESPONSE) + { mSocket->Close(); + } else + { Init(); + } } } else @@ -395,18 +414,20 @@ void LowHTTPDirect::Write(unsigned char *data, void LowHTTPDirect::DoWrite() { - while(mWriteBufferCount) + while (mWriteBufferCount) { int size = mSocket->writev(mWriteBuffers, mWriteBufferCount); - if(size < 0) + if (size < 0) { - if(errno != EAGAIN) + if (errno != EAGAIN) + { mWriteError = true; + } return; } mBytesWritten += size; - while(mWriteBufferCount && size >= mWriteBuffers[0].iov_len) + while (mWriteBufferCount && size >= mWriteBuffers[0].iov_len) { size -= mWriteBuffers[0].iov_len; low_remove_stash(mLow, mWriteBufferStashID[0]); @@ -422,10 +443,9 @@ void LowHTTPDirect::DoWrite() mWriteBufferStashID[2] = 0; mWriteBufferCount--; } - if(size) + if (size) { - mWriteBuffers[0].iov_base = - ((unsigned char *)mWriteBuffers[0].iov_base) + size; + mWriteBuffers[0].iov_base = ((unsigned char *) mWriteBuffers[0].iov_base) + size; mWriteBuffers[0].iov_len -= size; } } @@ -437,34 +457,40 @@ void LowHTTPDirect::DoWrite() bool LowHTTPDirect::OnLoop() { - if(!mSocket) + if (!mSocket) + { return false; - if(!mRequestCallID) + } + if (!mRequestCallID) + { return true; + } - if(!mIsRequest) + if (!mIsRequest) { - if(mClosed || mReadError || mHTTPError) + if (mClosed || mReadError || mHTTPError) { low_push_stash(mLow, mRequestCallID, false); - if(mReadError) + if (mReadError) + { mSocket->PushError(0); - else if(mHTTPError) + } + else if (mHTTPError) { - duk_push_error_object( - mLow->duk_ctx, DUK_ERR_ERROR, "HTTP data not valid"); + duk_push_error_object(mLow->duk_ctx, DUK_ERR_ERROR, "HTTP data not valid"); duk_push_string(mLow->duk_ctx, "ERR_HTTP_PARSER"); duk_put_prop_string(mLow->duk_ctx, -2, "code"); } else + { low_push_error(mLow, ECONNRESET, "read"); + } mReadError = mHTTPError = false; Detach(); duk_call(mLow->duk_ctx, 1); } - if(mParamFirst && mParamFirst->type == LOWHTTPDIRECT_PARAMDATA_HEADER && - mAtTrailer) + if (mParamFirst && mParamFirst->type == LOWHTTPDIRECT_PARAMDATA_HEADER && mAtTrailer) { low_push_stash(mLow, mRequestCallID, false); duk_push_null(mLow->duk_ctx); @@ -472,20 +498,21 @@ bool LowHTTPDirect::OnLoop() duk_push_array(mLow->duk_ctx); int arr_ind = 0; - while(mParamFirst && - mParamFirst->type == LOWHTTPDIRECT_PARAMDATA_HEADER) + while (mParamFirst && mParamFirst->type == LOWHTTPDIRECT_PARAMDATA_HEADER) { pthread_mutex_lock(&mMutex); LowHTTPDirect_ParamData *param = mParamFirst; mParamFirst = mParamFirst->next; - if(!mParamFirst) + if (!mParamFirst) + { mParamLast = NULL; + } pthread_mutex_unlock(&mMutex); int pos = 0; - while(param->data[pos]) + while (param->data[pos]) { - int len = (unsigned int)(unsigned char)param->data[pos]; + int len = (unsigned int) (unsigned char) param->data[pos]; char next = param->data[pos + 1 + len]; param->data[pos + 1 + len] = 0; @@ -510,8 +537,7 @@ bool LowHTTPDirect::OnLoop() } } - if(mReadCallID && - (mReadPos || mPhase == LOWHTTPDIRECT_PHASE_SENDING_RESPONSE || mClosed)) + if (mReadCallID && (mReadPos || mPhase == LOWHTTPDIRECT_PHASE_SENDING_RESPONSE || mClosed)) { pthread_mutex_lock(&mMutex); @@ -519,15 +545,16 @@ bool LowHTTPDirect::OnLoop() mReadCallID = 0; low_push_stash(mLow, callID, true); - if(mReadError || mHTTPError) + if (mReadError || mHTTPError) { low_push_stash(mLow, mRequestCallID, false); - if(mReadError) + if (mReadError) + { mSocket->PushError(0); + } else { - duk_push_error_object( - mLow->duk_ctx, DUK_ERR_ERROR, "HTTP data not valid"); + duk_push_error_object(mLow->duk_ctx, DUK_ERR_ERROR, "HTTP data not valid"); duk_push_string(mLow->duk_ctx, "ERR_HTTP_PARSER"); duk_put_prop_string(mLow->duk_ctx, -2, "code"); } @@ -551,22 +578,24 @@ bool LowHTTPDirect::OnLoop() pthread_mutex_unlock(&mLow->ref_mutex); duk_push_int(mLow->duk_ctx, read); - if(!mReadPos) + if (!mReadPos) { duk_push_array(mLow->duk_ctx); int arr_ind = 0; - while(mParamFirst) + while (mParamFirst) { pthread_mutex_lock(&mMutex); LowHTTPDirect_ParamData *param = mParamFirst; mParamFirst = mParamFirst->next; - if(!mParamFirst) + if (!mParamFirst) + { mParamLast = NULL; + } pthread_mutex_unlock(&mMutex); int pos = 0; - while(param->data[pos]) + while (param->data[pos]) { int len = param->data[pos]; char next = param->data[pos + 1 + len]; @@ -582,31 +611,33 @@ bool LowHTTPDirect::OnLoop() low_free(param); } - if(mIsServer) + if (mIsServer) + { duk_call(mLow->duk_ctx, 4); + } else { Detach(); - duk_push_boolean(mLow->duk_ctx, - !mClosed && mWriteDone && - !mWriteBufferCount); + duk_push_boolean(mLow->duk_ctx, !mClosed && mWriteDone && !mWriteBufferCount); duk_call(mLow->duk_ctx, 5); } } else + { duk_call(mLow->duk_ctx, 3); + } } } - if(!mWriteBufferCount || mWriteError) + if (!mWriteBufferCount || mWriteError) { - if(mWriteCallID) + if (mWriteCallID) { int callID = mWriteCallID; mWriteCallID = 0; low_push_stash(mLow, callID, true); - if(mWriteError) + if (mWriteError) { mSocket->PushError(1); mWriteError = false; @@ -622,24 +653,25 @@ bool LowHTTPDirect::OnLoop() duk_call(mLow->duk_ctx, 2); } } - if(!mWriteBufferCount && - mWriteDone) // we need to recheck b/c of duk_call + if (!mWriteBufferCount && mWriteDone) // we need to recheck b/c of duk_call { - if(!mIsServer) + if (!mIsServer) { - if(!mShutdown && !mWriteChunkedEncoding && - (mWriteLen < 0 || mWritePos != mWriteLen)) + if (!mShutdown && !mWriteChunkedEncoding && (mWriteLen < 0 || mWritePos != mWriteLen)) { mSocket->Shutdown(); mShutdown = true; } } - else if((!mWriteChunkedEncoding && - (mWriteLen < 0 || mWritePos != mWriteLen)) || - mPhase != LOWHTTPDIRECT_PHASE_SENDING_RESPONSE) + else if ((!mWriteChunkedEncoding && (mWriteLen < 0 || mWritePos != mWriteLen)) || + mPhase != LOWHTTPDIRECT_PHASE_SENDING_RESPONSE) + { mSocket->Close(); + } else + { Init(); + } } } @@ -661,61 +693,65 @@ bool LowHTTPDirect::OnSocketData(unsigned char *data, int len) // ----------------------------------------------------------------------------- #if !LOW_HAS_STRCASESTR + char *strcasestr(const char *s, const char *find); + #endif /* !LOW_HAS_STRCASESTR */ bool LowHTTPDirect::SocketData(unsigned char *data, int len, bool inLoop) { bool setCallback = false; - if(len == 0 || mClosed) + if (len == 0 || mClosed) + { goto done; - if(len < 0) + } + if (len < 0) { mReadError = true; goto done; } - while(len--) + while (len--) { unsigned char c = *data++; - if(mEraseNextN && c == '\n') + if (mEraseNextN && c == '\n') { mEraseNextN = false; continue; } mEraseNextN = mPhase != LOWHTTPDIRECT_PHASE_BODY && c == '\r'; - if(mPhase == LOWHTTPDIRECT_PHASE_SENDING_RESPONSE) + if (mPhase == LOWHTTPDIRECT_PHASE_SENDING_RESPONSE) + { goto err; + } LowHTTPDirect_ParamData *param = mParamLast; - if(mPhase != LOWHTTPDIRECT_PHASE_BODY && - mPhase != LOWHTTPDIRECT_PHASE_CHUNK_HEADER && - (!param || mParamPos + 2 >= sizeof(param->data))) + if (mPhase != LOWHTTPDIRECT_PHASE_BODY && mPhase != LOWHTTPDIRECT_PHASE_CHUNK_HEADER && + (!param || mParamPos + 2 >= sizeof(param->data))) { - LowHTTPDirect_ParamData *newParam = - (LowHTTPDirect_ParamData *)low_alloc( - sizeof(LowHTTPDirect_ParamData)); - if(!newParam) + LowHTTPDirect_ParamData *newParam = (LowHTTPDirect_ParamData *) low_alloc(sizeof(LowHTTPDirect_ParamData)); + if (!newParam) { mSocket->SetError(false, ENOMEM, false); goto done; } newParam->next = NULL; - newParam->type = mAtTrailer ? LOWHTTPDIRECT_PARAMDATA_TRAILER - : LOWHTTPDIRECT_PARAMDATA_HEADER; + newParam->type = mAtTrailer ? LOWHTTPDIRECT_PARAMDATA_TRAILER : LOWHTTPDIRECT_PARAMDATA_HEADER; pthread_mutex_lock(&mMutex); - if(param) + if (param) { - if(mParamStart == 1) + if (mParamStart == 1) + { goto err; + } param->next = newParam; - if(mParamStart != mParamPos) - memcpy(newParam->data + 1, - param->data + mParamStart, - mParamPos - mParamStart); + if (mParamStart != mParamPos) + { + memcpy(newParam->data + 1, param->data + mParamStart, mParamPos - mParamStart); + } param->data[mParamStart - 1] = '\0'; mParamPos -= mParamStart - 1; mParamPosNonSpace -= mParamStart - 1; @@ -732,22 +768,26 @@ bool LowHTTPDirect::SocketData(unsigned char *data, int len, bool inLoop) } bool isSpace = c == ' ' || c == '\t'; - if(mPhase == LOWHTTPDIRECT_PHASE_CHUNK_HEADER) + if (mPhase == LOWHTTPDIRECT_PHASE_CHUNK_HEADER) { - if(mParamStart == sizeof(mChunkedHeaderLine)) + if (mParamStart == sizeof(mChunkedHeaderLine)) + { goto err; + } - if(c == '\r' || c == '\n') + if (c == '\r' || c == '\n') { - if(mParamStart) + if (mParamStart) { mChunkedHeaderLine[mParamStart++] = '\0'; int i; - if(sscanf(mChunkedHeaderLine, "%x", &i) == 1) + if (sscanf(mChunkedHeaderLine, "%x", &i) == 1) { - if(i == 0) + if (i == 0) + { mPhase = LOWHTTPDIRECT_PHASE_HEADER_KEY; + } else { mContentLen += i; @@ -755,31 +795,39 @@ bool LowHTTPDirect::SocketData(unsigned char *data, int len, bool inLoop) } } else + { goto err; + } } } else + { mChunkedHeaderLine[mParamStart++] = c; + } } - else if(mPhase == LOWHTTPDIRECT_PHASE_BODY) + else if (mPhase == LOWHTTPDIRECT_PHASE_BODY) { len++; data--; // we need more than 1 char int size = len; - if(mContentLen >= 0 && size > mContentLen - mDataLen) + if (mContentLen >= 0 && size > mContentLen - mDataLen) + { size = mContentLen - mDataLen; + } pthread_mutex_lock(&mMutex); - if(!mReadData || mReadPos == mReadLen) + if (!mReadData || mReadPos == mReadLen) { mRemainingReadLen = len; mRemainingRead = data; pthread_mutex_unlock(&mMutex); break; } - if(size > mReadLen - mReadPos) + if (size > mReadLen - mReadPos) + { size = mReadLen - mReadPos; + } memcpy(mReadData + mReadPos, data, size); mReadPos += size; @@ -789,180 +837,194 @@ bool LowHTTPDirect::SocketData(unsigned char *data, int len, bool inLoop) data += size; len -= size; - if(mContentLen >= 0 && mDataLen == mContentLen) + if (mContentLen >= 0 && mDataLen == mContentLen) { - if(mChunkedEncoding) + if (mChunkedEncoding) { mPhase = LOWHTTPDIRECT_PHASE_CHUNK_HEADER; mParamStart = 0; } else + { mPhase = LOWHTTPDIRECT_PHASE_SENDING_RESPONSE; + } } setCallback = true; } - else if(mParamStart == mParamPos && - (isSpace || ((c == '\r' || c == '\n') && - mPhase == LOWHTTPDIRECT_PHASE_FIRSTLINE1))) + else if (mParamStart == mParamPos && + (isSpace || ((c == '\r' || c == '\n') && mPhase == LOWHTTPDIRECT_PHASE_FIRSTLINE1))) + { continue; + } else { - if(mEraseNextN) + if (mEraseNextN) + { c = '\n'; + } bool done = false; - if(mPhase == LOWHTTPDIRECT_PHASE_FIRSTLINE1 && isSpace) + if (mPhase == LOWHTTPDIRECT_PHASE_FIRSTLINE1 && isSpace) { mPhase = LOWHTTPDIRECT_PHASE_FIRSTLINE2; - if(!mIsServer) + if (!mIsServer) { - if(mParamPosNonSpace - mParamStart < 5 // x/1.0 - || param->data[mParamPosNonSpace - 4] != '/' || - param->data[mParamPosNonSpace - 2] != '.') + if (mParamPosNonSpace - mParamStart < 5 // x/1.0 + || param->data[mParamPosNonSpace - 4] != '/' || param->data[mParamPosNonSpace - 2] != '.') + { goto err; + } param->data[mParamStart - 1] = 3; - param->data[mParamStart] = - param->data[mParamPosNonSpace - 3]; + param->data[mParamStart] = param->data[mParamPosNonSpace - 3]; param->data[mParamStart + 1] = '.'; - param->data[mParamStart + 2] = - param->data[mParamPosNonSpace - 1]; - mParamPos = mParamStart = mParamPosNonSpace = - mParamStart + 4; + param->data[mParamStart + 2] = param->data[mParamPosNonSpace - 1]; + mParamPos = mParamStart = mParamPosNonSpace = mParamStart + 4; continue; } else { param->data[mParamPosNonSpace] = '\0'; - mNoBodyDefault = - strcmp(param->data + mParamStart, "OPTIONS") == 0 || - strcmp(param->data + mParamStart, "GET") == 0 || - strcmp(param->data + mParamStart, "HEAD") == 0 || - strcmp(param->data + mParamStart, "UNLOCK") == 0 || - strcmp(param->data + mParamStart, "MKCOL") == 0 || - strcmp(param->data + mParamStart, "COPY") == 0 || - strcmp(param->data + mParamStart, "MOVE") == 0 || - strcmp(param->data + mParamStart, "DELETE") == 0 || - strcmp(param->data + mParamStart, "CONNECT") == 0; + mNoBodyDefault = strcmp(param->data + mParamStart, "OPTIONS") == 0 || + strcmp(param->data + mParamStart, "GET") == 0 || + strcmp(param->data + mParamStart, "HEAD") == 0 || + strcmp(param->data + mParamStart, "UNLOCK") == 0 || + strcmp(param->data + mParamStart, "MKCOL") == 0 || + strcmp(param->data + mParamStart, "COPY") == 0 || + strcmp(param->data + mParamStart, "MOVE") == 0 || + strcmp(param->data + mParamStart, "DELETE") == 0 || + strcmp(param->data + mParamStart, "CONNECT") == 0; done = true; } } - else if(mPhase == LOWHTTPDIRECT_PHASE_FIRSTLINE2 && isSpace) + else if (mPhase == LOWHTTPDIRECT_PHASE_FIRSTLINE2 && isSpace) { mPhase = LOWHTTPDIRECT_PHASE_FIRSTLINE3; done = true; } - else if(mPhase == LOWHTTPDIRECT_PHASE_FIRSTLINE3 && c == '\n') + else if (mPhase == LOWHTTPDIRECT_PHASE_FIRSTLINE3 && c == '\n') { mPhase = LOWHTTPDIRECT_PHASE_HEADER_KEY; - if(mIsServer) + if (mIsServer) { - if(mParamPosNonSpace - mParamStart < 5 // x/1.0 - || param->data[mParamPosNonSpace - 4] != '/' || - param->data[mParamPosNonSpace - 2] != '.') + if (mParamPosNonSpace - mParamStart < 5 // x/1.0 + || param->data[mParamPosNonSpace - 4] != '/' || param->data[mParamPosNonSpace - 2] != '.') + { goto err; + } param->data[mParamStart - 1] = 3; - param->data[mParamStart] = - param->data[mParamPosNonSpace - 3]; + param->data[mParamStart] = param->data[mParamPosNonSpace - 3]; param->data[mParamStart + 1] = '.'; - param->data[mParamStart + 2] = - param->data[mParamPosNonSpace - 1]; - mParamPos = mParamStart = mParamPosNonSpace = - mParamStart + 4; + param->data[mParamStart + 2] = param->data[mParamPosNonSpace - 1]; + mParamPos = mParamStart = mParamPosNonSpace = mParamStart + 4; continue; } else + { done = true; + } } - else if(mPhase == LOWHTTPDIRECT_PHASE_HEADER_VALUE && c == '\n') + else if (mPhase == LOWHTTPDIRECT_PHASE_HEADER_VALUE && c == '\n') { - if(mIsContentLengthHeader) + if (mIsContentLengthHeader) { param->data[mParamPosNonSpace] = '\0'; mContentLen = atoi(param->data + mParamStart); } - else if(mIsTransferEncodingHeader) + else if (mIsTransferEncodingHeader) { param->data[mParamPosNonSpace] = '\0'; - mChunkedEncoding = - strcasestr(param->data + mParamStart, "chunked") != NULL; + mChunkedEncoding = strcasestr(param->data + mParamStart, "chunked") != NULL; } mPhase = LOWHTTPDIRECT_PHASE_HEADER_KEY; done = true; } - else if(mPhase == LOWHTTPDIRECT_PHASE_HEADER_KEY && c == ':') + else if (mPhase == LOWHTTPDIRECT_PHASE_HEADER_KEY && c == ':') { param->data[mParamPosNonSpace] = '\0'; - mIsContentLengthHeader = - strcmp(param->data + mParamStart, "content-length") == 0; + mIsContentLengthHeader = strcmp(param->data + mParamStart, "content-length") == 0; mIsTransferEncodingHeader = - !mIsContentLengthHeader && - strcmp(param->data + mParamStart, "transfer-encoding") == 0; + !mIsContentLengthHeader && strcmp(param->data + mParamStart, "transfer-encoding") == 0; mPhase = LOWHTTPDIRECT_PHASE_HEADER_VALUE; done = true; } - else if(mPhase == LOWHTTPDIRECT_PHASE_HEADER_KEY && c == '\n') + else if (mPhase == LOWHTTPDIRECT_PHASE_HEADER_KEY && c == '\n') { - if(mParamStart == mParamPos) + if (mParamStart == mParamPos) { param->data[mParamStart - 1] = '\0'; - if(mAtTrailer) + if (mAtTrailer) + { mPhase = LOWHTTPDIRECT_PHASE_SENDING_RESPONSE; + } else { mAtTrailer = true; - if(mContentLen == -1 && !mChunkedEncoding && - mNoBodyDefault) + if (mContentLen == -1 && !mChunkedEncoding && mNoBodyDefault) + { mContentLen = 0; - if(mChunkedEncoding) + } + if (mChunkedEncoding) { mPhase = LOWHTTPDIRECT_PHASE_CHUNK_HEADER; mParamStart = 0; mContentLen = 0; } - else if(mContentLen != 0) + else if (mContentLen != 0) + { mPhase = LOWHTTPDIRECT_PHASE_BODY; + } else + { mPhase = LOWHTTPDIRECT_PHASE_SENDING_RESPONSE; + } } setCallback = true; } else { // Header without value - param->data[mParamStart - 1] = - mParamPosNonSpace - mParamStart; + param->data[mParamStart - 1] = mParamPosNonSpace - mParamStart; param->data[mParamPosNonSpace] = 0; mParamPos = mParamStart = mParamPosNonSpace + 2; } continue; } - if(done) + if (done) { - if(mParamPosNonSpace - mParamStart > 255) + if (mParamPosNonSpace - mParamStart > 255) + { mParamPosNonSpace = mParamStart + 255; + } param->data[mParamStart - 1] = mParamPosNonSpace - mParamStart; - mParamPos = mParamStart = mParamPosNonSpace = - mParamPosNonSpace + 1; + mParamPos = mParamStart = mParamPosNonSpace = mParamPosNonSpace + 1; } else { - if(mPhase == LOWHTTPDIRECT_PHASE_HEADER_KEY) + if (mPhase == LOWHTTPDIRECT_PHASE_HEADER_KEY) + { param->data[mParamPos++] = tolower(c); - else if(mPhase == LOWHTTPDIRECT_PHASE_FIRSTLINE1 || - (mIsServer && mPhase == LOWHTTPDIRECT_PHASE_FIRSTLINE3)) + } + else if (mPhase == LOWHTTPDIRECT_PHASE_FIRSTLINE1 || + (mIsServer && mPhase == LOWHTTPDIRECT_PHASE_FIRSTLINE3)) + { param->data[mParamPos++] = toupper(c); + } else + { param->data[mParamPos++] = c; + } - if(!isSpace) + if (!isSpace) + { mParamPosNonSpace = mParamPos; + } } } } @@ -970,16 +1032,20 @@ bool LowHTTPDirect::SocketData(unsigned char *data, int len, bool inLoop) pthread_mutex_lock(&mLow->ref_mutex); mBytesRead += len; pthread_mutex_unlock(&mLow->ref_mutex); - if(mRequestCallID && setCallback && !inLoop) + if (mRequestCallID && setCallback && !inLoop) + { low_loop_set_callback(mLow, this); + } return !mRemainingRead; err: mHTTPError = true; done: mClosed = true; - if(mRequestCallID) + if (mRequestCallID) + { low_loop_set_callback(mLow, this); + } return false; } @@ -992,8 +1058,10 @@ bool LowHTTPDirect::OnSocketWrite() { pthread_mutex_lock(&mMutex); DoWrite(); - if(mWriteCallID && (!mWriteBufferCount || mWriteError)) + if (mWriteCallID && (!mWriteBufferCount || mWriteError)) + { low_loop_set_callback(mLow, this); + } bool res = mWriteBufferCount != 0; pthread_mutex_unlock(&mMutex); diff --git a/src/LowHTTPDirect.h b/src/LowHTTPDirect.h index 8c0b66e..8db2dd5 100644 --- a/src/LowHTTPDirect.h +++ b/src/LowHTTPDirect.h @@ -11,109 +11,116 @@ #include #include "low_config.h" + #if LOW_ESP32_LWIP_SPECIALITIES #include #else + #include + #endif /* LOW_ESP32_LWIP_SPECIALITIES */ using namespace std; enum LowHTTPDirect_Phase { - LOWHTTPDIRECT_PHASE_FIRSTLINE1, - LOWHTTPDIRECT_PHASE_FIRSTLINE2, - LOWHTTPDIRECT_PHASE_FIRSTLINE3, - LOWHTTPDIRECT_PHASE_HEADER_KEY, - LOWHTTPDIRECT_PHASE_HEADER_VALUE, - LOWHTTPDIRECT_PHASE_CHUNK_HEADER, - LOWHTTPDIRECT_PHASE_BODY, - LOWHTTPDIRECT_PHASE_SENDING_RESPONSE + LOWHTTPDIRECT_PHASE_FIRSTLINE1, + LOWHTTPDIRECT_PHASE_FIRSTLINE2, + LOWHTTPDIRECT_PHASE_FIRSTLINE3, + LOWHTTPDIRECT_PHASE_HEADER_KEY, + LOWHTTPDIRECT_PHASE_HEADER_VALUE, + LOWHTTPDIRECT_PHASE_CHUNK_HEADER, + LOWHTTPDIRECT_PHASE_BODY, + LOWHTTPDIRECT_PHASE_SENDING_RESPONSE }; enum LowHTTPDirect_ParamDataType { - LOWHTTPDIRECT_PARAMDATA_HEADER = 0, - LOWHTTPDIRECT_PARAMDATA_TRAILER + LOWHTTPDIRECT_PARAMDATA_HEADER = 0, LOWHTTPDIRECT_PARAMDATA_TRAILER }; struct LowHTTPDirect_ParamData { - LowHTTPDirect_ParamData *next; - LowHTTPDirect_ParamDataType type; - int size; - char data[10240]; + LowHTTPDirect_ParamData *next; + LowHTTPDirect_ParamDataType type; + int size; + char data[10240]; }; class LowSocket; -class LowHTTPDirect - : public LowSocketDirect - , public LowLoopCallback + +class LowHTTPDirect : public LowSocketDirect, public LowLoopCallback { - public: - LowHTTPDirect(low_main_t *low, bool isServer); - virtual ~LowHTTPDirect(); +public: + LowHTTPDirect(low_main_t *low, bool isServer); + + virtual ~LowHTTPDirect(); + + virtual void SetSocket(LowSocket *socket); + + void Detach(bool pushRemainingRead = false); + + void SetRequestCallID(int callID); + + void Read(unsigned char *data, int len, int callIndex); + + void WriteHeaders(const char *txt, int index, int len, bool isChunked); - virtual void SetSocket(LowSocket *socket); - void Detach(bool pushRemainingRead = false); + void Write(unsigned char *data, int len, int bufferIndex, int callIndex); - void SetRequestCallID(int callID); - void Read(unsigned char *data, int len, int callIndex); +protected: + void Init(); - void WriteHeaders(const char *txt, int index, int len, bool isChunked); - void Write(unsigned char *data, int len, int bufferIndex, int callIndex); + virtual bool OnLoop(); - protected: - void Init(); + virtual bool OnSocketData(unsigned char *data, int len); - virtual bool OnLoop(); + bool SocketData(unsigned char *data, int len, bool inLoop); - virtual bool OnSocketData(unsigned char *data, int len); - bool SocketData(unsigned char *data, int len, bool inLoop); + void DoWrite(); - void DoWrite(); - virtual bool OnSocketWrite(); + virtual bool OnSocketWrite(); - private: - low_main_t *mLow; - bool mIsServer, mDetached; +private: + low_main_t *mLow; + bool mIsServer, mDetached; - LowSocket *mSocket; - int mRequestCallID, mReadCallID, mWriteCallID; + LowSocket *mSocket; + int mRequestCallID, mReadCallID, mWriteCallID; - pthread_mutex_t mMutex; - LowHTTPDirect_Phase mPhase; - bool mIsRequest; - int mBytesRead; - int mBytesWritten; + pthread_mutex_t mMutex; + LowHTTPDirect_Phase mPhase; + bool mIsRequest; + int mBytesRead; + int mBytesWritten; - bool mShutdown, mClosed, mEraseNextN, mAtTrailer; + bool mShutdown, mClosed, mEraseNextN, mAtTrailer; - int mContentLength; - bool mNoBodyDefault, mChunkedEncoding; + int mContentLength; + bool mNoBodyDefault, mChunkedEncoding; - int mContentLen, mDataLen; + int mContentLen, mDataLen; - LowHTTPDirect_ParamData *mParamFirst, *mParamLast; - unsigned char *mParamCurrent; - int mParamStart, mParamPos, mParamPosNonSpace; + LowHTTPDirect_ParamData *mParamFirst, *mParamLast; + unsigned char *mParamCurrent; + int mParamStart, mParamPos, mParamPosNonSpace; - char mChunkedHeaderLine[10]; - bool mIsContentLengthHeader, mIsTransferEncodingHeader; + char mChunkedHeaderLine[10]; + bool mIsContentLengthHeader, mIsTransferEncodingHeader; - unsigned char *mRemainingRead; - int mRemainingReadLen; + unsigned char *mRemainingRead; + int mRemainingReadLen; - unsigned char *mReadData; - int mReadPos, mReadLen; + unsigned char *mReadData; + int mReadPos, mReadLen; - char mWriteChunkedHeaderLine[10]; - struct iovec mWriteBuffers[3]; - int mWriteBufferStashID[3]; - int mWritePos, mWriteLen, mWriteBufferCount; - bool mWriting, mWriteDone, mWriteChunkedEncoding; + char mWriteChunkedHeaderLine[10]; + struct iovec mWriteBuffers[3]; + int mWriteBufferStashID[3]; + int mWritePos, mWriteLen, mWriteBufferCount; + bool mWriting, mWriteDone, mWriteChunkedEncoding; - bool mReadError, mWriteError, mHTTPError; + bool mReadError, mWriteError, mHTTPError; }; #endif /* __LOWHTTPDIRECT_H__ */ \ No newline at end of file diff --git a/src/LowLoopCallback.h b/src/LowLoopCallback.h index 3f421ce..cf38ac3 100644 --- a/src/LowLoopCallback.h +++ b/src/LowLoopCallback.h @@ -9,33 +9,39 @@ class LowLoopCallback { - friend bool low_loop_run(low_main_t *low); - friend bool low_reset(low_main_t *low); - friend duk_ret_t low_loop_call_callback_safe(duk_context *ctx, void *udata); - friend void low_loop_set_callback(low_main_t *low, - LowLoopCallback *callback); - friend void low_loop_clear_callback(low_main_t *low, - LowLoopCallback *callback); - friend duk_ret_t low_fs_open_sync(duk_context *ctx); - friend duk_ret_t low_fs_close_sync(duk_context *ctx); - friend duk_ret_t low_fs_waitdone(duk_context *ctx); - - public: - LowLoopCallback(low_main_t *low) - : mLow(low), mNext(nullptr), mLoopClearOnReset(true) - { - } - virtual ~LowLoopCallback() { low_loop_clear_callback(mLow, this); } - - protected: - virtual bool OnLoop() = 0; - - private: - low_main_t *mLow; - LowLoopCallback *mNext; - - protected: - bool mLoopClearOnReset; + friend bool low_loop_run(low_main_t *low); + + friend bool low_reset(low_main_t *low); + + friend duk_ret_t low_loop_call_callback_safe(duk_context *ctx, void *udata); + + friend void low_loop_set_callback(low_main_t *low, LowLoopCallback *callback); + + friend void low_loop_clear_callback(low_main_t *low, LowLoopCallback *callback); + + friend duk_ret_t low_fs_open_sync(duk_context *ctx); + + friend duk_ret_t low_fs_close_sync(duk_context *ctx); + + friend duk_ret_t low_fs_waitdone(duk_context *ctx); + +public: + LowLoopCallback(low_main_t *low) : mLow(low), mNext(nullptr), mLoopClearOnReset(true) + { + } + + virtual ~LowLoopCallback() + { low_loop_clear_callback(mLow, this); } + +protected: + virtual bool OnLoop() = 0; + +private: + low_main_t *mLow; + LowLoopCallback *mNext; + +protected: + bool mLoopClearOnReset; }; #endif /* __LOWLOOPCALLBACK_H__ */ diff --git a/src/LowServerSocket.cpp b/src/LowServerSocket.cpp index d758477..ee301ea 100644 --- a/src/LowServerSocket.cpp +++ b/src/LowServerSocket.cpp @@ -27,13 +27,18 @@ // LowServerSocket::LowServerSocket // ----------------------------------------------------------------------------- -LowServerSocket::LowServerSocket(low_main_t *low, bool isHTTP, - LowTLSContext *secureContext) - : LowFD(low, LOWFD_TYPE_SERVER), mLow(low), mIsHTTP(isHTTP), - mAcceptCallID(0), mSecureContext(secureContext) +LowServerSocket::LowServerSocket(low_main_t *low, bool isHTTP, LowTLSContext *secureContext) : LowFD(low, + LOWFD_TYPE_SERVER), + mLow(low), + mIsHTTP(isHTTP), + mAcceptCallID(0), + mSecureContext( + secureContext) { if (mSecureContext) + { mSecureContext->AddRef(); + } } // ----------------------------------------------------------------------------- @@ -45,20 +50,25 @@ LowServerSocket::~LowServerSocket() low_web_clear_poll(mLow, this); if (FD() >= 0) + { close(FD()); + } if (mAcceptCallID) + { low_remove_stash(mLow, mAcceptCallID); + } if (mSecureContext) + { mSecureContext->DecRef(); + } } // ----------------------------------------------------------------------------- // LowServerSocket::Listen // ----------------------------------------------------------------------------- -bool LowServerSocket::Listen(struct sockaddr *addr, int addrLen, int callIndex, - int &err, const char *&syscall) +bool LowServerSocket::Listen(struct sockaddr *addr, int addrLen, int callIndex, int &err, const char *&syscall) { if (FD() >= 0) { @@ -76,8 +86,7 @@ bool LowServerSocket::Listen(struct sockaddr *addr, int addrLen, int callIndex, } u_long mode = 1; - if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (char *)&mode, sizeof(mode)) < - 0) + if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (char *) &mode, sizeof(mode)) < 0) { err = errno; syscall = "setsockopt"; @@ -112,8 +121,11 @@ bool LowServerSocket::Listen(struct sockaddr *addr, int addrLen, int callIndex, } // Get port, if we called bind with 0 - if ((addr->sa_family == AF_INET && !((struct sockaddr_in *)addr)->sin_port) || (addr->sa_family == AF_INET6 && !((struct sockaddr_in6 *)addr)->sin6_port)) - getsockname(fd, addr, (socklen_t *)&addrLen); + if ((addr->sa_family == AF_INET && !((struct sockaddr_in *) addr)->sin_port) || + (addr->sa_family == AF_INET6 && !((struct sockaddr_in6 *) addr)->sin6_port)) + { + getsockname(fd, addr, (socklen_t * ) & addrLen); + } SetFD(fd); AdvertiseFD(); @@ -136,8 +148,7 @@ void LowServerSocket::Read(int pos, unsigned char *data, int len, int callIndex) // LowServerSocket::Write // ----------------------------------------------------------------------------- -void LowServerSocket::Write(int pos, unsigned char *data, int len, - int callIndex) +void LowServerSocket::Write(int pos, unsigned char *data, int len, int callIndex) { duk_reference_error(mLow->duk_ctx, "write not supported on server"); } @@ -146,7 +157,8 @@ void LowServerSocket::Write(int pos, unsigned char *data, int len, // LowServerSocket::Close // ----------------------------------------------------------------------------- -bool LowServerSocket::Close(int callIndex) { return false; } +bool LowServerSocket::Close(int callIndex) +{ return false; } // ----------------------------------------------------------------------------- // LowServerSocket::OnEvents @@ -157,7 +169,7 @@ bool LowServerSocket::OnEvents(short events) LowHTTPDirect *direct = NULL; if (mIsHTTP) { - direct = new (low_new) LowHTTPDirect(mLow, true); + direct = new(low_new) LowHTTPDirect(mLow, true); if (!direct) { // error @@ -173,24 +185,28 @@ bool LowServerSocket::OnEvents(short events) sockaddr_in6 remoteAddr; socklen_t remoteAddrLen = sizeof(remoteAddr); - fd = accept(FD(), (sockaddr *)&remoteAddr, &remoteAddrLen); + fd = accept(FD(), (sockaddr * ) & remoteAddr, &remoteAddrLen); if (fd >= 0) - socket = new (low_new) - LowSocket(mLow, fd, (sockaddr *)&remoteAddr, mAcceptCallID, - direct, 0, mSecureContext); + { + socket = new(low_new) + LowSocket(mLow, fd, (sockaddr * ) & remoteAddr, mAcceptCallID, direct, 0, mSecureContext); + } } else { fd = accept(FD(), NULL, NULL); // no address if UNIX if (fd >= 0) - socket = new (low_new) LowSocket(mLow, fd, NULL, mAcceptCallID, - direct, 0, mSecureContext); + { + socket = new(low_new) LowSocket(mLow, fd, NULL, mAcceptCallID, direct, 0, mSecureContext); + } } if (!socket) { // error if (fd >= 0) + { close(fd); + } delete direct; } diff --git a/src/LowServerSocket.h b/src/LowServerSocket.h index 07d40c6..bef45a3 100644 --- a/src/LowServerSocket.h +++ b/src/LowServerSocket.h @@ -11,27 +11,29 @@ struct low_main_t; class LowServerSocket : public LowFD { - public: - LowServerSocket(low_main_t *low, bool isHTTP, LowTLSContext *secureContext); - virtual ~LowServerSocket(); +public: + LowServerSocket(low_main_t *low, bool isHTTP, LowTLSContext *secureContext); - bool Listen(struct sockaddr *addr, int addrLen, int callIndex, int &err, - const char *&syscall); + virtual ~LowServerSocket(); - void Read(int pos, unsigned char *data, int len, int callIndex); - void Write(int pos, unsigned char *data, int len, int callIndex); - bool Close(int callIndex); + bool Listen(struct sockaddr *addr, int addrLen, int callIndex, int &err, const char *&syscall); - protected: - virtual bool OnEvents(short events); + void Read(int pos, unsigned char *data, int len, int callIndex); - private: - low_main_t *mLow; - bool mIsHTTP; + void Write(int pos, unsigned char *data, int len, int callIndex); - int mFamily, mAcceptCallID; + bool Close(int callIndex); - LowTLSContext *mSecureContext; +protected: + virtual bool OnEvents(short events); + +private: + low_main_t *mLow; + bool mIsHTTP; + + int mFamily, mAcceptCallID; + + LowTLSContext *mSecureContext; }; #endif /* __LOWSERVERSOCKET_H__ */ \ No newline at end of file diff --git a/src/LowSignalHandler.cpp b/src/LowSignalHandler.cpp index 338c90c..c08c0bd 100644 --- a/src/LowSignalHandler.cpp +++ b/src/LowSignalHandler.cpp @@ -13,8 +13,7 @@ // LowSignalHandler::LowSignalHandler // ----------------------------------------------------------------------------- -LowSignalHandler::LowSignalHandler(low_main_t *low, int signal) - : LowLoopCallback(low), mLow(low), mSignal(signal) +LowSignalHandler::LowSignalHandler(low_main_t *low, int signal) : LowLoopCallback(low), mLow(low), mSignal(signal) { low_loop_set_callback(low, this); } @@ -27,38 +26,37 @@ bool LowSignalHandler::OnLoop() { const char *name; - switch(mSignal) + switch (mSignal) { - case SIGUSR1: - name = "SIGUSR1"; - break; - case SIGUSR2: - name = "SIGUSR2"; - break; - case SIGPIPE: - name = "SIGPIPE"; - break; - case SIGWINCH: - name = "SIGWINCH"; - break; - case SIGTERM: - name = "SIGTERM"; - break; - case SIGINT: - name = "SIGINT"; - break; - case SIGHUP: - name = "SIGHUP"; - break; - default: - return false; + case SIGUSR1: + name = "SIGUSR1"; + break; + case SIGUSR2: + name = "SIGUSR2"; + break; + case SIGPIPE: + name = "SIGPIPE"; + break; + case SIGWINCH: + name = "SIGWINCH"; + break; + case SIGTERM: + name = "SIGTERM"; + break; + case SIGINT: + name = "SIGINT"; + break; + case SIGHUP: + name = "SIGHUP"; + break; + default: + return false; } low_push_stash(mLow, mLow->signal_call_id, false); duk_push_string(mLow->duk_ctx, name); duk_call(mLow->duk_ctx, 1); - if(!duk_require_boolean(mLow->duk_ctx, -1) && - (mSignal == SIGTERM || mSignal == SIGINT || mSignal == SIGHUP)) + if (!duk_require_boolean(mLow->duk_ctx, -1) && (mSignal == SIGTERM || mSignal == SIGINT || mSignal == SIGHUP)) { #if LOW_HAS_SYS_SIGNALS // Go back to default handler @@ -72,7 +70,7 @@ bool LowSignalHandler::OnLoop() // Exit raise(mSignal); #else - while(true) + while (true) { } #endif /* LOW_HAS_SIGNALS */ diff --git a/src/LowSignalHandler.h b/src/LowSignalHandler.h index 0d926e7..e0dccc7 100644 --- a/src/LowSignalHandler.h +++ b/src/LowSignalHandler.h @@ -9,15 +9,15 @@ class LowSignalHandler : public LowLoopCallback { - public: - LowSignalHandler(low_main_t *low, int signal); +public: + LowSignalHandler(low_main_t *low, int signal); - protected: - virtual bool OnLoop(); +protected: + virtual bool OnLoop(); - private: - low_main_t *mLow; - int mSignal; +private: + low_main_t *mLow; + int mSignal; }; #endif /* __LOWSIGNALHANDLER_H__ */ \ No newline at end of file diff --git a/src/LowSocket.cpp b/src/LowSocket.cpp index f0e59bc..52e92fb 100644 --- a/src/LowSocket.cpp +++ b/src/LowSocket.cpp @@ -22,8 +22,10 @@ #include #define ioctl lwip_ioctl #else + #include #include + #endif /* LOW_ESP32_LWIP_SPECIALITIES */ @@ -31,14 +33,13 @@ // LowSocket::LowSocket // ----------------------------------------------------------------------------- -LowSocket::LowSocket(low_main_t *low, int fd) : - LowFD(low, LOWFD_TYPE_SOCKET, fd), LowLoopCallback(low), mLow(low), - mType(LOWSOCKET_TYPE_STDINOUT), mAcceptConnectCallID(0), - mAcceptConnectError(false), mReadCallID(0), mWriteCallID(0), - mConnected(true), mClosed(false), mDestroyed(false), mCloseCallID(0), - mReadData(NULL), mWriteData(NULL), mDirect(nullptr), - mDirectReadEnabled(false), mDirectWriteEnabled(false), mTLSContext(NULL), - mSSL(NULL) +LowSocket::LowSocket(low_main_t *low, int fd) : LowFD(low, LOWFD_TYPE_SOCKET, fd), LowLoopCallback(low), mLow(low), + mType(LOWSOCKET_TYPE_STDINOUT), mAcceptConnectCallID(0), + mAcceptConnectError(false), mReadCallID(0), mWriteCallID(0), + mConnected(true), mClosed(false), mDestroyed(false), mCloseCallID(0), + mReadData(NULL), mWriteData(NULL), mDirect(nullptr), + mDirectReadEnabled(false), mDirectWriteEnabled(false), + mTLSContext(NULL), mSSL(NULL) { AdvertiseFD(); InitSocket(NULL); @@ -48,79 +49,93 @@ LowSocket::LowSocket(low_main_t *low, int fd) : // LowSocket::LowSocket // ----------------------------------------------------------------------------- -LowSocket::LowSocket(low_main_t *low, - int fd, - struct sockaddr *remoteAddr, - int acceptCallID, - LowSocketDirect *direct, - int directType, - LowTLSContext *tlsContext, - bool clearOnReset) : - LowFD(low, LOWFD_TYPE_SOCKET, fd), - LowLoopCallback(low), mLow(low), mType(LOWSOCKET_TYPE_ACCEPTED), - mAcceptConnectCallID(acceptCallID), mAcceptConnectError(false), - mReadCallID(0), mWriteCallID(0), mConnected(false), mClosed(false), - mDestroyed(false), mCloseCallID(0), mReadData(NULL), mWriteData(NULL), - mDirect(direct), mDirectType(directType), - mDirectReadEnabled(direct != NULL), mDirectWriteEnabled(direct != NULL), - mTLSContext(tlsContext), mSSL(NULL) +LowSocket::LowSocket(low_main_t *low, int fd, struct sockaddr *remoteAddr, int acceptCallID, LowSocketDirect *direct, + int directType, LowTLSContext *tlsContext, bool clearOnReset) : LowFD(low, LOWFD_TYPE_SOCKET, fd), + LowLoopCallback(low), mLow(low), + mType(LOWSOCKET_TYPE_ACCEPTED), + mAcceptConnectCallID(acceptCallID), + mAcceptConnectError(false), + mReadCallID(0), mWriteCallID(0), + mConnected(false), mClosed(false), + mDestroyed(false), mCloseCallID(0), + mReadData(NULL), mWriteData(NULL), + mDirect(direct), + mDirectType(directType), + mDirectReadEnabled(direct != NULL), + mDirectWriteEnabled( + direct != NULL), + mTLSContext(tlsContext), mSSL(NULL) { mFDClearOnReset = clearOnReset; mLoopClearOnReset = clearOnReset; - if(mDirect) + if (mDirect) + { mDirect->SetSocket(this); + } - if(!InitSocket(remoteAddr)) + if (!InitSocket(remoteAddr)) { - if(mAcceptConnectCallID) + if (mAcceptConnectCallID) + { low_loop_set_callback(mLow, this); // to output error + } else + { low_web_set_poll_events(mLow, this, POLLOUT); + } mTLSContext = NULL; return; } - else if(mTLSContext) + else if (mTLSContext) + { low_web_set_poll_events(mLow, this, POLLOUT); + } else { mConnected = true; - if(mAcceptConnectCallID) + if (mAcceptConnectCallID) + { low_loop_set_callback(mLow, this); + } - if(mDirect) + if (mDirect) + { low_web_set_poll_events(mLow, this, POLLIN | POLLOUT); + } } - if(mTLSContext) + if (mTLSContext) + { mTLSContext->AddRef(); + } } // ----------------------------------------------------------------------------- // LowSocket::LowSocket // ----------------------------------------------------------------------------- -LowSocket::LowSocket(low_main_t *low, - LowSocketDirect *direct, - int directType, - LowTLSContext *tlsContext, - bool clearOnReset) : - LowFD(low, LOWFD_TYPE_SOCKET), - LowLoopCallback(low), mLow(low), mType(LOWSOCKET_TYPE_CONNECTED), - mAcceptConnectCallID(0), mAcceptConnectError(false), mReadCallID(0), - mWriteCallID(0), mConnected(false), mClosed(false), mDestroyed(false), - mCloseCallID(0), mReadData(NULL), mWriteData(NULL), mDirect(direct), - mDirectType(directType), mDirectReadEnabled(direct != NULL), - mDirectWriteEnabled(direct != NULL), mTLSContext(tlsContext), mSSL(NULL) +LowSocket::LowSocket(low_main_t *low, LowSocketDirect *direct, int directType, LowTLSContext *tlsContext, + bool clearOnReset) : LowFD(low, LOWFD_TYPE_SOCKET), LowLoopCallback(low), mLow(low), + mType(LOWSOCKET_TYPE_CONNECTED), mAcceptConnectCallID(0), + mAcceptConnectError(false), mReadCallID(0), mWriteCallID(0), + mConnected(false), mClosed(false), mDestroyed(false), mCloseCallID(0), + mReadData(NULL), mWriteData(NULL), mDirect(direct), mDirectType(directType), + mDirectReadEnabled(direct != NULL), mDirectWriteEnabled(direct != NULL), + mTLSContext(tlsContext), mSSL(NULL) { mFDClearOnReset = clearOnReset; mLoopClearOnReset = clearOnReset; - if(mDirect) + if (mDirect) + { mDirect->SetSocket(this); - if(mTLSContext) + } + if (mTLSContext) + { mTLSContext->AddRef(); + } } // ----------------------------------------------------------------------------- @@ -131,32 +146,40 @@ LowSocket::~LowSocket() { low_web_clear_poll(mLow, this); - if(mDirect) + if (mDirect) { delete mDirect; low_free(mReadData); } - if(mAcceptConnectCallID) + if (mAcceptConnectCallID) { - if(mType == LOWSOCKET_TYPE_CONNECTED) + if (mType == LOWSOCKET_TYPE_CONNECTED) + { low_remove_stash(mLow, mAcceptConnectCallID); + } } - if(mReadCallID) + if (mReadCallID) + { low_remove_stash(mLow, mReadCallID); - if(mWriteCallID) + } + if (mWriteCallID) + { low_remove_stash(mLow, mWriteCallID); - if(FD() >= 0 && mType != LOWSOCKET_TYPE_STDINOUT) + } + if (FD() >= 0 && mType != LOWSOCKET_TYPE_STDINOUT) + { close(FD()); + } SetFD(-1); - if(mSSL) + if (mSSL) { mbedtls_ssl_free(mSSL); low_free(mSSL); } - if(mTLSContext) + if (mTLSContext) { mTLSContext->DecRef(); } @@ -168,29 +191,26 @@ LowSocket::~LowSocket() bool LowSocket::InitSocket(struct sockaddr *remoteAddr) { - if(remoteAddr && remoteAddr->sa_family == AF_INET) + if (remoteAddr && remoteAddr->sa_family == AF_INET) { struct sockaddr_in *addr; unsigned char *ip; mNodeFamily = 4; - addr = (struct sockaddr_in *)remoteAddr; - ip = (unsigned char *)&addr->sin_addr.s_addr; + addr = (struct sockaddr_in *) remoteAddr; + ip = (unsigned char *) &addr->sin_addr.s_addr; sprintf(mRemoteHost, "%u.%u.%u.%u", ip[0], ip[1], ip[2], ip[3]); mRemotePort = ntohs(addr->sin_port); } - else if(remoteAddr && remoteAddr->sa_family == AF_INET6) + else if (remoteAddr && remoteAddr->sa_family == AF_INET6) { struct sockaddr_in6 *addr; mNodeFamily = 6; - addr = (struct sockaddr_in6 *)remoteAddr; - if(inet_ntop(AF_INET6, - addr->sin6_addr.s6_addr, - mRemoteHost, - sizeof(mRemoteHost)) == NULL) + addr = (struct sockaddr_in6 *) remoteAddr; + if (inet_ntop(AF_INET6, addr->sin6_addr.s6_addr, mRemoteHost, sizeof(mRemoteHost)) == NULL) { mAcceptConnectErrno = errno; mAcceptConnectErrnoSSL = false; @@ -200,10 +220,12 @@ bool LowSocket::InitSocket(struct sockaddr *remoteAddr) mRemotePort = ntohs(addr->sin6_port); } else - mNodeFamily = 0; // UNIX + { + mNodeFamily = 0; + } // UNIX u_long mode = 1; - if(ioctl(FD(), FIONBIO, &mode) < 0) + if (ioctl(FD(), FIONBIO, &mode) < 0) { mAcceptConnectErrno = errno; mAcceptConnectErrnoSSL = false; @@ -212,10 +234,10 @@ bool LowSocket::InitSocket(struct sockaddr *remoteAddr) return false; } - if(mTLSContext) + if (mTLSContext) { - mSSL = (mbedtls_ssl_context *)low_alloc(sizeof(mbedtls_ssl_context)); - if(!mSSL) + mSSL = (mbedtls_ssl_context *) low_alloc(sizeof(mbedtls_ssl_context)); + if (!mSSL) { mAcceptConnectErrno = ENOMEM; mAcceptConnectErrnoSSL = false; @@ -227,7 +249,7 @@ bool LowSocket::InitSocket(struct sockaddr *remoteAddr) mbedtls_ssl_init(mSSL); int ret; - if((ret = mbedtls_ssl_setup(mSSL, &mTLSContext->GetSSLConfig())) != 0) + if ((ret = mbedtls_ssl_setup(mSSL, &mTLSContext->GetSSLConfig())) != 0) { mAcceptConnectErrno = ret; mAcceptConnectErrnoSSL = true; @@ -236,8 +258,7 @@ bool LowSocket::InitSocket(struct sockaddr *remoteAddr) return false; } - mbedtls_ssl_set_bio( - mSSL, &FD(), mbedtls_net_send, mbedtls_net_recv, NULL); + mbedtls_ssl_set_bio(mSSL, &FD(), mbedtls_net_send, mbedtls_net_recv, NULL); } return true; @@ -247,13 +268,9 @@ bool LowSocket::InitSocket(struct sockaddr *remoteAddr) // LowSocket::Connect // ----------------------------------------------------------------------------- -bool LowSocket::Connect(struct sockaddr *remoteAddr, - int remoteAddrLen, - int callIndex, - int &err, - const char *&syscall) +bool LowSocket::Connect(struct sockaddr *remoteAddr, int remoteAddrLen, int callIndex, int &err, const char *&syscall) { - if(mType != LOWSOCKET_TYPE_CONNECTED || FD() >= 0) + if (mType != LOWSOCKET_TYPE_CONNECTED || FD() >= 0) { err = mConnected ? EISCONN : EALREADY; syscall = "connect"; @@ -261,17 +278,17 @@ bool LowSocket::Connect(struct sockaddr *remoteAddr, } SetFD(socket(remoteAddr->sa_family, SOCK_STREAM, 0)); - if(FD() < 0) + if (FD() < 0) { err = errno; syscall = "socket"; return false; } - if(InitSocket(remoteAddr)) + if (InitSocket(remoteAddr)) { - if(connect(FD(), remoteAddr, remoteAddrLen) < 0) + if (connect(FD(), remoteAddr, remoteAddrLen) < 0) { - if(errno != EINPROGRESS) + if (errno != EINPROGRESS) { mAcceptConnectErrno = errno; mAcceptConnectErrnoSSL = false; @@ -279,11 +296,13 @@ bool LowSocket::Connect(struct sockaddr *remoteAddr, mAcceptConnectSyscall = "connect"; } } - else if(!mTLSContext) + else if (!mTLSContext) + { mConnected = true; + } } - if(mAcceptConnectError) + if (mAcceptConnectError) { close(FD()); SetFD(-1); @@ -294,17 +313,20 @@ bool LowSocket::Connect(struct sockaddr *remoteAddr, } else { - if(mConnected) + if (mConnected) { - if(callIndex == -1) + if (callIndex == -1) + { return true; + } else + { return CallAcceptConnect(callIndex, false); + } } else { - mAcceptConnectCallID = - callIndex != -1 ? low_add_stash(mLow, callIndex) : 0; + mAcceptConnectCallID = callIndex != -1 ? low_add_stash(mLow, callIndex) : 0; low_web_set_poll_events(mLow, this, POLLOUT); return true; @@ -326,7 +348,7 @@ void LowSocket::Read(int pos, unsigned char *data, int len, int callIndex) } #endif /* LOW_ESP32_LWIP_SPECIALITIES */ - if(mDirect || mReadData) + if (mDirect || mReadData) { duk_dup(mLow->duk_ctx, callIndex); low_push_error(mLow, EAGAIN, "read"); @@ -341,17 +363,18 @@ void LowSocket::Read(int pos, unsigned char *data, int len, int callIndex) // If TLS context is used, always use other thread to read bool tryNow = !mTLSContext && mConnected; len = mClosed ? 0 : (tryNow ? DoRead() : -1); - if(len >= 0 || - (tryNow && len == -1 && (mReadErrno != EAGAIN || mReadErrnoSSL))) + if (len >= 0 || (tryNow && len == -1 && (mReadErrno != EAGAIN || mReadErrnoSSL))) { - if(len == 0) + if (len == 0) + { mClosed = true; + } int err = errno; mReadData = NULL; duk_dup(mLow->duk_ctx, callIndex); - if(len >= 0) + if (len >= 0) { duk_push_null(mLow->duk_ctx); duk_push_int(mLow->duk_ctx, len); @@ -367,12 +390,8 @@ void LowSocket::Read(int pos, unsigned char *data, int len, int callIndex) { mReadCallID = low_add_stash(mLow, callIndex); - short events = - mClosed ? 0 - : (POLLIN | (!mConnected || (mWriteData && !mWritePos) || - mDirectWriteEnabled - ? POLLOUT - : 0)); + short events = mClosed ? 0 : (POLLIN | + (!mConnected || (mWriteData && !mWritePos) || mDirectWriteEnabled ? POLLOUT : 0)); low_web_set_poll_events(mLow, this, events); } } @@ -400,7 +419,7 @@ void LowSocket::Write(int pos, unsigned char *data, int len, int callIndex) } #endif /* LOW_ESP32_LWIP_SPECIALITIES */ - if(mDirect || mWriteData) + if (mDirect || mWriteData) { duk_dup(mLow->duk_ctx, callIndex); low_push_error(mLow, EAGAIN, "write"); @@ -415,14 +434,13 @@ void LowSocket::Write(int pos, unsigned char *data, int len, int callIndex) // If TLS context is used, always use other thread to read bool tryNow = !mTLSContext && mConnected; len = mClosed ? 0 : (tryNow ? DoWrite() : -1); - if(len >= 0 || - (tryNow && len == -1 && (mWriteErrno != EAGAIN || mWriteErrnoSSL))) + if (len >= 0 || (tryNow && len == -1 && (mWriteErrno != EAGAIN || mWriteErrnoSSL))) { int err = errno; mWriteData = NULL; duk_dup(mLow->duk_ctx, callIndex); - if(len > 0) + if (len > 0) { duk_push_null(mLow->duk_ctx); duk_push_int(mLow->duk_ctx, len); @@ -438,9 +456,7 @@ void LowSocket::Write(int pos, unsigned char *data, int len, int callIndex) { mWriteCallID = low_add_stash(mLow, callIndex); - short events = - ((mReadData && !mReadPos) || mDirectReadEnabled ? POLLIN : 0) | - POLLOUT; + short events = ((mReadData && !mReadPos) || mDirectReadEnabled ? POLLIN : 0) | POLLOUT; low_web_set_poll_events(mLow, this, events); } } @@ -452,12 +468,12 @@ void LowSocket::Write(int pos, unsigned char *data, int len, int callIndex) void LowSocket::Shutdown(int callIndex) { duk_dup(mLow->duk_ctx, callIndex); - if(!mConnected) + if (!mConnected) { low_push_error(mLow, ENOTCONN, "shutdown"); duk_call(mLow->duk_ctx, 1); } - else if(Shutdown() < 0) + else if (Shutdown() < 0) { int err = errno; duk_dup(mLow->duk_ctx, callIndex); @@ -477,13 +493,17 @@ void LowSocket::Shutdown(int callIndex) int LowSocket::Shutdown() { - if(mTLSContext) + if (mTLSContext) { - if(mSSL) - return mbedtls_ssl_close_notify(mSSL); // todo: errnos are wrong + if (mSSL) + { + return mbedtls_ssl_close_notify(mSSL); + } // todo: errnos are wrong } else + { return shutdown(FD(), SHUT_WR); + } } // ----------------------------------------------------------------------------- @@ -492,19 +512,27 @@ int LowSocket::Shutdown() bool LowSocket::Close(int callIndex) { - if(mDestroyed) + if (mDestroyed) + { return true; + } - if(callIndex != -1) + if (callIndex != -1) + { mCloseCallID = low_add_stash(mLow, callIndex); + } mDestroyed = true; - if(mCloseCallID) + if (mCloseCallID) + { low_loop_set_callback(mLow, this); - // for direct + // for direct + } else + { low_web_mark_delete(mLow, this); + } return true; } @@ -514,22 +542,24 @@ bool LowSocket::Close(int callIndex) void LowSocket::KeepAlive(bool enable, int secs) { - if(FD() < 0) + if (FD() < 0) + { return; + } int opt = enable; - if(setsockopt(FD(), SOL_SOCKET, SO_KEEPALIVE, &opt, sizeof(int)) < 0) + if (setsockopt(FD(), SOL_SOCKET, SO_KEEPALIVE, &opt, sizeof(int)) < 0) { low_push_error(mLow, errno, "setsockopt"); duk_throw(mLow->duk_ctx); } - if(secs) + if (secs) { #ifdef __APPLE__ if(setsockopt(FD(), IPPROTO_TCP, TCP_KEEPALIVE, &secs, sizeof(int)) < 0) #else - if(setsockopt(FD(), IPPROTO_TCP, TCP_KEEPIDLE, &secs, sizeof(int)) < 0) + if (setsockopt(FD(), IPPROTO_TCP, TCP_KEEPIDLE, &secs, sizeof(int)) < 0) #endif /* #ifdef __APPLE__ */ { low_push_error(mLow, errno, "setsockopt"); @@ -545,7 +575,7 @@ void LowSocket::KeepAlive(bool enable, int secs) void LowSocket::NoDelay(bool enable) { int opt = enable; - if(setsockopt(FD(), IPPROTO_TCP, TCP_NODELAY, &opt, sizeof(int)) < 0) + if (setsockopt(FD(), IPPROTO_TCP, TCP_NODELAY, &opt, sizeof(int)) < 0) { low_push_error(mLow, errno, "setsockopt"); duk_throw(mLow->duk_ctx); @@ -558,33 +588,37 @@ void LowSocket::NoDelay(bool enable) bool LowSocket::SetDirect(LowSocketDirect *direct, int type, bool fromWebThread) { - if(direct && (mDirect || !mConnected || mReadData || mWriteData)) + if (direct && (mDirect || !mConnected || mReadData || mWriteData)) + { return false; - if(!direct && !mDirect) + } + if (!direct && !mDirect) + { return false; + } - if(!direct && mDirect) + if (!direct && mDirect) { - if(!fromWebThread) + if (!fromWebThread) + { low_web_clear_poll(mLow, this); + } low_free(mReadData); mReadData = NULL; } mDirect = direct; mDirectType = type; - if(mDirect) + if (mDirect) { mDirectReadEnabled = true; mDirect->SetSocket(this); - if(!mDestroyed) - low_web_set_poll_events( - mLow, - this, - mClosed ? 0 - : (POLLIN | (mTLSContext ? POLLOUT : 0) | - (!mConnected || mDirectWriteEnabled ? POLLOUT : 0))); + if (!mDestroyed) + { + low_web_set_poll_events(mLow, this, mClosed ? 0 : (POLLIN | (mTLSContext ? POLLOUT : 0) | + (!mConnected || mDirectWriteEnabled ? POLLOUT : 0))); + } } return true; @@ -606,19 +640,22 @@ LowSocketDirect *LowSocket::GetDirect(int &type) void LowSocket::TriggerDirect(int trigger) { - if(mDestroyed) + if (mDestroyed) + { return; + } - if(trigger & LOWSOCKET_TRIGGER_READ) + if (trigger & LOWSOCKET_TRIGGER_READ) + { mDirectReadEnabled = true; - if(trigger & LOWSOCKET_TRIGGER_WRITE) + } + if (trigger & LOWSOCKET_TRIGGER_WRITE) + { mDirectWriteEnabled = true; + } - short events = - mClosed - ? 0 - : (mDirectReadEnabled ? (POLLIN | (mTLSContext ? POLLOUT : 0)) : 0) | - (!mConnected || mDirectWriteEnabled ? POLLOUT : 0); + short events = mClosed ? 0 : (mDirectReadEnabled ? (POLLIN | (mTLSContext ? POLLOUT : 0)) : 0) | + (!mConnected || mDirectWriteEnabled ? POLLOUT : 0); low_web_set_poll_events(mLow, this, events); } @@ -628,31 +665,32 @@ void LowSocket::TriggerDirect(int trigger) bool LowSocket::OnEvents(short events) { - if((mDestroyed || mAcceptConnectError) && !mCloseCallID) + if ((mDestroyed || mAcceptConnectError) && !mCloseCallID) + { return false; - if(mClosed) + } + if (mClosed) { low_web_set_poll_events(mLow, this, 0); return true; } - while(mTLSContext && mSSL->state != MBEDTLS_SSL_HANDSHAKE_OVER && - (events & (POLLIN | POLLOUT))) + while (mTLSContext && mSSL->state != MBEDTLS_SSL_HANDSHAKE_OVER && (events & (POLLIN | POLLOUT))) { int ret = mbedtls_ssl_handshake_step(mSSL); - if(mSSL->state == MBEDTLS_SSL_HANDSHAKE_OVER) + if (mSSL->state == MBEDTLS_SSL_HANDSHAKE_OVER) { mDirectReadEnabled = mDirect; mDirectWriteEnabled = mDirect; } - else if(ret) + else if (ret) { - if(ret == MBEDTLS_ERR_SSL_WANT_READ) + if (ret == MBEDTLS_ERR_SSL_WANT_READ) { mDirectWriteEnabled = false; mDirectReadEnabled = true; } - else if(ret == MBEDTLS_ERR_SSL_WANT_WRITE) + else if (ret == MBEDTLS_ERR_SSL_WANT_WRITE) { mDirectReadEnabled = false; mDirectWriteEnabled = true; @@ -662,7 +700,7 @@ bool LowSocket::OnEvents(short events) mDirectReadEnabled = false; mDirectWriteEnabled = false; - if(mAcceptConnectCallID) + if (mAcceptConnectCallID) { mAcceptConnectErrno = ret; mAcceptConnectErrnoSSL = true; @@ -671,28 +709,31 @@ bool LowSocket::OnEvents(short events) low_loop_set_callback(mLow, this); } else + { return false; + } low_web_set_poll_events(mLow, this, 0); return true; } - short events = (mDirectReadEnabled ? POLLIN : 0) | - (mDirectWriteEnabled ? POLLOUT : 0); + short events = (mDirectReadEnabled ? POLLIN : 0) | (mDirectWriteEnabled ? POLLOUT : 0); low_web_set_poll_events(mLow, this, events); return true; } } - if(!mConnected) + if (!mConnected) { int error; socklen_t len = sizeof(error); - if(getsockopt(FD(), SOL_SOCKET, SO_ERROR, &error, &len) < 0) + if (getsockopt(FD(), SOL_SOCKET, SO_ERROR, &error, &len) < 0) + { error = errno; - if(error) + } + if (error) { - if(mAcceptConnectCallID) + if (mAcceptConnectCallID) { mAcceptConnectErrno = error; mAcceptConnectErrnoSSL = false; @@ -702,49 +743,58 @@ bool LowSocket::OnEvents(short events) low_loop_set_callback(mLow, this); } else + { return false; + } return true; } - if(mDirect) + if (mDirect) + { mDirect->OnSocketConnected(); + } mConnected = true; - if(mAcceptConnectCallID) + if (mAcceptConnectCallID) + { low_loop_set_callback(mLow, this); + } } - if(!mTLSContext || mSSL->state == MBEDTLS_SSL_HANDSHAKE_OVER) + if (!mTLSContext || mSSL->state == MBEDTLS_SSL_HANDSHAKE_OVER) { - if(mDirect) + if (mDirect) { - if(((events & (POLLIN | POLLHUP | POLLERR)) || mTLSContext) && - mDirectReadEnabled) + if (((events & (POLLIN | POLLHUP | POLLERR)) || mTLSContext) && mDirectReadEnabled) { - if(!mReadData) + if (!mReadData) { - mReadData = (unsigned char *)low_alloc(1024); + mReadData = (unsigned char *) low_alloc(1024); mReadLen = 1024; } - if(mReadData) + if (mReadData) { mDirectReadEnabled = false; // no race conditions - while(true) // required with SSL b/c Read might not always - // be retriggered if SSL still has data + while (true) // required with SSL b/c Read might not always + // be retriggered if SSL still has data { int len = DoRead(); - if(len < 0 && mReadErrno == EAGAIN && !mReadErrnoSSL) + if (len < 0 && mReadErrno == EAGAIN && !mReadErrnoSSL) { mDirectReadEnabled = true; break; } - if(len == 0) + if (len == 0) + { mClosed = true; - if(!mDirect->OnSocketData(mReadData, len)) + } + if (!mDirect->OnSocketData(mReadData, len)) + { break; + } - if(!mTLSContext) + if (!mTLSContext) { mDirectReadEnabled = true; break; @@ -752,38 +802,39 @@ bool LowSocket::OnEvents(short events) } } } - if((events & POLLOUT) && mDirectWriteEnabled) + if ((events & POLLOUT) && mDirectWriteEnabled) { mDirectWriteEnabled = false; // no race conditions - if(mDirect->OnSocketWrite()) + if (mDirect->OnSocketWrite()) + { mDirectWriteEnabled = true; + } } - short events = mClosed ? 0 - : (mDirectReadEnabled ? POLLIN : 0) | - (mDirectWriteEnabled ? POLLOUT : 0); + short events = mClosed ? 0 : (mDirectReadEnabled ? POLLIN : 0) | (mDirectWriteEnabled ? POLLOUT : 0); low_web_set_poll_events(mLow, this, events); } else { bool change = false; - if((events & (POLLIN | POLLHUP | POLLERR)) && mReadData && - !mReadPos) + if ((events & (POLLIN | POLLHUP | POLLERR)) && mReadData && !mReadPos) { int len = DoRead(); - if(len == 0) + if (len == 0) + { mClosed = true; + } - if(len >= 0 || mReadErrno != EAGAIN || mReadErrnoSSL) + if (len >= 0 || mReadErrno != EAGAIN || mReadErrnoSSL) { mReadPos = len; change = true; } } - if((events & POLLOUT) && mWriteData && !mWritePos) + if ((events & POLLOUT) && mWriteData && !mWritePos) { int len = DoWrite(); - if(len >= 0 || mReadErrno != EAGAIN || mReadErrnoSSL) + if (len >= 0 || mReadErrno != EAGAIN || mReadErrnoSSL) { mWritePos = len; change = true; @@ -791,8 +842,10 @@ bool LowSocket::OnEvents(short events) } low_web_set_poll_events(mLow, this, 0); - if(change) + if (change) + { low_loop_set_callback(mLow, this); + } } } @@ -805,9 +858,9 @@ bool LowSocket::OnEvents(short events) bool LowSocket::OnLoop() { - if(mDestroyed) + if (mDestroyed) { - if(mCloseCallID) + if (mCloseCallID) { low_push_stash(mLow, mCloseCallID, true); duk_push_null(mLow->duk_ctx); @@ -816,11 +869,11 @@ bool LowSocket::OnLoop() return false; } - if(mAcceptConnectCallID) + if (mAcceptConnectCallID) { - if(!CallAcceptConnect(mAcceptConnectCallID, true)) + if (!CallAcceptConnect(mAcceptConnectCallID, true)) { - if(mCloseCallID) + if (mCloseCallID) { low_push_stash(mLow, mCloseCallID, true); duk_push_null(mLow->duk_ctx); @@ -829,9 +882,9 @@ bool LowSocket::OnLoop() return false; } } - else if(mAcceptConnectError) + else if (mAcceptConnectError) { - if(mCloseCallID) + if (mCloseCallID) { low_push_stash(mLow, mCloseCallID, true); duk_push_null(mLow->duk_ctx); @@ -840,10 +893,12 @@ bool LowSocket::OnLoop() return false; } - if(mDirect || !mConnected) + if (mDirect || !mConnected) + { return true; + } - if(mReadData && (mClosed || mReadPos)) + if (mReadData && (mClosed || mReadPos)) { mReadData = NULL; @@ -851,7 +906,7 @@ bool LowSocket::OnLoop() mReadCallID = 0; low_push_stash(mLow, callID, true); - if(mReadPos >= 0) + if (mReadPos >= 0) { duk_push_null(mLow->duk_ctx); duk_push_int(mLow->duk_ctx, mReadPos); @@ -863,7 +918,7 @@ bool LowSocket::OnLoop() duk_call(mLow->duk_ctx, 1); } } - if(mWriteData && mWritePos) + if (mWriteData && mWritePos) { mWriteData = NULL; @@ -871,7 +926,7 @@ bool LowSocket::OnLoop() mWriteCallID = 0; low_push_stash(mLow, callID, true); - if(mWritePos > 0) + if (mWritePos > 0) { duk_push_null(mLow->duk_ctx); duk_push_int(mLow->duk_ctx, mWritePos); @@ -884,8 +939,7 @@ bool LowSocket::OnLoop() } } - short events = - mClosed ? 0 : (mReadData ? POLLIN : 0) | (mWriteData ? POLLOUT : 0); + short events = mClosed ? 0 : (mReadData ? POLLIN : 0) | (mWriteData ? POLLOUT : 0); low_web_set_poll_events(mLow, this, events); return true; } @@ -901,20 +955,20 @@ bool LowSocket::CallAcceptConnect(int callIndex, bool onStash) mAcceptConnectCallID = 0; - if(!mAcceptConnectError && mNodeFamily) + if (!mAcceptConnectError && mNodeFamily) { - if(mNodeFamily == 4) + if (mNodeFamily == 4) { sockaddr_in localAddr; socklen_t localAddrLen = sizeof(localAddr); - if(getsockname(FD(), (sockaddr *)&localAddr, &localAddrLen) < 0) + if (getsockname(FD(), (sockaddr * ) & localAddr, &localAddrLen) < 0) { mAcceptConnectErrno = errno; mAcceptConnectErrnoSSL = false; mAcceptConnectError = true; mAcceptConnectSyscall = "getsockname"; } - unsigned char *ip = (unsigned char *)&localAddr.sin_addr.s_addr; + unsigned char *ip = (unsigned char *) &localAddr.sin_addr.s_addr; sprintf(localHost, "%u.%u.%u.%u", ip[0], ip[1], ip[2], ip[3]); localPort = ntohs(localAddr.sin_port); } @@ -922,11 +976,8 @@ bool LowSocket::CallAcceptConnect(int callIndex, bool onStash) { sockaddr_in6 localAddr; socklen_t localAddrLen = sizeof(localAddr); - if(getsockname(FD(), (sockaddr *)&localAddr, &localAddrLen) < 0 || - inet_ntop(AF_INET6, - localAddr.sin6_addr.s6_addr, - localHost, - sizeof(localHost)) == NULL) + if (getsockname(FD(), (sockaddr * ) & localAddr, &localAddrLen) < 0 || + inet_ntop(AF_INET6, localAddr.sin6_addr.s6_addr, localHost, sizeof(localHost)) == NULL) { mAcceptConnectErrno = errno; mAcceptConnectErrnoSSL = false; @@ -937,29 +988,37 @@ bool LowSocket::CallAcceptConnect(int callIndex, bool onStash) } } - if(mAcceptConnectError) + if (mAcceptConnectError) { - if(onStash) + if (onStash) + { low_push_stash(mLow, callIndex, mType == LOWSOCKET_TYPE_CONNECTED); + } else + { duk_dup(mLow->duk_ctx, callIndex); + } PushError(2); duk_call(mLow->duk_ctx, 1); return false; } - else if(mConnected) + else if (mConnected) { AdvertiseFD(); - if(onStash) + if (onStash) + { low_push_stash(mLow, callIndex, mType == LOWSOCKET_TYPE_CONNECTED); + } else + { duk_dup(mLow->duk_ctx, callIndex); + } duk_push_null(mLow->duk_ctx); duk_push_int(mLow->duk_ctx, FD()); duk_push_int(mLow->duk_ctx, mNodeFamily); - if(mNodeFamily) + if (mNodeFamily) { duk_push_string(mLow->duk_ctx, localHost); duk_push_int(mLow->duk_ctx, localPort); @@ -968,7 +1027,9 @@ bool LowSocket::CallAcceptConnect(int callIndex, bool onStash) duk_call(mLow->duk_ctx, 7); } else + { duk_call(mLow->duk_ctx, 3); + } } return true; @@ -981,22 +1042,23 @@ bool LowSocket::CallAcceptConnect(int callIndex, bool onStash) int LowSocket::DoRead() { int len = 0; - while(len != mReadLen) + while (len != mReadLen) { - int size = mTLSContext - ? mbedtls_ssl_read(mSSL, mReadData + len, mReadLen - len) -#if LOW_ESP32_LWIP_SPECIALITIES - : lwip_read(FD(), mReadData + len, mReadLen - len); -#else - : read(FD(), mReadData + len, mReadLen - len); + int size = mTLSContext ? mbedtls_ssl_read(mSSL, mReadData + len, mReadLen - len) + #if LOW_ESP32_LWIP_SPECIALITIES + : lwip_read(FD(), mReadData + len, mReadLen - len); + #else + : read(FD(), mReadData + len, mReadLen - len); #endif /* LOW_ESP32_LWIP_SPECIALITIES */ - if(size < 0) + if (size < 0) { - if(mTLSContext) + if (mTLSContext) { - if(size == MBEDTLS_ERR_SSL_PEER_CLOSE_NOTIFY) + if (size == MBEDTLS_ERR_SSL_PEER_CLOSE_NOTIFY) + { return len; - if(size == MBEDTLS_ERR_SSL_WANT_READ) + } + if (size == MBEDTLS_ERR_SSL_WANT_READ) { mReadErrno = EAGAIN; mReadErrnoSSL = false; @@ -1014,10 +1076,14 @@ int LowSocket::DoRead() } return len ? len : -1; } - else if(size == 0) + else if (size == 0) + { return len; + } else + { len += size; + } } return len; } @@ -1029,21 +1095,19 @@ int LowSocket::DoRead() int LowSocket::DoWrite() { int len = 0; - while(len != mWriteLen) + while (len != mWriteLen) { - int size = - mTLSContext - ? mbedtls_ssl_write(mSSL, mWriteData + len, mWriteLen - len) -#if LOW_ESP32_LWIP_SPECIALITIES - : ::lwip_write(FD(), mWriteData + len, mWriteLen - len); -#else - : ::write(FD(), mWriteData + len, mWriteLen - len); + int size = mTLSContext ? mbedtls_ssl_write(mSSL, mWriteData + len, mWriteLen - len) + #if LOW_ESP32_LWIP_SPECIALITIES + : ::lwip_write(FD(), mWriteData + len, mWriteLen - len); + #else + : ::write(FD(), mWriteData + len, mWriteLen - len); #endif /* LOW_ESP32_LWIP_SPECIALITIES */ - if(size < 0) + if (size < 0) { - if(mTLSContext) + if (mTLSContext) { - if(size == MBEDTLS_ERR_SSL_WANT_WRITE) + if (size == MBEDTLS_ERR_SSL_WANT_WRITE) { mWriteErrno = EAGAIN; mWriteErrnoSSL = false; @@ -1061,10 +1125,14 @@ int LowSocket::DoWrite() } return len ? len : -1; } - else if(size == 0) + else if (size == 0) + { return len; + } else + { len += size; + } } return len; } @@ -1076,16 +1144,18 @@ int LowSocket::DoWrite() int LowSocket::write(const unsigned char *data, int len) { - if(!len) + if (!len) + { return 0; + } int size; - if(mTLSContext) + if (mTLSContext) { size = mbedtls_ssl_write(mSSL, data, len); - if(size < 0) + if (size < 0) { - if(size == MBEDTLS_ERR_SSL_WANT_WRITE) + if (size == MBEDTLS_ERR_SSL_WANT_WRITE) { errno = EAGAIN; // because we are checking this in LowHTTPDirect mWriteErrno = EAGAIN; @@ -1107,7 +1177,7 @@ int LowSocket::write(const unsigned char *data, int len) #else size = ::write(FD(), data, len); #endif /* LOW_ESP32_LWIP_SPECIALITIES */ - if(size < 0) + if (size < 0) { mWriteErrno = errno; mWriteErrnoSSL = true; @@ -1123,17 +1193,18 @@ int LowSocket::write(const unsigned char *data, int len) int LowSocket::writev(const struct iovec *iov, int iovcnt) { - if(!iovcnt) + if (!iovcnt) + { return 0; + } int size; - if(mTLSContext) + if (mTLSContext) { - size = - mbedtls_ssl_write(mSSL, (unsigned char *)iov->iov_base, iov->iov_len); - if(size < 0) + size = mbedtls_ssl_write(mSSL, (unsigned char *) iov->iov_base, iov->iov_len); + if (size < 0) { - if(size == MBEDTLS_ERR_SSL_WANT_WRITE) + if (size == MBEDTLS_ERR_SSL_WANT_WRITE) { errno = EAGAIN; // because we are checking this in LowHTTPDirect mWriteErrno = EAGAIN; @@ -1156,7 +1227,7 @@ int LowSocket::writev(const struct iovec *iov, int iovcnt) size = ::writev(FD(), iov, iovcnt); #endif /* #if LOW_ESP32_LWIP_SPECIALITIES */ - if(size < 0) + if (size < 0) { mWriteErrno = errno; mWriteErrnoSSL = true; @@ -1171,7 +1242,7 @@ int LowSocket::writev(const struct iovec *iov, int iovcnt) void LowSocket::SetError(bool write, int error, bool ssl) { - if(write) + if (write) { mWriteErrno = error; mWriteErrnoSSL = ssl; @@ -1193,7 +1264,7 @@ void LowSocket::PushError(int call) bool ssl; const char *syscall; - switch(call) + switch (call) { case 0: error = mReadErrno; @@ -1214,7 +1285,7 @@ void LowSocket::PushError(int call) break; } - if(error && ssl) + if (error && ssl) { char code[32], message[256]; mbedtls_strerror(error, message, sizeof(message)); @@ -1230,5 +1301,7 @@ void LowSocket::PushError(int call) duk_put_prop_string(mLow->duk_ctx, -2, "syscall"); } else + { low_push_error(mLow, error, syscall); + } } diff --git a/src/LowSocket.h b/src/LowSocket.h index 4c015a5..d75d2ff 100644 --- a/src/LowSocket.h +++ b/src/LowSocket.h @@ -15,9 +15,7 @@ enum LowSocketType { - LOWSOCKET_TYPE_STDINOUT, - LOWSOCKET_TYPE_ACCEPTED, - LOWSOCKET_TYPE_CONNECTED + LOWSOCKET_TYPE_STDINOUT, LOWSOCKET_TYPE_ACCEPTED, LOWSOCKET_TYPE_CONNECTED }; const int LOWSOCKET_TRIGGER_READ = 1; @@ -26,93 +24,88 @@ const int LOWSOCKET_TRIGGER_WRITE = 2; struct low_main_t; class LowSocketDirect; -class LowSocket - : public LowFD - , public LowLoopCallback + +class LowSocket : public LowFD, public LowLoopCallback { - public: - LowSocket(low_main_t *low, int fd); // LOWSOCKET_TYPE_STDINOUT - LowSocket(low_main_t *low, - int fd, - struct sockaddr *remoteAddr, - int acceptCallID, - LowSocketDirect *direct, - int directType, - LowTLSContext *tlsContext, - bool clearOnReset = true); // LOWSOCKET_TYPE_ACCEPTED - LowSocket(low_main_t *low, - LowSocketDirect *direct, - int directType, - LowTLSContext *tlsContext, - bool clearOnReset = true); // LOWSOCKET_TYPE_CONNECTED - virtual ~LowSocket(); - - bool Connect(struct sockaddr *remoteAddr, - int remoteAddrLen, - int callIndex, - int &err, - const char *&syscall); - - void Read(int pos, unsigned char *data, int len, int callIndex); - void Write(int pos, unsigned char *data, int len, int callIndex); - void Shutdown(int callIndex); // JS version - int Shutdown(); - bool Close(int callIndex = -1); - - void KeepAlive(bool enable, int secs); - void NoDelay(bool enable); - - bool SetDirect(LowSocketDirect *direct, - int type, - bool fromWebThread = false); - LowSocketDirect *GetDirect(int &type); - void TriggerDirect(int trigger); - - // for direct - int write(const unsigned char *data, int len); - int writev(const struct iovec *iov, int iovcnt); - - void SetError(bool write, int error, bool ssl); - void PushError(int call); - - bool IsConnected() { return mConnected; } - - protected: - virtual bool OnEvents(short events); - virtual bool OnLoop(); - - bool InitSocket(struct sockaddr *remoteAddr); - bool CallAcceptConnect(int callIndex, bool onStash); - - int DoRead(); - int DoWrite(); - - private: - low_main_t *mLow; - LowSocketType mType; - short mLastEvents; - - int mNodeFamily; - char mRemoteHost[INET6_ADDRSTRLEN]; - int mRemotePort; - - int mAcceptConnectCallID, mAcceptConnectErrno, mCloseCallID; - bool mAcceptConnectError, mAcceptConnectErrnoSSL, mConnected, mClosed, - mDestroyed; - const char *mAcceptConnectSyscall; - - unsigned char *mReadData, *mWriteData; - int mReadLen, mReadCallID, mReadPos, mReadErrno; - int mWriteLen, mWriteCallID, mWritePos, mWriteErrno; - bool mReadErrnoSSL, mWriteErrnoSSL; - - LowSocketDirect *mDirect; - int mDirectType; - bool mDirectReadEnabled, mDirectWriteEnabled; - - LowTLSContext *mTLSContext; - mbedtls_ssl_context *mSSL; - bool mSSLWantRead, mSSLWantWrite; +public: + LowSocket(low_main_t *low, int fd); // LOWSOCKET_TYPE_STDINOUT + LowSocket(low_main_t *low, int fd, struct sockaddr *remoteAddr, int acceptCallID, LowSocketDirect *direct, + int directType, LowTLSContext *tlsContext, bool clearOnReset = true); // LOWSOCKET_TYPE_ACCEPTED + LowSocket(low_main_t *low, LowSocketDirect *direct, int directType, LowTLSContext *tlsContext, + bool clearOnReset = true); // LOWSOCKET_TYPE_CONNECTED + virtual ~LowSocket(); + + bool Connect(struct sockaddr *remoteAddr, int remoteAddrLen, int callIndex, int &err, const char *&syscall); + + void Read(int pos, unsigned char *data, int len, int callIndex); + + void Write(int pos, unsigned char *data, int len, int callIndex); + + void Shutdown(int callIndex); // JS version + int Shutdown(); + + bool Close(int callIndex = -1); + + void KeepAlive(bool enable, int secs); + + void NoDelay(bool enable); + + bool SetDirect(LowSocketDirect *direct, int type, bool fromWebThread = false); + + LowSocketDirect *GetDirect(int &type); + + void TriggerDirect(int trigger); + + // for direct + int write(const unsigned char *data, int len); + + int writev(const struct iovec *iov, int iovcnt); + + void SetError(bool write, int error, bool ssl); + + void PushError(int call); + + bool IsConnected() + { return mConnected; } + +protected: + virtual bool OnEvents(short events); + + virtual bool OnLoop(); + + bool InitSocket(struct sockaddr *remoteAddr); + + bool CallAcceptConnect(int callIndex, bool onStash); + + int DoRead(); + + int DoWrite(); + +private: + low_main_t *mLow; + LowSocketType mType; + short mLastEvents; + + int mNodeFamily; + char mRemoteHost[INET6_ADDRSTRLEN]; + int mRemotePort; + + int mAcceptConnectCallID, mAcceptConnectErrno, mCloseCallID; + bool mAcceptConnectError, mAcceptConnectErrnoSSL, mConnected, mClosed, mDestroyed; + const char *mAcceptConnectSyscall; + + unsigned char *mReadData, *mWriteData; + int mReadLen, mReadCallID, mReadPos, mReadErrno; + int mWriteLen, mWriteCallID, mWritePos, mWriteErrno; + bool mReadErrnoSSL, mWriteErrnoSSL; + + LowSocketDirect *mDirect; + int mDirectType; + bool mDirectReadEnabled, mDirectWriteEnabled; + + LowTLSContext *mTLSContext; + mbedtls_ssl_context *mSSL; + bool mSSLWantRead, mSSLWantWrite; }; #endif /* __LOWSOCKET_H__ */ \ No newline at end of file diff --git a/src/LowSocketDirect.h b/src/LowSocketDirect.h index c019107..7f7b873 100644 --- a/src/LowSocketDirect.h +++ b/src/LowSocketDirect.h @@ -6,18 +6,23 @@ #define __LOWSOCKETDIRECT_H__ class LowSocket; + class LowSocketDirect { - friend class LowSocket; + friend class LowSocket; protected: - virtual ~LowSocketDirect() {} + virtual ~LowSocketDirect() + {} + + virtual void SetSocket(LowSocket *socket) = 0; + + virtual void OnSocketConnected() + {} - virtual void SetSocket(LowSocket *socket) = 0; + virtual bool OnSocketData(unsigned char *data, int len) = 0; - virtual void OnSocketConnected() {} - virtual bool OnSocketData(unsigned char *data, int len) = 0; - virtual bool OnSocketWrite() = 0; + virtual bool OnSocketWrite() = 0; }; #endif /* __LOWSOCKETDIRECT_H__ */ \ No newline at end of file diff --git a/src/LowTLSContext.cpp b/src/LowTLSContext.cpp index 92b419a..3cfd291 100644 --- a/src/LowTLSContext.cpp +++ b/src/LowTLSContext.cpp @@ -13,16 +13,15 @@ // LowTLSContext::LowTLSContext // ----------------------------------------------------------------------------- -static void my_debug(void *ctx, int level, const char *file, int line, - const char *str) +static void my_debug(void *ctx, int level, const char *file, int line, const char *str) { const char *p, *basename; - (void)ctx; + (void) ctx; /* Extract basename from file */ - for(p = basename = file; *p != '\0'; p++) + for (p = basename = file; *p != '\0'; p++) { - if(*p == '/' || *p == '\\') + if (*p == '/' || *p == '\\') { basename = p + 1; } @@ -31,25 +30,24 @@ static void my_debug(void *ctx, int level, const char *file, int line, printf("%s:%04d: |%d| %s", basename, line, level, str); } -LowTLSContext::LowTLSContext(low_main_t *low, const char *cert, int certLen, - const char *key, int keyLen, const char *ca, - int caLen, bool isServer) - : mLow(low), mIsOK(false), mHasCert(false), mHasCA(false), mRef(1), - mIndex(-1) +LowTLSContext::LowTLSContext(low_main_t *low, const char *cert, int certLen, const char *key, int keyLen, + const char *ca, int caLen, bool isServer) : mLow(low), mIsOK(false), mHasCert(false), + mHasCA(false), mRef(1), mIndex(-1) { int ret; - if(!cert || !key) + if (!cert || !key) + { cert = key = NULL; + } mbedtls_ssl_config_init(&conf); mbedtls_entropy_init(&entropy); mbedtls_ctr_drbg_init(&ctr_drbg); - ret = mbedtls_ssl_config_defaults( - &conf, isServer ? MBEDTLS_SSL_IS_SERVER : MBEDTLS_SSL_IS_CLIENT, - MBEDTLS_SSL_TRANSPORT_STREAM, MBEDTLS_SSL_PRESET_DEFAULT); - if(ret != 0) + ret = mbedtls_ssl_config_defaults(&conf, isServer ? MBEDTLS_SSL_IS_SERVER : MBEDTLS_SSL_IS_CLIENT, + MBEDTLS_SSL_TRANSPORT_STREAM, MBEDTLS_SSL_PRESET_DEFAULT); + if (ret != 0) { printf(" failed ! mbedtls_ssl_config_defaults returned %d", ret); return; @@ -59,9 +57,8 @@ LowTLSContext::LowTLSContext(low_main_t *low, const char *cert, int certLen, // mbedtls_debug_set_threshold(1); const char *pers = "low.js"; - ret = mbedtls_ctr_drbg_seed(&ctr_drbg, mbedtls_entropy_func, &entropy, - (const unsigned char *)pers, strlen(pers)); - if(ret != 0) + ret = mbedtls_ctr_drbg_seed(&ctr_drbg, mbedtls_entropy_func, &entropy, (const unsigned char *) pers, strlen(pers)); + if (ret != 0) { printf(" failed ! mbedtls_ctr_drbg_seed returned %d", ret); return; @@ -69,38 +66,37 @@ LowTLSContext::LowTLSContext(low_main_t *low, const char *cert, int certLen, mbedtls_ssl_conf_rng(&conf, mbedtls_ctr_drbg_random, &ctr_drbg); - if(cert || ca) + if (cert || ca) + { mbedtls_x509_crt_init(&srvcert); - if(cert) + } + if (cert) { mHasCert = true; mbedtls_pk_init(&pkey); - ret = mbedtls_x509_crt_parse(&srvcert, (unsigned char *)cert, certLen); - if(ret != 0) + ret = mbedtls_x509_crt_parse(&srvcert, (unsigned char *) cert, certLen); + if (ret != 0) { - printf(" failed ! mbedtls_x509_crt_parse for cert returned %d", - ret); + printf(" failed ! mbedtls_x509_crt_parse for cert returned %d", ret); return; } - ret = - mbedtls_pk_parse_key(&pkey, (unsigned char *)key, keyLen, NULL, 0); - if(ret != 0) + ret = mbedtls_pk_parse_key(&pkey, (unsigned char *) key, keyLen, NULL, 0); + if (ret != 0) { printf(" failed ! mbedtls_pk_parse_key returned %d", ret); return; } } - if(ca) + if (ca) { mHasCA = true; - ret = mbedtls_x509_crt_parse(&srvcert, (unsigned char *)ca, caLen); - if(ret != 0) + ret = mbedtls_x509_crt_parse(&srvcert, (unsigned char *) ca, caLen); + if (ret != 0) { - printf(" failed ! mbedtls_x509_crt_parse for ca returned %d", - ret); + printf(" failed ! mbedtls_x509_crt_parse for ca returned %d", ret); return; } @@ -112,10 +108,10 @@ LowTLSContext::LowTLSContext(low_main_t *low, const char *cert, int certLen, mbedtls_ssl_conf_authmode(&conf, MBEDTLS_SSL_VERIFY_NONE); } - if(cert) + if (cert) { ret = mbedtls_ssl_conf_own_cert(&conf, &srvcert, &pkey); - if(ret != 0) + if (ret != 0) { printf(" failed ! mbedtls_ssl_conf_own_cert returned %d", ret); return; @@ -131,19 +127,24 @@ LowTLSContext::LowTLSContext(low_main_t *low, const char *cert, int certLen, LowTLSContext::~LowTLSContext() { - if(mIndex >= 0) + if (mIndex >= 0) { - if(mIndex >= mLow->tlsContexts.size() || - mLow->tlsContexts[mIndex] != this) + if (mIndex >= mLow->tlsContexts.size() || mLow->tlsContexts[mIndex] != this) + { printf("assertion error at lowtlscontext\n"); + } mLow->tlsContexts[mIndex] = NULL; } - if(mHasCA || mHasCert) + if (mHasCA || mHasCert) + { mbedtls_x509_crt_free(&srvcert); - if(mHasCert) + } + if (mHasCert) + { mbedtls_pk_free(&pkey); + } mbedtls_ssl_config_free(&conf); mbedtls_ctr_drbg_free(&ctr_drbg); mbedtls_entropy_free(&entropy); @@ -167,13 +168,15 @@ void LowTLSContext::AddRef() void LowTLSContext::DecRef() { pthread_mutex_lock(&mLow->ref_mutex); - if(!--mRef) + if (!--mRef) { pthread_mutex_unlock(&mLow->ref_mutex); delete this; return; } - if(mRef < 0) + if (mRef < 0) + { printf("assertion error 2 at lowtlscontext\n"); + } pthread_mutex_unlock(&mLow->ref_mutex); } \ No newline at end of file diff --git a/src/LowTLSContext.h b/src/LowTLSContext.h index 7a835a2..c282b54 100644 --- a/src/LowTLSContext.h +++ b/src/LowTLSContext.h @@ -1,4 +1,3 @@ - // ----------------------------------------------------------------------------- // LowTLSContext.h // ----------------------------------------------------------------------------- @@ -20,37 +19,37 @@ using namespace std; class LowTLSContext { - public: - LowTLSContext(low_main_t *low, - const char *cert = NULL, - int certLen = 0, - const char *key = NULL, - int keyLen = 0, - const char *ca = NULL, - int caLen = 0, - bool isServer = false); - ~LowTLSContext(); - - bool IsOK() { return mIsOK; } - - void SetIndex(int index) { mIndex = index; } - void AddRef(); - void DecRef(); - - mbedtls_ssl_config &GetSSLConfig() { return conf; } - - private: - low_main_t *mLow; - int mRef; - int mIndex; - - mbedtls_entropy_context entropy; - mbedtls_ctr_drbg_context ctr_drbg; - mbedtls_ssl_config conf; - mbedtls_x509_crt srvcert; - mbedtls_pk_context pkey; - - bool mIsOK, mHasCert, mHasCA; +public: + LowTLSContext(low_main_t *low, const char *cert = NULL, int certLen = 0, const char *key = NULL, int keyLen = 0, + const char *ca = NULL, int caLen = 0, bool isServer = false); + + ~LowTLSContext(); + + bool IsOK() + { return mIsOK; } + + void SetIndex(int index) + { mIndex = index; } + + void AddRef(); + + void DecRef(); + + mbedtls_ssl_config &GetSSLConfig() + { return conf; } + +private: + low_main_t *mLow; + int mRef; + int mIndex; + + mbedtls_entropy_context entropy; + mbedtls_ctr_drbg_context ctr_drbg; + mbedtls_ssl_config conf; + mbedtls_x509_crt srvcert; + mbedtls_pk_context pkey; + + bool mIsOK, mHasCert, mHasCA; }; #endif /* __LOWTLSCONTEXT_H__ */ \ No newline at end of file diff --git a/src/low_alloc.cpp b/src/low_alloc.cpp index 238817f..6bcdd65 100644 --- a/src/low_alloc.cpp +++ b/src/low_alloc.cpp @@ -25,14 +25,18 @@ void *operator new(size_t size, low_new_ident ident) noexcept char *low_strdup(const char *str) { int len = str ? strlen(str) : 0; - char *dup = (char *)low_alloc(len + 1); + char *dup = (char *) low_alloc(len + 1); - if(dup) + if (dup) { - if(len) + if (len) + { memcpy(dup, str, len + 1); + } else + { *dup = '\0'; + } } return dup; diff --git a/src/low_alloc.h b/src/low_alloc.h index cd778bf..8cb69a5 100644 --- a/src/low_alloc.h +++ b/src/low_alloc.h @@ -30,12 +30,17 @@ extern "C" extern "C" { #endif /* __cplusplus */ - void *low_alloc(size_t size); - void *low_calloc(size_t num, size_t size); - void *low_realloc(void *ptr, size_t size); - void low_free(void *ptr); - char *low_strdup(const char *str); +void *low_alloc(size_t size); + +void *low_calloc(size_t num, size_t size); + +void *low_realloc(void *ptr, size_t size); + +void low_free(void *ptr); + +char *low_strdup(const char *str); + #ifdef __cplusplus } #endif /* __cplusplus */ diff --git a/src/low_crypto.cpp b/src/low_crypto.cpp index 83b33db..e520e90 100644 --- a/src/low_crypto.cpp +++ b/src/low_crypto.cpp @@ -19,42 +19,51 @@ duk_ret_t low_crypto_create_hash(duk_context *ctx) const char *type = duk_require_string(ctx, 1); int len = strlen(type); - char *typeUpper = (char *)low_alloc(len + 1); - if(!typeUpper) + char *typeUpper = (char *) low_alloc(len + 1); + if (!typeUpper) + { duk_generic_error(low->duk_ctx, "memory full"); - for(int i = 0; i < len; i++) - typeUpper[i] = toupper((unsigned)type[i]); + } + for (int i = 0; i < len; i++) + { + typeUpper[i] = toupper((unsigned) type[i]); + } typeUpper[len] = 0; const mbedtls_md_info_t *info = mbedtls_md_info_from_string(typeUpper); low_free(typeUpper); - if(!info) - duk_reference_error( - low->duk_ctx, "unsupported hashing algorithm %s!", type); + if (!info) + { + duk_reference_error(low->duk_ctx, "unsupported hashing algorithm %s!", type); + } unsigned char *key = NULL; duk_size_t key_len; - if(!duk_is_undefined(ctx, 2)) + if (!duk_is_undefined(ctx, 2)) { - key = (unsigned char *)duk_get_buffer_data(ctx, 2, &key_len); - if(!key) + key = (unsigned char *) duk_get_buffer_data(ctx, 2, &key_len); + if (!key) { - key = (unsigned char *)duk_require_string(ctx, 2); - key_len = strlen((char *)key); + key = (unsigned char *) duk_require_string(ctx, 2); + key_len = strlen((char *) key); } } LowCryptoHash *hash = new(low_new) LowCryptoHash(low, info, key, key_len); int index; - for(index = 0; index < low->cryptoHashes.size(); index++) - if(!low->cryptoHashes[index]) + for (index = 0; index < low->cryptoHashes.size(); index++) + { + if (!low->cryptoHashes[index]) { low->cryptoHashes[index] = hash; break; } - if(index == low->cryptoHashes.size()) + } + if (index == low->cryptoHashes.size()) + { low->cryptoHashes.push_back(hash); + } hash->SetIndex(index); duk_push_int(low->duk_ctx, index); @@ -73,8 +82,10 @@ duk_ret_t low_crypto_hash_finalizer(duk_context *ctx) low_main_t *low = duk_get_low_context(ctx); int index = duk_require_int(ctx, 0); - if(index < 0 || index >= low->cryptoHashes.size()) + if (index < 0 || index >= low->cryptoHashes.size()) + { duk_reference_error(ctx, "crypto hash not found"); + } delete low->cryptoHashes[index]; return 0; @@ -90,13 +101,15 @@ duk_ret_t low_crypto_hash_update(duk_context *ctx) low_main_t *low = duk_get_low_context(ctx); int index = duk_require_int(ctx, 0); - if(index < 0 || index >= low->cryptoHashes.size()) + if (index < 0 || index >= low->cryptoHashes.size()) + { duk_reference_error(ctx, "crypto hash not found"); + } duk_size_t len; auto buffer = duk_require_buffer_data(ctx, 1, &len); - low->cryptoHashes[index]->Update((unsigned char *)buffer, len); + low->cryptoHashes[index]->Update((unsigned char *) buffer, len); return 0; } @@ -110,13 +123,15 @@ duk_ret_t low_crypto_hash_digest(duk_context *ctx) low_main_t *low = duk_get_low_context(ctx); int index = duk_require_int(ctx, 0); - if(index < 0 || index >= low->cryptoHashes.size()) + if (index < 0 || index >= low->cryptoHashes.size()) + { duk_reference_error(ctx, "crypto hash not found"); + } int len = low->cryptoHashes[index]->OutputSize(); auto buffer = duk_push_fixed_buffer(ctx, len); - low->cryptoHashes[index]->Digest((unsigned char *)buffer, len); + low->cryptoHashes[index]->Digest((unsigned char *) buffer, len); duk_push_buffer_object(ctx, -1, 0, len, DUK_BUFOBJ_NODEJS_BUFFER); return 1; diff --git a/src/low_crypto.h b/src/low_crypto.h index 0a8a836..e9d14a0 100644 --- a/src/low_crypto.h +++ b/src/low_crypto.h @@ -8,9 +8,11 @@ #include "duktape.h" duk_ret_t low_crypto_create_hash(duk_context *ctx); + duk_ret_t low_crypto_hash_finalizer(duk_context *ctx); duk_ret_t low_crypto_hash_update(duk_context *ctx); + duk_ret_t low_crypto_hash_digest(duk_context *ctx); #endif /* __LOW_CRYPTO_H__ */ \ No newline at end of file diff --git a/src/low_data_thread.cpp b/src/low_data_thread.cpp index c526dd0..3dee4d6 100644 --- a/src/low_data_thread.cpp +++ b/src/low_data_thread.cpp @@ -13,64 +13,71 @@ void *low_data_thread_main(void *arg) { - low_main_t *low = (low_main_t *)arg; + low_main_t *low = (low_main_t *) arg; #if LOW_ESP32_LWIP_SPECIALITIES while(true) { #endif /* LOW_ESP32_LWIP_SPECIALITIES */ - pthread_mutex_lock(&low->data_thread_mutex); - while(true) + pthread_mutex_lock(&low->data_thread_mutex); + while (true) + { +start: + if (low->destroying) + { + break; + } + + for (int priority = 0; priority < 2; priority++) { - start: - if(low->destroying) - break; + if (low->data_callback_first[priority] && !low->destroying) + { + LowDataCallback *callback = low->data_callback_first[priority]; - for(int priority = 0; priority < 2; priority++) - if(low->data_callback_first[priority] && !low->destroying) + low->data_callback_first[priority] = callback->mNext; + if (!low->data_callback_first[priority]) { - LowDataCallback *callback = - low->data_callback_first[priority]; + low->data_callback_last[priority] = NULL; + } + callback->mNext = NULL; - low->data_callback_first[priority] = callback->mNext; - if(!low->data_callback_first[priority]) - low->data_callback_last[priority] = NULL; - callback->mNext = NULL; + pthread_mutex_unlock(&low->data_thread_mutex); + if (!callback->OnData()) + { + pthread_mutex_lock(&low->data_thread_mutex); + low->data_thread_done = true; + pthread_cond_broadcast(&low->data_thread_done_cond); pthread_mutex_unlock(&low->data_thread_mutex); - if(!callback->OnData()) - { - pthread_mutex_lock(&low->data_thread_mutex); - low->data_thread_done = true; - pthread_cond_broadcast(&low->data_thread_done_cond); - pthread_mutex_unlock(&low->data_thread_mutex); - - delete callback; - } - - pthread_mutex_lock(&low->data_thread_mutex); - low->data_thread_done = false; - goto start; + delete callback; } - if(low->destroying) - break; - - low->data_thread_done = true; - pthread_cond_broadcast(&low->data_thread_done_cond); - pthread_cond_wait(&low->data_thread_cond, &low->data_thread_mutex); - low->data_thread_done = false; + pthread_mutex_lock(&low->data_thread_mutex); + low->data_thread_done = false; + goto start; + } + } + if (low->destroying) + { + break; } + low->data_thread_done = true; pthread_cond_broadcast(&low->data_thread_done_cond); -#if LOW_ESP32_LWIP_SPECIALITIES - while(low->destroying) - pthread_cond_wait(&low->data_thread_cond, &low->data_thread_mutex); - pthread_mutex_unlock(&low->data_thread_mutex); + pthread_cond_wait(&low->data_thread_cond, &low->data_thread_mutex); + low->data_thread_done = false; } + low->data_thread_done = true; + pthread_cond_broadcast(&low->data_thread_done_cond); + +#if LOW_ESP32_LWIP_SPECIALITIES + while(low->destroying) + pthread_cond_wait(&low->data_thread_cond, &low->data_thread_mutex); + pthread_mutex_unlock(&low->data_thread_mutex); +} #endif /* LOW_ESP32_LWIP_SPECIALITIES */ pthread_mutex_unlock(&low->data_thread_mutex); @@ -81,21 +88,23 @@ void *low_data_thread_main(void *arg) // low_data_set_callback // ----------------------------------------------------------------------------- -void low_data_set_callback(low_main_t *low, LowDataCallback *callback, - int priority) +void low_data_set_callback(low_main_t *low, LowDataCallback *callback, int priority) { pthread_mutex_lock(&low->data_thread_mutex); - if(callback->mNext || low->data_callback_last[0] == callback || - low->data_callback_last[1] == callback) + if (callback->mNext || low->data_callback_last[0] == callback || low->data_callback_last[1] == callback) { pthread_mutex_unlock(&low->data_thread_mutex); return; } - if(low->data_callback_last[priority]) + if (low->data_callback_last[priority]) + { low->data_callback_last[priority]->mNext = callback; + } else + { low->data_callback_first[priority] = callback; + } low->data_callback_last[priority] = callback; pthread_cond_broadcast(&low->data_thread_cond); @@ -109,43 +118,54 @@ void low_data_set_callback(low_main_t *low, LowDataCallback *callback, void low_data_clear_callback(low_main_t *low, LowDataCallback *callback) { pthread_mutex_lock(&low->data_thread_mutex); - if(low->data_callback_first[0] == callback) + if (low->data_callback_first[0] == callback) { LowDataCallback *elem = low->data_callback_first[0]; low->data_callback_first[0] = elem->mNext; - if(!low->data_callback_first[0]) + if (!low->data_callback_first[0]) + { low->data_callback_last[0] = NULL; + } } - else if(low->data_callback_first[1] == callback) + else if (low->data_callback_first[1] == callback) { LowDataCallback *elem = low->data_callback_first[1]; low->data_callback_first[1] = elem->mNext; - if(!low->data_callback_first[1]) + if (!low->data_callback_first[1]) + { low->data_callback_last[1] = NULL; + } } - else if(callback->mNext || low->data_callback_last[0] == callback || - low->data_callback_last[1] == callback) + else if (callback->mNext || low->data_callback_last[0] == callback || low->data_callback_last[1] == callback) { - for(int priority = 0; priority < 2; priority++) + for (int priority = 0; priority < 2; priority++) { LowDataCallback *elem = low->data_callback_first[priority]; - while(elem && elem->mNext != callback) + while (elem && elem->mNext != callback) + { elem = elem->mNext; - if(!elem) + } + if (!elem) + { continue; + } - if(low->data_callback_last[priority] == callback) + if (low->data_callback_last[priority] == callback) { low->data_callback_last[priority] = elem; elem->mNext = NULL; } else + { elem->mNext = callback->mNext; + } } } callback->mNext = NULL; - while(!low->data_thread_done) + while (!low->data_thread_done) + { pthread_cond_wait(&low->data_thread_done_cond, &low->data_thread_mutex); + } pthread_mutex_unlock(&low->data_thread_mutex); } diff --git a/src/low_data_thread.h b/src/low_data_thread.h index bec1ab4..cdbf563 100644 --- a/src/low_data_thread.h +++ b/src/low_data_thread.h @@ -7,17 +7,17 @@ enum { - LOW_DATA_THREAD_PRIORITY_READ = 0, - LOW_DATA_THREAD_PRIORITY_MODIFY + LOW_DATA_THREAD_PRIORITY_READ = 0, LOW_DATA_THREAD_PRIORITY_MODIFY }; struct low_main_t; + class LowDataCallback; void *low_data_thread_main(void *arg); -void low_data_set_callback(low_main_t *low, LowDataCallback *callback, - int priority); +void low_data_set_callback(low_main_t *low, LowDataCallback *callback, int priority); + void low_data_clear_callback(low_main_t *low, LowDataCallback *callback); #endif /* __LOW_DATA_THREAD_H__ */ \ No newline at end of file diff --git a/src/low_dns.cpp b/src/low_dns.cpp index 4abceb9..3cc0c7d 100644 --- a/src/low_dns.cpp +++ b/src/low_dns.cpp @@ -10,6 +10,7 @@ #include "low_system.h" #include "low_config.h" + #if LOW_INCLUDE_CARES_RESOLVER #include "LowDNSResolver.h" #endif /* LOW_INCLUDE_CARES_RESOLVER */ @@ -29,7 +30,7 @@ duk_ret_t low_dns_lookup(duk_context *ctx) int family = duk_require_int(ctx, 1); int hints = duk_require_int(ctx, 2); - switch(family) + switch (family) { case 4: family = AF_INET; @@ -47,8 +48,10 @@ duk_ret_t low_dns_lookup(duk_context *ctx) hints = (hints & 1) ? AI_ADDRCONFIG : 0 | (hints & 2) ? AI_V4MAPPED : 0; LowDNSWorker *worker = new(low_new) LowDNSWorker(duk_get_low_context(ctx)); - if(!worker->Lookup(address, family, hints, 3)) + if (!worker->Lookup(address, family, hints, 3)) + { delete worker; + } return 0; } @@ -63,8 +66,10 @@ duk_ret_t low_dns_lookup_service(duk_context *ctx) int port = duk_require_int(ctx, 1); LowDNSWorker *worker = new(low_new) LowDNSWorker(duk_get_low_context(ctx)); - if(!worker->LookupService(address, port, 2)) + if (!worker->LookupService(address, port, 2)) + { delete worker; + } return 0; } @@ -91,9 +96,8 @@ duk_ret_t low_dns_new_resolver(duk_context *ctx) duk_push_c_function(ctx, low_dns_resolver_finalizer, 1); duk_set_finalizer(ctx, 0); #else - duk_reference_error(ctx, - "low.js was compiled without c-ares. Recompile or " - "use dns.lookup instead."); + duk_reference_error(ctx, "low.js was compiled without c-ares. Recompile or " + "use dns.lookup instead."); #endif /* LOW_INCLUDE_CARES_RESOLVER */ return 1; @@ -116,9 +120,8 @@ duk_ret_t low_dns_resolver_cancel(duk_context *ctx) low->resolvers[index]->Cancel(); pthread_mutex_unlock(&low->resolvers_mutex); #else - duk_reference_error(ctx, - "low.js was compiled without c-ares. Recompile or " - "use dns.lookup instead."); + duk_reference_error(ctx, "low.js was compiled without c-ares. Recompile or " + "use dns.lookup instead."); #endif /* LOW_INCLUDE_CARES_RESOLVER */ return 0; } @@ -210,9 +213,8 @@ duk_ret_t low_dns_resolver_get_servers(duk_context *ctx) } ares_free_data(list); #else - duk_reference_error(ctx, - "low.js was compiled without c-ares. Recompile or " - "use dns.lookup instead."); + duk_reference_error(ctx, "low.js was compiled without c-ares. Recompile or " + "use dns.lookup instead."); #endif /* LOW_INCLUDE_CARES_RESOLVER */ return 1; } @@ -290,9 +292,8 @@ duk_ret_t low_dns_resolver_set_servers(duk_context *ctx) duk_throw(ctx); } #else - duk_reference_error(ctx, - "low.js was compiled without c-ares. Recompile or " - "use dns.lookup instead."); + duk_reference_error(ctx, "low.js was compiled without c-ares. Recompile or " + "use dns.lookup instead."); #endif /* LOW_INCLUDE_CARES_RESOLVER */ return 0; } @@ -332,9 +333,8 @@ duk_ret_t low_dns_resolver_resolve(duk_context *ctx) query->Resolve(hostname, type, ttl, 0, 4); pthread_mutex_unlock(&low->resolvers_mutex); #else - duk_reference_error(ctx, - "low.js was compiled without c-ares. Recompile or " - "use dns.lookup instead."); + duk_reference_error(ctx, "low.js was compiled without c-ares. Recompile or " + "use dns.lookup instead."); #endif /* LOW_INCLUDE_CARES_RESOLVER */ return 0; } @@ -379,9 +379,8 @@ duk_ret_t low_dns_resolver_gethostbyaddr(duk_context *ctx) return 0; } #else - duk_reference_error(ctx, - "low.js was compiled without c-ares. Recompile or " - "use dns.lookup instead."); + duk_reference_error(ctx, "low.js was compiled without c-ares. Recompile or " + "use dns.lookup instead."); #endif /* LOW_INCLUDE_CARES_RESOLVER */ return 0; } diff --git a/src/low_dns.h b/src/low_dns.h index 8a6a13f..08ebac9 100644 --- a/src/low_dns.h +++ b/src/low_dns.h @@ -8,13 +8,19 @@ #include "duktape.h" duk_ret_t low_dns_lookup(duk_context *ctx); + duk_ret_t low_dns_lookup_service(duk_context *ctx); duk_ret_t low_dns_new_resolver(duk_context *ctx); + duk_ret_t low_dns_resolver_cancel(duk_context *ctx); + duk_ret_t low_dns_resolver_get_servers(duk_context *ctx); + duk_ret_t low_dns_resolver_set_servers(duk_context *ctx); + duk_ret_t low_dns_resolver_resolve(duk_context *ctx); + duk_ret_t low_dns_resolver_gethostbyaddr(duk_context *ctx); duk_ret_t low_dns_resolver_finalizer(duk_context *ctx); diff --git a/src/low_fs.cpp b/src/low_fs.cpp index 5675739..a127c2b 100644 --- a/src/low_fs.cpp +++ b/src/low_fs.cpp @@ -23,18 +23,24 @@ duk_ret_t low_fs_open(duk_context *ctx) const char *path = duk_require_string(ctx, 0); int iflags = 0; - if(duk_is_string(ctx, 1)) + if (duk_is_string(ctx, 1)) { // TODO: handle x, s const char *flags = duk_require_string(ctx, 1); - if(flags[0] == 'a') + if (flags[0] == 'a') + { iflags = O_WRONLY | O_APPEND | O_CREAT; - if(flags[0] == 'r') + } + if (flags[0] == 'r') + { iflags = O_RDONLY; - if(flags[0] == 'w') + } + if (flags[0] == 'w') + { iflags = O_WRONLY | O_CREAT | O_TRUNC; + } - for(int i = 1; flags[i]; i++) + for (int i = 1; flags[i]; i++) { #if LOW_ESP32_LWIP_SPECIALITIES if(flags[0] == 'r' && flags[i] == 'c') @@ -42,27 +48,33 @@ duk_ret_t low_fs_open(duk_context *ctx) if(flags[0] == 'w' && flags[i] == 'c') iflags |= O_COMPRESS; #endif /* LOW_ESP32_LWIP_SPECIALITIES */ - if(flags[i] == '+') + if (flags[i] == '+') + { iflags = (iflags & ~(O_RDONLY | O_WRONLY)) | O_RDWR; + } } } else + { iflags = duk_require_int(ctx, 1); + } #if LOW_ESP32_LWIP_SPECIALITIES if(iflags & ~(O_RDONLY | O_WRONLY | O_RDWR | O_APPEND | O_CREAT | O_TRUNC | O_COMPRESS | O_COMPRESSED)) duk_range_error(ctx, "flags not supported"); #else - if(iflags & ~(O_RDONLY | O_WRONLY | O_RDWR | O_APPEND | O_CREAT | O_TRUNC | - O_CLOEXEC)) + if (iflags & ~(O_RDONLY | O_WRONLY | O_RDWR | O_APPEND | O_CREAT | O_TRUNC | O_CLOEXEC)) + { duk_range_error(ctx, "flags not supported"); + } iflags |= O_CLOEXEC; // on spawn, close file #endif /* LOW_ESP32_LWIP_SPECIALITIES */ - LowFile *file = - new(low_new) LowFile(low, path, iflags, duk_is_undefined(ctx, 3) ? 2 : 3); - if(!file) + LowFile *file = new(low_new) LowFile(low, path, iflags, duk_is_undefined(ctx, 3) ? 2 : 3); + if (!file) + { duk_generic_error(ctx, "out of memory"); + } return 0; } @@ -77,18 +89,24 @@ duk_ret_t low_fs_open_sync(duk_context *ctx) const char *path = duk_require_string(ctx, 0); int iflags = 0; - if(duk_is_string(ctx, 1)) + if (duk_is_string(ctx, 1)) { // TODO: handle x, s const char *flags = duk_require_string(ctx, 1); - if(flags[0] == 'a') + if (flags[0] == 'a') + { iflags = O_WRONLY | O_APPEND | O_CREAT; - if(flags[0] == 'r') + } + if (flags[0] == 'r') + { iflags = O_RDONLY; - if(flags[0] == 'w') + } + if (flags[0] == 'w') + { iflags = O_WRONLY | O_CREAT | O_TRUNC; + } - for(int i = 1; flags[i]; i++) + for (int i = 1; flags[i]; i++) { #if LOW_ESP32_LWIP_SPECIALITIES if(flags[0] == 'r' && flags[i] == 'c') @@ -96,34 +114,43 @@ duk_ret_t low_fs_open_sync(duk_context *ctx) if(flags[0] == 'w' && flags[i] == 'c') iflags |= O_COMPRESS; #endif /* LOW_ESP32_LWIP_SPECIALITIES */ - if(flags[i] == '+') + if (flags[i] == '+') + { iflags = (iflags & ~(O_RDONLY | O_WRONLY)) | O_RDWR; + } } } else + { iflags = duk_require_int(ctx, 1); + } #if LOW_ESP32_LWIP_SPECIALITIES if(iflags & ~(O_RDONLY | O_WRONLY | O_RDWR | O_APPEND | O_CREAT | O_TRUNC | O_COMPRESS | O_COMPRESSED)) duk_range_error(ctx, "flags not supported"); #else - if(iflags & ~(O_RDONLY | O_WRONLY | O_RDWR | O_APPEND | O_CREAT | O_TRUNC | - O_CLOEXEC)) + if (iflags & ~(O_RDONLY | O_WRONLY | O_RDWR | O_APPEND | O_CREAT | O_TRUNC | O_CLOEXEC)) + { duk_range_error(ctx, "flags not supported"); + } iflags |= O_CLOEXEC; // on spawn, close file #endif /* LOW_ESP32_LWIP_SPECIALITIES */ LowFile *file = new(low_new) LowFile(low, path, iflags, 0); - if(!file) + if (!file) + { duk_generic_error(ctx, "out of memory"); + } - while(true) + while (true) { - if(file->FinishPhase()) + if (file->FinishPhase()) + { break; + } pthread_mutex_lock(&low->loop_thread_mutex); - if(!file->LowLoopCallback::mNext && low->loop_callback_last != file) + if (!file->LowLoopCallback::mNext && low->loop_callback_last != file) { duk_debugger_cooperate(low->duk_ctx); pthread_cond_wait(&low->loop_thread_cond, &low->loop_thread_mutex); @@ -145,11 +172,13 @@ duk_ret_t low_fs_close(duk_context *ctx) int fd = duk_require_int(ctx, 0); auto iter = low->fds.find(fd); - if(iter == low->fds.end()) + if (iter == low->fds.end()) + { duk_reference_error(ctx, "file descriptor not found"); + } LowFD *file = iter->second; - if(!file->Close(1)) + if (!file->Close(1)) { delete file; @@ -170,25 +199,31 @@ duk_ret_t low_fs_close_sync(duk_context *ctx) int fd = duk_require_int(ctx, 0); auto iter = low->fds.find(fd); - if(iter == low->fds.end()) + if (iter == low->fds.end()) + { duk_reference_error(ctx, "file descriptor not found"); - if(iter->second->FDType() != LOWFD_TYPE_FILE) + } + if (iter->second->FDType() != LOWFD_TYPE_FILE) + { duk_reference_error(ctx, "file descriptor is not a file"); - LowFile *file = (LowFile *)iter->second; + } + LowFile *file = (LowFile *) iter->second; - if(!file->Close(-1)) + if (!file->Close(-1)) { delete file; return 0; } - while(true) + while (true) { - if(file->FinishPhase()) + if (file->FinishPhase()) + { return 0; + } pthread_mutex_lock(&low->loop_thread_mutex); - if(!file->LowLoopCallback::mNext && low->loop_callback_last != file) + if (!file->LowLoopCallback::mNext && low->loop_callback_last != file) { duk_debugger_cooperate(low->duk_ctx); pthread_cond_wait(&low->loop_thread_cond, &low->loop_thread_mutex); @@ -209,18 +244,21 @@ duk_ret_t low_fs_read(duk_context *ctx) int fd = duk_require_int(ctx, 0); duk_size_t buf_len; - unsigned char *buf = - (unsigned char *)duk_require_buffer_data(ctx, 1, &buf_len); + unsigned char *buf = (unsigned char *) duk_require_buffer_data(ctx, 1, &buf_len); int offset = duk_require_int(ctx, 2); int length = duk_require_int(ctx, 3); int position = duk_get_int_default(ctx, 4, -1); - if(offset < 0 || length < 0 || offset + length > buf_len) + if (offset < 0 || length < 0 || offset + length > buf_len) + { duk_range_error(ctx, "offset/length outside of buffer"); + } auto iter = low->fds.find(fd); - if(iter == low->fds.end()) + if (iter == low->fds.end()) + { duk_reference_error(ctx, "file descriptor not found"); + } LowFD *file = iter->second; file->Read(position, buf + offset, length, 5); @@ -237,18 +275,21 @@ duk_ret_t low_fs_write(duk_context *ctx) int fd = duk_require_int(ctx, 0); duk_size_t buf_len; - unsigned char *buf = - (unsigned char *)duk_require_buffer_data(ctx, 1, &buf_len); + unsigned char *buf = (unsigned char *) duk_require_buffer_data(ctx, 1, &buf_len); int offset = duk_require_int(ctx, 2); int length = duk_require_int(ctx, 3); int position = duk_get_int_default(ctx, 4, -1); - if(offset < 0 || length < 0 || offset + length > buf_len) + if (offset < 0 || length < 0 || offset + length > buf_len) + { duk_range_error(ctx, "offset/length outside of buffer"); + } auto iter = low->fds.find(fd); - if(iter == low->fds.end()) + if (iter == low->fds.end()) + { duk_reference_error(ctx, "file descriptor not found"); + } LowFD *file = iter->second; file->Write(position, buf + offset, length, 5); @@ -265,11 +306,15 @@ duk_ret_t low_fs_fstat(duk_context *ctx) int fd = duk_require_int(ctx, 0); auto iter = low->fds.find(fd); - if(iter == low->fds.end()) + if (iter == low->fds.end()) + { duk_reference_error(ctx, "file descriptor not found"); - if(iter->second->FDType() != LOWFD_TYPE_FILE) + } + if (iter->second->FDType() != LOWFD_TYPE_FILE) + { duk_reference_error(ctx, "file descriptor is not a file"); - LowFile *file = (LowFile *)iter->second; + } + LowFile *file = (LowFile *) iter->second; file->FStat(1); return 0; @@ -285,20 +330,26 @@ duk_ret_t low_fs_waitdone(duk_context *ctx) int fd = duk_require_int(ctx, 0); auto iter = low->fds.find(fd); - if(iter == low->fds.end()) + if (iter == low->fds.end()) + { return 0; + } - if(iter->second->FDType() != LOWFD_TYPE_FILE) + if (iter->second->FDType() != LOWFD_TYPE_FILE) + { duk_reference_error(ctx, "file descriptor is not a file"); - LowFile *file = (LowFile *)iter->second; + } + LowFile *file = (LowFile *) iter->second; - while(true) + while (true) { - if(file->FinishPhase()) + if (file->FinishPhase()) + { return 0; + } pthread_mutex_lock(&low->loop_thread_mutex); - if(!file->LowLoopCallback::mNext && low->loop_callback_last != file) + if (!file->LowLoopCallback::mNext && low->loop_callback_last != file) { duk_debugger_cooperate(low->duk_ctx); pthread_cond_wait(&low->loop_thread_cond, &low->loop_thread_mutex); @@ -319,11 +370,15 @@ duk_ret_t low_fs_file_pos(duk_context *ctx) int fd = duk_require_int(ctx, 0); auto iter = low->fds.find(fd); - if(iter == low->fds.end()) + if (iter == low->fds.end()) + { duk_reference_error(ctx, "file descriptor not found"); - if(iter->second->FDType() != LOWFD_TYPE_FILE) + } + if (iter->second->FDType() != LOWFD_TYPE_FILE) + { duk_reference_error(ctx, "file descriptor is not a file"); - LowFile *file = (LowFile *)iter->second; + } + LowFile *file = (LowFile *) iter->second; duk_push_int(ctx, lseek(file->FD(), 0, SEEK_CUR)); return 1; @@ -333,11 +388,7 @@ duk_ret_t low_fs_file_pos(duk_context *ctx) // low_fs_resolve // ----------------------------------------------------------------------------- -bool low_fs_resolve(char *res, - int res_len, - const char *base, - const char *add, - const char *add_node_modules_at) +bool low_fs_resolve(char *res, int res_len, const char *base, const char *add, const char *add_node_modules_at) { char *start, *path; @@ -351,97 +402,130 @@ bool low_fs_resolve(char *res, path = res + 1; #endif /* LOW_ESP32_LWIP_SPECIALITIES */ - if(add[0] != '/') + if (add[0] != '/') { - for(const char *str = base; *str && str != add_node_modules_at; str++) + for (const char *str = base; *str && str != add_node_modules_at; str++) { - if(path != start) + if (path != start) { - if(path[-1] == '/' && str[0] == '/') + if (path[-1] == '/' && str[0] == '/') + { continue; - else if(path[-1] == '/' && str[0] == '.' && - (!str[1] || str[1] == '/')) + } + else if (path[-1] == '/' && str[0] == '.' && (!str[1] || str[1] == '/')) { str++; - if(!*str) + if (!*str) + { break; + } continue; } - else if(path[-1] == '/' && str[0] == '.' && str[1] == '.' && - (!str[2] || str[2] == '/') && - !(path - start > 2 && path[-2] == '.' && - path[-3] == '.' && - (path - start == 3 || path[-4] == '/'))) + else if (path[-1] == '/' && str[0] == '.' && str[1] == '.' && (!str[2] || str[2] == '/') && + !(path - start > 2 && path[-2] == '.' && path[-3] == '.' && + (path - start == 3 || path[-4] == '/'))) { path--; - while(path != start && path[-1] != '/') + while (path != start && path[-1] != '/') + { path--; - if(path == start) + } + if (path == start) + { return false; + } str += 2; - if(!*str) + if (!*str) + { break; + } } else + { *path++ = *str; + } } else + { *path++ = *str; + } - if(path - res == res_len) + if (path - res == res_len) + { return false; + } } - while(path != start && path[-1] != '/') + while (path != start && path[-1] != '/') + { path--; - if(path == start) + } + if (path == start) + { return false; + } } - if(add_node_modules_at) + if (add_node_modules_at) { - if(path + 13 - res >= res_len) + if (path + 13 - res >= res_len) + { return false; + } memcpy(path, "node_modules/", 13); path += 13; } - for(const char *str = add; *str; str++) + for (const char *str = add; *str; str++) { - if(path != start) + if (path != start) { - if(path[-1] == '/' && str[0] == '/') + if (path[-1] == '/' && str[0] == '/') + { continue; - else if(path[-1] == '/' && str[0] == '.' && - (!str[1] || str[1] == '/')) + } + else if (path[-1] == '/' && str[0] == '.' && (!str[1] || str[1] == '/')) { str++; - if(!*str) + if (!*str) + { break; + } continue; } - else if(path[-1] == '/' && str[0] == '.' && str[1] == '.' && - (!str[2] || str[2] == '/') && - !(path - start > 2 && path[-2] == '.' && path[-3] == '.' && - (path - start == 3 || path[-4] == '/'))) + else if (path[-1] == '/' && str[0] == '.' && str[1] == '.' && (!str[2] || str[2] == '/') && + !(path - start > 2 && path[-2] == '.' && path[-3] == '.' && + (path - start == 3 || path[-4] == '/'))) { path--; - while(path != start && path[-1] != '/') + while (path != start && path[-1] != '/') + { path--; - if(path == start) + } + if (path == start) + { return false; + } str += 2; - if(!*str) + if (!*str) + { break; + } } else + { *path++ = *str; + } } else + { *path++ = *str; + } - if(path - res == res_len) + if (path - res == res_len) + { return false; + } } *path = '\0'; diff --git a/src/low_fs.h b/src/low_fs.h index aae527f..2b33de1 100644 --- a/src/low_fs.h +++ b/src/low_fs.h @@ -8,22 +8,23 @@ #include "duktape.h" duk_ret_t low_fs_open(duk_context *ctx); + duk_ret_t low_fs_open_sync(duk_context *ctx); duk_ret_t low_fs_close(duk_context *ctx); + duk_ret_t low_fs_close_sync(duk_context *ctx); duk_ret_t low_fs_read(duk_context *ctx); + duk_ret_t low_fs_write(duk_context *ctx); + duk_ret_t low_fs_fstat(duk_context *ctx); duk_ret_t low_fs_waitdone(duk_context *ctx); + duk_ret_t low_fs_file_pos(duk_context *ctx); -bool low_fs_resolve(char *res, - int res_len, - const char *base, - const char *add, - const char *add_node_modules_at = NULL); +bool low_fs_resolve(char *res, int res_len, const char *base, const char *add, const char *add_node_modules_at = NULL); #endif /* __LOW_FS_H__ */ \ No newline at end of file diff --git a/src/low_fs_misc.cpp b/src/low_fs_misc.cpp index 1090fe6..466b1ea 100644 --- a/src/low_fs_misc.cpp +++ b/src/low_fs_misc.cpp @@ -28,8 +28,10 @@ duk_ret_t low_fs_rename(duk_context *ctx) const char *new_name = duk_require_string(ctx, 1); LowFSMisc *fl = new(low_new) LowFSMisc(low); - if(!fl) + if (!fl) + { duk_generic_error(ctx, "out of memory"); + } fl->Rename(old_name, new_name); fl->Run(2); @@ -46,8 +48,10 @@ duk_ret_t low_fs_unlink(duk_context *ctx) const char *file_name = duk_require_string(ctx, 0); LowFSMisc *fl = new(low_new) LowFSMisc(low); - if(!fl) + if (!fl) + { duk_generic_error(ctx, "out of memory"); + } fl->Unlink(file_name); fl->Run(1); @@ -64,8 +68,10 @@ duk_ret_t low_fs_stat(duk_context *ctx) const char *file_name = duk_require_string(ctx, 0); LowFSMisc *fl = new(low_new) LowFSMisc(low); - if(!fl) + if (!fl) + { duk_generic_error(ctx, "out of memory"); + } fl->Stat(file_name); fl->Run(1); @@ -83,11 +89,13 @@ duk_ret_t low_fs_access(duk_context *ctx) const char *file_name = duk_require_string(ctx, 0); LowFSMisc *fl = new(low_new) LowFSMisc(low); - if(!fl) + if (!fl) + { duk_generic_error(ctx, "out of memory"); + } int mode, callIndex; - if(duk_is_undefined(ctx, 2)) + if (duk_is_undefined(ctx, 2)) { mode = F_OK; callIndex = 1; @@ -114,21 +122,27 @@ duk_ret_t low_fs_readdir(duk_context *ctx) const char *file_name = duk_require_string(ctx, 0); LowFSMisc *fl = new(low_new) LowFSMisc(low); - if(!fl) + if (!fl) + { duk_generic_error(ctx, "out of memory"); + } bool withFileTypes = false; int callIndex; - if(duk_is_undefined(ctx, 2)) + if (duk_is_undefined(ctx, 2)) + { callIndex = 1; - else if(duk_is_object(ctx, 1)) + } + else if (duk_is_object(ctx, 1)) { withFileTypes = duk_get_prop_string(ctx, 1, "withFileTypes") && duk_require_boolean(ctx, -1); callIndex = 2; } else + { callIndex = 2; + } fl->ReadDir(file_name, withFileTypes); fl->Run(callIndex); @@ -146,24 +160,32 @@ duk_ret_t low_fs_mkdir(duk_context *ctx) const char *file_name = duk_require_string(ctx, 0); LowFSMisc *fl = new(low_new) LowFSMisc(low); - if(!fl) + if (!fl) + { duk_generic_error(ctx, "out of memory"); + } bool recursive = false; int mode = 0777; int callIndex; - if(duk_is_undefined(ctx, 2)) + if (duk_is_undefined(ctx, 2)) + { callIndex = 1; - else if(duk_is_object(ctx, 1)) + } + else if (duk_is_object(ctx, 1)) { recursive = duk_get_prop_string(ctx, 1, "recursive") && duk_require_boolean(ctx, -1); - if(duk_get_prop_string(ctx, 1, "mode")) + if (duk_get_prop_string(ctx, 1, "mode")) + { mode = duk_require_int(ctx, -1); + } callIndex = 2; } else + { callIndex = 2; + } fl->MkDir(file_name, recursive, mode); fl->Run(callIndex); @@ -181,14 +203,20 @@ duk_ret_t low_fs_rmdir(duk_context *ctx) const char *file_name = duk_require_string(ctx, 0); LowFSMisc *fl = new(low_new) LowFSMisc(low); - if(!fl) + if (!fl) + { duk_generic_error(ctx, "out of memory"); + } int callIndex; - if(duk_is_undefined(ctx, 2)) + if (duk_is_undefined(ctx, 2)) + { callIndex = 1; + } else + { callIndex = 2; + } fl->RmDir(file_name); fl->Run(callIndex); @@ -207,8 +235,10 @@ duk_ret_t low_fs_rename_sync(duk_context *ctx) const char *new_name = duk_require_string(ctx, 1); LowFSMisc *fl = new(low_new) LowFSMisc(low); - if(!fl) + if (!fl) + { duk_generic_error(ctx, "out of memory"); + } fl->Rename(old_name, new_name); fl->Run(); @@ -225,8 +255,10 @@ duk_ret_t low_fs_unlink_sync(duk_context *ctx) const char *file_name = duk_require_string(ctx, 0); LowFSMisc *fl = new(low_new) LowFSMisc(low); - if(!fl) + if (!fl) + { duk_generic_error(ctx, "out of memory"); + } fl->Unlink(file_name); fl->Run(); @@ -244,8 +276,10 @@ duk_ret_t low_fs_stat_sync(duk_context *ctx) const char *file_name = duk_require_string(ctx, 0); LowFSMisc *fl = new(low_new) LowFSMisc(low); - if(!fl) + if (!fl) + { duk_generic_error(ctx, "out of memory"); + } fl->Stat(file_name); fl->Run(); @@ -263,14 +297,20 @@ duk_ret_t low_fs_access_sync(duk_context *ctx) const char *file_name = duk_require_string(ctx, 0); LowFSMisc *fl = new(low_new) LowFSMisc(low); - if(!fl) + if (!fl) + { duk_generic_error(ctx, "out of memory"); + } int mode; - if(duk_is_undefined(ctx, 2)) + if (duk_is_undefined(ctx, 2)) + { mode = F_OK; + } else + { mode = duk_require_int(ctx, 1); + } fl->Access(file_name, mode); fl->Run(); @@ -288,16 +328,22 @@ duk_ret_t low_fs_readdir_sync(duk_context *ctx) const char *file_name = duk_require_string(ctx, 0); LowFSMisc *fl = new(low_new) LowFSMisc(low); - if(!fl) + if (!fl) + { duk_generic_error(ctx, "out of memory"); + } bool withFileTypes; int callIndex; - if(!duk_is_undefined(ctx, 2)) + if (!duk_is_undefined(ctx, 2)) + { withFileTypes = false; - else if(duk_is_object(ctx, 1)) + } + else if (duk_is_object(ctx, 1)) + { withFileTypes = duk_get_prop_string(ctx, 1, "withFileTypes") && duk_require_boolean(ctx, -1); + } fl->ReadDir(file_name, withFileTypes); fl->Run(); @@ -315,19 +361,23 @@ duk_ret_t low_fs_mkdir_sync(duk_context *ctx) const char *file_name = duk_require_string(ctx, 0); LowFSMisc *fl = new(low_new) LowFSMisc(low); - if(!fl) + if (!fl) + { duk_generic_error(ctx, "out of memory"); + } bool recursive = false; int mode = 0777; - if(duk_is_undefined(ctx, 2)) - ; - else if(duk_is_object(ctx, 1)) + if (duk_is_undefined(ctx, 2)) + {} + else if (duk_is_object(ctx, 1)) { recursive = duk_get_prop_string(ctx, 1, "recursive") && duk_require_boolean(ctx, -1); - if(duk_get_prop_string(ctx, 1, "mode")) + if (duk_get_prop_string(ctx, 1, "mode")) + { mode = duk_require_int(ctx, -1); + } } fl->MkDir(file_name, recursive, mode); @@ -346,8 +396,10 @@ duk_ret_t low_fs_rmdir_sync(duk_context *ctx) const char *file_name = duk_require_string(ctx, 0); LowFSMisc *fl = new(low_new) LowFSMisc(low); - if(!fl) + if (!fl) + { duk_generic_error(ctx, "out of memory"); + } fl->RmDir(file_name); fl->Run(); diff --git a/src/low_fs_misc.h b/src/low_fs_misc.h index 34abd7a..1aa8db2 100644 --- a/src/low_fs_misc.h +++ b/src/low_fs_misc.h @@ -8,19 +8,31 @@ #include "duktape.h" duk_ret_t low_fs_rename(duk_context *ctx); + duk_ret_t low_fs_unlink(duk_context *ctx); + duk_ret_t low_fs_stat(duk_context *ctx); + duk_ret_t low_fs_access(duk_context *ctx); + duk_ret_t low_fs_readdir(duk_context *ctx); + duk_ret_t low_fs_mkdir(duk_context *ctx); + duk_ret_t low_fs_rmdir(duk_context *ctx); duk_ret_t low_fs_rename_sync(duk_context *ctx); + duk_ret_t low_fs_unlink_sync(duk_context *ctx); + duk_ret_t low_fs_stat_sync(duk_context *ctx); + duk_ret_t low_fs_access_sync(duk_context *ctx); + duk_ret_t low_fs_readdir_sync(duk_context *ctx); + duk_ret_t low_fs_mkdir_sync(duk_context *ctx); + duk_ret_t low_fs_rmdir_sync(duk_context *ctx); #endif /* __LOW_FS_MISC_H__ */ diff --git a/src/low_http.cpp b/src/low_http.cpp index 9a4a05b..29754cb 100644 --- a/src/low_http.cpp +++ b/src/low_http.cpp @@ -23,25 +23,29 @@ duk_ret_t low_http_get_request(duk_context *ctx) int socketFD = duk_require_int(ctx, 0); auto iter = low->fds.find(socketFD); - if(iter == low->fds.end()) + if (iter == low->fds.end()) + { return 0; + } - if(iter->second->FDType() != LOWFD_TYPE_SOCKET) + if (iter->second->FDType() != LOWFD_TYPE_SOCKET) + { duk_reference_error(ctx, "file descriptor is not a socket"); - LowSocket *socket = (LowSocket *)iter->second; + } + LowSocket *socket = (LowSocket *) iter->second; int directType; - LowHTTPDirect *direct = (LowHTTPDirect *)socket->GetDirect(directType); - if(direct && directType == 0) + LowHTTPDirect *direct = (LowHTTPDirect *) socket->GetDirect(directType); + if (direct && directType == 0) { // Server version direct->SetRequestCallID(low_add_stash(low, 1)); } - else if(!direct) + else if (!direct) { // Client version direct = new(low_new) LowHTTPDirect(low, false); - if(!direct) + if (!direct) { duk_dup(ctx, 1); low_push_error(low, ENOMEM, "malloc"); @@ -49,14 +53,16 @@ duk_ret_t low_http_get_request(duk_context *ctx) return 0; } - if(!socket->SetDirect(direct, 0)) - duk_reference_error( - ctx, "file descriptor not available for direct object"); + if (!socket->SetDirect(direct, 0)) + { + duk_reference_error(ctx, "file descriptor not available for direct object"); + } direct->SetRequestCallID(low_add_stash(low, 1)); } else - duk_reference_error( - ctx, "file descriptor is already acquired by direct object"); + { + duk_reference_error(ctx, "file descriptor is already acquired by direct object"); + } return 0; } @@ -71,17 +77,23 @@ duk_ret_t low_http_detach(duk_context *ctx) int socketFD = duk_require_int(ctx, 0); auto iter = low->fds.find(socketFD); - if(iter == low->fds.end()) + if (iter == low->fds.end()) + { return 0; + } - if(iter->second->FDType() != LOWFD_TYPE_SOCKET) + if (iter->second->FDType() != LOWFD_TYPE_SOCKET) + { duk_reference_error(ctx, "file descriptor is not a socket"); - LowSocket *socket = (LowSocket *)iter->second; + } + LowSocket *socket = (LowSocket *) iter->second; int directType; - LowHTTPDirect *direct = (LowHTTPDirect *)socket->GetDirect(directType); - if(!direct || directType != 0) + LowHTTPDirect *direct = (LowHTTPDirect *) socket->GetDirect(directType); + if (!direct || directType != 0) + { duk_reference_error(ctx, "file descriptor is not an HTTP stream"); + } direct->Detach(true); return 1; @@ -97,21 +109,26 @@ duk_ret_t low_http_read(duk_context *ctx) int socketFD = duk_require_int(ctx, 0); duk_size_t buf_len; - unsigned char *buf = - (unsigned char *)duk_require_buffer_data(ctx, 1, &buf_len); + unsigned char *buf = (unsigned char *) duk_require_buffer_data(ctx, 1, &buf_len); auto iter = low->fds.find(socketFD); - if(iter == low->fds.end()) + if (iter == low->fds.end()) + { return 0; + } - if(iter->second->FDType() != LOWFD_TYPE_SOCKET) + if (iter->second->FDType() != LOWFD_TYPE_SOCKET) + { duk_reference_error(ctx, "file descriptor is not a socket"); - LowSocket *socket = (LowSocket *)iter->second; + } + LowSocket *socket = (LowSocket *) iter->second; int directType; - LowHTTPDirect *http = (LowHTTPDirect *)socket->GetDirect(directType); - if(!http || directType != 0) + LowHTTPDirect *http = (LowHTTPDirect *) socket->GetDirect(directType); + if (!http || directType != 0) + { duk_reference_error(ctx, "file descriptor is not an HTTP stream"); + } http->Read(buf, buf_len, 2); return 0; @@ -127,23 +144,26 @@ duk_ret_t low_http_write(duk_context *ctx) int socketFD = duk_require_int(ctx, 0); duk_size_t buf_len = 0; - unsigned char *buf = - duk_is_null(ctx, 1) - ? NULL - : (unsigned char *)duk_require_buffer_data(ctx, 1, &buf_len); + unsigned char *buf = duk_is_null(ctx, 1) ? NULL : (unsigned char *) duk_require_buffer_data(ctx, 1, &buf_len); auto iter = low->fds.find(socketFD); - if(iter == low->fds.end()) + if (iter == low->fds.end()) + { return 0; + } - if(iter->second->FDType() != LOWFD_TYPE_SOCKET) + if (iter->second->FDType() != LOWFD_TYPE_SOCKET) + { duk_reference_error(ctx, "file descriptor is not a socket"); - LowSocket *socket = (LowSocket *)iter->second; + } + LowSocket *socket = (LowSocket *) iter->second; int directType; - LowHTTPDirect *http = (LowHTTPDirect *)socket->GetDirect(directType); - if(!http || directType != 0) + LowHTTPDirect *http = (LowHTTPDirect *) socket->GetDirect(directType); + if (!http || directType != 0) + { duk_reference_error(ctx, "file descriptor is not an HTTP stream"); + } http->Write(buf, buf_len, 1, 2); return 0; @@ -163,17 +183,23 @@ duk_ret_t low_http_write_head(duk_context *ctx) bool isChunked = duk_require_boolean(ctx, 3); auto iter = low->fds.find(socketFD); - if(iter == low->fds.end()) + if (iter == low->fds.end()) + { return 0; + } - if(iter->second->FDType() != LOWFD_TYPE_SOCKET) + if (iter->second->FDType() != LOWFD_TYPE_SOCKET) + { duk_reference_error(ctx, "file descriptor is not a socket"); - LowSocket *socket = (LowSocket *)iter->second; + } + LowSocket *socket = (LowSocket *) iter->second; int directType; - LowHTTPDirect *http = (LowHTTPDirect *)socket->GetDirect(directType); - if(!http || directType != 0) + LowHTTPDirect *http = (LowHTTPDirect *) socket->GetDirect(directType); + if (!http || directType != 0) + { duk_reference_error(ctx, "file descriptor is not an HTTP stream"); + } http->WriteHeaders(headers, 1, len, isChunked); return 0; diff --git a/src/low_http.h b/src/low_http.h index 5b15e10..a9ba7fb 100644 --- a/src/low_http.h +++ b/src/low_http.h @@ -1,4 +1,3 @@ - // ----------------------------------------------------------------------------- // low_http.h // ----------------------------------------------------------------------------- @@ -9,11 +8,13 @@ #include "duktape.h" duk_ret_t low_http_get_request(duk_context *ctx); + duk_ret_t low_http_detach(duk_context *ctx); duk_ret_t low_http_read(duk_context *ctx); duk_ret_t low_http_write(duk_context *ctx); + duk_ret_t low_http_write_head(duk_context *ctx); #endif /* __LOW_HTTP_H__ */ \ No newline at end of file diff --git a/src/low_loop.cpp b/src/low_loop.cpp index ff65302..40257c4 100644 --- a/src/low_loop.cpp +++ b/src/low_loop.cpp @@ -21,19 +21,21 @@ void user_cpu_load(bool active); bool low_loop_run(low_main_t *low) { - while(!low->duk_flag_stop && (low->run_ref || low->loop_callback_first)) + while (!low->duk_flag_stop && (low->run_ref || low->loop_callback_first)) { int millisecs = -1; - if(low->chore_times.size()) + if (low->chore_times.size()) { int tick_count = low_tick_count(); auto iter = low->chore_times.lower_bound(low->last_chore_time); - if(iter == low->chore_times.end()) + if (iter == low->chore_times.end()) + { iter = low->chore_times.begin(); + } millisecs = iter->first - tick_count; - if(millisecs <= 0) + if (millisecs <= 0) { low->last_chore_time = iter->first; @@ -42,29 +44,32 @@ bool low_loop_run(low_main_t *low) auto iterData = low->chores.find(index); bool erase = iterData->second.oneshot; - if(erase) + if (erase) { - if(iterData->second.ref) + if (iterData->second.ref) + { low->run_ref--; + } low->chores.erase(iterData); } else { iterData->second.stamp += iterData->second.interval; - if(iterData->second.stamp - tick_count < 0) + if (iterData->second.stamp - tick_count < 0) + { iterData->second.stamp = tick_count; + } - low->chore_times.insert( - pair(iterData->second.stamp, index)); + low->chore_times.insert(pair(iterData->second.stamp, index)); } int args[2] = {index, erase}; - if(duk_safe_call( - low->duk_ctx, low_loop_call_chore_safe, args, 0, 1) != - DUK_EXEC_SUCCESS) + if (duk_safe_call(low->duk_ctx, low_loop_call_chore_safe, args, 0, 1) != DUK_EXEC_SUCCESS) { - if(!low->duk_flag_stop) // flag stop also produces error + if (!low->duk_flag_stop) + { // flag stop also produces error low_duk_print_error(low->duk_ctx); + } duk_pop(low->duk_ctx); return low->duk_flag_stop; @@ -75,14 +80,14 @@ bool low_loop_run(low_main_t *low) } pthread_mutex_lock(&low->loop_thread_mutex); - if(!low->loop_callback_first) + if (!low->loop_callback_first) { duk_debugger_cooperate(low->duk_ctx); #if LOW_ESP32_LWIP_SPECIALITIES user_cpu_load(false); #endif /* LOW_ESP32_LWIP_SPECIALITIES */ - if(millisecs >= 0) + if (millisecs >= 0) { /* // TODO under os x @@ -105,54 +110,58 @@ bool low_loop_run(low_main_t *low) #endif /* LOW_ESP32_LWIP_SPECIALITIES */ ts.tv_sec += secs; ts.tv_nsec += (millisecs - secs * 1000) * 1000000; - if(ts.tv_nsec >= 1000000000) + if (ts.tv_nsec >= 1000000000) { ts.tv_sec++; ts.tv_nsec -= 1000000000; } - pthread_cond_timedwait( - &low->loop_thread_cond, &low->loop_thread_mutex, &ts); + pthread_cond_timedwait(&low->loop_thread_cond, &low->loop_thread_mutex, &ts); } else - pthread_cond_wait(&low->loop_thread_cond, - &low->loop_thread_mutex); + { + pthread_cond_wait(&low->loop_thread_cond, &low->loop_thread_mutex); + } #if LOW_ESP32_LWIP_SPECIALITIES user_cpu_load(true); #endif /* LOW_ESP32_LWIP_SPECIALITIES */ } - if(low->loop_callback_first) + if (low->loop_callback_first) { - while(true) + while (true) { LowLoopCallback *callback = low->loop_callback_first; low->loop_callback_first = callback->mNext; - if(!low->loop_callback_first) + if (!low->loop_callback_first) + { low->loop_callback_last = NULL; + } callback->mNext = NULL; pthread_mutex_unlock(&low->loop_thread_mutex); - if(duk_safe_call(low->duk_ctx, - low_loop_call_callback_safe, - callback, - 0, - 1) != DUK_EXEC_SUCCESS) + if (duk_safe_call(low->duk_ctx, low_loop_call_callback_safe, callback, 0, 1) != DUK_EXEC_SUCCESS) { - if(!low->duk_flag_stop) // flag stop also produces error + if (!low->duk_flag_stop) + { // flag stop also produces error low_duk_print_error(low->duk_ctx); + } duk_pop(low->duk_ctx); return low->duk_flag_stop; } duk_pop(low->duk_ctx); - if(!low->loop_callback_first) + if (!low->loop_callback_first) + { break; + } pthread_mutex_lock(&low->loop_thread_mutex); } } else + { pthread_mutex_unlock(&low->loop_thread_mutex); + } } return true; } @@ -163,7 +172,7 @@ bool low_loop_run(low_main_t *low) duk_ret_t low_loop_call_chore_safe(duk_context *ctx, void *udata) { - int *args = (int *)udata; + int *args = (int *) udata; low_push_stash(duk_get_low_context(ctx), args[0], args[1]); duk_call(ctx, 0); @@ -176,9 +185,11 @@ duk_ret_t low_loop_call_chore_safe(duk_context *ctx, void *udata) duk_ret_t low_loop_call_callback_safe(duk_context *ctx, void *udata) { - LowLoopCallback *callback = (LowLoopCallback *)udata; - if(!callback->OnLoop()) + LowLoopCallback *callback = (LowLoopCallback *) udata; + if (!callback->OnLoop()) + { delete callback; + } return 0; } @@ -192,8 +203,10 @@ duk_ret_t low_loop_set_chore(duk_context *ctx) int index = low_add_stash(low, 0); int delay = duk_require_int(ctx, 1); - if(delay < 0) + if (delay < 0) + { delay = 0; + } low_chore_t &chore = low->chores[index]; chore.interval = delay; @@ -217,16 +230,22 @@ duk_ret_t low_loop_clear_chore(duk_context *ctx) int index = duk_require_int(ctx, 0); auto iter = low->chores.find(index); - if(iter == low->chores.end()) + if (iter == low->chores.end()) + { return 0; + } auto iter2 = low->chore_times.find(iter->second.stamp); - while(iter2->second != index) + while (iter2->second != index) + { iter2++; + } low->chore_times.erase(iter2); - if(iter->second.ref) + if (iter->second.ref) + { low->run_ref--; + } low->chores.erase(iter); low_remove_stash(low, index); @@ -244,15 +263,21 @@ duk_ret_t low_loop_chore_ref(duk_context *ctx) bool ref = duk_require_boolean(ctx, 1); auto iter = low->chores.find(index); - if(iter == low->chores.end()) + if (iter == low->chores.end()) + { return 0; + } - if(iter->second.ref != ref) + if (iter->second.ref != ref) { - if(ref) + if (ref) + { low->run_ref++; + } else + { low->run_ref--; + } iter->second.ref = ref; } @@ -277,16 +302,20 @@ duk_ret_t low_loop_run_ref(duk_context *ctx) void low_loop_set_callback(low_main_t *low, LowLoopCallback *callback) { pthread_mutex_lock(&low->loop_thread_mutex); - if(callback->mNext || low->loop_callback_last == callback) + if (callback->mNext || low->loop_callback_last == callback) { pthread_mutex_unlock(&low->loop_thread_mutex); return; } - if(low->loop_callback_last) + if (low->loop_callback_last) + { low->loop_callback_last->mNext = callback; + } else + { low->loop_callback_first = callback; + } low->loop_callback_last = callback; pthread_cond_signal(&low->loop_thread_cond); @@ -300,27 +329,33 @@ void low_loop_set_callback(low_main_t *low, LowLoopCallback *callback) void low_loop_clear_callback(low_main_t *low, LowLoopCallback *callback) { pthread_mutex_lock(&low->loop_thread_mutex); - if(callback->mNext || low->loop_callback_last == callback) + if (callback->mNext || low->loop_callback_last == callback) { LowLoopCallback *elem = low->loop_callback_first; - if(elem == callback) + if (elem == callback) { low->loop_callback_first = elem->mNext; - if(!low->loop_callback_first) + if (!low->loop_callback_first) + { low->loop_callback_last = NULL; + } } else { - while(elem->mNext != callback) + while (elem->mNext != callback) + { elem = elem->mNext; + } - if(low->loop_callback_last == callback) + if (low->loop_callback_last == callback) { low->loop_callback_last = elem; elem->mNext = NULL; } else + { elem->mNext = callback->mNext; + } } callback->mNext = NULL; } diff --git a/src/low_loop.h b/src/low_loop.h index 1005d54..925f2ab 100644 --- a/src/low_loop.h +++ b/src/low_loop.h @@ -11,27 +11,27 @@ struct low_main_t; struct low_chore_t { - int stamp, interval; - bool oneshot, ref; + int stamp, interval; + bool oneshot, ref; }; class LowLoopCallback; extern "C" bool low_loop_run(low_main_t *low); + duk_ret_t low_loop_call_chore_safe(duk_context *ctx, void *udata); + duk_ret_t low_loop_call_callback_safe(duk_context *ctx, void *udata); duk_ret_t low_loop_chore_ref(duk_context *ctx); + duk_ret_t low_loop_run_ref(duk_context *ctx); duk_ret_t low_loop_set_chore(duk_context *ctx); + duk_ret_t low_loop_clear_chore(duk_context *ctx); -void low_loop_set_callback( - low_main_t *low, - LowLoopCallback *callback); // may be called from other thread -void low_loop_clear_callback( - low_main_t *low, - LowLoopCallback *callback); // must be called from main thread +void low_loop_set_callback(low_main_t *low, LowLoopCallback *callback); // may be called from other thread +void low_loop_clear_callback(low_main_t *low, LowLoopCallback *callback); // must be called from main thread #endif /* __LOW_LOOP_H__ */ \ No newline at end of file diff --git a/src/low_main.cpp b/src/low_main.cpp index 27f395b..7f5aec5 100644 --- a/src/low_main.cpp +++ b/src/low_main.cpp @@ -20,6 +20,7 @@ #include "low_system.h" #include "duktape.h" + #if LOW_INCLUDE_CARES_RESOLVER #include "../deps/c-ares/ares.h" #include "LowDNSResolver.h" @@ -65,7 +66,7 @@ static void *low_duk_alloc(void *udata, duk_size_t size) static void *low_duk_realloc(void *udata, void *ptr, duk_size_t size) { - if(size == 0) + if (size == 0) { low_free(ptr); return NULL; @@ -98,9 +99,8 @@ static void low_duk_fatal(void *udata, const char *msg) #else low_error(msg); - fprintf(stderr, - "--- exiting as we reached fatal error handler, should not " - "happen ---\n"); + fprintf(stderr, "--- exiting as we reached fatal error handler, should not " + "happen ---\n"); exit(EXIT_FAILURE); #endif /* LOW_ESP32_LWIP_SPECIALITIES */ } @@ -118,7 +118,7 @@ low_main_t *low_init() #endif /* LOW_INCLUDE_CARES_RESOLVER */ low_main_t *low = new(low_new) low_main_t(); - if(!low) + if (!low) { fprintf(stderr, "Memory full\n"); @@ -129,8 +129,10 @@ low_main_t *low_init() } low->web_thread = NULL; - for(int i = 0; i < LOW_NUM_DATA_THREADS; i++) + for (int i = 0; i < LOW_NUM_DATA_THREADS; i++) + { low->data_thread[i] = NULL; + } low->destroying = false; low->duk_flag_stop = 0; @@ -138,9 +140,8 @@ low_main_t *low_init() // we are doing this on reset low->duk_ctx = NULL; #else - low->duk_ctx = duk_create_heap( - low_duk_alloc, low_duk_realloc, low_duk_free, low, low_duk_fatal); - if(!low->duk_ctx) + low->duk_ctx = duk_create_heap(low_duk_alloc, low_duk_realloc, low_duk_free, low, low_duk_fatal); + if (!low->duk_ctx) { fprintf(stderr, "Cannot initialize Duktape heap\n"); @@ -160,8 +161,10 @@ low_main_t *low_init() low->last_chore_time = low_tick_count(); - if(pthread_mutex_init(&low->ref_mutex, NULL) != 0) + if (pthread_mutex_init(&low->ref_mutex, NULL) != 0) + { goto err; + } #if LOW_INCLUDE_CARES_RESOLVER if(pthread_mutex_init(&low->resolvers_mutex, NULL) != 0) @@ -172,7 +175,7 @@ low_main_t *low_init() low->resolvers_active = 0; #endif /* LOW_INCLUDE_CARES_RESOLVER */ - if(pthread_mutex_init(&low->loop_thread_mutex, NULL) != 0) + if (pthread_mutex_init(&low->loop_thread_mutex, NULL) != 0) { #if LOW_INCLUDE_CARES_RESOLVER pthread_mutex_destroy(&low->resolvers_mutex); @@ -180,7 +183,7 @@ low_main_t *low_init() pthread_mutex_destroy(&low->ref_mutex); goto err; } - if(pthread_cond_init(&low->loop_thread_cond, NULL) != 0) + if (pthread_cond_init(&low->loop_thread_cond, NULL) != 0) { #if LOW_INCLUDE_CARES_RESOLVER pthread_mutex_destroy(&low->resolvers_mutex); @@ -191,7 +194,7 @@ low_main_t *low_init() } low->loop_callback_first = low->loop_callback_last = NULL; - if(pthread_mutex_init(&low->data_thread_mutex, NULL) != 0) + if (pthread_mutex_init(&low->data_thread_mutex, NULL) != 0) { #if LOW_INCLUDE_CARES_RESOLVER pthread_mutex_destroy(&low->resolvers_mutex); @@ -202,7 +205,7 @@ low_main_t *low_init() goto err; } - if(pthread_cond_init(&low->data_thread_cond, NULL) != 0) + if (pthread_cond_init(&low->data_thread_cond, NULL) != 0) { #if LOW_INCLUDE_CARES_RESOLVER pthread_mutex_destroy(&low->resolvers_mutex); @@ -214,7 +217,7 @@ low_main_t *low_init() goto err; } - if(pthread_cond_init(&low->data_thread_done_cond, NULL) != 0) + if (pthread_cond_init(&low->data_thread_done_cond, NULL) != 0) { #if LOW_INCLUDE_CARES_RESOLVER pthread_mutex_destroy(&low->resolvers_mutex); @@ -230,7 +233,7 @@ low_main_t *low_init() low->data_callback_first[0] = low->data_callback_last[0] = NULL; low->data_callback_first[1] = low->data_callback_last[1] = NULL; - for(int i = 0; i < LOW_NUM_DATA_THREADS; i++) + for (int i = 0; i < LOW_NUM_DATA_THREADS; i++) { #if LOW_ESP32_LWIP_SPECIALITIES err = xTaskCreatePinnedToCore((void (*)(void *))low_data_thread_main, @@ -245,15 +248,16 @@ low_main_t *low_init() fprintf( stderr, "failed to create data task, error code: %d\n", err); #else - if(pthread_create( - &low->data_thread[i], NULL, low_data_thread_main, low) != 0) + if (pthread_create(&low->data_thread[i], NULL, low_data_thread_main, low) != 0) { pthread_mutex_lock(&low->data_thread_mutex); low->destroying = 1; pthread_cond_broadcast(&low->data_thread_cond); pthread_mutex_unlock(&low->data_thread_mutex); - for(int j = 0; j < i; j++) + for (int j = 0; j < i; j++) + { pthread_join(low->data_thread[j], NULL); + } #if LOW_INCLUDE_CARES_RESOLVER pthread_mutex_destroy(&low->resolvers_mutex); @@ -272,14 +276,16 @@ low_main_t *low_init() low->web_thread_done = low->web_thread_notinevents = false; #if !LOW_ESP32_LWIP_SPECIALITIES - if(pipe(low->web_thread_pipe) < 0) + if (pipe(low->web_thread_pipe) < 0) { pthread_mutex_lock(&low->data_thread_mutex); low->destroying = 1; pthread_cond_broadcast(&low->data_thread_cond); pthread_mutex_unlock(&low->data_thread_mutex); - for(int i = 0; i < LOW_NUM_DATA_THREADS; i++) + for (int i = 0; i < LOW_NUM_DATA_THREADS; i++) + { pthread_join(low->data_thread[i], NULL); + } #if LOW_INCLUDE_CARES_RESOLVER pthread_mutex_destroy(&low->resolvers_mutex); @@ -294,7 +300,7 @@ low_main_t *low_init() goto err; } #endif /* !LOW_ESP32_LWIP_SPECIALITIES */ - if(pthread_mutex_init(&low->web_thread_mutex, NULL) != 0) + if (pthread_mutex_init(&low->web_thread_mutex, NULL) != 0) { #if !LOW_ESP32_LWIP_SPECIALITIES close(low->web_thread_pipe[0]); @@ -304,8 +310,10 @@ low_main_t *low_init() low->destroying = 1; pthread_cond_broadcast(&low->data_thread_cond); pthread_mutex_unlock(&low->data_thread_mutex); - for(int i = 0; i < LOW_NUM_DATA_THREADS; i++) + for (int i = 0; i < LOW_NUM_DATA_THREADS; i++) + { pthread_join(low->data_thread[i], NULL); + } #if LOW_INCLUDE_CARES_RESOLVER pthread_mutex_destroy(&low->resolvers_mutex); @@ -320,7 +328,7 @@ low_main_t *low_init() goto err; } - if(pthread_cond_init(&low->web_thread_done_cond, NULL) != 0) + if (pthread_cond_init(&low->web_thread_done_cond, NULL) != 0) { #if !LOW_ESP32_LWIP_SPECIALITIES close(low->web_thread_pipe[0]); @@ -330,8 +338,10 @@ low_main_t *low_init() low->destroying = 1; pthread_cond_broadcast(&low->data_thread_cond); pthread_mutex_unlock(&low->data_thread_mutex); - for(int i = 0; i < LOW_NUM_DATA_THREADS; i++) + for (int i = 0; i < LOW_NUM_DATA_THREADS; i++) + { pthread_join(low->data_thread[i], NULL); + } #if LOW_INCLUDE_CARES_RESOLVER pthread_mutex_destroy(&low->resolvers_mutex); @@ -359,7 +369,7 @@ low_main_t *low_init() { fprintf(stderr, "failed to create web task, error code: %d\n", err); #else - if(pthread_create(&low->web_thread, NULL, low_web_thread_main, low) != 0) + if (pthread_create(&low->web_thread, NULL, low_web_thread_main, low) != 0) { close(low->web_thread_pipe[0]); close(low->web_thread_pipe[1]); @@ -368,8 +378,10 @@ low_main_t *low_init() low->destroying = 1; pthread_cond_broadcast(&low->data_thread_cond); pthread_mutex_unlock(&low->data_thread_mutex); - for(int i = 0; i < LOW_NUM_DATA_THREADS; i++) + for (int i = 0; i < LOW_NUM_DATA_THREADS; i++) + { pthread_join(low->data_thread[i], NULL); + } #if LOW_INCLUDE_CARES_RESOLVER pthread_mutex_destroy(&low->resolvers_mutex); @@ -390,7 +402,7 @@ low_main_t *low_init() low->fds[0] = new(low_new) LowSocket(low, 0); low->fds[1] = new(low_new) LowSocket(low, 1); low->fds[2] = new(low_new) LowSocket(low, 2); - if(!low->fds[0] || !low->fds[1] || !low->fds[2]) + if (!low->fds[0] || !low->fds[1] || !low->fds[2]) { low_destroy(low); return NULL; @@ -426,7 +438,7 @@ low_main_t *duk_get_low_context(duk_context *ctx) { duk_memory_functions funcs; duk_get_memory_functions(ctx, &funcs); - return (low_main_t *)funcs.udata; + return (low_main_t *) funcs.udata; } @@ -642,11 +654,12 @@ static duk_ret_t low_lib_init_safe(duk_context *ctx, void *udata) bool low_lib_init(low_main_t *low) { - if(duk_safe_call(low->duk_ctx, low_lib_init_safe, NULL, 0, 1) != - DUK_EXEC_SUCCESS) + if (duk_safe_call(low->duk_ctx, low_lib_init_safe, NULL, 0, 1) != DUK_EXEC_SUCCESS) { - if(!low->duk_flag_stop) + if (!low->duk_flag_stop) + { low_duk_print_error(low->duk_ctx); + } return false; } duk_pop(low->duk_ctx); @@ -661,8 +674,10 @@ void low_destroy(low_main_t *low) { #if !LOW_ESP32_LWIP_SPECIALITIES g_low_system.signal_pipe_fd = low->web_thread_pipe[1]; - if(g_low_system.signal_pipe_fd == low->web_thread_pipe[1]) + if (g_low_system.signal_pipe_fd == low->web_thread_pipe[1]) + { g_low_system.signal_pipe_fd = -1; + } low->destroying = true; low_web_thread_break(low); @@ -678,17 +693,25 @@ void low_destroy(low_main_t *low) pthread_cond_broadcast(&low->data_thread_cond); pthread_mutex_unlock(&low->data_thread_mutex); - for(int i = 0; i < LOW_NUM_DATA_THREADS; i++) + for (int i = 0; i < LOW_NUM_DATA_THREADS; i++) + { pthread_join(low->data_thread[i], NULL); + } // Then we close all FDs and delete all classes behind the callbacks - while(low->loop_callback_first) // before FDs important for LowDNSResolver! + while (low->loop_callback_first) + { // before FDs important for LowDNSResolver! delete low->loop_callback_first; - while(low->data_callback_first[0]) + } + while (low->data_callback_first[0]) + { delete low->data_callback_first[0]; - while(low->data_callback_first[1]) + } + while (low->data_callback_first[1]) + { delete low->data_callback_first[1]; - for(auto iter = low->fds.begin(); iter != low->fds.end();) + } + for (auto iter = low->fds.begin(); iter != low->fds.end();) { auto iter2 = iter; iter++; @@ -708,10 +731,12 @@ void low_destroy(low_main_t *low) pthread_mutex_destroy(&low->loop_thread_mutex); pthread_cond_destroy(&low->loop_thread_cond); - if(low->duk_ctx) + if (low->duk_ctx) + { duk_destroy_heap(low->duk_ctx); + } - // After finalizers.. they must not use DukTape heap! + // After finalizers.. they must not use DukTape heap! #if LOW_INCLUDE_CARES_RESOLVER for(int i = 0; i < low->resolvers.size(); i++) if(low->resolvers[i]) @@ -720,12 +745,20 @@ void low_destroy(low_main_t *low) pthread_mutex_destroy(&low->resolvers_mutex); #endif /* LOW_INCLUDE_CARES_RESOLVER */ - for(int i = 0; i < low->tlsContexts.size(); i++) - if(low->tlsContexts[i]) + for (int i = 0; i < low->tlsContexts.size(); i++) + { + if (low->tlsContexts[i]) + { delete low->tlsContexts[i]; - for(int i = 0; i < low->cryptoHashes.size(); i++) - if(low->cryptoHashes[i]) - delete low->cryptoHashes[i]; // TODO: also needed in restart? + } + } + for (int i = 0; i < low->cryptoHashes.size(); i++) + { + if (low->cryptoHashes[i]) + { + delete low->cryptoHashes[i]; + } + } // TODO: also needed in restart? pthread_mutex_destroy(&low->ref_mutex); low_free(low); @@ -738,24 +771,30 @@ void low_destroy(low_main_t *low) int low_add_stash(low_main_t *low, int index) { - if(low->duk_flag_stop) + if (low->duk_flag_stop) + { return 0; + } duk_context *ctx = low->duk_ctx; - if(duk_is_undefined(ctx, index)) + if (duk_is_undefined(ctx, index)) + { return 0; + } duk_push_heap_stash(ctx); duk_get_prop_string(ctx, -1, "low"); int stashIndex; - while(true) + while (true) { stashIndex = ++low->last_stash_index; - if(!stashIndex) + if (!stashIndex) + { stashIndex = ++low->last_stash_index; + } - if(!duk_get_prop_index(ctx, -1, stashIndex)) + if (!duk_get_prop_index(ctx, -1, stashIndex)) { duk_pop(ctx); break; @@ -776,8 +815,10 @@ int low_add_stash(low_main_t *low, int index) void low_remove_stash(low_main_t *low, int index) { - if(low->duk_flag_stop) + if (low->duk_flag_stop) + { return; + } duk_context *ctx = low->duk_ctx; duk_push_heap_stash(ctx); @@ -792,15 +833,19 @@ void low_remove_stash(low_main_t *low, int index) void low_push_stash(low_main_t *low, int index, bool remove) { - if(low->duk_flag_stop) + if (low->duk_flag_stop) + { return; + } duk_context *ctx = low->duk_ctx; duk_push_heap_stash(ctx); duk_get_prop_string(ctx, -1, "low"); duk_get_prop_index(ctx, -1, index); - if(remove) + if (remove) + { duk_del_prop_index(ctx, -2, index); + } duk_replace(ctx, -3); duk_pop(ctx); } @@ -811,13 +856,19 @@ void low_push_stash(low_main_t *low, int index, bool remove) void low_duk_print_error(duk_context *ctx) { - if(duk_is_error(ctx, -1)) + if (duk_is_error(ctx, -1)) { - if(duk_get_prop_string(ctx, -1, "stack")) + if (duk_get_prop_string(ctx, -1, "stack")) + { low_error(duk_safe_to_string(ctx, -1)); + } else + { low_error("JavaScript error with stack"); + } } else + { low_error("JavaScript error with without error object"); + } } \ No newline at end of file diff --git a/src/low_main.h b/src/low_main.h index 4ce94d8..6ef2b2d 100644 --- a/src/low_main.h +++ b/src/low_main.h @@ -21,80 +21,79 @@ using namespace std; class LowLoopCallback; + class LowDataCallback; + class LowFD; + class LowDNSResolver; + class LowTLSContext; + class LowCryptoHash; struct low_main_t { - uint8_t duk_flag_stop; - bool destroying; - duk_context *duk_ctx; - - int run_ref, last_stash_index; - int signal_call_id; - - map, - low_allocator>> - chores; - multimap, low_allocator>> - chore_times; - int last_chore_time; - - pthread_mutex_t loop_thread_mutex; - pthread_cond_t loop_thread_cond; - LowLoopCallback *loop_callback_first, *loop_callback_last; + uint8_t duk_flag_stop; + bool destroying; + duk_context *duk_ctx; + + int run_ref, last_stash_index; + int signal_call_id; + + map, low_allocator>> chores; + multimap, low_allocator>> chore_times; + int last_chore_time; + + pthread_mutex_t loop_thread_mutex; + pthread_cond_t loop_thread_cond; + LowLoopCallback *loop_callback_first, *loop_callback_last; #if LOW_ESP32_LWIP_SPECIALITIES - TaskHandle_t data_thread[LOW_NUM_DATA_THREADS]; - TaskHandle_t web_thread; + TaskHandle_t data_thread[LOW_NUM_DATA_THREADS]; + TaskHandle_t web_thread; #else - pthread_t data_thread[LOW_NUM_DATA_THREADS]; - pthread_t web_thread; + pthread_t data_thread[LOW_NUM_DATA_THREADS]; + pthread_t web_thread; #endif /* LOW_ESP32_LWIP_SPECIALITIES */ - bool data_thread_done; - pthread_mutex_t data_thread_mutex; - pthread_cond_t data_thread_cond, data_thread_done_cond; - LowDataCallback *data_callback_first[2], *data_callback_last[2]; + bool data_thread_done; + pthread_mutex_t data_thread_mutex; + pthread_cond_t data_thread_cond, data_thread_done_cond; + LowDataCallback *data_callback_first[2], *data_callback_last[2]; - pthread_mutex_t web_thread_mutex; - pthread_cond_t web_thread_done_cond; + pthread_mutex_t web_thread_mutex; + pthread_cond_t web_thread_done_cond; #if !LOW_ESP32_LWIP_SPECIALITIES - int web_thread_pipe[2]; + int web_thread_pipe[2]; #endif /* LOW_ESP32_LWIP_SPECIALITIES */ - LowFD *web_changed_first, *web_changed_last; - bool web_thread_done, web_thread_notinevents; + LowFD *web_changed_first, *web_changed_last; + bool web_thread_done, web_thread_notinevents; - map, low_allocator>> fds; + map, low_allocator >> fds; #if LOW_INCLUDE_CARES_RESOLVER - vector> resolvers; - int resolvers_active; - pthread_mutex_t resolvers_mutex; + vector> resolvers; + int resolvers_active; + pthread_mutex_t resolvers_mutex; #endif /* LOW_INCLUDE_CARES_RESOLVER */ - vector> tlsContexts; - vector> cryptoHashes; + vector> tlsContexts; + vector> cryptoHashes; - pthread_mutex_t ref_mutex; + pthread_mutex_t ref_mutex; #if LOW_ESP32_LWIP_SPECIALITIES - char *cwd; + char *cwd; #endif /* LOW_ESP32_LWIP_SPECIALITIES */ }; -extern "C" -{ - low_main_t *low_init(); - bool low_lib_init(low_main_t *low); - void low_destroy(low_main_t *low); +extern "C" { +low_main_t *low_init(); +bool low_lib_init(low_main_t *low); +void low_destroy(low_main_t *low); - duk_context *low_get_duk_context(low_main_t *low); - low_main_t *duk_get_low_context(duk_context *ctx); +duk_context *low_get_duk_context(low_main_t *low); +low_main_t *duk_get_low_context(duk_context *ctx); } #if LOW_ESP32_LWIP_SPECIALITIES @@ -102,7 +101,9 @@ bool low_reset(low_main_t *low); #endif /* LOW_ESP32_LWIP_SPECIALITIES */ int low_add_stash(low_main_t *low, int index); + void low_remove_stash(low_main_t *low, int index); + void low_push_stash(low_main_t *low, int index, bool remove); void low_duk_print_error(duk_context *duk); diff --git a/src/low_module.cpp b/src/low_module.cpp index 3a9c8dc..c2a8b32 100644 --- a/src/low_module.cpp +++ b/src/low_module.cpp @@ -58,11 +58,11 @@ void low_module_init(duk_context *ctx) static duk_ret_t low_module_make_native_safe(duk_context *ctx, void *udata) { - low_main_t *low = *(low_main_t **)udata; - char *name = (char *)(((void **)udata)[1]); - void (*setup_safe_cb)(low_main_t * main, void *data) = - (void (*)(low_main_t * main, void *data))(((void **)udata)[2]); - void *setup_safe_cb_data = ((void **)udata)[3]; + low_main_t *low = *(low_main_t **) udata; + char *name = (char *) (((void **) udata)[1]); + void (*setup_safe_cb)(low_main_t *main, void *data) = + (void (*)(low_main_t *main, void *data)) (((void **) udata)[2]); + void *setup_safe_cb_data = ((void **) udata)[3]; duk_push_object(ctx); // our new module! @@ -85,10 +85,8 @@ static duk_ret_t low_module_make_native_safe(duk_context *ctx, void *udata) duk_put_prop_string(ctx, -2, "children"); duk_push_object(ctx); - duk_put_prop_string(ctx, - -2, - "\xff" - "childrenMap"); + duk_put_prop_string(ctx, -2, "\xff" + "childrenMap"); // [... module] @@ -96,10 +94,8 @@ static duk_ret_t low_module_make_native_safe(duk_context *ctx, void *udata) duk_push_c_function(ctx, low_module_require, 1); duk_dup(ctx, -2); - duk_put_prop_string(ctx, - -2, - "\xff" - "module"); + duk_put_prop_string(ctx, -2, "\xff" + "module"); duk_push_string(ctx, "name"); duk_push_string(ctx, "require"); // this is used in call stack @@ -120,10 +116,8 @@ static duk_ret_t low_module_make_native_safe(duk_context *ctx, void *udata) duk_push_c_function(ctx, low_module_resolve, 2); duk_dup(ctx, -2); - duk_put_prop_string(ctx, - -2, - "\xff" - "module"); + duk_put_prop_string(ctx, -2, "\xff" + "module"); duk_push_string(ctx, "name"); duk_push_string(ctx, "resolve"); // this is used in call stack @@ -153,19 +147,16 @@ static duk_ret_t low_module_make_native_safe(duk_context *ctx, void *udata) return 0; } -bool low_module_make_native(low_main_t *low, - const char *name, - void (*setup_safe_cb)(low_main_t *main, void *data), +bool low_module_make_native(low_main_t *low, const char *name, void (*setup_safe_cb)(low_main_t *main, void *data), void *setup_safe_cb_data) { - void *data[4] = { - (void *)low, (void *)name, (void *)setup_safe_cb, setup_safe_cb_data}; - if(duk_safe_call( - low->duk_ctx, low_module_make_native_safe, (void *)data, 0, 1) != - DUK_EXEC_SUCCESS) + void *data[4] = {(void *) low, (void *) name, (void *) setup_safe_cb, setup_safe_cb_data}; + if (duk_safe_call(low->duk_ctx, low_module_make_native_safe, (void *) data, 0, 1) != DUK_EXEC_SUCCESS) { - if(!low->duk_flag_stop) // flag stop also produces error + if (!low->duk_flag_stop) + { // flag stop also produces error low_duk_print_error(low->duk_ctx); + } duk_pop(low->duk_ctx); return low->duk_flag_stop; @@ -183,16 +174,16 @@ bool neonious_start_result(const char *code); static duk_ret_t low_module_main_safe(duk_context *ctx, void *udata) { - char *path = (char *)udata; - if(path) + char *path = (char *) udata; + if (path) { - char *res_id = (char *)duk_push_fixed_buffer(ctx, 1024); - if(!low_module_resolve_c(ctx, path, ".", res_id)) + char *res_id = (char *) duk_push_fixed_buffer(ctx, 1024); + if (!low_module_resolve_c(ctx, path, ".", res_id)) { #if LOW_ESP32_LWIP_SPECIALITIES if(!neonious_start_result("FILE_NOT_FOUND")) #endif /* LOW_ESP32_LWIP_SPECIALITIES */ - duk_type_error(ctx, "cannot resolve module '%s'", path); + duk_type_error(ctx, "cannot resolve module '%s'", path); return 1; } @@ -202,7 +193,9 @@ static duk_ret_t low_module_main_safe(duk_context *ctx, void *udata) low_module_run(ctx, res_id, LOW_MODULE_FLAG_MAIN); } else + { low_module_run(ctx, "lib:main", LOW_MODULE_FLAG_MAIN); + } return 0; } @@ -214,18 +207,18 @@ bool low_module_main(low_main_t *low, const char *path) DUK_EXEC_SUCCESS) #else char path2[PATH_MAX]; - if(path) + if (path) + { realpath(path, path2); + } - if(duk_safe_call(low->duk_ctx, - low_module_main_safe, - (void *)(path ? path2 : NULL), - 0, - 1) != DUK_EXEC_SUCCESS) + if (duk_safe_call(low->duk_ctx, low_module_main_safe, (void *) (path ? path2 : NULL), 0, 1) != DUK_EXEC_SUCCESS) #endif /* LOW_ESP32_LWIP_SPECIALITIES */ { - if(!low->duk_flag_stop) // flag stop also produces error + if (!low->duk_flag_stop) + { // flag stop also produces error low_duk_print_error(low->duk_ctx); + } duk_pop(low->duk_ctx); return low->duk_flag_stop; @@ -246,8 +239,7 @@ bool get_data_block(const char *path, bool escapeZero = false); #endif /* LOW_ESP32_LWIP_SPECIALITIES */ - void - low_module_run(duk_context *ctx, const char *path, int flags) +void low_module_run(duk_context *ctx, const char *path, int flags) { unsigned char *data; int len; @@ -256,14 +248,19 @@ bool get_data_block(const char *path, bool isLib = memcmp(path, "lib:", 4) == 0; int fullLen = strlen(path); - for(len = fullLen; len >= 0; len--) - if(path[len] == '.') + for (len = fullLen; len >= 0; len--) + { + if (path[len] == '.') + { break; - if(fullLen - len == 5 && path[len] == '.' && (path[len + 1] == 'j' || path[len + 1] == 'J') && - (path[len + 2] == 's' || path[len + 2] == 'S') && - (path[len + 3] == 'o' || path[len + 3] == 'O') && - (path[len + 4] == 'n' || path[len + 4] == 'N')) + } + } + if (fullLen - len == 5 && path[len] == '.' && (path[len + 1] == 'j' || path[len + 1] == 'J') && + (path[len + 2] == 's' || path[len + 2] == 'S') && (path[len + 3] == 'o' || path[len + 3] == 'O') && + (path[len + 4] == 'n' || path[len + 4] == 'N')) + { flags |= LOW_MODULE_FLAG_JSON; + } #if LOW_ESP32_LWIP_SPECIALITIES char *txt; @@ -331,14 +328,18 @@ bool get_data_block(const char *path, } #else int fd; - if(isLib) + if (isLib) { - if(len > 1000) + if (len > 1000) + { goto cantLoad; + } - char *txt = (char *)low_alloc(1024); - if(!txt) + char *txt = (char *) low_alloc(1024); + if (!txt) + { goto cantLoad; + } sprintf(txt, "%s%s.low", g_low_system.lib_path, path + 4); flags |= LOW_MODULE_FLAG_DUK_FORMAT; @@ -347,24 +348,28 @@ bool get_data_block(const char *path, low_free(txt); } else + { fd = open(path, O_RDONLY); - if(fd < 0) + } + if (fd < 0) + { duk_type_error(ctx, "cannot find module '%s'", path); + } - if(fstat(fd, &st) < 0) + if (fstat(fd, &st) < 0) { close(fd); goto cantLoad; } len = st.st_size; // TODO: use buffer object so we no longer have a memory - // leak! - data = (unsigned char *)low_alloc(len); - if(!data) + // leak! + data = (unsigned char *) low_alloc(len); + if (!data) { close(fd); goto cantLoad; } - if(read(fd, data, len) != len) + if (read(fd, data, len) != len) { low_free(data); close(fd); @@ -375,12 +380,12 @@ bool get_data_block(const char *path, duk_push_object(ctx); // our new module! - if(flags & LOW_MODULE_FLAG_MAIN) + if (flags & LOW_MODULE_FLAG_MAIN) { duk_dup(ctx, -1); duk_put_prop_string(ctx, -2, "main"); } - else if(!(flags & LOW_MODULE_FLAG_GLOBAL)) + else if (!(flags & LOW_MODULE_FLAG_GLOBAL)) { duk_get_prop_string(ctx, -2, "main"); duk_put_prop_string(ctx, -2, "main"); @@ -394,12 +399,16 @@ bool get_data_block(const char *path, duk_put_prop_string(ctx, -3, "filename"); duk_put_prop_string(ctx, -2, "id"); - if(!(flags & LOW_MODULE_FLAG_JSON)) + if (!(flags & LOW_MODULE_FLAG_JSON)) { - if(flags & LOW_MODULE_FLAG_GLOBAL) + if (flags & LOW_MODULE_FLAG_GLOBAL) + { duk_push_global_object(ctx); + } else + { duk_push_object(ctx); + } duk_put_prop_string(ctx, -2, "exports"); } @@ -413,10 +422,8 @@ bool get_data_block(const char *path, duk_put_prop_string(ctx, -2, "children"); duk_push_object(ctx); - duk_put_prop_string(ctx, - -2, - "\xff" - "childrenMap"); + duk_put_prop_string(ctx, -2, "\xff" + "childrenMap"); // [... module] @@ -424,10 +431,8 @@ bool get_data_block(const char *path, duk_push_c_function(ctx, low_module_require, 1); duk_dup(ctx, -2); - duk_put_prop_string(ctx, - -2, - "\xff" - "module"); + duk_put_prop_string(ctx, -2, "\xff" + "module"); duk_push_string(ctx, "name"); duk_push_string(ctx, "require"); // this is used in call stack @@ -448,10 +453,8 @@ bool get_data_block(const char *path, duk_push_c_function(ctx, low_module_resolve, 1); duk_dup(ctx, -3); - duk_put_prop_string(ctx, - -2, - "\xff" - "module"); + duk_put_prop_string(ctx, -2, "\xff" + "module"); duk_push_string(ctx, "name"); duk_push_string(ctx, "resolve"); // this is used in call stack @@ -462,26 +465,27 @@ bool get_data_block(const char *path, duk_get_prop_string(ctx, -2, "main"); duk_put_prop_string(ctx, -2, "main"); - if(!isLib && !(flags & LOW_MODULE_FLAG_JSON)) // security problem + if (!isLib && !(flags & LOW_MODULE_FLAG_JSON)) + { // security problem duk_put_prop_string(ctx, -2, "require"); + } // [... module [require]] - if(!(flags & LOW_MODULE_FLAG_GLOBAL)) + if (!(flags & LOW_MODULE_FLAG_GLOBAL)) { // Cache module duk_push_heap_stash(ctx); - duk_get_prop_string( - ctx, -1, memcmp(path, "lib:", 4) == 0 ? "lib_modules" : "modules"); + duk_get_prop_string(ctx, -1, memcmp(path, "lib:", 4) == 0 ? "lib_modules" : "modules"); duk_dup(ctx, !isLib && !(flags & LOW_MODULE_FLAG_JSON) ? -3 : -4); duk_put_prop_string(ctx, -2, path); duk_pop_2(ctx); } - if(flags & LOW_MODULE_FLAG_JSON) + if (flags & LOW_MODULE_FLAG_JSON) { - duk_push_lstring(ctx, (char *)data, len); + duk_push_lstring(ctx, (char *) data, len); low_free(data); duk_json_decode(ctx, -1); @@ -491,11 +495,9 @@ bool get_data_block(const char *path, } else { - if(flags & LOW_MODULE_FLAG_DUK_FORMAT) + if (flags & LOW_MODULE_FLAG_DUK_FORMAT) { - memcpy(duk_push_fixed_buffer(ctx, len), - data, - len); // TODO: remove copy + memcpy(duk_push_fixed_buffer(ctx, len), data, len); // TODO: remove copy low_free(data); duk_load_function(ctx); } @@ -503,12 +505,9 @@ bool get_data_block(const char *path, { // TODO: remove concat bool shebang = len >= 2 && data[0] == '#' && data[1] == '!'; - duk_push_string( - ctx, - shebang - ? "function(exports,require,module,__filename,__dirname){//" - : "function(exports,require,module,__filename,__dirname){"); - duk_push_lstring(ctx, (char *)data, len); + duk_push_string(ctx, shebang ? "function(exports,require,module,__filename,__dirname){//" + : "function(exports,require,module,__filename,__dirname){"); + duk_push_lstring(ctx, (char *) data, len); low_free(data); duk_push_string(ctx, "\n}"); /* Newline allows module last line to contain a // comment. */ @@ -522,19 +521,25 @@ bool get_data_block(const char *path, /* call the function wrapper */ duk_get_prop_string(ctx, isLib ? -3 : -2, "exports"); /* exports */ - if(isLib) + if (isLib) { duk_dup(ctx, -3); /* require */ duk_remove(ctx, -4); } else - duk_get_prop_string(ctx, -3, "require"); /* require */ + { + duk_get_prop_string(ctx, -3, "require"); + } /* require */ duk_dup(ctx, -4); /* module */ duk_push_string(ctx, path); /* __filename */ - for(len = strlen(path) - 1; len > 0; len--) - if(path[len] == '/') + for (len = strlen(path) - 1; len > 0; len--) + { + if (path[len] == '/') + { break; + } + } duk_push_lstring(ctx, path, len == -1 ? 0 : len); /* __dirname */ duk_call(ctx, 5); @@ -559,51 +564,53 @@ bool get_data_block(const char *path, duk_ret_t low_module_require(duk_context *ctx) { - char *res_id = (char *)duk_push_fixed_buffer(ctx, 1024); + char *res_id = (char *) duk_push_fixed_buffer(ctx, 1024); const char *id = duk_require_string(ctx, 0); // Get parent ID duk_push_current_function(ctx); - duk_get_prop_string(ctx, - -1, - "\xff" - "module"); + duk_get_prop_string(ctx, -1, "\xff" + "module"); duk_remove(ctx, -2); const char *parent_id; int popCount = 0; - while(true) + while (true) { duk_get_prop_string(ctx, -1, "filename"); parent_id = duk_get_string(ctx, -1); duk_pop(ctx); - if(parent_id) + if (parent_id) + { break; + } // If a module does not have a filename (vm.createContext), then try // parent popCount++; - if(!duk_get_prop_string(ctx, -1, "parent")) + if (!duk_get_prop_string(ctx, -1, "parent")) + { break; + } } - while(popCount--) + while (popCount--) + { duk_pop(ctx); + } // We always resolve with our own function - if(!low_module_resolve_c(ctx, id, parent_id, res_id)) + if (!low_module_resolve_c(ctx, id, parent_id, res_id)) { - duk_type_error( - ctx, "cannot resolve module '%s', parent '%s'", id, parent_id); + duk_type_error(ctx, "cannot resolve module '%s', parent '%s'", id, parent_id); return 1; } // Try to find in cache duk_push_heap_stash(ctx); - duk_get_prop_string( - ctx, -1, memcmp(res_id, "lib:", 4) == 0 ? "lib_modules" : "modules"); - if(duk_get_prop_string(ctx, -1, res_id)) + duk_get_prop_string(ctx, -1, memcmp(res_id, "lib:", 4) == 0 ? "lib_modules" : "modules"); + if (duk_get_prop_string(ctx, -1, res_id)) { duk_remove(ctx, -2); duk_remove(ctx, -2); @@ -619,14 +626,14 @@ duk_ret_t low_module_require(duk_context *ctx) // [ id parent module ] - if(memcmp(parent_id, "lib:", 4) != 0) // security check + if (memcmp(parent_id, "lib:", 4) != 0) // security check { - duk_get_prop_string(ctx, - -2, - "\xff" - "childrenMap"); - if(duk_get_prop_string(ctx, -1, res_id)) + duk_get_prop_string(ctx, -2, "\xff" + "childrenMap"); + if (duk_get_prop_string(ctx, -1, res_id)) + { duk_pop_2(ctx); + } else { duk_push_boolean(ctx, true); @@ -652,47 +659,50 @@ duk_ret_t low_module_require(duk_context *ctx) duk_ret_t low_module_resolve(duk_context *ctx) { - char *res_id = (char *)duk_push_fixed_buffer(ctx, 1024); + char *res_id = (char *) duk_push_fixed_buffer(ctx, 1024); const char *id = duk_require_string(ctx, 0); // Get parent ID duk_push_current_function(ctx); - duk_get_prop_string(ctx, - -1, - "\xff" - "module"); + duk_get_prop_string(ctx, -1, "\xff" + "module"); duk_remove(ctx, -2); const char *parent_id; int popCount = 1; - while(true) + while (true) { duk_get_prop_string(ctx, -1, "filename"); parent_id = duk_get_string(ctx, -1); duk_pop(ctx); - if(parent_id) + if (parent_id) + { break; + } // If a module does not have a filename (vm.createContext), then try // parent popCount++; - if(!duk_get_prop_string(ctx, -1, "parent")) + if (!duk_get_prop_string(ctx, -1, "parent")) + { break; + } } - while(popCount--) + while (popCount--) + { duk_pop(ctx); + } - if(low_module_resolve_c(ctx, id, parent_id, res_id)) + if (low_module_resolve_c(ctx, id, parent_id, res_id)) { duk_push_string(ctx, res_id); return 1; } else { - duk_type_error( - ctx, "cannot resolve module '%s', parent '%s'", id, parent_id); + duk_type_error(ctx, "cannot resolve module '%s', parent '%s'", id, parent_id); return 1; } } @@ -730,10 +740,8 @@ duk_ret_t low_module_make(duk_context *ctx) duk_put_prop_string(ctx, -2, "children"); duk_push_object(ctx); - duk_put_prop_string(ctx, - -2, - "\xff" - "childrenMap"); + duk_put_prop_string(ctx, -2, "\xff" + "childrenMap"); // [... module] @@ -741,10 +749,8 @@ duk_ret_t low_module_make(duk_context *ctx) duk_push_c_function(ctx, low_module_require, 1); duk_dup(ctx, -2); - duk_put_prop_string(ctx, - -2, - "\xff" - "module"); + duk_put_prop_string(ctx, -2, "\xff" + "module"); duk_push_string(ctx, "name"); duk_push_string(ctx, "require"); // this is used in call stack @@ -765,10 +771,8 @@ duk_ret_t low_module_make(duk_context *ctx) duk_push_c_function(ctx, low_module_resolve, 2); duk_dup(ctx, -2); - duk_put_prop_string(ctx, - -2, - "\xff" - "module"); + duk_put_prop_string(ctx, -2, "\xff" + "module"); duk_push_string(ctx, "name"); duk_push_string(ctx, "resolve"); // this is used in call stack @@ -795,17 +799,13 @@ duk_ret_t low_module_make(duk_context *ctx) // result must be min 1024 bytes // ----------------------------------------------------------------------------- -bool low_module_resolve_c(duk_context *ctx, - const char *module_id, - const char *parent_id, - char *res_id) +bool low_module_resolve_c(duk_context *ctx, const char *module_id, const char *parent_id, char *res_id) { struct stat st; // lib: may get native - if(strcmp(module_id, "native") == 0 && parent_id && - (memcmp(parent_id, "lib:", 4) == 0 || - memcmp(parent_id, "module:", 7) == 0)) + if (strcmp(module_id, "native") == 0 && parent_id && + (memcmp(parent_id, "lib:", 4) == 0 || memcmp(parent_id, "module:", 7) == 0)) { strcpy(res_id, "lib:native"); return true; @@ -813,20 +813,21 @@ bool low_module_resolve_c(duk_context *ctx, bool is_not_absolute_path = false; int i; - for(i = 0; module_id[i]; i++) - if(module_id[i] == '.') + for (i = 0; module_id[i]; i++) + { + if (module_id[i] == '.') { is_not_absolute_path = true; break; } - if(!is_not_absolute_path && i < 1000 && strcmp(module_id, "init") != 0 && - strcmp(module_id, "main") != 0) + } + if (!is_not_absolute_path && i < 1000 && strcmp(module_id, "init") != 0 && strcmp(module_id, "main") != 0) { sprintf(res_id, "lib:%s", module_id); duk_push_heap_stash(ctx); duk_get_prop_string(ctx, -1, "lib_modules"); - if(duk_get_prop_string(ctx, -1, res_id)) + if (duk_get_prop_string(ctx, -1, res_id)) { duk_pop_3(ctx); return true; @@ -835,38 +836,44 @@ bool low_module_resolve_c(duk_context *ctx, // system module sprintf(res_id, "%s%s.low", g_low_system.lib_path, module_id); - if(stat(res_id, &st) == 0) + if (stat(res_id, &st) == 0) { sprintf(res_id, "lib:%s", module_id); return true; } } - if(!parent_id || memcmp(parent_id, "lib:", 4) == 0) + if (!parent_id || memcmp(parent_id, "lib:", 4) == 0) + { return false; + } const char *parent_end = NULL; - while(true) + while (true) { - if(!parent_end) + if (!parent_end) { // For next start parent_end = parent_id + strlen(parent_id); - if(!((module_id[0] == '.' && module_id[1] == '/') || - (module_id[0] == '/') || - (module_id[0] == '.' && module_id[1] == '.' && - module_id[2] == '/'))) + if (!((module_id[0] == '.' && module_id[1] == '/') || (module_id[0] == '/') || + (module_id[0] == '.' && module_id[1] == '.' && module_id[2] == '/'))) + { continue; + } low_fs_resolve(res_id, 1024, parent_id, module_id); } else { // Go through node_modules - while(parent_id != parent_end && parent_end[-1] != '/') + while (parent_id != parent_end && parent_end[-1] != '/') + { parent_end--; - if(parent_id == parent_end) + } + if (parent_id == parent_end) + { return false; + } low_fs_resolve(res_id, 1024, parent_id, module_id, parent_end); parent_end--; @@ -878,15 +885,17 @@ bool low_module_resolve_c(duk_context *ctx, #endif /* LOW_ESP32_LWIP_SPECIALITIES */ bool isFolder = path[-1] == '/'; - if(isFolder) + if (isFolder) + { path--; + } - if(!isFolder) + if (!isFolder) { // LOAD_AS_FILE path[0] = 0; - if(stat(res_id, &st) == 0 && S_ISREG(st.st_mode)) + if (stat(res_id, &st) == 0 && S_ISREG(st.st_mode)) { #if LOW_ESP32_LWIP_SPECIALITIES memmove(res_id, start, path + 1 - start); @@ -894,10 +903,12 @@ bool low_module_resolve_c(duk_context *ctx, return true; } - if(path + 3 - res_id >= 1024) + if (path + 3 - res_id >= 1024) + { return false; + } strcpy(path, ".js"); - if(stat(res_id, &st) == 0 && S_ISREG(st.st_mode)) + if (stat(res_id, &st) == 0 && S_ISREG(st.st_mode)) { #if LOW_ESP32_LWIP_SPECIALITIES memmove(res_id, start, path + 4 - start); @@ -905,10 +916,12 @@ bool low_module_resolve_c(duk_context *ctx, return true; } - if(path + 5 - res_id >= 1024) + if (path + 5 - res_id >= 1024) + { return false; + } strcpy(path, ".json"); - if(stat(res_id, &st) == 0 && S_ISREG(st.st_mode)) + if (stat(res_id, &st) == 0 && S_ISREG(st.st_mode)) { #if LOW_ESP32_LWIP_SPECIALITIES memmove(res_id, start, path + 6 - start); @@ -919,20 +932,24 @@ bool low_module_resolve_c(duk_context *ctx, // LOAD_AS_DIRECTORY - if(path + 13 - res_id >= 1024) + if (path + 13 - res_id >= 1024) + { return false; + } strcpy(path, "/package.json"); - if(stat(res_id, &st) == 0 && S_ISREG(st.st_mode)) + if (stat(res_id, &st) == 0 && S_ISREG(st.st_mode)) { int len = st.st_size; void *data = duk_push_buffer(ctx, len, false); int fd = open(res_id, O_RDONLY); - if(fd < 0) + if (fd < 0) + { return false; + } - if(read(fd, data, len) != len) + if (read(fd, data, len) != len) { close(fd); duk_pop(ctx); @@ -944,12 +961,12 @@ bool low_module_resolve_c(duk_context *ctx, duk_buffer_to_string(ctx, -1); duk_json_decode(ctx, -1); - if(duk_get_prop_string(ctx, -1, "main")) + if (duk_get_prop_string(ctx, -1, "main")) { const char *str = duk_get_string(ctx, -1); len = strlen(str); - char *res_id2 = (char *)duk_push_buffer(ctx, 1024, false); + char *res_id2 = (char *) duk_push_buffer(ctx, 1024, false); low_fs_resolve(res_id2, 1024, res_id, str); char *path = res_id2 + strlen(res_id2); @@ -960,51 +977,61 @@ bool low_module_resolve_c(duk_context *ctx, #endif /* LOW_ESP32_LWIP_SPECIALITIES */ bool isFolder = path[-1] == '/'; - if(isFolder) + if (isFolder) + { path--; + } path[0] = 0; - if(stat(res_id2, &st) == 0 && S_ISREG(st.st_mode)) + if (stat(res_id2, &st) == 0 && S_ISREG(st.st_mode)) { memmove(res_id, start, path + 1 - start); duk_pop_3(ctx); return true; } - if(path + 3 - res_id2 >= 1024) + if (path + 3 - res_id2 >= 1024) + { return false; + } strcpy(path, ".js"); - if(stat(res_id2, &st) == 0 && S_ISREG(st.st_mode)) + if (stat(res_id2, &st) == 0 && S_ISREG(st.st_mode)) { memmove(res_id, start, path + 4 - start); duk_pop_3(ctx); return true; } - if(path + 5 - res_id2 >= 1024) + if (path + 5 - res_id2 >= 1024) + { return false; + } strcpy(path, ".json"); - if(stat(res_id2, &st) == 0 && S_ISREG(st.st_mode)) + if (stat(res_id2, &st) == 0 && S_ISREG(st.st_mode)) { memmove(res_id, start, path + 6 - start); duk_pop_3(ctx); return true; } - if(path + 9 - res_id2 >= 1024) + if (path + 9 - res_id2 >= 1024) + { return false; + } strcpy(path, "/index.js"); - if(stat(res_id2, &st) == 0 && S_ISREG(st.st_mode)) + if (stat(res_id2, &st) == 0 && S_ISREG(st.st_mode)) { memmove(res_id, start, path + 10 - start); duk_pop_3(ctx); return true; } - if(path + 11 - res_id2 >= 1024) + if (path + 11 - res_id2 >= 1024) + { return false; + } strcpy(path, "/index.json"); - if(stat(res_id2, &st) == 0 && S_ISREG(st.st_mode)) + if (stat(res_id2, &st) == 0 && S_ISREG(st.st_mode)) { memmove(res_id, start, path + 12 - start); duk_pop_3(ctx); @@ -1014,13 +1041,17 @@ bool low_module_resolve_c(duk_context *ctx, duk_pop_3(ctx); } else + { duk_pop_2(ctx); + } } - if(path + 9 - res_id >= 1024) + if (path + 9 - res_id >= 1024) + { return false; + } strcpy(path, "/index.js"); - if(stat(res_id, &st) == 0 && S_ISREG(st.st_mode)) + if (stat(res_id, &st) == 0 && S_ISREG(st.st_mode)) { #if LOW_ESP32_LWIP_SPECIALITIES memmove(res_id, start, path + 10 - start); @@ -1028,10 +1059,12 @@ bool low_module_resolve_c(duk_context *ctx, return true; } - if(path + 11 - res_id >= 1024) + if (path + 11 - res_id >= 1024) + { return false; + } strcpy(path, "/index.json"); - if(stat(res_id, &st) == 0 && S_ISREG(st.st_mode)) + if (stat(res_id, &st) == 0 && S_ISREG(st.st_mode)) { #if LOW_ESP32_LWIP_SPECIALITIES memmove(res_id, start, path + 12 - start); diff --git a/src/low_module.h b/src/low_module.h index 2c25e97..9eff32e 100644 --- a/src/low_module.h +++ b/src/low_module.h @@ -17,22 +17,19 @@ struct low_main_t; void low_module_init(duk_context *ctx); -extern "C" bool low_module_make_native(low_main_t *low, - const char *name, - void (*setup_safe_cb)(low_main_t *main, - void *data), - void *cb_data); +extern "C" bool +low_module_make_native(low_main_t *low, const char *name, void (*setup_safe_cb)(low_main_t *main, void *data), + void *cb_data); extern "C" bool low_module_main(low_main_t *low, const char *path); void low_module_run(duk_context *ctx, const char *path, int flags); duk_ret_t low_module_require(duk_context *ctx); + duk_ret_t low_module_resolve(duk_context *ctx); + duk_ret_t low_module_make(duk_context *ctx); -bool low_module_resolve_c(duk_context *ctx, - const char *module_id, - const char *parent_id, - char *res_id); +bool low_module_resolve_c(duk_context *ctx, const char *module_id, const char *parent_id, char *res_id); #endif /* __LOW_MODULE_H__ */ \ No newline at end of file diff --git a/src/low_native.cpp b/src/low_native.cpp index 6a58e24..19b031d 100644 --- a/src/low_native.cpp +++ b/src/low_native.cpp @@ -15,61 +15,60 @@ #include "low_tls.h" // The methods of the module 'native', accessable by files in lib_js directory -duk_function_list_entry g_low_native_methods[] = { - {"processInfo", low_process_info, 2}, - {"ttyInfo", low_tty_info, 0}, - {"hrtime", low_hrtime, 1}, - {"compile", low_compile, 1}, - {"runInContext", low_run_in_context, 4}, - {"compare", low_compare, 2}, - {"setChore", low_loop_set_chore, 3}, - {"clearChore", low_loop_clear_chore, 1}, - {"choreRef", low_loop_chore_ref, 2}, - {"runRef", low_loop_run_ref, 1}, - {"open", low_fs_open, 4}, - {"openSync", low_fs_open_sync, 3}, - {"close", low_fs_close, 2}, - {"closeSync", low_fs_close_sync, 1}, - {"read", low_fs_read, 6}, - {"write", low_fs_write, 6}, - {"fstat", low_fs_fstat, 2}, - {"stat", low_fs_stat, 2}, - {"rename", low_fs_rename, 3}, - {"unlink", low_fs_unlink, 2}, - {"access", low_fs_access, 3}, - {"readdir", low_fs_readdir, 3}, - {"mkdir", low_fs_mkdir, 3}, - {"rmdir", low_fs_rmdir, 2}, - {"statSync", low_fs_stat_sync, 1}, - {"renameSync", low_fs_rename_sync, 2}, - {"unlinkSync", low_fs_unlink_sync, 1}, - {"accessSync", low_fs_access_sync, 2}, - {"readdirSync", low_fs_readdir_sync, 2}, - {"mkdirSync", low_fs_mkdir_sync, 2}, - {"rmdirSync", low_fs_rmdir_sync, 1}, - {"waitDone", low_fs_waitdone, 1}, - {"file_pos", low_fs_file_pos, 1}, - {"listen", low_net_listen, 7}, - {"connect", low_net_connect, 5}, - {"setsockopt", low_net_setsockopt, 5}, - {"shutdown", low_net_shutdown, 2}, - {"isIP", low_is_ip, 1}, - {"lookup", low_dns_lookup, 4}, - {"lookupService", low_dns_lookup_service, 3}, - {"newResolver", low_dns_new_resolver, 1}, - {"resolverCancel", low_dns_resolver_cancel, 1}, - {"resolverGetServers", low_dns_resolver_get_servers, 1}, - {"resolverSetServers", low_dns_resolver_set_servers, 2}, - {"resolverResolve", low_dns_resolver_resolve, 5}, - {"resolverGetHostByAddr", low_dns_resolver_gethostbyaddr, 3}, - {"httpGetRequest", low_http_get_request, 2}, - {"httpDetach", low_http_detach, 1}, - {"httpRead", low_http_read, 3}, - {"httpWrite", low_http_write, 3}, - {"httpWriteHead", low_http_write_head, 4}, - {"createTLSContext", low_tls_create_context, 1}, - {"makeModule", low_module_make, 2}, - {"createCryptoHash", low_crypto_create_hash, 3}, - {"cryptoHashUpdate", low_crypto_hash_update, 2}, - {"cryptoHashDigest", low_crypto_hash_digest, 1}, - {NULL, NULL, 0}}; +duk_function_list_entry g_low_native_methods[] = {{"processInfo", low_process_info, 2}, + {"ttyInfo", low_tty_info, 0}, + {"hrtime", low_hrtime, 1}, + {"compile", low_compile, 1}, + {"runInContext", low_run_in_context, 4}, + {"compare", low_compare, 2}, + {"setChore", low_loop_set_chore, 3}, + {"clearChore", low_loop_clear_chore, 1}, + {"choreRef", low_loop_chore_ref, 2}, + {"runRef", low_loop_run_ref, 1}, + {"open", low_fs_open, 4}, + {"openSync", low_fs_open_sync, 3}, + {"close", low_fs_close, 2}, + {"closeSync", low_fs_close_sync, 1}, + {"read", low_fs_read, 6}, + {"write", low_fs_write, 6}, + {"fstat", low_fs_fstat, 2}, + {"stat", low_fs_stat, 2}, + {"rename", low_fs_rename, 3}, + {"unlink", low_fs_unlink, 2}, + {"access", low_fs_access, 3}, + {"readdir", low_fs_readdir, 3}, + {"mkdir", low_fs_mkdir, 3}, + {"rmdir", low_fs_rmdir, 2}, + {"statSync", low_fs_stat_sync, 1}, + {"renameSync", low_fs_rename_sync, 2}, + {"unlinkSync", low_fs_unlink_sync, 1}, + {"accessSync", low_fs_access_sync, 2}, + {"readdirSync", low_fs_readdir_sync, 2}, + {"mkdirSync", low_fs_mkdir_sync, 2}, + {"rmdirSync", low_fs_rmdir_sync, 1}, + {"waitDone", low_fs_waitdone, 1}, + {"file_pos", low_fs_file_pos, 1}, + {"listen", low_net_listen, 7}, + {"connect", low_net_connect, 5}, + {"setsockopt", low_net_setsockopt, 5}, + {"shutdown", low_net_shutdown, 2}, + {"isIP", low_is_ip, 1}, + {"lookup", low_dns_lookup, 4}, + {"lookupService", low_dns_lookup_service, 3}, + {"newResolver", low_dns_new_resolver, 1}, + {"resolverCancel", low_dns_resolver_cancel, 1}, + {"resolverGetServers", low_dns_resolver_get_servers, 1}, + {"resolverSetServers", low_dns_resolver_set_servers, 2}, + {"resolverResolve", low_dns_resolver_resolve, 5}, + {"resolverGetHostByAddr", low_dns_resolver_gethostbyaddr, 3}, + {"httpGetRequest", low_http_get_request, 2}, + {"httpDetach", low_http_detach, 1}, + {"httpRead", low_http_read, 3}, + {"httpWrite", low_http_write, 3}, + {"httpWriteHead", low_http_write_head, 4}, + {"createTLSContext", low_tls_create_context, 1}, + {"makeModule", low_module_make, 2}, + {"createCryptoHash", low_crypto_create_hash, 3}, + {"cryptoHashUpdate", low_crypto_hash_update, 2}, + {"cryptoHashDigest", low_crypto_hash_digest, 1}, + {NULL, NULL, 0}}; diff --git a/src/low_native_aux.cpp b/src/low_native_aux.cpp index 5ce12e1..10f6854 100644 --- a/src/low_native_aux.cpp +++ b/src/low_native_aux.cpp @@ -1,4 +1,3 @@ - // ----------------------------------------------------------------------------- // low_native_aux.cpp // ----------------------------------------------------------------------------- @@ -22,15 +21,21 @@ duk_ret_t low_compare(duk_context *ctx) { duk_size_t a_len, b_len; - unsigned char *a = (unsigned char *)duk_require_buffer_data(ctx, 0, &a_len); - unsigned char *b = (unsigned char *)duk_require_buffer_data(ctx, 1, &b_len); + unsigned char *a = (unsigned char *) duk_require_buffer_data(ctx, 0, &a_len); + unsigned char *b = (unsigned char *) duk_require_buffer_data(ctx, 1, &b_len); - if(a_len < b_len) + if (a_len < b_len) + { duk_push_int(ctx, -1); - else if(a_len > b_len) + } + else if (a_len > b_len) + { duk_push_int(ctx, 1); + } else + { duk_push_int(ctx, memcmp(a, b, a_len)); + } return 1; } @@ -43,9 +48,9 @@ duk_ret_t low_is_ip(duk_context *ctx) const char *ip = duk_require_string(ctx, 0); bool isIPv4 = false; - for(int i = 0; ip[i]; i++) + for (int i = 0; ip[i]; i++) { - if(ip[i] == '.') + if (ip[i] == '.') { isIPv4 = true; break; @@ -53,7 +58,7 @@ duk_ret_t low_is_ip(duk_context *ctx) } unsigned char buf[16]; - if(inet_pton(isIPv4 ? AF_INET : AF_INET6, ip, buf) != 1) + if (inet_pton(isIPv4 ? AF_INET : AF_INET6, ip, buf) != 1) { duk_push_int(ctx, 0); return 1; @@ -103,8 +108,7 @@ duk_ret_t low_run_in_context(duk_context *ctx) duk_set_global_object(low->duk_ctx); duk_dup(low->duk_ctx, 0); - if(duk_safe_call(low->duk_ctx, low_run_in_context_safe, NULL, 1, 1) != - DUK_EXEC_SUCCESS) + if (duk_safe_call(low->duk_ctx, low_run_in_context_safe, NULL, 1, 1) != DUK_EXEC_SUCCESS) { duk_dup(low->duk_ctx, 4); duk_set_global_object(low->duk_ctx); diff --git a/src/low_native_aux.h b/src/low_native_aux.h index 43f9229..7ed0e1c 100644 --- a/src/low_native_aux.h +++ b/src/low_native_aux.h @@ -1,4 +1,3 @@ - // ----------------------------------------------------------------------------- // low_native_aux.cpp // ----------------------------------------------------------------------------- @@ -9,9 +8,11 @@ #include "duktape.h" duk_ret_t low_compare(duk_context *ctx); + duk_ret_t low_is_ip(duk_context *ctx); duk_ret_t low_compile(duk_context *ctx); + duk_ret_t low_run_in_context(duk_context *ctx); #endif /* __LOW_NATIVE_AUX_H__ */ \ No newline at end of file diff --git a/src/low_net.cpp b/src/low_net.cpp index 6c0d6b6..e4392cd 100644 --- a/src/low_net.cpp +++ b/src/low_net.cpp @@ -34,14 +34,15 @@ duk_ret_t low_net_listen(duk_context *ctx) bool isHTTP = duk_require_boolean(ctx, 3); LowTLSContext *tlsContext = NULL; - if(duk_is_object(ctx, 4)) + if (duk_is_object(ctx, 4)) { duk_get_prop_string(ctx, 4, "_index"); int index = duk_require_int(ctx, -1); - if(index < 0 || index >= low->tlsContexts.size() || - !low->tlsContexts[index]) + if (index < 0 || index >= low->tlsContexts.size() || !low->tlsContexts[index]) + { duk_reference_error(ctx, "tls context not found"); + } tlsContext = low->tlsContexts[index]; } @@ -57,10 +58,10 @@ duk_ret_t low_net_listen(duk_context *ctx) } else #endif /* LOW_HAS_UNIX_SOCKET */ - addrLen = family == 4 ? sizeof(sockaddr_in) : sizeof(sockaddr_in6); + addrLen = family == 4 ? sizeof(sockaddr_in) : sizeof(sockaddr_in6); unsigned char addrBuf[addrLen]; - sockaddr *addr = (sockaddr *)addrBuf; + sockaddr *addr = (sockaddr *) addrBuf; memset(addr, 0, addrLen); #if LOW_HAS_UNIX_SOCKET @@ -75,12 +76,12 @@ duk_ret_t low_net_listen(duk_context *ctx) #endif /* LOW_HAS_UNIX_SOCKET */ { int port = duk_require_int(ctx, 2); - if(family == 4) + if (family == 4) { - sockaddr_in *addr_in = (sockaddr_in *)addr; + sockaddr_in *addr_in = (sockaddr_in *) addr; addr_in->sin_family = AF_INET; - if(inet_pton(AF_INET, address, &addr_in->sin_addr) != 1) + if (inet_pton(AF_INET, address, &addr_in->sin_addr) != 1) { int err = errno; duk_dup(low->duk_ctx, 5); @@ -92,10 +93,10 @@ duk_ret_t low_net_listen(duk_context *ctx) } else { - sockaddr_in6 *addr_in6 = (sockaddr_in6 *)addr; + sockaddr_in6 *addr_in6 = (sockaddr_in6 *) addr; addr_in6->sin6_family = AF_INET6; - if(inet_pton(AF_INET6, address, &addr_in6->sin6_addr) != 1) + if (inet_pton(AF_INET6, address, &addr_in6->sin6_addr) != 1) { int err = errno; duk_dup(low->duk_ctx, 5); @@ -107,9 +108,8 @@ duk_ret_t low_net_listen(duk_context *ctx) } } - LowServerSocket *server = - new(low_new) LowServerSocket(low, isHTTP, tlsContext); - if(!server) + LowServerSocket *server = new(low_new) LowServerSocket(low, isHTTP, tlsContext); + if (!server) { duk_dup(low->duk_ctx, 5); low_push_error(low, ENOMEM, "malloc"); @@ -119,7 +119,7 @@ duk_ret_t low_net_listen(duk_context *ctx) int err; const char *syscall; - if(!server->Listen(addr, addrLen, 6, err, syscall)) + if (!server->Listen(addr, addrLen, 6, err, syscall)) { delete server; @@ -132,12 +132,18 @@ duk_ret_t low_net_listen(duk_context *ctx) duk_dup(ctx, 5); duk_push_null(ctx); duk_push_int(ctx, server->FD()); - if(family == 4) - duk_push_int(ctx, ntohs(((struct sockaddr_in *)addr)->sin_port)); - else if(family == 6) - duk_push_int(ctx, ntohs(((struct sockaddr_in6 *)addr)->sin6_port)); + if (family == 4) + { + duk_push_int(ctx, ntohs(((struct sockaddr_in *) addr)->sin_port)); + } + else if (family == 6) + { + duk_push_int(ctx, ntohs(((struct sockaddr_in6 *) addr)->sin6_port)); + } else + { duk_push_int(ctx, 0); + } duk_call(ctx, 3); } return 0; @@ -165,10 +171,10 @@ duk_ret_t low_net_connect(duk_context *ctx) } else #endif /* LOW_HAS_UNIX_SOCKET */ - addrLen = family == 4 ? sizeof(sockaddr_in) : sizeof(sockaddr_in6); + addrLen = family == 4 ? sizeof(sockaddr_in) : sizeof(sockaddr_in6); unsigned char addrBuf[addrLen]; - sockaddr *addr = (sockaddr *)addrBuf; + sockaddr *addr = (sockaddr *) addrBuf; memset(addr, 0, addrLen); #if LOW_HAS_UNIX_SOCKET @@ -183,12 +189,12 @@ duk_ret_t low_net_connect(duk_context *ctx) #endif /* LOW_HAS_UNIX_SOCKET */ { int port = duk_require_int(ctx, 2); - if(family == 4) + if (family == 4) { - sockaddr_in *addr_in = (sockaddr_in *)addr; + sockaddr_in *addr_in = (sockaddr_in *) addr; addr_in->sin_family = AF_INET; - if(inet_pton(AF_INET, address, &addr_in->sin_addr) != 1) + if (inet_pton(AF_INET, address, &addr_in->sin_addr) != 1) { int err = errno; duk_dup(low->duk_ctx, 4); @@ -200,10 +206,10 @@ duk_ret_t low_net_connect(duk_context *ctx) } else { - sockaddr_in6 *addr_in6 = (sockaddr_in6 *)addr; + sockaddr_in6 *addr_in6 = (sockaddr_in6 *) addr; addr_in6->sin6_family = AF_INET6; - if(inet_pton(AF_INET6, address, &addr_in6->sin6_addr) != 1) + if (inet_pton(AF_INET6, address, &addr_in6->sin6_addr) != 1) { int err = errno; duk_dup(low->duk_ctx, 4); @@ -216,7 +222,7 @@ duk_ret_t low_net_connect(duk_context *ctx) } LowSocket *socket = new(low_new) LowSocket(low, NULL, 0, NULL); - if(!socket) + if (!socket) { duk_dup(low->duk_ctx, 4); low_push_error(low, ENOMEM, "malloc"); @@ -226,7 +232,7 @@ duk_ret_t low_net_connect(duk_context *ctx) int err; const char *syscall; - if(!socket->Connect(addr, addrLen, 4, err, syscall)) + if (!socket->Connect(addr, addrLen, 4, err, syscall)) { delete socket; @@ -244,31 +250,43 @@ duk_ret_t low_net_connect(duk_context *ctx) duk_ret_t low_net_setsockopt(duk_context *ctx) { low_main_t *low = duk_get_low_context(ctx); - if(!duk_is_undefined(ctx, 4)) - if(!low_set_raw_mode(duk_require_boolean(ctx, 4))) + if (!duk_is_undefined(ctx, 4)) + { + if (!low_set_raw_mode(duk_require_boolean(ctx, 4))) { low_push_error(low, errno, "tcsetattr"); duk_throw(ctx); } + } bool setKeepAlive = !duk_is_undefined(ctx, 1); bool setNoDelay = !duk_is_undefined(ctx, 3); - if(!setKeepAlive && !setNoDelay) + if (!setKeepAlive && !setNoDelay) + { return 0; + } int fd = duk_require_int(ctx, 0); auto iter = low->fds.find(fd); - if(iter == low->fds.end()) + if (iter == low->fds.end()) + { return 0; + } - if(iter->second->FDType() != LOWFD_TYPE_SOCKET) + if (iter->second->FDType() != LOWFD_TYPE_SOCKET) + { duk_reference_error(ctx, "file descriptor is not a socket"); - LowSocket *socket = (LowSocket *)iter->second; + } + LowSocket *socket = (LowSocket *) iter->second; - if(setKeepAlive) + if (setKeepAlive) + { socket->KeepAlive(duk_require_boolean(ctx, 1), duk_require_int(ctx, 2)); - if(setNoDelay) + } + if (setNoDelay) + { socket->NoDelay(duk_require_boolean(ctx, 3)); + } return 0; } @@ -283,12 +301,16 @@ duk_ret_t low_net_shutdown(duk_context *ctx) int fd = duk_require_int(ctx, 0); auto iter = low->fds.find(fd); - if(iter == low->fds.end()) + if (iter == low->fds.end()) + { return 0; + } - if(iter->second->FDType() != LOWFD_TYPE_SOCKET) + if (iter->second->FDType() != LOWFD_TYPE_SOCKET) + { duk_reference_error(ctx, "file descriptor is not a socket"); - LowSocket *socket = (LowSocket *)iter->second; + } + LowSocket *socket = (LowSocket *) iter->second; socket->Shutdown(1); return 0; diff --git a/src/low_net.h b/src/low_net.h index 5ef4250..f53316d 100644 --- a/src/low_net.h +++ b/src/low_net.h @@ -8,8 +8,11 @@ #include "duktape.h" duk_ret_t low_net_listen(duk_context *ctx); + duk_ret_t low_net_connect(duk_context *ctx); + duk_ret_t low_net_setsockopt(duk_context *ctx); + duk_ret_t low_net_shutdown(duk_context *ctx); #endif /* __LOW_NET_H__ */ \ No newline at end of file diff --git a/src/low_process.cpp b/src/low_process.cpp index 5fe2ef5..383217f 100644 --- a/src/low_process.cpp +++ b/src/low_process.cpp @@ -20,9 +20,11 @@ #include #include #else + #include #include #include + #endif /* __APPLE__ */ // used in low_hrtime() below @@ -56,7 +58,7 @@ static duk_ret_t low_process_cwd(duk_context *ctx) duk_push_string(ctx, duk_get_low_context(ctx)->cwd); #else char path[1024]; - if(!getcwd(path, sizeof(path))) + if (!getcwd(path, sizeof(path))) { low_push_error(duk_get_low_context(ctx), errno, "getcwd"); duk_throw(ctx); @@ -89,7 +91,7 @@ static duk_ret_t low_process_chdir(duk_context *ctx) low_free(low->cwd); low->cwd = cwd; #else - if(chdir(path) < 0) + if (chdir(path) < 0) { low_push_error(duk_get_low_context(ctx), errno, "getcwd"); duk_throw(ctx); @@ -133,14 +135,14 @@ duk_ret_t low_process_info(duk_context *ctx) duk_push_object(ctx); #if !LOW_ESP32_LWIP_SPECIALITIES - for(int i = 0; environ && environ[i]; i++) + for (int i = 0; environ && environ[i]; i++) { int j; - for(j = 0; environ[i][j] && environ[i][j] != '='; j++) + for (j = 0; environ[i][j] && environ[i][j] != '='; j++) { } - if(environ[i][j]) + if (environ[i][j]) { duk_push_string(ctx, &environ[i][j + 1]); environ[i][j] = '\0'; @@ -260,14 +262,16 @@ duk_ret_t low_hrtime(duk_context *ctx) clock_get_time(cclock, &ts); #else struct timespec ts; - if(clock_gettime(CLOCK_MONOTONIC, &ts) < 0) + if (clock_gettime(CLOCK_MONOTONIC, &ts) < 0) + { low_error_errno(); + } #endif /* __APPLE__ */ - t = (((uint64_t)ts.tv_sec) * NANOS_PER_SEC + ts.tv_nsec); + t = (((uint64_t) ts.tv_sec) * NANOS_PER_SEC + ts.tv_nsec); #endif /* LOW_ESP32_LWIP_SPECIALITIES */ - uint32_t *fields = (uint32_t *)duk_require_buffer_data(ctx, 0, nullptr); + uint32_t *fields = (uint32_t *) duk_require_buffer_data(ctx, 0, nullptr); fields[0] = (t / NANOS_PER_SEC) >> 32; fields[1] = (t / NANOS_PER_SEC) & 0xffffffff; fields[2] = t % NANOS_PER_SEC; diff --git a/src/low_process.h b/src/low_process.h index 8e46dd9..d45abcc 100644 --- a/src/low_process.h +++ b/src/low_process.h @@ -8,7 +8,9 @@ #include "duktape.h" duk_ret_t low_process_info(duk_context *ctx); + duk_ret_t low_tty_info(duk_context *ctx); + duk_ret_t low_hrtime(duk_context *ctx); #endif /* __LOW_PROCESS_H__ */ \ No newline at end of file diff --git a/src/low_system.cpp b/src/low_system.cpp index 4d93120..e7a101b 100644 --- a/src/low_system.cpp +++ b/src/low_system.cpp @@ -30,9 +30,11 @@ #include #include #else + #include #include #include + #endif /* __APPLE__ */ // Global variables @@ -103,15 +105,14 @@ bool low_system_init() #else #define MAX_PATH_LEN 1024 - g_low_system.lib_path = - (char *)low_alloc(MAX_PATH_LEN + 1 + lib_add_path_len); - if(!g_low_system.lib_path) + g_low_system.lib_path = (char *) low_alloc(MAX_PATH_LEN + 1 + lib_add_path_len); + if (!g_low_system.lib_path) { low_error_errno(); goto err; } memset(g_low_system.lib_path, 0, MAX_PATH_LEN + 1); - if(readlink("/proc/self/exe", g_low_system.lib_path, MAX_PATH_LEN) < 0) + if (readlink("/proc/self/exe", g_low_system.lib_path, MAX_PATH_LEN) < 0) { low_error_errno(); goto err; @@ -119,12 +120,14 @@ bool low_system_init() #endif /* __APPLE__ */ int i; - for(i = strlen(g_low_system.lib_path); i > 0; i--) - if(g_low_system.lib_path[i - 1] == '/') + for (i = strlen(g_low_system.lib_path); i > 0; i--) + { + if (g_low_system.lib_path[i - 1] == '/') { g_low_system.lib_path[i] = '\0'; break; } + } strcpy(g_low_system.lib_path + i, lib_add_path); #endif /* LOW_ESP32_LWIP_SPECIALITIES */ @@ -232,11 +235,13 @@ int low_tick_count() clock_get_time(cclock, &tv); #else struct timespec tv; - if(clock_gettime(CLOCK_MONOTONIC, &tv) < 0) + if (clock_gettime(CLOCK_MONOTONIC, &tv) < 0) + { low_error_errno(); + } #endif /* __APPLE__ */ - return (int)(((long long)tv.tv_sec) * 1000 + tv.tv_nsec / 1000000); + return (int) (((long long) tv.tv_sec) * 1000 + tv.tv_nsec / 1000000); #endif /* LOW_ESP32_LWIP_SPECIALITIES */ } @@ -246,387 +251,375 @@ int low_tick_count() void low_push_error(struct low_main_t *low, int error, const char *syscall) { - const char *low_errcode[LOW_NUM_ERROR_CODES] = { - "EUNKNOWN", "ENODATA", "EFORMERR", - "ESERVFAIL", "ENOTFOUND", "ENOTIMP", - "EREFUSED", "EBADQUERY", "EBADNAME", - "EBADFAMILY", "EBADRESP", "ECONNREFUSED", - "ETIMEOUT", "EOF", "EFILE", - "ENOMEM", "EDESTRUCTION", "EBADSTR", - "EBADFLAGS", "ENONAME", "EBADHINTS", - "ENOTINITIALIZED", "ELOADIPHLPAPI", "EADDRGETNETWORKPARAMS", - "ECANCELLED"}; - const char *low_errtext[LOW_NUM_ERROR_CODES] = { - "Unknown error", - "DNS server returned answer with no data", - "DNS server claims query was misformatted", - "DNS server returned general failure", - "Domain name not found", - "DNS server does not implement requested operation", - "DNS server refused query", - "Misformatted DNS query", - "Misformatted domain name", - "Unsupported address family", - "Misformatted DNS reply", - "Could not contact DNS servers", - "Timeout while contacting DNS servers", - "End of file", - "Error reading file", - "Out of memory", - "Channel is being destroyed", - "Misformatted string", - "Illegal flags specified", - "Given hostname is not numeric", - "Illegal hints flags specified", - "c-ares library initialization not yet performed", - "Error loading iphlpapi.dll", - "Could not find GetNetworkParams function", - "DNS query cancelled"}; + const char *low_errcode[LOW_NUM_ERROR_CODES] = {"EUNKNOWN", "ENODATA", "EFORMERR", "ESERVFAIL", "ENOTFOUND", + "ENOTIMP", "EREFUSED", "EBADQUERY", "EBADNAME", "EBADFAMILY", + "EBADRESP", "ECONNREFUSED", "ETIMEOUT", "EOF", "EFILE", "ENOMEM", + "EDESTRUCTION", "EBADSTR", "EBADFLAGS", "ENONAME", "EBADHINTS", + "ENOTINITIALIZED", "ELOADIPHLPAPI", "EADDRGETNETWORKPARAMS", + "ECANCELLED"}; + const char *low_errtext[LOW_NUM_ERROR_CODES] = {"Unknown error", "DNS server returned answer with no data", + "DNS server claims query was misformatted", + "DNS server returned general failure", "Domain name not found", + "DNS server does not implement requested operation", + "DNS server refused query", "Misformatted DNS query", + "Misformatted domain name", "Unsupported address family", + "Misformatted DNS reply", "Could not contact DNS servers", + "Timeout while contacting DNS servers", "End of file", + "Error reading file", "Out of memory", "Channel is being destroyed", + "Misformatted string", "Illegal flags specified", + "Given hostname is not numeric", "Illegal hints flags specified", + "c-ares library initialization not yet performed", + "Error loading iphlpapi.dll", + "Could not find GetNetworkParams function", "DNS query cancelled"}; char message[1024] = "", txt[10]; const char *code; - if(-error >= 0 && -error < LOW_NUM_ERROR_CODES) + if (-error >= 0 && -error < LOW_NUM_ERROR_CODES) { code = low_errcode[-error]; strcpy(message, low_errtext[-error]); } else - switch(error) + { + switch (error) { - case EPERM: - code = "EPERM"; - break; - case ENOENT: - code = "ENOENT"; - break; - case ESRCH: - code = "ESRCH"; - break; - case EINTR: - code = "EINTR"; - break; - case EIO: - code = "EIO"; - break; - case ENXIO: - code = "ENXIO"; - break; - case E2BIG: - code = "E2BIG"; - break; - case ENOEXEC: - code = "ENOEXEC"; - break; - case EBADF: - code = "EBADF"; - break; - case ECHILD: - code = "ECHILD"; - break; - case EDEADLK: - code = "EDEADLK"; - break; - case ENOMEM: - code = "ENOMEM"; - break; - case EACCES: - code = "EACCES"; - break; - case EFAULT: - code = "EFAULT"; - break; - case EBUSY: - code = "EBUSY"; - break; - case EEXIST: - code = "EEXIST"; - break; - case EXDEV: - code = "EXDEV"; - break; - case ENODEV: - code = "ENODEV"; - break; - case ENOTDIR: - code = "ENOTDIR"; - break; - case EISDIR: - code = "EISDIR"; - break; - case EINVAL: - code = "EINVAL"; - break; - case ENFILE: - code = "ENFILE"; - break; - case EMFILE: - code = "EMFILE"; - break; - case ENOTTY: - code = "ENOTTY"; - break; - case ETXTBSY: - code = "ETXTBSY"; - break; - case EFBIG: - code = "EFBIG"; - break; - case ENOSPC: - code = "ENOSPC"; - break; - case ESPIPE: - code = "ESPIPE"; - break; - case EROFS: - code = "EROFS"; - break; - case EMLINK: - code = "EMLINK"; - break; - case EPIPE: - code = "EPIPE"; - break; - case EDOM: - code = "EDOM"; - break; - case ERANGE: - code = "ERANGE"; - break; - case EAGAIN: - code = "EAGAIN"; - break; - case EINPROGRESS: - code = "EINPROGRESS"; - break; - case EALREADY: - code = "EALREADY"; - break; - case ENOTSOCK: - code = "ENOTSOCK"; - break; - case EDESTADDRREQ: - code = "EDESTADDRREQ"; - break; - case EMSGSIZE: - code = "EMSGSIZE"; - break; - case EPROTOTYPE: - code = "EPROTOTYPE"; - break; - case ENOPROTOOPT: - code = "ENOPROTOOPT"; - break; - case EPROTONOSUPPORT: - code = "EPROTONOSUPPORT"; - break; - case ENOTSUP: - code = "ENOTSUP"; - break; - case EPFNOSUPPORT: - code = "EPFNOSUPPORT"; - break; - case EAFNOSUPPORT: - code = "EAFNOSUPPORT"; - break; - case EADDRINUSE: - code = "EADDRINUSE"; - break; - case EADDRNOTAVAIL: - code = "EADDRNOTAVAIL"; - break; - case ENETDOWN: - code = "ENETDOWN"; - break; - case ENETUNREACH: - code = "ENETUNREACH"; - break; - case ENETRESET: - code = "ENETRESET"; - break; - case ECONNABORTED: - code = "ECONNABORTED"; - break; - case ECONNRESET: - code = "ECONNRESET"; - break; - case ENOBUFS: - code = "ENOBUFS"; - break; - case EISCONN: - code = "EISCONN"; - break; - case ENOTCONN: - code = "ENOTCONN"; - break; - case ETOOMANYREFS: - code = "ETOOMANYREFS"; - break; - case ETIMEDOUT: - code = "ETIMEDOUT"; - break; - case ECONNREFUSED: - code = "ECONNREFUSED"; - break; - case ELOOP: - code = "ELOOP"; - break; - case ENAMETOOLONG: - code = "ENAMETOOLONG"; - break; - case EHOSTDOWN: - code = "EHOSTDOWN"; - break; - case EHOSTUNREACH: - code = "EHOSTUNREACH"; - break; - case ENOTEMPTY: - code = "ENOTEMPTY"; - break; - case EDQUOT: - code = "EDQUOT"; - break; - case ESTALE: - code = "ESTALE"; - break; - case ENOLCK: - code = "ENOLCK"; - break; - case ENOSYS: - code = "ENOSYS"; - break; - case EOVERFLOW: - code = "EOVERFLOW"; - break; - case ECANCELED: - code = "ECANCELED"; - break; - case EIDRM: - code = "EIDRM"; - break; - case ENOMSG: - code = "ENOMSG"; - break; - case EILSEQ: - code = "EILSEQ"; - break; - case EBADMSG: - code = "EBADMSG"; - break; - case EMULTIHOP: - code = "EMULTIHOP"; - break; - case ENODATA: - code = "ENODATA"; - break; - case ENOLINK: - code = "ENOLINK"; - break; - case ENOSR: - code = "ENOSR"; - break; - case ENOSTR: - code = "ENOSTR"; - break; - case EPROTO: - code = "EPROTO"; - break; - case ETIME: - code = "ETIME"; - break; - case ENOTRECOVERABLE: - code = "ENOTRECOVERABLE"; - break; - case EOWNERDEAD: - code = "EOWNERDEAD"; - break; + case EPERM: + code = "EPERM"; + break; + case ENOENT: + code = "ENOENT"; + break; + case ESRCH: + code = "ESRCH"; + break; + case EINTR: + code = "EINTR"; + break; + case EIO: + code = "EIO"; + break; + case ENXIO: + code = "ENXIO"; + break; + case E2BIG: + code = "E2BIG"; + break; + case ENOEXEC: + code = "ENOEXEC"; + break; + case EBADF: + code = "EBADF"; + break; + case ECHILD: + code = "ECHILD"; + break; + case EDEADLK: + code = "EDEADLK"; + break; + case ENOMEM: + code = "ENOMEM"; + break; + case EACCES: + code = "EACCES"; + break; + case EFAULT: + code = "EFAULT"; + break; + case EBUSY: + code = "EBUSY"; + break; + case EEXIST: + code = "EEXIST"; + break; + case EXDEV: + code = "EXDEV"; + break; + case ENODEV: + code = "ENODEV"; + break; + case ENOTDIR: + code = "ENOTDIR"; + break; + case EISDIR: + code = "EISDIR"; + break; + case EINVAL: + code = "EINVAL"; + break; + case ENFILE: + code = "ENFILE"; + break; + case EMFILE: + code = "EMFILE"; + break; + case ENOTTY: + code = "ENOTTY"; + break; + case ETXTBSY: + code = "ETXTBSY"; + break; + case EFBIG: + code = "EFBIG"; + break; + case ENOSPC: + code = "ENOSPC"; + break; + case ESPIPE: + code = "ESPIPE"; + break; + case EROFS: + code = "EROFS"; + break; + case EMLINK: + code = "EMLINK"; + break; + case EPIPE: + code = "EPIPE"; + break; + case EDOM: + code = "EDOM"; + break; + case ERANGE: + code = "ERANGE"; + break; + case EAGAIN: + code = "EAGAIN"; + break; + case EINPROGRESS: + code = "EINPROGRESS"; + break; + case EALREADY: + code = "EALREADY"; + break; + case ENOTSOCK: + code = "ENOTSOCK"; + break; + case EDESTADDRREQ: + code = "EDESTADDRREQ"; + break; + case EMSGSIZE: + code = "EMSGSIZE"; + break; + case EPROTOTYPE: + code = "EPROTOTYPE"; + break; + case ENOPROTOOPT: + code = "ENOPROTOOPT"; + break; + case EPROTONOSUPPORT: + code = "EPROTONOSUPPORT"; + break; + case ENOTSUP: + code = "ENOTSUP"; + break; + case EPFNOSUPPORT: + code = "EPFNOSUPPORT"; + break; + case EAFNOSUPPORT: + code = "EAFNOSUPPORT"; + break; + case EADDRINUSE: + code = "EADDRINUSE"; + break; + case EADDRNOTAVAIL: + code = "EADDRNOTAVAIL"; + break; + case ENETDOWN: + code = "ENETDOWN"; + break; + case ENETUNREACH: + code = "ENETUNREACH"; + break; + case ENETRESET: + code = "ENETRESET"; + break; + case ECONNABORTED: + code = "ECONNABORTED"; + break; + case ECONNRESET: + code = "ECONNRESET"; + break; + case ENOBUFS: + code = "ENOBUFS"; + break; + case EISCONN: + code = "EISCONN"; + break; + case ENOTCONN: + code = "ENOTCONN"; + break; + case ETOOMANYREFS: + code = "ETOOMANYREFS"; + break; + case ETIMEDOUT: + code = "ETIMEDOUT"; + break; + case ECONNREFUSED: + code = "ECONNREFUSED"; + break; + case ELOOP: + code = "ELOOP"; + break; + case ENAMETOOLONG: + code = "ENAMETOOLONG"; + break; + case EHOSTDOWN: + code = "EHOSTDOWN"; + break; + case EHOSTUNREACH: + code = "EHOSTUNREACH"; + break; + case ENOTEMPTY: + code = "ENOTEMPTY"; + break; + case EDQUOT: + code = "EDQUOT"; + break; + case ESTALE: + code = "ESTALE"; + break; + case ENOLCK: + code = "ENOLCK"; + break; + case ENOSYS: + code = "ENOSYS"; + break; + case EOVERFLOW: + code = "EOVERFLOW"; + break; + case ECANCELED: + code = "ECANCELED"; + break; + case EIDRM: + code = "EIDRM"; + break; + case ENOMSG: + code = "ENOMSG"; + break; + case EILSEQ: + code = "EILSEQ"; + break; + case EBADMSG: + code = "EBADMSG"; + break; + case EMULTIHOP: + code = "EMULTIHOP"; + break; + case ENODATA: + code = "ENODATA"; + break; + case ENOLINK: + code = "ENOLINK"; + break; + case ENOSR: + code = "ENOSR"; + break; + case ENOSTR: + code = "ENOSTR"; + break; + case EPROTO: + code = "EPROTO"; + break; + case ETIME: + code = "ETIME"; + break; + case ENOTRECOVERABLE: + code = "ENOTRECOVERABLE"; + break; + case EOWNERDEAD: + code = "EOWNERDEAD"; + break; #ifdef __APPLE__ - case EPROCLIM: - code = "EPROCLIM"; - break; - case EBADRPC: - code = "EBADRPC"; - break; - case ERPCMISMATCH: - code = "ERPCMISMATCH"; - break; - case EPROGUNAVAIL: - code = "EPROGUNAVAIL"; - break; - case EPROGMISMATCH: - code = "EPROGMISMATCH"; - break; - case EPROCUNAVAIL: - code = "EPROCUNAVAIL"; - break; - case EFTYPE: - code = "EFTYPE"; - break; - case EAUTH: - code = "EAUTH"; - break; - case ENEEDAUTH: - code = "ENEEDAUTH"; - break; - case EPWROFF: - code = "EPWROFF"; - break; - case EDEVERR: - code = "EDEVERR"; - break; - case EBADEXEC: - code = "EBADEXEC"; - break; - case EBADARCH: - code = "EBADARCH"; - break; - case ESHLIBVERS: - code = "ESHLIBVERS"; - break; - case EBADMACHO: - code = "EBADMACHO"; - break; - case ENOATTR: - code = "ENOATTR"; - break; - case EOPNOTSUPP: - code = "EOPNOTSUPP"; - break; - case ENOPOLICY: - code = "ENOPOLICY"; - break; - case EQFULL: - code = "EQFULL"; - break; + case EPROCLIM: + code = "EPROCLIM"; + break; + case EBADRPC: + code = "EBADRPC"; + break; + case ERPCMISMATCH: + code = "ERPCMISMATCH"; + break; + case EPROGUNAVAIL: + code = "EPROGUNAVAIL"; + break; + case EPROGMISMATCH: + code = "EPROGMISMATCH"; + break; + case EPROCUNAVAIL: + code = "EPROCUNAVAIL"; + break; + case EFTYPE: + code = "EFTYPE"; + break; + case EAUTH: + code = "EAUTH"; + break; + case ENEEDAUTH: + code = "ENEEDAUTH"; + break; + case EPWROFF: + code = "EPWROFF"; + break; + case EDEVERR: + code = "EDEVERR"; + break; + case EBADEXEC: + code = "EBADEXEC"; + break; + case EBADARCH: + code = "EBADARCH"; + break; + case ESHLIBVERS: + code = "ESHLIBVERS"; + break; + case EBADMACHO: + code = "EBADMACHO"; + break; + case ENOATTR: + code = "ENOATTR"; + break; + case EOPNOTSUPP: + code = "EOPNOTSUPP"; + break; + case ENOPOLICY: + code = "ENOPOLICY"; + break; + case EQFULL: + code = "EQFULL"; + break; #endif /* __APPLE__ */ #if !LOW_ESP32_LWIP_SPECIALITIES - case ENOTBLK: - code = "ENOTBLK"; - break; - case ESOCKTNOSUPPORT: - code = "ESOCKTNOSUPPORT"; - break; - case ESHUTDOWN: - code = "ESHUTDOWN"; - break; - case EUSERS: - code = "EUSERS"; - break; - case EREMOTE: - code = "EREMOTE"; - break; + case ENOTBLK: + code = "ENOTBLK"; + break; + case ESOCKTNOSUPPORT: + code = "ESOCKTNOSUPPORT"; + break; + case ESHUTDOWN: + code = "ESHUTDOWN"; + break; + case EUSERS: + code = "EUSERS"; + break; + case EREMOTE: + code = "EREMOTE"; + break; #endif /* LOW_ESP32_LWIP_SPECIALITIES */ - default: - code = txt; - sprintf(txt, "E%d", error); - break; + default: + code = txt; + sprintf(txt, "E%d", error); + break; } + } - if(!message[0]) + if (!message[0]) + { strerror_r(error, message, sizeof(message) - 16 - strlen(syscall)); + } sprintf(message + strlen(message), " (at %s)", syscall); duk_push_error_object(low->duk_ctx, DUK_ERR_ERROR, message); duk_push_string(low->duk_ctx, code); diff --git a/src/low_system.h b/src/low_system.h index 6bc9e40..b559c9e 100644 --- a/src/low_system.h +++ b/src/low_system.h @@ -43,28 +43,29 @@ struct low_system_t { - char *lib_path; + char *lib_path; #if LOW_HAS_TERMIOS - bool isatty, raw_mode; - struct termios orig_termios; + bool isatty, raw_mode; + struct termios orig_termios; #endif /* LOW_HAS_TERMIOS */ - int signal_pipe_fd; + int signal_pipe_fd; }; -extern "C" -{ - bool low_system_init(); - void low_system_destroy(); +extern "C" { +bool low_system_init(); +void low_system_destroy(); } bool low_set_raw_mode(bool mode); + int low_tick_count(); void low_push_error(struct low_main_t *low, int error, const char *syscall); void low_error_errno(); + void low_error(const char *txt); #endif /* __LOW_SYSTEM_H__ */ diff --git a/src/low_tls.cpp b/src/low_tls.cpp index 09e1aed..1cfd0a4 100644 --- a/src/low_tls.cpp +++ b/src/low_tls.cpp @@ -24,10 +24,10 @@ duk_ret_t low_tls_create_context(duk_context *ctx) duk_size_t cert_len, key_len, ca_len; duk_get_prop_string(ctx, 0, "cert"); - if(duk_is_string(ctx, -1)) + if (duk_is_string(ctx, -1)) { my_cert = low_strdup(duk_get_string(ctx, -1)); - if(!my_cert) + if (!my_cert) { low_push_error(low, ENOMEM, "malloc"); duk_throw(ctx); @@ -36,11 +36,11 @@ duk_ret_t low_tls_create_context(duk_context *ctx) } else { - cert = (unsigned char *)duk_get_buffer_data(ctx, -1, &cert_len); - if(cert) + cert = (unsigned char *) duk_get_buffer_data(ctx, -1, &cert_len); + if (cert) { - my_cert = (char *)low_alloc(cert_len + 1); - if(!my_cert) + my_cert = (char *) low_alloc(cert_len + 1); + if (!my_cert) { low_push_error(low, ENOMEM, "malloc"); duk_throw(ctx); @@ -50,10 +50,10 @@ duk_ret_t low_tls_create_context(duk_context *ctx) } } duk_get_prop_string(ctx, 0, "key"); - if(duk_is_string(ctx, -1)) + if (duk_is_string(ctx, -1)) { my_key = low_strdup(duk_get_string(ctx, -1)); - if(!my_key) + if (!my_key) { low_free(my_cert); low_push_error(low, ENOMEM, "malloc"); @@ -63,11 +63,11 @@ duk_ret_t low_tls_create_context(duk_context *ctx) } else { - key = (unsigned char *)duk_get_buffer_data(ctx, -1, &key_len); - if(key) + key = (unsigned char *) duk_get_buffer_data(ctx, -1, &key_len); + if (key) { - my_key = (char *)low_alloc(key_len + 1); - if(!my_key) + my_key = (char *) low_alloc(key_len + 1); + if (!my_key) { low_free(my_cert); low_push_error(low, ENOMEM, "malloc"); @@ -78,11 +78,11 @@ duk_ret_t low_tls_create_context(duk_context *ctx) } } duk_get_prop_string(ctx, 0, "ca"); - ca = (unsigned char *)duk_get_buffer_data(ctx, -1, &ca_len); - if(duk_is_string(ctx, -1)) + ca = (unsigned char *) duk_get_buffer_data(ctx, -1, &ca_len); + if (duk_is_string(ctx, -1)) { my_ca = low_strdup(duk_get_string(ctx, -1)); - if(!my_ca) + if (!my_ca) { low_free(my_cert); low_free(my_key); @@ -93,11 +93,11 @@ duk_ret_t low_tls_create_context(duk_context *ctx) } else { - ca = (unsigned char *)duk_get_buffer_data(ctx, -1, &ca_len); - if(ca) + ca = (unsigned char *) duk_get_buffer_data(ctx, -1, &ca_len); + if (ca) { - my_ca = (char *)low_alloc(ca_len + 1); - if(!my_ca) + my_ca = (char *) low_alloc(ca_len + 1); + if (!my_ca) { low_free(my_cert); low_free(my_key); @@ -109,27 +109,30 @@ duk_ret_t low_tls_create_context(duk_context *ctx) } } - LowTLSContext *context = new(low_new) LowTLSContext( - low, my_cert, cert_len, my_key, key_len, my_ca, ca_len, true); + LowTLSContext *context = new(low_new) LowTLSContext(low, my_cert, cert_len, my_key, key_len, my_ca, ca_len, true); low_free(my_cert); low_free(my_key); low_free(my_ca); - if(!context->IsOK()) + if (!context->IsOK()) { delete context; duk_generic_error(ctx, "SSL context error"); } int index; - for(index = 0; index < low->tlsContexts.size(); index++) - if(!low->tlsContexts[index]) + for (index = 0; index < low->tlsContexts.size(); index++) + { + if (!low->tlsContexts[index]) { low->tlsContexts[index] = context; break; } - if(index == low->tlsContexts.size()) + } + if (index == low->tlsContexts.size()) + { low->tlsContexts.push_back(context); + } context->SetIndex(index); duk_push_object(low->duk_ctx); @@ -152,8 +155,10 @@ duk_ret_t low_tls_context_finalizer(duk_context *ctx) duk_get_prop_string(ctx, 0, "_index"); int index = duk_require_int(ctx, -1); - if(index < 0 || index >= low->tlsContexts.size()) + if (index < 0 || index >= low->tlsContexts.size()) + { duk_reference_error(ctx, "tls context not found"); + } low->tlsContexts[index]->DecRef(); return 0; diff --git a/src/low_tls.h b/src/low_tls.h index b8957e8..f18c01c 100644 --- a/src/low_tls.h +++ b/src/low_tls.h @@ -8,6 +8,7 @@ #include "duktape.h" duk_ret_t low_tls_create_context(duk_context *ctx); + duk_ret_t low_tls_context_finalizer(duk_context *ctx); #endif /* __LOW_TLS_H__ */ \ No newline at end of file diff --git a/src/low_web_thread.cpp b/src/low_web_thread.cpp index 9f12a3f..50bcd53 100644 --- a/src/low_web_thread.cpp +++ b/src/low_web_thread.cpp @@ -16,6 +16,7 @@ #include "low_alloc.h" #include + #if LOW_HAS_POLL #include #endif /* LOW_HAS_POLL */ @@ -36,7 +37,7 @@ using namespace std; void *low_web_thread_main(void *arg) { - low_main_t *low = (low_main_t *)arg; + low_main_t *low = (low_main_t *) arg; #if LOW_HAS_POLL vector fds; @@ -259,7 +260,7 @@ void *low_web_thread_main(void *arg) } #else fd_set read_set, write_set; - vector> fds; + vector > fds; FD_ZERO(&read_set); FD_ZERO(&write_set); @@ -272,76 +273,78 @@ void *low_web_thread_main(void *arg) FD_SET(low->web_thread_pipe[0], &read_set); #endif /* LOW_ESP32_LWIP_SPECIALITIES */ - while(true) - { - int timeout = -1, i; + while (true) + { + int timeout = -1, i; - int first_cares_fd = fds.size(); - fd_set read_set1 = read_set; - fd_set write_set1 = write_set; + int first_cares_fd = fds.size(); + fd_set read_set1 = read_set; + fd_set write_set1 = write_set; #if LOW_INCLUDE_CARES_RESOLVER - bool has_cares = false; - if(low->resolvers_active) + bool has_cares = false; + if(low->resolvers_active) + { + pthread_mutex_lock(&low->resolvers_mutex); + for(i = 0; i < low->resolvers.size(); i++) { - pthread_mutex_lock(&low->resolvers_mutex); - for(i = 0; i < low->resolvers.size(); i++) + if(!low->resolvers[i]->IsActive()) + continue; + ares_channel &channel = low->resolvers[i]->Channel(); + + int count = ares_fds(channel, &read_set1, &write_set1); + if(count) { - if(!low->resolvers[i]->IsActive()) - continue; - ares_channel &channel = low->resolvers[i]->Channel(); + has_cares = true; - int count = ares_fds(channel, &read_set1, &write_set1); - if(count) + struct timeval tv; + struct timeval *val = ares_timeout(channel, NULL, &tv); + if(val) { - has_cares = true; - - struct timeval tv; - struct timeval *val = ares_timeout(channel, NULL, &tv); - if(val) - { - int millisecs = - val->tv_sec * 1000 + val->tv_usec / 1000; - if(timeout > millisecs || timeout == -1) - timeout = millisecs; - } + int millisecs = + val->tv_sec * 1000 + val->tv_usec / 1000; + if(timeout > millisecs || timeout == -1) + timeout = millisecs; } } - pthread_mutex_unlock(&low->resolvers_mutex); } + pthread_mutex_unlock(&low->resolvers_mutex); + } #endif /* LOW_INCLUDE_CARES_RESOLVER */ #if LOW_ESP32_LWIP_SPECIALITIES - int timeout2 = gWebThreadNextTick - low_tick_count(); - while(timeout2 <= 0) - { - low->web_thread_notinevents = true; - neoniousWebThreadTick(); - low->web_thread_notinevents = false; - timeout2 = gWebThreadNextTick - low_tick_count(); - } - if(timeout == -1 || timeout > timeout2) - timeout = timeout2; - - int count; - if(timeout == -1) - count = lwip_select(FD_SETSIZE, &read_set1, &write_set1, NULL, - NULL); - else - { - struct timeval tv; - tv.tv_sec = timeout / 1000; - tv.tv_usec = (timeout - tv.tv_sec * 1000) * 1000; + int timeout2 = gWebThreadNextTick - low_tick_count(); + while(timeout2 <= 0) + { + low->web_thread_notinevents = true; + neoniousWebThreadTick(); + low->web_thread_notinevents = false; + timeout2 = gWebThreadNextTick - low_tick_count(); + } + if(timeout == -1 || timeout > timeout2) + timeout = timeout2; - count = - lwip_select(FD_SETSIZE, &read_set1, &write_set1, NULL, &tv); - } - if(count < 0) - vTaskDelay(1000); // do not block! -#else int count; if(timeout == -1) + count = lwip_select(FD_SETSIZE, &read_set1, &write_set1, NULL, + NULL); + else + { + struct timeval tv; + tv.tv_sec = timeout / 1000; + tv.tv_usec = (timeout - tv.tv_sec * 1000) * 1000; + + count = + lwip_select(FD_SETSIZE, &read_set1, &write_set1, NULL, &tv); + } + if(count < 0) + vTaskDelay(1000); // do not block! +#else + int count; + if (timeout == -1) + { count = select(FD_SETSIZE, &read_set1, &write_set1, NULL, NULL); + } else { struct timeval tv; @@ -352,146 +355,136 @@ void *low_web_thread_main(void *arg) } #endif /* LOW_ESP32_LWIP_SPECIALITIES */ - if(low->destroying) - break; + if (low->destroying) + { + break; + } #if LOW_ESP32_LWIP_SPECIALITIES - if(!count) - { - low->web_thread_notinevents = true; - neoniousWebThreadTick(); - low->web_thread_notinevents = false; - } + if(!count) + { + low->web_thread_notinevents = true; + neoniousWebThreadTick(); + low->web_thread_notinevents = false; + } #endif /* LOW_ESP32_LWIP_SPECIALITIES */ #if LOW_INCLUDE_CARES_RESOLVER - if(has_cares) + if(has_cares) + { + pthread_mutex_lock(&low->resolvers_mutex); + for(i = 0; i < low->resolvers.size(); i++) { - pthread_mutex_lock(&low->resolvers_mutex); - for(i = 0; i < low->resolvers.size(); i++) - { - if(!low->resolvers[i]->IsActive()) - continue; - ares_channel &channel = low->resolvers[i]->Channel(); + if(!low->resolvers[i]->IsActive()) + continue; + ares_channel &channel = low->resolvers[i]->Channel(); - ares_process(channel, &read_set1, &write_set1); - } - pthread_mutex_unlock(&low->resolvers_mutex); + ares_process(channel, &read_set1, &write_set1); } + pthread_mutex_unlock(&low->resolvers_mutex); + } #endif /* LOW_INCLUDE_CARES_RESOLVER */ #if !LOW_ESP32_LWIP_SPECIALITIES - if(count > 0 && FD_ISSET(low->web_thread_pipe[0], &read_set1)) + if (count > 0 && FD_ISSET(low->web_thread_pipe[0], &read_set1)) + { + unsigned char s; + read(low->web_thread_pipe[0], &s, 1); + if (s != 0xFF) { - unsigned char s; - read(low->web_thread_pipe[0], &s, 1); - if(s != 0xFF) + LowSignalHandler *signal = new(low_new) LowSignalHandler(low, s); + if (!signal) { - LowSignalHandler *signal = - new(low_new) LowSignalHandler(low, s); - if(!signal) - { - } // not much we can do here ! - } - count--; + } // not much we can do here ! } + count--; + } #endif /* LOW_ESP32_LWIP_SPECIALITIES */ - if(count > 0) + if (count > 0) + { + int firstNone = 0; + for (i = 0; i < fds.size(); i++) { - int firstNone = 0; - for(i = 0; i < fds.size(); i++) + if (fds[i].second >= 0) { - if(fds[i].second >= 0) + int events = (FD_ISSET(fds[i].second, &read_set1) ? POLLIN : 0) | + (FD_ISSET(fds[i].second, &write_set1) ? POLLOUT : 0); + if (events) { - int events = - (FD_ISSET(fds[i].second, &read_set1) ? POLLIN : 0) | - (FD_ISSET(fds[i].second, &write_set1) ? POLLOUT - : 0); - if(events) + if (!fds[i].first->OnEvents(events)) { - if(!fds[i].first->OnEvents(events)) + auto fd = fds[i].first; + + fds[i].second = -1; + if (fd->mFD >= 0) { - auto fd = fds[i].first; + FD_CLR(fd->mFD, &read_set); + FD_CLR(fd->mFD, &write_set); + } - fds[i].second = -1; - if(fd->mFD >= 0) + // Remove from web thread list + pthread_mutex_lock(&low->web_thread_mutex); + if (fd->mNextChanged || low->web_changed_last == fd) + { + if (low->web_changed_first == fd) { - FD_CLR(fd->mFD, &read_set); - FD_CLR(fd->mFD, &write_set); + low->web_changed_first = fd->mNextChanged; } - - // Remove from web thread list - pthread_mutex_lock(&low->web_thread_mutex); - if(fd->mNextChanged || - low->web_changed_last == fd) + else { - if(low->web_changed_first == fd) - low->web_changed_first = - fd->mNextChanged; - else + auto elem = low->web_changed_first; + while (elem) { - auto elem = low->web_changed_first; - while(elem) + if (elem->mNextChanged == fd) { - if(elem->mNextChanged == fd) - { - elem->mNextChanged = - fd->mNextChanged; - break; - } - elem = elem->mNextChanged; + elem->mNextChanged = fd->mNextChanged; + break; } + elem = elem->mNextChanged; } - if(!low->web_changed_first) - low->web_changed_last = NULL; } - fd->mPollIndex = -1; - fd->mNextChanged = NULL; - pthread_mutex_unlock(&low->web_thread_mutex); - - low->web_thread_notinevents = true; - delete fd; - low->web_thread_notinevents = false; + if (!low->web_changed_first) + { + low->web_changed_last = NULL; + } } - count--; + fd->mPollIndex = -1; + fd->mNextChanged = NULL; + pthread_mutex_unlock(&low->web_thread_mutex); + + low->web_thread_notinevents = true; + delete fd; + low->web_thread_notinevents = false; } + count--; } - if(fds[i].second >= 0) - firstNone = i + 1; } - if(firstNone != fds.size()) - fds.resize(firstNone); + if (fds[i].second >= 0) + { + firstNone = i + 1; + } } - - pthread_mutex_lock(&low->web_thread_mutex); - while(low->web_changed_first) + if (firstNone != fds.size()) { - LowFD *fd = low->web_changed_first; - - low->web_changed_first = fd->mNextChanged; - if(!low->web_changed_first) - low->web_changed_last = NULL; - fd->mNextChanged = NULL; + fds.resize(firstNone); + } + } - if(fd->mMarkDelete) - { - if(fd->mPollIndex != -1) - { - FD_CLR(fds[fd->mPollIndex].second, &read_set); - FD_CLR(fds[fd->mPollIndex].second, &write_set); + pthread_mutex_lock(&low->web_thread_mutex); + while (low->web_changed_first) + { + LowFD *fd = low->web_changed_first; - fds[fd->mPollIndex].second = -1; - fd->mPollIndex = -1; - } + low->web_changed_first = fd->mNextChanged; + if (!low->web_changed_first) + { + low->web_changed_last = NULL; + } + fd->mNextChanged = NULL; - low->web_thread_notinevents = true; - pthread_mutex_unlock(&low->web_thread_mutex); - delete fd; - pthread_mutex_lock(&low->web_thread_mutex); - low->web_thread_notinevents = false; - } - else if((fd->mFD < 0 || !fd->mPollEvents) && - fd->mPollIndex != -1) + if (fd->mMarkDelete) + { + if (fd->mPollIndex != -1) { FD_CLR(fds[fd->mPollIndex].second, &read_set); FD_CLR(fds[fd->mPollIndex].second, &write_set); @@ -499,65 +492,88 @@ void *low_web_thread_main(void *arg) fds[fd->mPollIndex].second = -1; fd->mPollIndex = -1; } - else if(fd->mFD >= 0 && fd->mPollEvents) + + low->web_thread_notinevents = true; + pthread_mutex_unlock(&low->web_thread_mutex); + delete fd; + pthread_mutex_lock(&low->web_thread_mutex); + low->web_thread_notinevents = false; + } + else if ((fd->mFD < 0 || !fd->mPollEvents) && fd->mPollIndex != -1) + { + FD_CLR(fds[fd->mPollIndex].second, &read_set); + FD_CLR(fds[fd->mPollIndex].second, &write_set); + + fds[fd->mPollIndex].second = -1; + fd->mPollIndex = -1; + } + else if (fd->mFD >= 0 && fd->mPollEvents) + { + if (fd->mPollIndex == -1) { - if(fd->mPollIndex == -1) + for (int i = 0; i < fds.size(); i++) { - for(int i = 0; i < fds.size(); i++) - { - if(fds[i].second == -1) - { - fd->mPollIndex = i; - fds[i].first = fd; - fds[i].second = fd->mFD; - break; - } - } - if(fd->mPollIndex == -1) + if (fds[i].second == -1) { - fd->mPollIndex = fds.size(); - fds.push_back(pair(fd, fd->mFD)); + fd->mPollIndex = i; + fds[i].first = fd; + fds[i].second = fd->mFD; + break; } } + if (fd->mPollIndex == -1) + { + fd->mPollIndex = fds.size(); + fds.push_back(pair(fd, fd->mFD)); + } + } - if(fd->mPollEvents & POLLIN) - FD_SET(fd->mFD, &read_set); - else - FD_CLR(fd->mFD, &read_set); - if(fd->mPollEvents & POLLOUT) - FD_SET(fd->mFD, &write_set); - else - FD_CLR(fd->mFD, &write_set); + if (fd->mPollEvents & POLLIN) + { + FD_SET(fd->mFD, &read_set); + } + else + { + FD_CLR(fd->mFD, &read_set); + } + if (fd->mPollEvents & POLLOUT) + { + FD_SET(fd->mFD, &write_set); + } + else + { + FD_CLR(fd->mFD, &write_set); } } - - pthread_cond_broadcast(&low->web_thread_done_cond); - pthread_mutex_unlock(&low->web_thread_mutex); } -#if LOW_ESP32_LWIP_SPECIALITIES - pthread_mutex_lock(&low->web_thread_mutex); - low->web_thread_done = true; pthread_cond_broadcast(&low->web_thread_done_cond); + pthread_mutex_unlock(&low->web_thread_mutex); + } + +#if LOW_ESP32_LWIP_SPECIALITIES + pthread_mutex_lock(&low->web_thread_mutex); + low->web_thread_done = true; + pthread_cond_broadcast(&low->web_thread_done_cond); - // Remove the FDs here! - for(int i = 0; i < fds.size(); i++) + // Remove the FDs here! + for(int i = 0; i < fds.size(); i++) + { + if(fds[i].first->mFDClearOnReset && fds[i].second >= 0) { - if(fds[i].first->mFDClearOnReset && fds[i].second >= 0) - { - FD_CLR(fds[i].second, &read_set); - FD_CLR(fds[i].second, &write_set); + FD_CLR(fds[i].second, &read_set); + FD_CLR(fds[i].second, &write_set); - fds[i].second = -1; - fds[i].first->mPollIndex = -1; - } + fds[i].second = -1; + fds[i].first->mPollIndex = -1; } - - while(low->destroying) - pthread_cond_wait(&low->web_thread_done_cond, - &low->web_thread_mutex); - pthread_mutex_unlock(&low->web_thread_mutex); } + + while(low->destroying) + pthread_cond_wait(&low->web_thread_done_cond, + &low->web_thread_mutex); + pthread_mutex_unlock(&low->web_thread_mutex); +} #endif /* LOW_ESP32_LWIP_SPECIALITIES */ #endif /* LOW_HAS_POLL */ @@ -592,16 +608,20 @@ void low_web_set_poll_events(low_main_t *low, LowFD *fd, short events) pthread_mutex_lock(&low->web_thread_mutex); fd->mPollEvents = events; - if(fd->mNextChanged || low->web_changed_last == fd) + if (fd->mNextChanged || low->web_changed_last == fd) { pthread_mutex_unlock(&low->web_thread_mutex); return; } - if(low->web_changed_last) + if (low->web_changed_last) + { low->web_changed_last->mNextChanged = fd; + } else + { low->web_changed_first = fd; + } low->web_changed_last = fd; low_web_thread_break(low); @@ -615,25 +635,28 @@ void low_web_set_poll_events(low_main_t *low, LowFD *fd, short events) void low_web_clear_poll(low_main_t *low, LowFD *fd) { pthread_mutex_lock(&low->web_thread_mutex); - if(fd->mPollIndex == -1 && !fd->mNextChanged && fd != low->web_changed_last) + if (fd->mPollIndex == -1 && !fd->mNextChanged && fd != low->web_changed_last) { - if(!low->web_thread_notinevents && !low->web_thread_done) /* TODO can be even more */ + if (!low->web_thread_notinevents && !low->web_thread_done) /* TODO can be even more */ { low_web_thread_break(low); - pthread_cond_wait(&low->web_thread_done_cond, - &low->web_thread_mutex); + pthread_cond_wait(&low->web_thread_done_cond, &low->web_thread_mutex); } pthread_mutex_unlock(&low->web_thread_mutex); return; } fd->mPollEvents = 0; - if(!low->web_thread_done) + if (!low->web_thread_done) { - if(low->web_changed_last) + if (low->web_changed_last) + { low->web_changed_last->mNextChanged = fd; + } else + { low->web_changed_first = fd; + } low->web_changed_last = fd; low_web_thread_break(low); @@ -651,16 +674,20 @@ void low_web_mark_delete(low_main_t *low, LowFD *fd) pthread_mutex_lock(&low->web_thread_mutex); fd->mMarkDelete = true; - if(fd->mNextChanged || low->web_changed_last == fd) + if (fd->mNextChanged || low->web_changed_last == fd) { pthread_mutex_unlock(&low->web_thread_mutex); return; } - if(low->web_changed_last) + if (low->web_changed_last) + { low->web_changed_last->mNextChanged = fd; + } else + { low->web_changed_first = fd; + } low->web_changed_last = fd; low_web_thread_break(low); diff --git a/src/low_web_thread.h b/src/low_web_thread.h index 24b7c26..5b89879 100644 --- a/src/low_web_thread.h +++ b/src/low_web_thread.h @@ -16,15 +16,16 @@ #define POLLRESET 0xFF struct low_main_t; + class LowFD; void *low_web_thread_main(void *arg); + void low_web_thread_break(low_main_t *low); void low_web_set_poll_events(low_main_t *low, LowFD *fd, short events); -void low_web_clear_poll(low_main_t *low, - LowFD *fd); // only call from not-web thread +void low_web_clear_poll(low_main_t *low, LowFD *fd); // only call from not-web thread void low_web_mark_delete(low_main_t *low, LowFD *fd); #endif /* __LOW_WEB_THREAD_H__ */ From 30087a0987fba614d14a39f207d9a2a7cd8b4b9d Mon Sep 17 00:00:00 2001 From: Steve Fan <29133953+stevefan1999-personal@users.noreply.github.com> Date: Mon, 31 Dec 2018 18:23:14 +0800 Subject: [PATCH 3/8] feat: test if this could hide idea diff --- .gitattributes | 1 + .idea/saveactions_settings.xml | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 .gitattributes diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..4a30d55 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +.idea/* linguist-vendored \ No newline at end of file diff --git a/.idea/saveactions_settings.xml b/.idea/saveactions_settings.xml index 66129c1..7d35778 100644 --- a/.idea/saveactions_settings.xml +++ b/.idea/saveactions_settings.xml @@ -5,7 +5,6 @@ From 1ca557e3f68091bfff61ca2fe8dcb1e7a1aabc68 Mon Sep 17 00:00:00 2001 From: Steve Fan <29133953+stevefan1999-personal@users.noreply.github.com> Date: Mon, 31 Dec 2018 18:27:03 +0800 Subject: [PATCH 4/8] feat: no more idea folder diff --- .gitattributes | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitattributes b/.gitattributes index 4a30d55..6f03063 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1 +1 @@ -.idea/* linguist-vendored \ No newline at end of file +.idea/* linguist-generated \ No newline at end of file From 6bfba1aa22c51bbe5eb29fb6df46db211c24b1b3 Mon Sep 17 00:00:00 2001 From: Steve Fan <29133953+stevefan1999-personal@users.noreply.github.com> Date: Mon, 31 Dec 2018 18:53:39 +0800 Subject: [PATCH 5/8] change: use release build by default --- CMakeLists.txt | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 5add52a..b0ea67d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,9 +5,21 @@ if (UNIX AND NOT APPLE) set(BUILD_SHARED_LIBS OFF) endif () + find_package(Threads REQUIRED) +if (NOT CMAKE_BUILD_TYPE) + set(CMAKE_BUILD_TYPE Release) +endif () + set(CMAKE_CXX_STANDARD 11) +set(CMAKE_CXX_FLAGS "-Wall -Wextra") +set(CMAKE_CXX_FLAGS_DEBUG "-g") +set(CMAKE_CXX_FLAGS_RELEASE "-O3") +set(CMAKE_C_FLAGS "-Wall -Wextra") +set(CMAKE_C_FLAGS_DEBUG "-g") +set(CMAKE_C_FLAGS_RELEASE "-O3") + set(DEP_DUK ${PROJECT_SOURCE_DIR}/deps/duktape) set(DEP_ARES ${PROJECT_SOURCE_DIR}/deps/c-ares) set(DEP_MBED ${PROJECT_SOURCE_DIR}/deps/mbedtls) From 01401b3836c5e84878f8f1b294caf6bfcc8d3dad Mon Sep 17 00:00:00 2001 From: Steve Fan <29133953+stevefan1999-personal@users.noreply.github.com> Date: Mon, 31 Dec 2018 18:55:27 +0800 Subject: [PATCH 6/8] fix: move the build type away --- CMakeLists.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b0ea67d..76102d6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -8,10 +8,6 @@ endif () find_package(Threads REQUIRED) -if (NOT CMAKE_BUILD_TYPE) - set(CMAKE_BUILD_TYPE Release) -endif () - set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_FLAGS "-Wall -Wextra") set(CMAKE_CXX_FLAGS_DEBUG "-g") @@ -20,6 +16,10 @@ set(CMAKE_C_FLAGS "-Wall -Wextra") set(CMAKE_C_FLAGS_DEBUG "-g") set(CMAKE_C_FLAGS_RELEASE "-O3") +if (NOT CMAKE_BUILD_TYPE) + set(CMAKE_BUILD_TYPE Release) +endif () + set(DEP_DUK ${PROJECT_SOURCE_DIR}/deps/duktape) set(DEP_ARES ${PROJECT_SOURCE_DIR}/deps/c-ares) set(DEP_MBED ${PROJECT_SOURCE_DIR}/deps/mbedtls) From 31929d18410ee3473b07e5201ad9958da100ff76 Mon Sep 17 00:00:00 2001 From: Steve Fan <29133953+stevefan1999-personal@users.noreply.github.com> Date: Mon, 31 Dec 2018 19:05:34 +0800 Subject: [PATCH 7/8] change: move extra checks into debug mode --- CMakeLists.txt | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 76102d6..8c124be 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -8,18 +8,13 @@ endif () find_package(Threads REQUIRED) +set(CMAKE_C_STANDARD 11) set(CMAKE_CXX_STANDARD 11) -set(CMAKE_CXX_FLAGS "-Wall -Wextra") -set(CMAKE_CXX_FLAGS_DEBUG "-g") +set(CMAKE_CXX_FLAGS_DEBUG "-g -Wall -Wextra") set(CMAKE_CXX_FLAGS_RELEASE "-O3") -set(CMAKE_C_FLAGS "-Wall -Wextra") -set(CMAKE_C_FLAGS_DEBUG "-g") +set(CMAKE_C_FLAGS_DEBUG "-g -Wall -Wextra") set(CMAKE_C_FLAGS_RELEASE "-O3") -if (NOT CMAKE_BUILD_TYPE) - set(CMAKE_BUILD_TYPE Release) -endif () - set(DEP_DUK ${PROJECT_SOURCE_DIR}/deps/duktape) set(DEP_ARES ${PROJECT_SOURCE_DIR}/deps/c-ares) set(DEP_MBED ${PROJECT_SOURCE_DIR}/deps/mbedtls) From 6010f341b3c54f368f91934f4b7e68d0459478f1 Mon Sep 17 00:00:00 2001 From: Steve Fan <29133953+stevefan1999-personal@users.noreply.github.com> Date: Tue, 1 Jan 2019 02:11:37 +0800 Subject: [PATCH 8/8] bug: remove the stray character --- lib_js/init.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_js/init.js b/lib_js/init.js index 8136808..e6b5d04 100644 --- a/lib_js/init.js +++ b/lib_js/init.js @@ -115,7 +115,7 @@ class Timeout { native.clearChore(this._id); this._id = native.setChore(this._func, this._delay, this._oneshot); } -v} +} exports.setTimeout = function (func, delay) { var cb_func; var bind_args;