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
31 December 2013, Version 1.0.1 Released
This is a minor release correcting a grave bug causing gtk-gnutella to think all other gtk-gnutella out there are hostile.
Other minor improvements are present, as well as low-level bug fixes. The most visible change is that filenames with parentheses are now mangled to have the parentheses turned into brackets, instead of being left as-is. This allows filename cut-n-paste into shell commands, without having to use the shell auto-completion to escape the parentheses.
- Generate a NM/1.0 HTTP-like header at the top of the pre-computed nm list.
- [GTK] Avoid GUI flickering when widget sensitivity is changing quickly.
- Replace "()" with "" in filenames for easier cut-n-paste in shell commands.
- Windows: improved stack unwinding.
- Fixed grave bug, making all GTKGs appear hostile.
- qrp_close(): must disable periodic monitoring during shutdown.
- filename_to_utf8_normalized(): fixed broken if/else logic in loop.
Under the Hood
- Updated the GeoIP databases.
- Added a Keywords entry for lintian in the gtk-gnutella.desktop file.
- Fixed license link to point to GPL-2 on Debian systems.
- Added gtk-gnutella.appdata.xml for distributions that need such a file.
- Renamed icon.xpm as icon.48x48.xpm and icon.32x32.xpm as icon.xpm.
- TLS: disabled SVN signature verification code, since we no longer use SVN.
- Define our own G_STRFUNC, do not use the version from GLib.
- vmm_resize(): fixed wrong implementation when vmm_crashing is true.
- Semi-reliable UDP: drop traffic to host temporarily if we can't send messages.
- Use a 5-minute TLS ban to avoid reconnecting to host with TLS when it failed.
- download_mark_active(): do not reset fi->recv_last_rate on HTTP follow-ups
- bsched_heartbeat(): fixed wrong delay computatation, use tm_elapsed_ms().
- gtk_gnutella_exit(): always emit final "cleanly exited" info.
- zalloc_stack_accounting_ctrl(): used wrong lookup key, leading to crashes.
- mingw_valloc(): handle initial non-hinted allocations larger than page.
- signal_trap_with(): fixed improper return value computation for sigaction().
1 September 2013, Version 1.0.0 Released
This is a major release correcting a few bugs and adding small but interesting features such as the ability to limit dropping of received UDP messages, making the DHT keys and values persistent across sessions, SDBM file auto-compaction at startup, and last but not least, rarest-chunk downloading to optimize download efficiency when facing partial sources.
- Let users define a maximum lease time for UPnP and NAT-PMP mappings.
- Made DHT keys and values persistent across sessions.
- When there are partial sources for a file, download the rarest chunks first.
- [GTK1] Optimize massive updating of the download source list.
- [GTK] Dynamically update the list of available chunks in the file (blue line).
- Files used to persist information across sessions are now auto-compacted.
- The UPnP layer can now monitor more types of Internet Gateway Devices.
- After unclean shutdown, rename existing core file in crash directory.
- Detect servers that choke when receiving pipelined HTTP requests.
- Added the Mersenne Twister Pseudo-Random Number Generator.
- Remember when user requests an auto-restart, to keep the same session going.
- Increased maximum download buffer size to 1 MiB and default to 128 KiB.
- [GTK2] Set height of the pref/upload window (paths to files) to 100 pixels.
- [GTK1] Fixed wrong enum value usage (c_fi_sources instead of c_src_num).
- [GTK] Download source details were incorrect sometimes for queued downloads.
- [GTK] Reserve display of partial file indication (PFS) to partial sources.
- DHT traffic accounting was broken when semi-reliable UDP was introduced.
- Was wrongly keeping orphan DHT contacts and removing alive ones!
- Fixed wrong restarting DB key computation for DHT values (preventing crashes).
- Fixed improper "good" alt-loc flagging from uploaders, leading to wrong mesh.
- Fixed English typos in comments and user-visible messages.
- Avoid selecting the magic fw-fw file index for partial files in query hits.
- Fixed wrong propagation of duplicate messages with higher TTL.
Under the Hood
- Fixed posix_memalign() so that we can now run with glib 2.36 and upwards.
- [GTK] Update available ranges when the core sends a "range changed" event.
- Added UDP datagram read-ahead to minimize local kernel drops (RX queue full).
- Added UDP read-ahead statistics.
- Ensure "DHT values" and "DHT raw data" SDBM files are consistently reloaded.
- Fixed omalloc() memory usage accounting.
- str_at(): fixed harmful typo causing it to seg-fault with negative offsets.
- Do not send X-Features / X-Token on follow-up HTTP requests.
- upnp_dscv_probed(): plugged memory leak.
- UPNP: extract the Service Control Protocol Definition (SCPD) URL.
- UPNP: monitor gateway with GetStatusInfo() if no GetTotalPacketsReceived().
- Some UPnP devices can advertize an API and yet return 401 (action invalid).
- bigkey_hash(): more robust in case we encounter a big key and support is off.
- udp_sched_write_error(): don't panic if we get an unexpected UDP write error.
- Jumbo patch: replaced most gm_[v]snprintf() with str_[v]bprintf() calls.
- Count truncated incoming UDP messages.
- http_got_header(): fixed harmful typo causing mishandling of chunked output.
- After 3 X-Nalt reports, move source from download mesh to the banned mesh.
- Leave banned entries in the bad mesh for at least 5 minutes.
- cq_free(): release mutex to prevent loud warning a shutdown time.
- When the the crash handler child fails, append decorated stack from parent.
- download_data_received(): extend fileinfo when file size is unknown.
- Moved HTTP range parsing / handling from core to library (re-architectured).
- Benchmark sorting routines at startup and select the most efficient.
- socket_udp_flush_timer(): do not process queued datagrams during shutdown.
- Make rand31() more random, especially on the low-order bits.
- Added computation of chi-squared cumulative distributions.
- Made entropy_random() 5 times faster on average.
- Prefer random_value() over random_u32() followed by bit masking.
- The random layer now uses the Mersenne Twister, excepted for random_bytes().
- hash_keyset_lookup(): was not always spotting first tomb correctly.
- Let small hash tables be denser than larger ones.
- Tweaked hash tables and derivatives for smaller memory footprint.
- guess_pmsg_free(): make sure pool does not contain host before adding it back.
- http_send_status(): was not properly detecting too large HTTP headers.
- Semi-reliable RX UDP: re-ack everything well before the whole message expires.
- Adjust maximum DHT value count per IP/network dynamically with DHT size.
- Be careful when truncating body on an HTTP kept-alive connection.
- ensure_unicity(): assume pidfile is locked when lock owner bears our PID.
- Added protection when writing important files on filesystems like "ext4".
- PARQ: accept to move an upload to the "dead" queue even if we wait for QUEUE.
- Made GTK2 the default GTK version since GTK1 is not 64-bit safe.
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.