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.
This is a maintenance release with minor bug fixes.
xmalloc()
when the page size is
not 4Kaq_on_available()
to hide waiter object.xmalloc()
to
malloc()
.thread_lock_dump()
logic.popcount()
if it exists.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.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 use NOT_LEAKING_Z()
for
walloc()
.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.zget()
: limit scope of global spinlock to a minimum.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.
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.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.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.
pattern_prefix_period()
: don't corrupt end-of-block.hash_table_resize()
: clear last cached lookup!ev_link()
: insert events in the proper bucket!bit_generic_count_set()
.plural_child()
.progstart_was_called()
.H_STRFREEV_NULL()
.hash_table_copy_foreach()
.tm_precise_elapsed_ns()
convenience routine.thread_stack_size()
to get configured stack size.pattern_string()
to get the string being looked for.str_2c_from()
to grab C string from a given offset.eval_subst_atom()
.stacktrace_caller_fast()
and stack-test program.suspend()
.tmalloc_contains()
for assertions.node_check()
to node traversal loops.SIGN()
as well.mem_test()
run only once.backtrace()
, ensure we compile with a frame
pointer.longjmp()
if on altstack.xmalloc()
for their values.main()
starts to allocate the signal chunk.ascii_toupper()
and ascii_tolower()
avoid
branching.aging_destroy()
: remove periodic GC before cleanup.bfd_util_init()
: avoid warning on bfd_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 call
crash_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()
: use
pslist_random()
.ntp_send_probes()
: comment updates, cleanup.once_recursive()
: avoid calling
stacktrace_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()
and str_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 run
clock_update()
.xcopy()
: not defined as inlined routine when
TRACK_MALLOC.