The Most Efficient Gnutella Client
gtk-gnutella is a server/client for the Gnutella peer-to-peer network. It runs on Microsoft Windows, MacOS 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-2).
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.
This website is written in PHP, follows HTML5 and CSS3 web standards and does not use cookies.
All ideas and comments are welcome to the gtk-gnutella-devel mailing list. Bugs should be reported to the SourceForge.net Bug Tracker
We need additional contributors for C development, documentation, software translation and website translation.
News
3 March 2024, Version 1.2.3 Released
This is a maintenance release with minor bug fixes.
Improvements
- Allow final address to be used as a search and sorting column in GUI.
- Do not hide the "random stats" shell command in the help.
- Shell "node add" now supports g2:IP:port for G2 nodes.
Bug Fixes
- Avoid assertion failure in
xmalloc()
when the page size is not 4K - Fix build on NetBSD with SSP.
- Avoid conflicting symbol with NetBSD's powerpc/frame.h
- Force supervisor to quit if child gets a SIGKILL.
- Forgot to set te->ptid in discovered threads.
Under the Hood
- Add
aq_on_available()
to hide waiter object. - Add debugging #define XMALLOC_DISABLED to remap
xmalloc()
tomalloc()
. - Add randomness every minute instead of 30 seconds.
- Dump held locks when suspending thread with locks.
- Fix
thread_lock_dump()
logic. - Recent version of glib define G_NORETURN already.
- Use library
popcount()
if it exists. - Use an integer for atomic_lock_t (or it fails on Darwin ppc32).
atio_get_lock()
: no need to hash file descriptor.crash_hook_add()
: watch out for early inits.crash_init()
: ignore subsequent calls, loudly.crash_mode()
: disable locking on concurrent crash.dump_hex_vec()
: do not re-emit header if reached end.entropy_collect_gateway()
: cache initial gateway information.entropy_harvest_many()
: accelerate processing.evq_close()
: forgot to free local callout queue.getgateway()
: avoid endless warnings.- hashlist: avoid race condition for moveto operations.
random_double_generate()
: ensure value is in [0, 1[.ripening_set_expire()
: remove faulty assertion.rwlock_deadlocked()
: trace locking thread owner.rwlock_lock_granted()
: verify waiter presence.rwlock_readers_downto()
: issue a memory barrier.shared_file_free()
: give more details on assert failure.semaphore_emulate()
: was not handling timeout properly.sig_get_pc_index()
: also trap SIGBUS for OS/X.socket_tls_upgrade()
: synchronous upgrade logged but no longer fatal.str_private()
: must useNOT_LEAKING_Z()
forwalloc()
.str_slice()
: change semantics of `to'.thread_element_reset()
: also clear lock stack overflow.thread_lock_dump()
: can now omit details if necessary.thread_lock_released()
: give more context on problems.thread_sig_handle()
: add default handling of TSIG_TERM.vmm_mmap_anonymous()
: optimize re-locking.walloc_get_zone()
: do not keep lock whilst allocating zone.xmalloc_chunk_allocate()
: validate chunk head is sound.- zalloc: do not keep lock whilst extending the zone.
zget()
: limit scope of global spinlock to a minimum.
25 February 2022, Version 1.2.2 Released
This is a maintenance release with major bug fixes.
There were several shortcomings with bandwidth management: capping was not performed correctly and could overuse uploading bandwidth. Also when the DHT is turned off or on, we need to recompute proper bandwidth stealing.
Corruption of the DHT disk databases could also lead to a crash.
There was a critical old bug in the Dynamic Querying layer that affected Ultrapeers mostly: we could corrupt memory and/or crash when the current node was removed and we were processing a Dynamic Query for that node. This is more likely to happen when running as an Ultrapeer but it could also affect nodes running as leaves, although the probability of that bug happening is much less in that case.
Finally, it is best to not iterate on a global list that could get changed due to a node removal. This was the case when sending pongs to neighbouring nodes, so we now take a private copy.
Improvements
- Extended "props" shell command with -e (exact) and -i (ignore missing).
- The "props" command now takes a set of properties, handled as one batch.
Bug Fixes
- Properly recompute bandwidth stealing on DHT changes.
- Avoid crashing in D-Bus lib when filename is improperly UTF-8 encoded.
- DHT: protect against corrupted database.
bw_available()
: fix invalid logic for I/O source capping.pong_all_neighbours_but_one()
: iterate on local list.dq_node_removed()
: must free dq object asynchronously.
Under the Hood
- Update IRC network information: moved from freenode to libera.chat
- Chunk size limiting for uploads accounts for bandwidth.
- Reduce memory footprint for statx_t if no data kept.
- CQ: defer freeing of dispatched event.
- watchdog: be more verbose within critical messages.
node_parse()
: signal to callers when we have BYE-ed the node.cq_event_called()
: use better diagnostic on assert failure.dbus_util_send_message()
: protect against invalid text.prepare_entry()
: ensure entry invariant remains true.wd_expire()
: do nothing if watchdog was asleep.
12 July 2021, Version 1.2.1 Released
This is a maintenance release with minor bug fixes.
Note that our project IRC #gtk-gnutella channel is now on irc.libera.chat.
When launching gtk-gnutella and there is a stale lockfile present, listing some PID, and it happens that there is already another process running under this PID, we abort, complaining that another gtk-gnutella is running. However, if the lockfile is really stale, and the PID listed in there has nothing to do with gtk-gnutella at the moment, the user will need to remove the stale lockfile. Hence we show them the command to run, listing the full lockfile path so that it is easy to overcome this little inconvenience!
When using hashtables for memory management, it was possible to trigger a resizing and, during the course of operations, have further memory used, requiring tracking of new items in the same hashtable we were in the process of resizing. That led to double VMM freeing of the region used to store the data.
Add properties to track bytes exchanged by schedulers. These properties track the amount of bytes exchanged by session and are reset to 0 whenever a new user session starts. It allows users to see the actual amount of data consumed by running gtk-gnutella sessions, programatically via the shell interface.
Add -t switch to shell "status" command: this displays the total amount of bandwidth consumed during the session for the different schedulers.
Improvements
- Show command to clean stale lockfile.
- Add properties to track bytes exchanged by schedulers.
- Add -t switch to shell "status" command.
- Make use of libera.chat instead of freenode.
- Expiration time now increased from 1 to 2 years.
- New --no-expire switch to disable GUI popup when expired.
Bug Fixes
pattern_prefix_period()
: don't corrupt end-of-block.- Fix subtle recursive resizing bug.
- Do not emit empty leading description in saved properties.
- For time sync over UDP, write replying time later!
hash_table_resize()
: clear last cached lookup!ev_link()
: insert events in the proper bucket!
Under the Hood
- Updated GeoIP databases.
- Ad
bit_generic_count_set()
. - Add
plural_child()
. - Add
progstart_was_called()
. - Add
H_STRFREEV_NULL()
. - Add syn=c to *.ht and *.ct files for vim.
- Add
hash_table_copy_foreach()
. - Add
tm_precise_elapsed_ns()
convenience routine. - Add
thread_stack_size()
to get configured stack size. - Add
pattern_string()
to get the string being looked for. - Add
str_2c_from()
to grab C string from a given offset. - Add
eval_subst_atom()
. - Add
stacktrace_caller_fast()
and stack-test program. - Add thread_{un}
suspend()
. - Add
tmalloc_contains()
for assertions. - Add public VMM validate/invalidate routines.
- Add macros to ease printing for tmval and tmspec.
- Add
node_check()
to node traversal loops. - Avoid branches in
SIGN()
as well. - Avoid regeneration of Geo DB if no data changes.
- Bump python dependency for jhbuild on OSX.
- Better clock skew computation.
- Handle time-sync exchanges via UDP better.
- Make use of travis cache feature for OSX builds.
- Only include <sys/sysctl.h> if we actually need it.
- Allow compilation with usemymalloc=n on 32-bit CPUs.
- Let
mem_test()
run only once. - When no
backtrace()
, ensure we compile with a frame pointer. - Compile with -DTRACK_MALLOC -DREMAP_ZALLOC again.
- Made -DTRACK_ZALLOC usable again.
- Do not check stack at
longjmp()
if on altstack. - Do not trap hash_list_{new,free}() under REMAP_ZALLOC.
- Ensure properties use
xmalloc()
for their values. - Wait until
main()
starts to allocate the signal chunk. - Made
ascii_toupper()
andascii_tolower()
avoid branching. - Trace saving time whithin property files.
- Trace page (PA) and offset within page on SEGV.
- Trace page protection on SEGV faults, if possible.
- Trace how and where symbols were loaded in crash log.
- Symbol quality definition moved to symbols!
- Windows: handle freopen("a") specially to allow read sharing.
- Windows: no need to dump stack again if no gdb.
- mutex: supply more context on lock errors.
- ostream: now also accepts str_t as output medium.
- rwlock: added debug option to track wlock location.
- random-test: added -a to benchmark all routines.
- random-test: add -v to be verbose when -a is used.
- VMM: added extra debugging tools / assertions.
- VMM: trace new compile-time options.
- clock: simplify code by using aging table.
- xmalloc: avoid late page pool creation.
- xmalloc: extended assertions to detect freelist corruption.
- zalloc: avoid warnings when compiling with REMAP_ZALLOC.
- zalloc: with ZONE_SAFE, ensure block tagging never changes!
- malloc.c: enhanced and fixed some errors with multi-threading.
- malloc.c: huge refactoring and cleanup.
aging_destroy()
: remove periodic GC before cleanup.bfd_util_init()
: avoid warning onbfd_init()
call.clock_adjust()
: removed MAX_SDEV.clock_adjust()
: stop pruning if we keep everything.clock_update()
: lowered required amount of data.compat_setjmp()
: protect against gone contexts.crash_handler_process()
: only callcrash_auto_restart()
if needed.ev_free()
: assert event is not linked in queue!ev_unlink()
: added list consistency assertions.eval_subst()
: remove the size limitation on the susbtituted string.evq_close()
: be silent if event queue not created.fi_pick_rarest_chunk()
: fixed assertion failure.fi_pick_rarest_chunk()
: log assertion values.get_prop()
: also trace failing property when ps is NULL.ggept_filesize_encode()
: can return 0 if given 0.hash_compute_increment()
: make it odd without branch.main()
: do not set a crash dir if not running for long.name_to_single_host_addr()
: usepslist_random()
.ntp_send_probes()
: comment updates, cleanup.once_recursive()
: avoid callingstacktrace_function_name()
.progstart_duplicate()
: added assertions.prop_lock()
: use macro for locking (hiding lock type).rwlock_deadlocked()
: trace write owner if known.spinlock_loop()
: document why no memory barrier.statusbar_gui_push_v()
: be safe if called early.str_avail()
: new implementation and semantics.str_ichar()
andstr_istr()
can now append.strvec_cpy()
: was failing when called with cnt=0.thread_id_name_to_buf()
: be nicer with negative IDs.thread_lock_waiting_done()
: cleanup when no problems.tok_version_valid()
: no longer runclock_update()
.xcopy()
: not defined as inlined routine when TRACK_MALLOC.