* chore: housekeeping
* refactor: reduce copying when building payloads
* feat: dual-stack udp tracker support
* refactor: convert function names to snake_case
* fix: `readability-identifier-naming` warning
* fix: account for dual-stack in tests
* code review: add prefix to global names
* fix: don't resolve to IPv4-mapped address
* refactor: use `tr_address` method to check ip protocol
* fix: workaround MSVC x86 build failure
* fix: handle host components that has square brackets
* Partial Revert: "fix: account for dual-stack in tests"
Not needed anymore
* fix: store ipv6 peers in pex6
---------
Co-authored-by: Charles Kerr <charles@charleskerr.com>
* fix: don't save blocks bitfield to resume when we are seed
* chore: housekeeping
* code review: replace `auto` with `tr_resume::fields_t`
* code review: remove the `have` key in resume
* fix: `blocks` error message
* chore: housekeeping
* refactor: store peer info objects in shared_ptr
* refactor: minimise insert/erase operations to the peer info pool
* refactor: unify `on_got_port()` exit point to simplify cleanup
* fix: use `std::unordered_map` as a stand-in for `small::map`
* refactor: use small maps but with `std::vector` as base
* fix: suppress goto warning
* refactor: use `small::map`
* fix: remove constexpr
* feat: allow upnp to recover from errors
* feat: allow natpmp to recover from errors
* chore: housekeeping
* code review: explicitly list all states to start discovering from
* fix: recover from failed UPnP discovery
* refactor: remove `UpnpState::Failed`
std::chrono::duration is just a wrapper, underlying numerical value member will be default initialized to zero as expected.
See https://en.cppreference.com/w/cpp/chrono/duration
Signed-off-by: Dzmitry Neviadomski <nevack.d@gmail.com>
* fix: queue torrent verification as soon as metadata complete
* fix: avoid heap-use-after-free in `tr_peerMsgsImpl::process_peer_message()`
Details: https://github.com/transmission/transmission/pull/6383#discussion_r1429202253
* code review: move `tr_torrent::do_magnet_idle_work()` to private
* code review: `std::deque::empty()` is not `constexpr`
* fix: test
* chore: housekeeping
* refactor: convert `on_idle()` to class method
* refactor: convert `task_request_next_chunk()` to class method
* refactor: convert `onPartialDataFetched()` to class method
* refactor: convert `onBufferGotData()` to class method
* refactor: convert `useFetchedBlocks()` to class method
* refactor: hide some `tr_webseed_task` fields and methods
* refactor: convert `tr_webseed_task` methods to snake_case
* refactor: remove `write_block_data`
* refactor: store reference to `tr_torrent` directly
* refactor: convert `ConnectionLimiter` methods to snake_case
* refactor: convert `tr_webseed` methods to snake_case
* refactor: hide `tr_webseed` callback member variables
* refactor: convert `tr_webseed` to C++ interface
* feat: accept ipv6 string in square brackets for `tr_address::from_string()`
* test: add test case for ipv6 string in square brackets
* fix: include square brackets in host component
According to RFC3986:
host = IP-literal / IPv4address / reg-name
IP-literal = "[" ( IPv6address / IPvFuture ) "]"
* fix: set ipv6-only socket before binding UDP socket
Will return EINVAL on Linux otherwise
* refactor: simplify code using `evutil` when binding TCP socket
* fix: do not set SO_REUSEADDR for listening sockets on Windows systems
Reason: https://stackoverflow.com/a/14388707/11390656
* fix: do not enclose ipv4 address string in square brackets
* fix: `tr_address` should be invalid by default
* fix: allow loopback address for LPD and incoming connections
* fix: `parseCidrline()` should set address type
* code review: keep `memcmp`
* fix: Sparkle Version Comparator
* Code review: Reducing CFBundleVersion to three components and avoiding versionComparatorForUpdater
* adding +99 when it's a non-beta release
* code review: set CFBUNDLE_VERSION and unset components
* re-adding support for ignoring beta
* refactor: update bep links
* chore: use more appropriate data types
* chore: checkpoint
* refactor: split `can_request()` into each of their own different signature
* chore: checkpoint
* refactor: convert tr_peerMsgsImpl functions to methods
* chore: checkpoint
* refactor: store peer info as reference
* refactor: convert all member variables to private
* chore: re-arrange methods
* refactor: optimise tmp vector default size in `send_ut_pex()`
* chore: housekeeping
* chore: housekeeping
* refactor: avoid `dynamic_cast` when sending cancel
* fix: restore `blocks_sent_to_peer` stat
regression e91af26923
* fix: choke first then reject
* refactor: convert `tr_peerMsgsNew()` to static factory function
* refactor: store `tr_torrent` reference instead of pointer
* Revert "refactor: store peer info as reference"
This reverts commit bb419bf2
---------
Co-authored-by: Charles Kerr <charles@charleskerr.com>
* refactor: use fmt::print in log.cc
https://github.com/fmtlib/fmt/issues/428#issuecomment-395442159
> You can use fmt::print("...\n") on Windows as well.
Use this mechanism instead of tr_sys_file_write_line()
* refactor: use FILE* in daemon
* refactor: remove unused tr_sys_file_flush_possible()
* refactor: remove unused tr_sys_file_write_line()
* refactor: remove unused tr_sys_file_get_std()
* refactor: remove unused tr_std_sys_file_t