* refactor: make tr_peerIoGetAddress() a member function
* refactor: make tr_peerIo.addr a private field
* refactor: make tr_peerIoIsIncoming a member function
* refactor: make tr_peerIoHasBandwidthLeft a member function
* refactor: make tr_peerIoGetPieceSpeed_Bps a member function
* refactor: make tr_peerIoSupportsFEXT() a member function
* refactor: mark tr_peerIo::supportsDHT nodiscard
* refactor: update naming style for tr_peerIo fields
* refactor: make tr_peerIo.is_seed a private field
* fix: ESPIPE "illegal seek" error while seeding
The root cause is createSocket returning `{}` instead of `TR_BAD_SOCKET`
when we have too many peers in use. This defaulted to fd 0, which wound
up closing stdin.
Commit also includes some const-correctness changes made while tracking
the problem down.
* Modernize blocklist.cc to C++
* Modernize blocklist.cc: Renamed BlocklistFile struct and moved IPv4 range struct inside it
Modernize bandwidth.cc: Review notes; Promote container of blocklists in session to vec of unique_ptrs
* fix: invalid tr_peerMsgsImpl::prefetchCount value
This count could get corrupted due to imprecise bookkeeping when
processing peers' cancel messages. This PR replaces the field with
a `prefetched` flag in the struct that represents a peer request.
This approach has simpler code, simpler logic, and is harder to break.
* refactor: remove unused field tr_torrent.prefetchMagnetMetadata
* refactor: remove unused field tr_torrent.dhtAnnounce6InProgress
* refactor: remove unused field tr_torrent.dhtAnnounceInProgress
* refactor: fold etaULSpeed and etaDLSpeed into one field
* refactor: re-arrange fields to avoid padding
* Support specifying the umask as a string representing an octal number.
* Save the umask as a string representing an octal number.
* Support specifying the IPC socket permission as a string representing an octal number.
* Save the IPC socket permission as a string representing an octal number.
* Add a `base` parameter to `tr_parseNum()` for specifying the radix.
Most use cases involve either (a) using the default group or (b) sharing
a group with other torrents. In both cases, using a tr_quark is cheaper
than a std::string.
* refactor: re-enable cert-err33-c clang-tidy warning
* refactor: use fmt::chrono in transmission-remote
* refactor: use fmt::chrono in transmission-show
* refactor: use fmt::chrono in GTK details dialog
* refactor: use fmt::chrono in tr_session
* refactor: remove tr_localtime_r
* refactor: remove tr_gmtime_r