The Most Efficient Gnutella Client
gtk-gnutella is a server/client for Gnutella. It runs on Microsoft Windows and every Unix-like system which supports GTK+ (1.2 or above). The GNOME desktop environment is not required. It is currently developed and tested under Linux (Debian) as well as NetBSD. It is known to run at least on Linux, FreeBSD, NetBSD, Darwin, Solaris, Tru64 UNIX (OSF/1), SGI IRIX, BeOS whereas CPU architectures include x86, AMD64, PowerPC, SPARC, MIPS. And of course Microsoft Windows (XP at least).
gtk-gnutella is free open-source software and released under the GNU General Public License (GPL).
gtk-gnutella is not finished yet, but it is fully functional: you may share, search, and download. And it is stable too, users usually just leave it run unattended for days.
All ideas and comments are welcome to the gtk-gnutella-devel mailing list. Bugs should be reported to the SourceForge.net Bug Tracker
11 November 2012, Version 0.98.4 Released
This is an important release correcting severe bugs affecting the overall wealth of the system: the PARQ upload queue was not properly restored, the DHT was not always sending correct values back (resulting in failed lookups), and SDBM (our hash-on-disk database) had two well-hidden bugs that could cause crashes at startup or that compromised regular runtime operations.
This release also introduces an interesting improvement: we are now using a reliable UDP layer to transfer out-of-band query hits, ensuring that these important messages are properly sent and received and never lost.
The SPAM-detection on query hits received via UDP was too eager to discard results from perfectly valid sources, causing improper loss of results from your queries.
We were also wrongly sending out more queries than necessary: a long-standing bug caused locally-issued OOB-proxied queries to be re-emitted a second time, and we were re-forwarding duplicate queries (received with higher TTL than before) to all the leaves. Although not harmful, these two bugs were wasting some of the outgoing bandwidth when running as a ultra node.
- Plugged support for "OOB Proxy Veto".
- Added a Semi-Reliable UDP layer for Gnutella for safe OOB hit delivery.
- Report and display available file size when handling hits for partial files.
- Added French and Turkish translations of the FAQ.
- Updated French and Turkish translations.
- Fixed typo in a German translation.
- Cleanup of the English FAQ, updating obsolete answers.
- [GTK] Show different icon and tooltip when port mapping done through NAT-PMP.
- [GTK] Flag results from servents with a banned GUID in the "Info" column.
- [GTK] Windows version now compiled with GTK 2.24.10.
- Non-sharing servents can now be promoted to ultra peers (in automatic mode).
- Be stricter about vendor messages origin: ignore them if from wrong protocol.
- Strip GGEP "NP" key from relayed queries.
- Use higher-priority UDP messages for important or time-sensitive data.
- Use semi-reliable UDP to transfer critical data (query hits).
- Make sure the queries we OOB-proxy have a GGEP "SO" key for secure OOB hits.
- Ignore unsecure OOB hit promises from hosts known to support secure OOB.
- Use some of our connected ultra nodes when filling UHC pongs.
- Updated GeoIP databases.
- When resuming from crashes, do not stop session-only searches.
- Persist selected search media types from session to session.
- Report last modification time + available size of partial files in hits.
- Added "webm" and "zoo" to the list of file extensions that can be shared.
- Display unexpected command-line argument before usage output.
- The shell "status" command now shows how port mapping was done, if any.
- Do not forward "What's New?" queries to leaf nodes with empty routing tables.
- Avoid segmentation fault if GUESS 0.2 cache is empty.
- Avoid SDBM crash when clearing database which had big keys/values present.
- Use signed arithmetic to compute compression ratios.
- Consider x.x.x.0 as a possibly valid IPv4 address.
- Was not correctly parsing the saved PARQ queue, causing undue forgetting.
- Fixed key accounting in DBMW.
- SDBM was sometimes not iterating over unflushed dirty LRU pages.
- Fixed wrong DHT value response message format.
- Fixed crash when attempting to browse host on a queued source.
- Do not route duplicate queries with higher TTL to leaves.
- Prevent sending of duplicate (locally issued) OOB-proxied queries.
- Fixed startup crash bug on Ubuntu machines.
- Changed the Debian menu icon to use the one which is 32x32, as lintian wants.
- Fixed auto-restart function on 64-bit Windows.
Under the Hood
- [GTK] Darken the color used to display partial results (yellow -> dark gold).
- Various PARQ cleanup to smooth QUEUE callback operations.
- Fallback to pre-computed symbol file when loaded symbols are garbage.
- Relax file_path_set() and open_read() to gracefully handle relative paths.
- get_folder_basepath(): protect against unsuitable environment variables.
- Recompute the amount of banned fds dynamically as config parameters change.
- Detect series of unclaimed OOB hits from a host to ignore further queries.
- Changed MUID marking strategy in queries to better accomodate OOB proxying.
- Added a UDP TX scheduler to optimize datagram sending by priority.
- Enhanced the incremental zlib operations, reusing objects across operations.
- Added new official ISO 3166 country codes.
- node_read(): was wrongly resizing the message buffer for each message!
- Refactored aging table to lower memory footprint (by 6 pointers per entry).
- On Windows, keep last 3 stdout/stderr logs, created when launched from GUI.
- Send important UDP messages with a "control" priority.
- Count TCP push-proxy requests aimed at firewalled-to-firewalled connections.
- Patch UDP PUSH messages aimed at initiating firewall-to-firewall transfers.
- Count received PUSHes requesting FW-FW transfers, plus those targeting us.
- dht_init(): do not reset the KUID if DHT disabled at startup.
- Detect whether we are restarting after a clean shutdown or after a crash.
- bg_task_terminate(): don't panic at shutdown when handling unaccounted tasks.
- Reserve only about 40% of the available virtual memory space on Windows.
- Always discover port-mapping devices, even if they won't be used.
- Ensure reasonable TTL and hops for PUSH messages from UDP we will route.
- The shell "nodes" command now displays the gnet port along with the address.
- Added metaconfig check for malloc() superseding.
- New switch --disable-malloc added to build.sh to prevent superseding malloc().
- When launching gdb during crash, ask for threads and thread stacks as well.
- External IP changes were not waiting for 3 hosts in 3 different CIDR ranges.
- Removed too restrive permissions in the man page (COPYRIGHT section).
- Shell meta-chars in executable path do not prevent loading symbols via BFD.
- Added more DHT statistics.
4 June 2012, Version 0.98.3 Released
- [GTK] Added per-search GUESS statistics line, which can be hidden by users.
- [GTK] Display amount of downloads associated with search in the search label.
- Added property to control usage of unused Gnutella bandwidth by GUESS.
- Added "memory check xmalloc" shell command to monitor the xmalloc freelists.
- On Windows, generate a gdb-like stack trace in the crash log file.
- [GTK] Optimized rendering of main statistics page.
- [GTK] Show more accurate message for queued downloads on completed files.
- Shell now displays properties with appropriate surrounding type markers.
- Limit pongs sent to transient nodes in order to save some bandwidth.
- Avoid sending too many pongs on uncompressed connections.
- Added README.Windows to document compile instructions for Windows.
- Avoid "write() failed: EPIPE" messages from the shell for local client writes.
- Added GUESS link cache size to the general statistics pane.
- GUESS now uses a dynamically computed outgoing bandwidth limit.
- Allow failed TLS connections to be retried without TLS, transparently.
- Added "-a" switch to the shell "version" command to display glib/GTK/TLS info.
- Added -p switch to the "stats" shell command to pretty-print numbers.
- Memory optimization of commonly used data structures to reduce footprint.
- Always generate a crashlog file, even when dumping a core.
- PARQ: switch actively queued download to another when file has been completed.
- Attempt to immediately restart download after failed SHA1 + TTH verification.
- At startup, compute TTH if available and SHA1 checking failed.
- When switching PARQ 1.0 downloads, switch IDs if queue position is favorable.
- Updated translation strings, and fixed French translation.
- bug #3286824 "Crash at startup / 0.96.9 / FreeBSD AMD64"
- Fixed %G formatting bug whereby a zero following a dot would be missed.
- Prevent auto-restart when they explicitly request a shutdown.
- Fixed grave bugs in the virtual memory layer, some being Windows-specific.
- PARQ was not properly computing amortized per-slot time.
- Avoid random shell connection failures on Windows.
- An un-parseable token in a shell command led to an assertion failure.
- Fixed the "alignment optimized" code branch of msort_with_tmp().
- Fixed bad copy-n-paste that could lead to malloc() freelist corruption.
- Fixed GUESS corner-case crash when handling an RPC timeout.
- [GTK] Avoid crash when user clears the upload statistics (bug #3501181).
- On Windows, be smarter when reserving the initial amount of virtual space.
- GUESS: always wakeup sleeping queries if we have bandwidth.
Under the Hood
- Improved thread-safety of the VMM layer.
- Removed perl4-ism in Perl scripts.
- Updated IPv4 and IPv6 geo databases.
- Attempt to drive a deadlock crash as far as possible to collect debug info.
- When logging from another thread (not main), include the small thread ID.
- Switched halloc() to xpmalloc() instead of walloc().
- Added thread-private zones for blocks <= 512 bytes for faster allocations.
- Optimized access to thread-private information, via a lock-free fast path.
- Exit with a zero status when terminating through a regular signal or request.
- Some UTF-8 optimizations and low-level fixes.
- Also log the faulting PC when we get a harmful signal.
- Use the BFD library, if available, to extract symbols from the executable.
- Restored ability to have usable stack unwinding on Windows.
- Extended crash log information to include full OS name and CPU architecture.
- Sort SHA1s in the search.xml file.
- Clear whole routing table when switching between Ultra and Leaf modes.
- Protect xfree() from algorithmic complexity when handling bursts.
- Added xmalloc garbage collector to reclaim fragments from freelist.
- Allow the "TLS handshake failed" string to be translated.
- Consider IPv4 addresses x.x.x.0 as non-routable.
- Now uses own hash table and hash set implementations.
- Strengthened entropy collection and ARC4 initial seeding.
- Randomly propagate GUESS 0.2 hosts among GUESS 0.2 servents.
- Assume we're not firewalled right after initial UPnP or NAT-PMP configuration.
- Avoid compiler warnings on Windows.
- Make sure random_value() returns uniformly distributed random numbers.
- Added ability to filter dumped traffic by IP address.
- Changed %F to display whole mantissa before switching to scientific notation.
- Ensure memory allocated from the heap is aligned properly.
- Show amount of detected CPUs at startup.
- Added version numbers to the crash log file name.
- Avoid complexity attacks on the hash table.
30 December 2011, Version 0.98.2 Released
This is a minor patch to support systems running latest Ubuntu systems, and maybe others which create multiple threads for GTK programs: our xmalloc() implementation replaces the system's malloc() but it was not safe to use in multi-threaded environments.
- [GTK] Added option to discard results from banned GUIDs (set by default).
- [GTK] Display results from servents with a banned GUID in "hot pink".
- Updated turkish translation.
- Added IPv6 geo-localization database (from Maxmind).
- Added dynamic IPv6 hostile support.