# since last version

- (2003.07.19 - RAM)
 * Added server-side push-proxy support.
 * New routine base32_encode_str_into().
 * Added optional padding emission to base32_encode().
 * Factorized dl_request handling code into http.c, as http_buffer_t.
 * Fixed pushed download selection on GIV reception to also consider running
   downloads expecting a GIV when no exact fileindex is found.
 * Check for X-Push-Proxies lines in HTTP replies from firewalled hosts.
 * Allow http async users to customize the building of the HTTP request.
 * Now handles partial sending of the HTTP request for async http.
 * Added calls to pproxy_close() and pproxy_timer().
 * Fixed hex2dec() to report -1 on invalid hex char.
 * hex_to_guid() now returns boolean indicating proper decoding.
 * New guid_base32_str() and base32_to_guid() routines.
 * Added node_http_proxies_add() so we can send them our known push-proxies
   when we are firewalled.
 * Added paranoid sanity checks on reception of push-proxy request messages.
 * Added route_proxy_find() so that we can resolve push-proxy HTTP requests.
 * Added two new socket types: SOCK_TYPE_PPROXY and SOCK_TYPE_CPROXY.
 * Redirect incoming HTTP requests to /gnutella or /gnet to push-proxy.
 * Added upload_send_giv() to be able to send a GIV string directly.
 * Allow sending of push-proxy ACK (LIME/22v2) messages now that the
   server-side works and we can act as a push-proxy.
 * Replace all control characters in filename by '_'.
 * Added client-side push proxy support, with GUI feedback.
 * Added node_became_firewalled(), called whenever we are becoming firewalled
   to send push-proxy requests to non-leaf servents that we are connected to.
 * Made "data_ind" callback optional in HTTP aync.
 * Added message argument to the "header_ind" callback in HTTP async.
 * Added new optional callback to monitor HTTP async state changes.
 * Disable redirections by default, unless specified otherwise.
 * Added ip and port to http_async_get(), for when we know them.
 * Added new 'p' or 'P' node flag to indicate either our push-proxy or a
   node for which we are push-proxy, respectively.
 * Disabled broken equlity fix in qrp_step_compute(), pending later fix.
 * Now always send the GGEP "GTKGV1" in query hits, regardless of query sender.
 * Added sending of GGEP "PUSH" in query hits to list our push proxies.

- (2003.07.18 - RAM)
 * Always set QUERY_SPEED_NO_XML since GTKG does not parse XML in query hits.
 * Removed the "[No Push]" indication in download status: was misleading.
 * Added generic header formatting routines: header_fmt_xxx().
 * Rewrote formatted_connection_pongs() to use generic header_fmt_xxx().
 * Added state indication in HTTP async requests, for external monitoring.

- (2003.07.17 - RAM)
 * Reserved bit 10 of "min speed" for out-of-band reply delivery.
 * Added more debugging warning when parsing "ALT" in query hits.
 * Only open "u" in query hits if it looks like a sha1 or a bitprint URN.
 * Renamed alt_locs_t into host_vec_t and gnet_alt_locs_t into gnet_host_vec_t.
 * Added knowledge about the GGEP "PUSH" extension for push-proxy, and created
   new READ_GUINT16_BE() and WRITE_GUINT16_BE() supporting macros, required
   by "PUSH".
 * Changed signature of download_new() and download_auto_new() to include
   the known push proxies.
 * Moved search_gui_got_results() to search_gui_common.c
 * GUI now uses gnet_host_vec_t instead of host_vec_t: no need to make a
   particular data structure.
 * Result set now stores push-proxies given in query hit.
 * Finally, the IP is stored in big-endian within GGEP "PUSH".
 * Added logic for processing LIME/21v2 and LIME/22v2 messages (push proxy
   request and ack, respectively).
 * Heavy callback signature and message building refactoring in vmsg.c.
 * Can now send and receive LIME/21v2 and LIME/22v2.

- (2003.07.17 - Jeroen)
 * Made GtkG compile when xml was disabled

- (2003.07.16 - RAM)
 * Forgot to initialize `len' in dl_req_alloc().
 * Factorized common search GUI code to search_gui_common.c.
 * Moved type-specific GGEP extraction code to new ggep_type.c file.
 * New property "auto_feed_download_mesh", defaulting to TRUE, used to
   control whether we monitor query hits for alt-locs of files we are sharing
   or already have in our mesh.
 * Added read-only support for new GGEP "ALT" extension carrying alt-locs
   in query hit records.
 * Not only refuse to add private IPs in the mesh, also refuse multicast et al.
 * Factorized definition of blank_guid[] into guid.c.
 * Refactored checking of results set: moved file_info_check_results_set() and
   file_info_check_alt_locs() to search.c with proper name change.
 * Added indication of support of GGEP "H" in the "min speed" query field.
 * Will now reply with a GGEP "H" to servents that claim support for it.
 * Upgraded file_info_store() to use common file.c routines for saving.
 * Further factorized code into search_gui_common.c: search saving / restoring.
 * Rename XML searches as .orig before parsing.
 * Switched GGEP "H" support indication from bit 12 to bit 11, since bit 12
   is used for leaf-guided queries.
 * Handle retry-after time on a per-download basis, not only on a per-server
   one because of PARQ: we might need to retry one particular download earlier
   than the others queued on the same server.
 * The download "waiting" list is now sorted by increasing download retry time.
 * Processing of EXT_T_URN_BITPRINT in query hits was incorrect.
 * Added processing for GGEP "u" and "T" extensions in query hits.
 * Will now protect against a query hit record having several SHA1, to avoid
   memory leaks mainly.
 * Make a distinction between re-queuing a download that must not be
   rescheduled before some delay, and re-queuing a download from a host
   that is busy or is timeouting, in which case we want to hold further
   requests to that host.
 * Make sure to space requests to same host by 15 seconds or so.

- (2003.07.15 - Jeroen)
 * Made search_gui.c compilable again when xml was disabled

- (2003.07.15 - RAM)
 * Ran the new "fix_copyright" script to update all copyright notice dates.
 * Removed support for the loading of old (legacy) config files.

- (2003.07.14 - RAM)
 * Handle partial sending of the HTTP request, instead of stopping.
 * Fixed encoding of saved strings [Patch from Stephane Corbe, fixes #747501].

>>>>>>> 1.419
- (2003.07.13 - Jeroen)
 * PARQ won't assert on bad behaving clients anymore

- (2003.07.13 - RAM)
 * Fixed ban_record(): could be using the wrong callout queue callback.
 * Added ban_is_banned() to allow checking for the ban status without calling
   ban_allow() which is only supposed to be called on new connections.
 * When host refuses that we download from it, ban it for some time and kill
   all its pending uploads.
 * Don't send back QUEUE to a host that is banned.
 * Protect against subsequent ban_record() calls: free existing ban mesasge.

- (2003.07.12 - Jeroen)
 * PARQ doesn't like it when gets multiple requests for the same file from the
   same host while it is allready being upload to that host. Duplicate upload
   detection is now done before handing the upload over to PARQ.
 * PARQ now keeps track to an upload structure so it can look up information
   faster, as well as testing parq <-> upload integrity

- (2003.07.09 - Jeroen)
 * PARQ: Uploads->parq pointers were only assigned during parq_upload_create.
         Pointer is now also set when a existing parq upload is rerequested.
         Pointer is removed as soon as PARQ strucuture is freed.

- (2003.07.08 - RAM)
 * Call setlocale() and determine proper codeset [Path from Stephane Corbe].

- (2003.07.07 - Jeroen)
 * PARQ: Uploads contain a pointer to a parq structure now for fast lookups.

- (2003.07.06 - RAM)
 * Broadcast Push messages to all known routes to increase reception likelihood.
 * Double grace period when running in ultra mode: more connections to flush.
 * Added -mieee to the compile flags when building for Debian on Alpha
   [Patch from Christoph Reichenbach on Debian].
 * Raised default gnet connection timeout to 10 seconds.
 * Now fully supports special "min speed" field in queries.  The GUI min speed
   value as well as the default min speed are now ignored and should be removed.
 * We now have the IP address in version checks: log it when bad token is seen.
 * Added string evaluation code, that can evaluate ~/foo and $HOME or ${HOME}.
 * Added new generic prop_name() to convert a property into its name.
 * Property initialization strings are now run through eval_subst() to allow
   environment variables and ~ in their value.
 * Factorized setting callback for file path into one file_path_changed(),
   and added a verification callback for PROP_BAD_FILE_PATH.
 * Simplified debugging code to use new xxx_prop_name() calls.
 * File path properties have their default set to "~" instead of "/tmp".
 * Call locale_to_utf8() on filenames for GTK2 [Patch from Uriel].
 * Also "broadcast" our own Push requests if we have multiple routes.

- (2003.07.05 - RAM)
 * Parse all query hits for inclusion into the download mesh.
 * Don't activate the "no keepalive" flag on downloads if we detect that
   the server is performing some kind of "rotation" in the queue by closing
   our connection after having shrunk our request.
 * Prefix user-agent strings with a '*' when server appears to be banning us.
 * Only use an IP for clock skew computation once per 24 hours.
 * Apply queue regexp search to both download's filename and output filename
   [Patch #754923 from Stephane Corbe].
 * [GTK1] Print message in statusbar showing how many downloads were created
   from the many items selected.
 * Don't use GNU-isms for variadic macros, prefer the ANSI way
   [Patch #755639 from int_80h].
 * Avoid duplicate free in _search_send_packet() when empty word vector
   (fixes #706014).
 * Don't send queries unless there is a route for the possible replies.

- (2003.07.04 - RAM)
 * Added anti-403 "Network Disabled" code.
 * Don't insert alt-locs pointing to hostile IPs in the mesh.
 * Navigation pane updates correctly with 'jump to downloads' (fixes #612799
   and #629299) [From Emile le Vivre].
 * When banning due to vendor user-agent string, record the IP and forcefully
   ban it for 3 hours from then on, to defeat GTKG's own anti-banning code.

- (2003.07.03 - Jeroen)
 * PARQ: Should only actively queue one upload per ip

- (2003.07.01 - RAM)
 * Sort by size, then by SHA1 when sorting by size [From Thomas Schuerger].

- (2003.06.28 - RAM)
 * Added "torrent" to the default list of sharing extensions.

- (2003.06.25 - RAM)
 * Don't pick a suspended download in download_find_waiting_unparq().
 * Asserted that a verifying download must be in DL_LIST_STOPPED.
 * Mark fileinfo database as being dirty when a fileinfo is reset.
 * Code cleanup in parq.c.
 * Send blanked GUID in vendor messages that don't need a particular GUID.

- (2003.06.25 - Jeroen)
 * PARQ: QUEUE callback should now also 'help' activly queued downloads
		 (untested)

- (2003.06.24 - cbiere)
 * [GTK2] Re-worked removing of rows. Due to enabled sorting it seems to be
   possible that a list store contains the same row twice. I consider this
   a GTK+ bug, thus the changes are a bug workaround. The important part is
   setting the data column to NULL to prevent accessing already freed data.

- (2003.06.22 - Jeroen)
 * PARQ: Only sends one QUEUE command per IP at once. And aborts any other
		 pending QUEUE callback for that IP if the first one can't connect

- (2003.06.19 - RAM)
 * Optimized server banning test.
 * Don't send pong-cache pings on a flow-controlled connection.
 * Finished application of Angelo's symlink patch (fixes bug #756146).
 * Restored stripped out gtk_init(&argc, &argv) call (fixes bug #757504).
 * Moved verify_close() and move_close() calls before main_gui_shutdown()
   so that no ticks to the daemon thread be made whilst in shutdown!

- (2003.06.17 - Richard
 * [Gtk2] No longer disable antialiasing. This confuses people who are 
   using Gtk2 and get font problems. If they want better performance, they
   should turn off AA manually using "export GDK_USE_XFT=0".
   (closes 754998).

- (2003.06.17 - RAM)
 * Now supports collection of multiple URNs from X-Gnutella-Content-URN,
   but still only look at ones containing a SHA1.
 * Use new dmesh_collect_sha1() to collect URNs.
 * Collect URNs from non-standard Shareaza X-Content-URN header.
 * When remote host turns out to be a genuine GTKG, stop anti-banning
   protection by faking a user-agent string, since we know the remote end
   won't be discriminating us.

# v 0.92   2003.06.15  [stable]

- Now supports Ultrapeers, which means GTKG can work as an ultra node or as
  a leaf node.  You can still run as a normal node, although this is not
  something wise to do, because that will likely relagate you in a small part
  of the Gnutella network.
- New icons for showing node state (leaf or ultra mode).
- The GTK2 front-end is no longer experimental, albeit it is slower than
  the GTK1.2 front-end.  This is due to the somewhat inefficient
  implementation of the underlying GTK library.  Don't use GTK2 unless you
  have the equivalent of a 1 GHz Intel chip.
- Added client-side PFSP support (partial file sharing). GTKG can download
  from servers holding partial files.
- Added full PARQ support (Passive / Active Remote Queuing), both for uplaod
  and downloads.
- New Gnet statistics: flow-controlled packets per TTL and hops.
- The "Type" column in the Gnet connection pane was turned into "Flags".
- Added support for GGEP in pings/pongs/pushes: those packets are now
  accepted and forwarded to connections advertising GGEP support.
- New "use surplus bandwidth" setting: all unused bandwidth for Gnet or HTTP
  can be stolen by the other in case it needs some.
- Added count for total bytes uploaded and downloaded.
- Added support for vendor-specific messages.
- New hops-flow support: remote flow-controlled connections can now warn us
  that thye are flow-controlling us, and so we can drop queries immediately
  instead of sending them, saving outgoing bandwidth.
- Will now show the GTKG version in query hits.
- The queue now shows the count of alive downloads, as well as the queue count.
  An "alive" download is an entry for which the remote server replies.
- Changed the connection algorithm: will now attempt to connect to more
  nodes than really configured, dropping the surplus connections later, when
  needed at all.
- Filters out hostile IP addresses.
- New "fileinfo" pane in the download screen.  Not finished, but will show
  the currently registered downloads and their status.
- Domain name resolution for Gnutella web cache are now done asynchronously.
  The GUI will no longer freeze due to a DNS request.
- Some performance improvements: removed the most important bottlenecks.

- (2003.06.14 - RAM)
 * Updated hostiles.txt to follow BearShare's modifications, and sorted it.
 * Forgot to mention PARQ id in header of persisted downloads.
 * Changed tooltip for "listen_port".
 * The new default listening port is now set to 8436 to avoid ISP censorship.
 * Fixed typo appereance -> appearance in GTK2.

- (2003.06.12 - Jeroen)
 * PARQ: Max uploads from single host is also detected and used in PARQ now.
 * PARQ: Timesout small upload chunks sooner now. This should make sure people
         who were unable to have all there upload slots used before, because
	 they were only sharing relative small and popular files, to maximize
	 their bandwith usage again if they want. This shouldn't affect PARQs 
	 behaviour for small files.
	 NOTE: This is:  #if 0 in the parq code, and thus actually disabled.
 * PARQ: No more assertion failure on gtk-gnutella shutdown (I hope)

- (2003.06.10 - RAM)
 * Don't send out an invalid IP/port in the X-Node header.
 * Integrated GTK2 icon patch [From Russell Francis].

- (2003.06.09 - RAM)
 * Raised default amount of downloads from 10 to 50.
 * Doubled max PARQ retry time, and lowered retry frequency for queued entries.
 * Fixed English: SHRINKED -> SHRUNK.
 * Avoid endless request/sinking loops: only allow one sinking per session.
 * Added some extra assertions in PARQ, little cleanup.

- (2003.06.09 - Jeroen)
 * PARQ: PARQ IP entries are now stored using their dotted notation.
 * PARQ: Fixed: Slots by IP didn't work yet
 * PARQ: Also preference by IP and not just by filename only. If client has
		 2 files A (pos 1) and B (pos 66) and it is requesting file B it will
		 still be allowed to upload. file A will have to wait for file B though.

- (2003.06.08 - Jeroen)
 * Prefer compressed connections should now also work in Ultrapeer mode
 * PARQ: Should not block anymore when a queued upload is not allowed to
		 continue due to 'max allowed uploads per ip'

- (2003.06.07 - RAM)
 * Decode base32 case-insensitively.
 * Fixed stupid memory leak: pmsg_free() called in a debug block.

- (2003.06.05 - RAM)
 * Don't parse incoming X-Node headers for PARQ if requestor did not advertise
   support for PARQ, since X-Node is not necessarily PARQ-specific.

- (2003.06.03 - RAM)
 * Append a trailing '-' in the download range size indication when the server
   is answering us with less data than we requested.  The amount shown then
   reflects what the server is giving.
 * Don't store downloads to disk every time we abort/stop one.  This should
   improve speed noticeably when aborting by SHA1 or by server!

- (2003.06.02 - Richard)
 * Applied symlink patch from Angelo Cano

- (2003.06.01 - RAM)
 * Fixed download_clone() to remap the parq ID to the children download.
 * Make sure to revitalize a stopped download upon receiving QUEUE.
 * Removed spurious trailing "\n" in warnings from parq.c.

- (2003.06.01 - Jeroen)
 * Uploads: HEAD requests won't be treated as a followup request anymore (which
            avoids an upload to ignore the max uploads per ip setting)
 * PARQ:    Fixed an assertion failure when an upload got removed due to too many
            disconnections

- (2003.05.29 - RAM)
 * Top makefile did not install "hostiles.txt".
 * Reset counter of QUEUE requests sent when remote servent replies to one.

# v 0.92   2003.05.25  [candidate]

Candidate 0.92 release.  The following are the main changes since 0.92b2:

- PARQ is now fully implemented.
- Filters out hostile IP addresses.
- New icons for showing node state (leaf or ultra mode).
- New "fileinfo" pane in the download screen.  Not finished, but will show
  the currently registered downloads and their status.
- Minor bugs fixed.

WARNING: Leaf node bandwidth is now stolen from HTTP when running in ultra
mode.  If that brings outgoing HTTP bandwidth to 0, sharing is disabled.

- (2003.05.25 - RAM)
 * Miscellaneous cleanup before release of 0.92c.
 * Now trace vendor string in the "Cancelling upload" messages.
 * Mentionned in GUI hints that number of PARQ queue is governed by the
   number of upload slots, and that it should be at least set to 2.
 * Tell them that when host runs NTP, the computed clock skew is ignored.
 * Display lifecount of the fileinfo, not its refcount [From Hans de Graaff].

- (2003.05.25 - Jeroen)
 * When in leaf mode: Prefer compressed connections is honoured again.

- (2003.05.24 - RAM)
 * Also package the pixmaps in the RPM [Patch #635484 from Sam Varshavchik].
 * Don't store download queue at each download inserted [Patch #699251 from
   Paul J. Mantyla].
 * When ignoring a download due to an hostile IP address, make sure we don't
   clear all the downloads for that file: it's just the server that we ignore,
   not the download entry.
 * Remember disabled searches when persisting (fixes bug #625314) [Patch
   #739466 from Stephane Corbe].
 * Increased max HTTP header size on reception to 16K.
 * Cleaned up patch from Stephane Corbe.
 * Added some assertions regarding fileinfo lifecount.
 * Try to report a more specific message to servents mis-handling Retry-After
   whilst passively queued.
 * Include vendor string in PARQ warning messages about early retries.

- (2003.05.24 - Jeroen)
 * PARQ: New ETA calculations. It now takes the current uploads into account too.
 * PARQ: Don't save PARQ entries from which the upload was finished.
 * PARQ: Avoid abusing: re-using the ID for another upload which got finished.
         (a client could keep an upload slot for eternity)
 
- (2003.05.23 - RAM)
 * Fixed punishing of hosts that re-request too early without paying attention
   to the Retry-After header.

- (2003.05.22 - Jeroen)
 * PARQ: A broken/disconnected upload can reclaim its queue position
 * PARQ: Upload pane now shows the Queue the current upload is queued in
 * PARQ: Dynamic upload slots also honours parq now.
 * PARQ: Fixed: No more infinite Waiting uploads.

- (2003.05.20 - Jeroen)
 * PARQ: Fixed: An upload can't get actively queued more than once at a time.

- (2003.05.19 - Jeroen)
 * PARQ: Shouldn't assert anymore when using dynamic slot allocations
 * PARQ: If a client does not obey the Retry-After header it will be
         removed from the PARQ queue.

- (2003.05.19 - RAM)
 * Forgot a "continue" statement in download_remove_file().
 * Likewise, on a file info change, don't requeue actively queued downloads
   or connecting ones.
 * Make sure the message queue kept track of the right amount of items.

- (2003.05.18 - RAM)
 * Added the @INTLLIBS@ macro in the linking flags for I18N
   [From Christian Biere].
 * Reset some fields to NULL in download_remove().
 * Must ignore downloads marked as GTA_DL_REMOVED when iterating on the
   download list.
 * Don't call download_free_removed() from fi_purge().  That call must be
   done asynchronously.
 * Changed status type in uploads to upload_stage_t.
 * Don't send the PARQ ID on 2xx for HEAD replies and follow-up requests.
 * Added extra pre-condition to fi_purge().

- (2003.05.17 - RAM)
 * Doubled half period for remote flow control computations to 5 minutes.
 * Don't requeue actively queued downloads or connecting ones when the
   underlying file is removed.
 * When a download has PARQ information, don't stop it when a write to the
   remote host fails, but requeue it instead.  Those downloads have a chance
   of being resumed.
 * Renamed download_free() into download_remove().
 * Clone lists before iterating in bg_close().
 * Reverted to using casts in clock_update().
 * Made clock_update() ignore the new timestamp if delta is within precision
   (making the ignore interval 2*precision instead of just precision).
 * Increased period for alive pings between ultrapeer and leaf to 120 seconds.
 * Flag when we send a QUEUE, and determine whether they refused our callback.
   After they refused it MAX_QUEUE_REFUSED times, we give up and never send
   them a QUEUE during this session.
 * Added parq_upload_add_header_id() to add an X-Queued header on 2xx replies.
 * Always call parq_upload_remove() from upload_remove().
 * Plugged call to parq_upload_add_header_id() to send queue ID on 2xx replies.
 * Renamed upload_push_conf() as upload_connect_conf().
 * Added call to parq_download_parse_queue_status() even on 2xx replies.
 * Call parq_upload_add_header_id() before upload_http_status() to avoid
   lacking room in the headers if alternate locations are present.
 * Remember when a PARQ id was sent, to avoid sending one back on 2xx replies.
 * Fixed assert failure in ban_force() when only 1 fd is used for banning.

- (2003.05.16 - RAM)
 * Limit clock skew to one day maximum: avoid badly synchronized remote clocks
   to let the skew deviate out of proportions.
 * Avoid issuing a connection to a node we're already connected to
   [From Rafael R. Reilova].
 * GTKG could loop in malloc(): block was freed twice in the case a config
   file was retrieved from the .orig version.
 * Ignore SIGQUIT in the adns process, so that CTRL-\ makes GTKG dump a core.
 * Must call parq_init() before retrieving the downloads now that PARQ IDs
   are stored.

- (2003.05.15 - RAM)
 * Allow server to give a smaller range than the one we're requesting.
 * Reject download when range end is greater than what we asked for.
 * Persist download PARQ ids.
 * Added download_find_waiting_unparq() to elect replacing download on QUEUE.
 * Fixed handling of QUEUE callbacks: was not parsing the ID correctly.
 * When looking up a PARQ download by ID, if we don't find one for the host,
   try to pick any non-PARQ waiting download for that host instead.
 * PARQ ids are now random GUIDs, tagged for GTKG.
 * Don't call file_info_update(DL_CHUNK_EMPTY) to clear the tail of a range.
   The routine is not prepared to handle that case.  As a workaround, 
   call file_info_clear_download() first, then file_info_update(DL_CHUNK_BUSY)
   on the complementary part.
 * New file_config_open_read_norename() to open config files that are never
   written, and which therefore don't need to be renamed as ".orig".
 * Fixed file_config_open_read() so that it displays "instead" when we open
   the ".orig" version.
 * Fixed file_info_update() so that it accepts DL_CHUNK_EMPTY on *whole* ranges.
 * Open hostiles and whitelist with new file_config_open_read_norename().

- (2003.05.15 - Jeroen)
 * PARQ: Don't display status Waiting when there are no upload slots available
 * PARQ: Send a QUEUE command when an upload slot is available
 
- (2003.05.14 - Jeroen)
 * PARQ: Saves and loads the expiration time of a queued upload. This should
         speed up starting uploading on startup.
 * PARQ: Fixed an assertion bug in upload_timer
 
- (2003.05.13 - RAM)
 * Avoid casting to (gint32), and use the "* (gint32*)" dereferencing trick.
 * In the download pane, display ETA for queued entries in a readable way.
 * Forgot to make a variable "static", causing endless promoting and demoting
   to/from ultra mode.
 * Fixed memory leak in sq.c, when query is ignored.

- (2003.05.12 - RAM)
 * Stopped removing half the slot contribution to writing b/w schedulers for
   all the slots that don't trigger.
 * Added missing RCSID to hostiles.c.

- (2003.05.12 - Jeroen)
 * PARQ: Fixed an assertion when connecting back to another IP than the IP
         the upload connected from.

-(2003.05.11 - Richard)
 * [Gtk1] Added clock skew to gui (calculation seems broken).
 * [Gtk1] Added PROP_RUNS_NTP to gui.
 * [Gtk1] Reordered connection settings in gnet pane.
 * [Gtk1] Updated list of contributors in about dialog.
 * Show all connection settings on gnet pane in leaf and ultra mode and hide
   ultrapeer setting in legacy mode.
 * Changed displayed info when failing to load config files.
 * Properly update PROP_CLOCK_SKEW instead of modifying the variable directly.

- (2003.05.11 - RAM)
 * Updated PARQ to revision 1.0.a of the specs.
 * Added flags to record whether a QUEUE is pending.
 * Try sending as many QUEUE messages as possible until we have 100 uploads.
 * Don't expire a PARQ entry if a QUEUE message is pending but was delayed
   because there are too many uploads running.
 * Exported download_redirect_to_server() for PARQ.
 * Send QUEUE messages spaced by at least 10 minutes for a given entry.
 * Give dead downloads a chance to come back to life by sending them QUEUE.

- (2003.05.10 - Jeroen)
 * PARQ: Displays retry time when queue slot is waiting for its upload slot
 * PARQ: Use uploads alive instead of queue size when displaying
         position out of <size>
 * PARQ: Only send QUEUE when library is not being rebuilt
	    
- (2003.05.10 - RAM)
 * Fixed "memory leak" in fileinfo_gui.c.
 * New -DTRACK_ZALLOC compilation switch that will track down the allocation
   points of all the zalloc blocks to display leaks at the end.
 * New properties "host_runs_ntp" and "clock_skew".
 * Will now try to automatically figure out the clock skew relative to GMT.
 * Use the Date: HTTP header as a source for clock skew computation.
 * Use token timestamps as another source for clock skew computation.
 * Trace Ultrapeer selection criteria for debugging.
 * Made sort order in the search pane persistent (fixes bug #557696) [From
   Emile le Vivre].
 * Was not using the forced 95% threshold for flow-control limits in leaf mode.

- (2003.05.09 - RAM)
 * Accidentally inverted condition for hostile checks on pongs: was dropping
   all the non-hostile pongs as being hostile!
 * Integrated PARQ patch #19 [From Jeroen Asselman].
 * Integrated PARQ patch #20 [From Jeroen Asselman].

- (2003.05.08 - RAM)
 * Added monitoring of average outgoing bandwidth.
 * Further tuned the bandwidth scheduler to maximize available bandwidth use.
 * Ultrapeer election now takes into account system params and bandwidth.
 * Don't further limit query propagation to leaves with no pending messages.
 * Integrated hostile IP parsing [From Markus Goetz].
 * Plugged dropping of connections and packets from/to hostile IP addresses.

- (2003.05.07 - Richard)
 * [Gtk1] Added "purge" button to fileinfo pane.
 * [Gtk1] Removed "sources" tab from fileinfo pane. This has not been used yet
   and will not be completed before the next release.
 * Export download_free_removed() so it can be used in fi_purge.
 * [Gtk1] Added tooltips to peermode icons.

- (2003.04.17 - RAM)
 * Integrated PARQ patch #15 [From Jeroen Asselman].
 * List PARQ development explicitly in the AUTHORS file.

- (2003.04.16 - RAM)
 * Added new "configured_peermode" property.  Old "current_peermode" is
   no longer persistent.
 * Leaf node bandwidth is now stolen from HTTP.  If that brings outgoing
   HTTP bandwidth to 0, sharing is disabled.
 * Reordered the computations in bsched.c: resort to early floating point
   division by 1000.0 then to multiplication to avoid overflowing integers.
 * Shut up compiler warning about uninitialized var in adns.c.
 * Removed "force_ultrapeer" and "force_leaf" properties.
 * Addded automatic promotion of leaf to Ultrapeer based on uptime (for now).
 * Don't send non-ultra pongs to leaf nodes.
 * Fixed memory leak in searches: limit MUID list to 4 per search.
 * Throttle leaf node pings to 60 seconds instead of the 3 seconds for others.
 * Adjusted bandwidth scheduler for low-activity sources.
 * Removed unused function on_the_net().
 * When switching to the "auto" configured peermode and there is no connection
   yet, force leaf mode as the current mode.

- (2003.04.13 - RAM)
 * Forgot to update node's timestamp after having sent the Gnutella hello.
 * Added files created by gettext for internationalization (i18n).
 * Integrated i18n patch [From Nicolas Lichtmaier].

- (2003.04.09 - RAM)
 * Be sure to requeue all active downloads that were referencing a file
   we are removing.
 * Make sure we're not over-querying new connections by limiting the amount
   of queries sent to the configured outdegree.
 * Propagate random unsollicited ultra pongs to leaf nodes.

- (2003.04.02 - RAM)
 * Added icon.xpm, the default gtk-gnutella icon for GTK1 [From Michael Gray].
 * Also remove all downloads from host when push route is lost, or when we
   can't reach a host through a direct connection.
 * Fixed icon.c to have it work with GTK 2.0 [From Michael Gray].
 * Avoid setting the IP ToS on a freed socket descriptor.

- (2003.03.31 - RAM)
 * Optimized sha1_eq() and guid_eq() when pointers are identical.
 * Added Retry-After header in parq_upload_add_header().
 * Be more stringent when generating the QRP table: no more than 1% full.
 * Integrated PARQ patch #14 [From Jeroen Asselman].
 * Integrated IP TOS patch [From Mike Mestnik].

- (2003.03.29 - Richard)
 * downloads.c:
   - Added some skeletons for having events on the downloads (sources).
   - Added handles to downloads.
 * downloads.c,downloads_cb.c,settings_gui.c:
   - download_clear_stopped can clear failed and/or completed downloads.
 * event.h: 
   - Typedefed frequency_t and event_t.
 * fileinfo.c: 
   - Put events into an array instead of keeping several event_t variables.
   - Removed event specific add/remove listeners functions and added 
     general fi_add/remove_listener() function. Event types are defined
     in gnet.h.
 * fileinfo_gui.c:
   - Correctly show when a file is finished.
   - Use generalized fi_add/remove_listener().
 * gnet.h: 
   - Added basic support for download/source related events.
   - Added event type enumeration for download/source related events.
   - Added event type enumeration for fileinfo related events.
 * oldconfig.c: 
   - Mapped old "clear_downloads" configuration variable to both new 
     PROP_AUTOCLEAR_*_DOWNLOADS properties.
 * settings_gui.c:
   - Fixed connection odometer in NODE_P_LEAF.
 * gnet properties:
   - Added PROP_AUTOCLEAR_COMPLETED_DOWNLOADS.
   - Added PROP_AUTOCLEAR_FAILED_DOWNLOADS.
   - Removed PROP_AUTOCLEAR_DOWNLOADS.
 * gui properties:
   - Added PROP_SHOW_DL_SETTINGS.
 * [Gtk1] gui modifications:
   - Download settings on download pane hidable.
   - Added detail panel to fileinfo pane.

- (2003.03.28 - RAM)
 * Integrated PARQ patch #13 [From Jeroen Asselman].
 * Abort all downloads from a host to which we can't connect.

- (2003.03.27 - RAM)
 * Added inclusion of <sys/time.h> before <sys/resource.h> for FreeBSD.
 * Added handle_to_queued() to verify the PARQ_UL_MAGIC magic whilst casting.

- (2003.03.26 - RAM)
 * Split parq_upload_request() into two to avoid assertion failures.
 * New parq_upload_get() call to return an opaque PARQ slot for uploads.
 * Moved down inclusion of "gnutella.h" to avoid warnings on MIN/MAX redefine.
 * Integrated PARQ patch #12 [From Jeroen Asselman].
 * Fixed function declarations to avoid compiler warnings in downloads.c.

- (2003.03.25 - RAM)
 * Fixed stupid trailing char truncation when quoting download mesh URLs.
 * Integrated icon patch #2 [From Michael Gray].
 * Added Jeroen Asselman to the glade file in the authors list.
 * Integrated PARQ patch #10 [From Jeroen Asselman].

- (2003.03.23 - Richard)
 * Regenerated configure and friends.
 * Fixed max-nodes calculation in the connection-odometer.
 * Missing ";" in misc.h broke compilation when HAVE_STRLCPY was not set.
 * Added means to fetch aliases of a file from fileinfo database.
 * Show aliases in fileinfo screen.
 * Added link between fileinfo and associated downloads (fi->dl).

- (2003.03.16 - RAM)
 * Regenerated configure and friends.
 * Integrated icon patch from Mike Gray.
 * Suppress error message from DNS helper upon final exit.
 * Make sure we don't try to parse ranges if the file size is zero bytes.
 * In leaf mode, allow flow control from ultrapeer up to 95% of the time.
 * Fixed flags display for nodes: was no longer showing 'I' or 'O'.
 * Adjusted bandwidth scheduler to limit starvation effects when we have
   a large amount of entries.

- (2003.03.11 - Richard)
 * Added possibility to tap into the fileinfo database from the gui.
 * [Gtk1] Added file info table to the downloads pane. This is not finished, 
   but already helpful.
 * Added download_restore_state() (seperated out from download_init())
 * Changed init sequence: first init gui, then read back downloads+fileinfo
 * Changed shutdown: first close downloads, then gui, then fileinfo
 * Introduced file_info_ref() and file_info_unref() to make it possible to
   watch for changes here and notify the gui.
 * Fixed: PROP_BAN_MAX_FDS not updated in gui

- (2003.03.09 - RAM)
 * Change web cache when an ERROR (HTTP or web cache) is reported.

- (2003.03.06 - Richard)
 * Fixed odometers (were all showing "in")
 * [Gtk1] Added odometers for leaf traffic
 * [Gtk1] Added 3 new icons to the gui
 * Fixed connections odometer for the different peermodes
 * Converted the *_LE and *_BE macros to glib style using G_STMT_START and
   G_STMT_END
 * Moved some gui code from downloads.c to downloads_gui.c

# v 0.92   2003.03.04  [beta2]

Bugfixing release:

- Fixed Gnutella web cache hammering.  A buggy test caused GTKG to query
  the caches each time it was establishing an outgoing connection!
- Domain name resolution for Gnutella web cache are now done asynchronously.
  The GUI will no longer freeze due to a DNS request.
- Some performance improvements: removed the most important bottlenecks.
- Fixed flow-control bug, exercised mainly with compressed connections: they
  could stall abruptly, no longer transmitting data.
- Fixed assertion failure in PARQ client code.
- Fixed incomplete clearing of downloads from a given host.

- (2003.03.04 - RAM)
 * Ban 0.92b as an hostile servent, due to its GWC hammering.
 * Only emit the exec() argument size warning if lib_debug.
 * Fixed version_tagcmp(): was not anti-symetric for 'b' and 'u'.

- (2003.03.03 - RAM)
 * Optimized guid_eq() and sha1_eq() to not call memcmp().
 * Rewrote the callout queue to have a more efficient ev_link() routine, the
   drawback being a slightly more costly cq_clock() call.
 * Fixed GWC hammering bug.
 * Avoid using / and % in macros from idtable.c.
 * Removed spurious trailing "\n" in some warnings.

- (2003.03.02 - cbiere)
 * [GTK2] gtk2-gnutella.glade:
    Added spinbutton_config_track_props (sync with GTK1)
    main_window_config_sel_tab: center contents
 * oldconfig.c/config_set_param(): Translate proxy_connections to
    proxy_protocol=PROXY_NONE from old config files
 * sockets.c/socket_connect_prepare():
    Moved ip parameter to socket_connect_finalize()
 * sockets.c/socket_connect_finalize():
    Fixed typo: addr <-> lcladdr
    Added another memset() to clear lcladdr
    Don't call socket_destroy() if the function was called from the
    ADNS callback which would cause a second socket_destroy() later
 * sockets.c/socket_connect_by_name_helper():
    Don't call socket_destroy() but set SOCK_ADNS_FAILED in case of an error
 * sockets.c/socket_connect_by_name():
    If the callback for adns_resolve was already invoked, check the status
    and call socket_destroy() in case of an error
 * sockets.h/struct gnutella_socket:
    Replaced `gboolean adns_pending' with `gint adns' as status variable
    Added `adns_msg' which should point to a static error message when
    SOCK_ADNS_FAILED is set, points to NULL otherwise
 * Removed all GDK legacy from core i.e., s/GDK_INPUT/INPUT_EVENT/ and
    no #include <gdk/gdk.h> any longer
 * Applied patch by Murphy <juncus@telus.net> which fixes typos in tooltips
 * nodes_cb(2).c: Added add_node_helper() for proper type translation
 * adns.c:
    Use adns_callback_t instead of a lazy gpointer
    Revised client-side to use non-blocking pipes which prevents
    deadlocks, allows partial transfers and to handle filled
    pipe buffers
 * adns.c/adns_resolve(): Returns FALSE if the resolution happened
    synchronous, otherwise returns TRUE.

- (2003.03.01 - RAM)
 * Show that we sent crawler info when remote disconnects after our reply.
 * Fixed assertion failure when parsing PARQ replies.
 * Added gm_setproctitle().
 * The ADNS subprocess will now be identified by "ps" as the "DNS helper".
 * Changed socket_timer() to avoid removing entries whilst iterating on list.
 * Special case the insertion to an empty array in qlink_insert().
 * Avoid uninitialized memory reads by bind(): zero the addr structs.
 * Forgot to free the list in socket_timer().

- (2003.02.28 - RAM)
 * The `dl_by_time' list was split into a hashed array, to cut down the number
   of item comparisons we do when inserting, at the cost of more work when
   traversing the list.
 * Optimized filter_apply() by pre-computing the length of the matching text
   at filter "compilation" time, to avoid endless strlen() calls.
 * Optimized search_has_muid(): sent MUIDs are now stored in a hash table.
 * Turned old g_return_if_fail() from legacy code into a g_assert() (tx_link.c).
 * Added some debugging traces whilst chasing the "connection freeze" problem
   (tx_deflate.c).
 * Fixed mq_service(): need to saturate the lower layer whilst running, lest
   we run the risk of never being called again when the lower layer has
   finished flushing its data => the TX side freezes.

- (2003.02.27 - RAM)
 * Optimized message queue to avoid huge CPU utilization during flow-control.
 * Optimized mq_service() to avoid useless I/O vector building.
 * Don't encode '/' in the query portion of URLs.

- (2003.02.27 - Richard)
 * event.[ch]: Added as a replacement for listener.h. For now it's used only
   in the property system. The bonus over listener.h: control of callback 
   frequency on a per-listener base.
 * Added seperate property to control debug level of the property system.
 * props.tpl: Upgraded to use event.[ch], regenerated property sources.
 * prop.[ch]: 
   - Upgraded to use event.[ch]
   - Added prop_get_by_name(): look up a property by name.
   - Added prop_to_string(): converting a property to string reprsenentation, 
     doesn't work for all property types yet.
 * settings_gui.c: Upgraded property_map to make use of the new frequency
   control feature of prop.[ch]
 * shell.c: 
   - No longer show auth cookie in debug output
   - New command: "PRINT [property]" to display current value of a property

- (2003.02.25 - RAM)
 * Added CRC32 code.
 * Fixed the base32/base64 code to correctly process padding, and return the
   amount of decoded bytes, padding not included.
 * Some servents send X-Try headers at every handshaking step, so process them.
 * Added token level.
 * Restored old ban_vendor() signature.

- (2003.02.23 - cbiere)
 * adns_do_transfer(): forgot to rename write to do_write
 * adns_gethostbyname(): use host_to_ip() instead of gethostbyname()
 * adns_callback(): remove the callback manually because the relay in
        inputevt.c doesn't propagate the return value;
    close() pipe if adns_do_read() fails
 * adns_init(): close() stdin and wire the file descriptor to /dev/null,
        just in case because it's shared with the main process;
    use _exit() instead of exit();
    close() all opened file descriptors in case fork() fails
 * adns_resolve(): close() pipe if adns_do_write() fails and don't retry
 * main(): ignore SIGINT and SIGPIPE before adns_init();
    use sig_ignore also for SIGXFSZ
 * host_to_ip(): declare hostname as const
 * upload_write(): Hide variable "pos" if HAVE_SENDFILE is undefined
 * adns.c:
        * Added caching; caching happens server-side, if the server dies
        * caching will be started client-side;
        * Fixed typo (children -> child);
        * Debug warnings depend on dbg > 1 or dbg > 2, now;
        * Declared larger variables as static;
        * adns_resolve(): usage of fallback is only reported once
 * [GTK2] locale_to_utf8: moved function from misc.[ch] to utf8.[ch]

- (2003.02.23 - RAM)
 * Forgot to negate the return of version_check().
 * Partially validate version whose token is given.
 * Avoid always polling at the minimum specified by the download server.
 * Applied Christian's patch fixing the type of gtk_tag and inputevt_add().
 * Forgot to use network order when writing token's timestamp.

- (2003.02.22 - guruz)
 * Added MLDonkey vendor code (MLDK)

- (2003.02.22 - cbiere)
 * The user_callback (parameter for adns_resolve()) was called twice if
   the hostname was an IP string; this caused s->gdk_tag != 0 in
   socket_connect_finalize() because it was called twice due to this bug.

- (2003.02.21 - cbiere)
 * Added socket_connect_prepare() to reduce double code
 * Added adns_pending to which indicates whether the adns callback has been
   invoked
 * Added socket type SOCK_TYPE_DESTROYING which is used free the socket after
   the adns callback has been invoked; prevents accessing already free()d
   memory.
 * Replaced assertion in socket_connect_finalize() because an event handler
   might have been installed while resolving the hostname; this is only a
   temporarily work around and not a solution!

- (2003.02.21 - RAM)
 * Integrated Christian Biere's ADNS patch (fixes bug #662916).
 * Now uses G_N_ELEMENTS() to determine the amount of items in array.
 * Added version tokens.

- (2003.02.17 - RAM)
 * Would not remove all the downloads from a given host sometimes.

- (2003.02.15 - RAM)
 * Associate download with move context early in case we cannot create the
   file on the filesystem: d_end() processing must still be able to run.

- (2003.02.11 - RAM)
 * Forgot to add the "sinking" state to the ESTABLISHING macro.
 * Don't lead them to the leaf status if we can't accept leaves.

# v 0.92   2003.02.08  [beta]

Highlight of changes (user-visible):

- Now supports Ultrapeers, which means GTKG can work as an ultra node or as
  a leaf node.  You can still run as a normal node, although this is not
  something wise to do, because that will likely relagate you in a small part
  of the Gnutella network.
- The GTK2 front-end is no longer experimental, albeit it is slower than
  the GTK1.2 front-end.  This is due to the somewhat inefficient
  implementation of the underlying GTK library.  Don't use GTK2 unless you
  have the equivalent of a 1 GHz Intel chip.
- Added client-side PFSP support (partial file sharing). GTKG can download
  from servers holding partial files.
- Added client-side PARQ support (Passive / Active Remote Queuing).  GTKG
  can now queue downloads from either active-queuing servers or PARQ.
- New Gnet statistics: flow-controlled packets per TTL and hops.
- The "Type" column in the Gnet connection pane was turned into "Flags".
- Added support for GGEP in pings/pongs/pushes: those packets are now
  accepted and forwarded to connections advertising GGEP support.
- New "use surplus bandwidth" setting: all unused bandwidth for Gnet or HTTP
  can be stolen by the other in case it needs some.
- Added count for total bytes uploaded and downloaded.
- Added support for vendor-specific messages.
- The "prefer compressed connections" settings no longer works as expected
  when running in non-normal mode.
- New hops-flow support: remote flow-controlled connections can now warn us
  that thye are flow-controlling us, and so we can drop queries immediately
  instead of sending them, saving outgoing bandwidth.
- Will now show the GTKG version in query hits.
- The queue now shows the count of alive downloads, as well as the queue count.
  An "alive" download is an entry for which the remote server replies.
- Changed the connection algorithm: will now attempt to connect to more
  nodes than really configured, dropping the surplus connections later, when
  needed at all.

WARNING:

- The amount of bandwidth configured for leaves is currently automatically
  added to the HTTP connections when not in leaf mode, regardless of whether
  "use surplus bandwidth" is activated.  This will change in the release.

- (2003.02.08 - RAM)
 * Fixed memory leak in gwcache.c.
 * Refactored upload_stats_dump_history(), and added upload_stats_close().
   Cleanup and dumping are now clearly separated.
 * Suppressed settings_upload_stats_save(): there is no an explicit call
   to upload_stats_close() done at exit time.
 * Be sure to call bsched_set_peermode() each time a bandwidth value is changed
   so that we can adjust the schedulers according to the current mode.
 * New FALSE default for the "fuzzy_filter_dmesh" property.
 * When downgrading from ultra to leaf mode due to peer request, be sure to
   use the property system to change the "current_peermode" property, instead
   of writing directly to the variable!
 * Make sure we react to the peermode change asynchronously.

- (2003.02.07 - RAM)
 * Fixed memory leaks in dmesh.c, fileinfo.c, qrp.c.
 * Allow user to abort actively-queued downloads.
 * Added upload_stats_free_all() to clean up memory on exit.
 * Fixed reading of free'd memory in mq.c.

- (2003.02.06 - RAM)
 * Had mistakenly added the "sinking" state to DOWNLOAD_IS_ACTIVE().
 * Prefix all warnings with a timestamp [From Christian Biere].

- (2003.02.05 - RAM)
 * Fixed dmesh fuzzy matching memory corruption.
 * Send PUSH messages at max TTL value, not my TTL in case it needs re-routing.
 * Added missing memory cleanup to shutdown calls, preventing leak detection.

- (2003.02.04 - RAM)
 * Abort download if handed out an URL that is too large (probably garbage).
 * Integrated fuzzy dmesh filtering for non-N2R entries [From Alex Bennee].
 * Shortened the string displayed for queued download entries.
 * New properties "pfsp_server", "pfsp_first_chunk" for PFSP (unused for now).
 * New property "fuzzy_filter_dmesh" to toggle fuzzy dmesh filtering.
 * Give unused reserved bandwidth for leaf nodes to HTTP traffic.
 * Integrated fix in get_header_value() [From Jeroen Asselman].

- (2003.02.03 - RAM)
 * Added inclusion of "common.h" for FreeBSD 4.7 (utf8.c).
 * Integrated PARQ patch: client-side is fully supported [From Jeroen Asselman].
 * Raised minimal query routing table size to 128 K slots, and lowered the
   sparseness and conflict ratios to check whether we can double the routing
   table size.

- (2003.02.02 - RAM)
 * No longer free remaining atoms in atom_warn_free(), for leak detectors.
 * When seeking to get the fileinfo trailer, don't use SEEK_END with a
   negative offset, but use SEEK_SET with an explicit positive value to
   avoid problems when off_t is 8-byte wide [From Christian Biere].
 * When doing SEEK_SET, check that lseek() returns the right offset.
 * Be sure to not truncate the headers for crawler replies in the middle
   of an IP address [From Christian Biere].
 * Fixed final cleanup in pcache.c to also discard the recent pong cache.
 * Changed freeing order for the existing query table when a RESET is received.
 * Protect against broken servents that don't send us QRP patches covering
   the whole query table.
 * Fixed memory leak on the query sending path in ultra mode.
 * Made sure `n' is no greater than INT_MAX for gm_*snprintf() calls.
 * Don't forget to reset str[0] to NUL in case we have to strlen(str) within
   the gm_*snprintf() calls.
 * First experimental support for PARQ (active queuing only, client-side)
   [From Jeroen Asselman].
 * Fixed parq_download_add_header(): now gets length of buffer explicitly.
 * Fixed status display for remotely queued entries.
 * Fixed get_header_value() to look for a ',' separator as well.

- (2003.02.01 - RAM)
 * Limit lifetime of download mesh entries to 1 day.
 * Added pre-condition to file_info_find_hole(): no busy chunks for download.
 * Forbid outgoing connections to a Gnutella crawler.
 * Apply vendor-specific banning early, so banned people know about it even
   if we're otherwise busy.
 * Limit the headers sent back to crawlers to the strict minimum.
 * Replaced all broken g_snprintf() and g_vsnprintf() calls by calls to
   fixed gm_snprintf() and gm_vsnprintf().  Broken calls are now forbidden.
 * configure now looks for vsnprintf() and defines HAVE_VSNPRINTF.

- (2003.02.01 - Richard)
 * [Gtk2] Reduced padding on uptime
 * [Gtk2] Added "edit filters" button back to search pane
 * Integrated patch by ko <junkpile@free.fr>:
   - shell.c: Remove unnecessary (GdkInputCondition cast)
   - gtk-missing.c: Optimize clist collect_data
   - gtk-missing.c: added tree_selection_collect_data
   - moved/renamed filter rule adding convenience functions from
     search_cb.c and search_cb2.c to filter.c
   - moved/renamed add_targetted_search from search_cb.c and search_cb2.c to
     gui.c
   - moved/renamed record comparing functions from search_cb.c and
     search_cb2.c to gui.c
 * Integrated patch by T'aZ <tazdev@altern.org>
   - search_cb.c, search_cb2.c: show "none auto selected" in the status bar 
     when no additional results were autoselected
     
- (2003.01.30 - RAM)
 * Immediately reset the qrt_ fields and query_table to NULL after having
   freed those items, to prevent accidental reuse.
 * Forgot to remove QRT patch compression task from the list of running tasks
   upon a cancel.
 * Clone directory list before traversing it with recurse_scan() since we
   loop back to the GUI and the directory list could be changed whilst the
   scanning is proceeding.
 * Suppressed warning about handle_messages_supported() not being done.
 * Removed spurious assert() in qrt_patch_computed_add_listener().
 * Added support for LimeWire's crawler.

- (2003.01.29 - RAM)
 * If downloaded filename is empty, use "noname" as the filename.
 * Forgot to test for swapped ranges in the trailing range listed.
 * Fixed bug when cancelling QRT computation due to rescanning.
 * Fixed another bug when cancelling QRT computation due to rescanning.
 * Tell whether we're an ultranode or not on handshaking errors.

- (2003.01.27 - RAM)
 * Will now show when a download is from a partial file, and how much of
   the total file the remote server has.
 * New http_range_size() routine.
 * Now makes sure ranges are well-specified before calling http_range_add().
 * Also detect overlapping with next range in list during http_range_add().
 * Changed detection place of so-called "gnutella2": will now abort earlier,
   without giving the chance for the remote ultranode to become a leaf.
 * Dynamic upload slot computation was not co-existing peacefully with
   the ability to steal bandwidth: now compare both instantaneous and average
   to the min usage percentage.
 * Handle only the very first range in upload requests, instead of replying 500.

- (2003.01.26 - RAM)
 * Added glib-missing routines.
 * New HTTP range parsing routines.
 * Range requests now handled through new HTTP parsing routines.
 * Don't add words less than QRP_MIN_WORD_LENGTH chars to the QRP vector.
 * Fixed RX flow-control ratio computation.
 * Don't accept nodes claiming so-called "gnutella2" support as peers.
 * Added support for client-side PFSP (Partial File Sharing Protocol).
 * New download state "sinking" when slurping HTTP reply between requests.

- (2003.01.24 - RAM)
 * Reworked the bandwidth stealing algorithm to behave less aggressively when
   the kernel flow-controls us on the way out.
 * Do not send out duplicate addresses in X-Try* headers.
 * Fixed `elapsed' to be a time_t instead of a guint32 (http.c).

- (2003.01.19 - RAM)
 * Must not free word vector if it was not allocated (matching.c).
 * Update node flags after the first handshake reply.
 * Only send about 50% of queries to flow-controlled leaf nodes.
 * Understand specially marked speed in queries, but do not emit them yet.
 * Warn users running an unstable version after 60 days, ban them after 90.
 * Was not emitting X-Try-Ultrapeers correctly.
 * New flag 'd' shown instead of 'F' when the queue is non-empty, to indicate
   that there is some delay in the packets sent.
 * Based on my experiments about the necessary bandwidth to run an Ultrapeer,
   changed the default amount of leaves to 15 and the minimum to 5.
 * Display max amount of leaves/ultra/nodes when rejecting connections.
 * Added necessary callback from mq.c to warn when queue count changes, so
   we can update the node's flag immediately.
 * Was not parsing version tag properly, and therefore started to ban recent
   stable GTKG versions.
 * Do not trigger "activity timeout" for leaf nodes.

- (2003.01.18 - RAM)
 * Added new properties: "bw_gnet_leaf_in_enabled", "bw_gnet_leaf_out_enabled",
   "bw_gnet_lin" and "bw_gnet_lout" to control leaf node bandwidth.
   Those are special: values configured are automatically added to Gnet
   bandwidth when not in ultra mode, regardless of whether the shaper is
   enabled.
 * Set decent default Gnutella bandwidths.
 * Added leaf bandwidth scheduler, that can steal bandwidth out of Gnet only.
 * Reordered creation of TX and RX stack so that the peermode is known.
 * Can now properly switch between all three modes (normal, leaf, ultra).
 * Upon mode change, reshape the Gnet bandwidth (leaf versus regular).
 * Added support for QRP infinity 1 to not rule out Shareaza.
 * Have the TX and RX link layers write/read using proper bandwidth scheduler.
 * Had inverted proportional bandwidth repartition computations.
 * Adjusted the bandwidth scheduling algorithm to behave a little better
   in the advent we lack bandwidth and lots of stealing occurs accross shapers.
 * No longer kills a connection when the send queue becomes full, unless
   the message was a prioritary one.
 * RX and TX stacks now provides access to the underlying link-level I/O source.
 * GUI now displays the node TX / RX speeds in k/s.
 * Leaf nodes have their send buffer shrank to as low as 256 bytes.
 * Doubled the time between two alive pings.
 * Don't route the query if the hashing vector is empty.
 * Don't send queries from the search queue on flow-controlled connections.

- (2003.01.18 - Richard)
 * [Gtk1] Added following props to gui:
   - PROP_SEARCH_MAX_RESULTS (search pane settings)
   - PROP_NODE_RX_FLOWC_RATIO (gnet config quality management)
   - PROP_NORMAL_CONNECTION (gnet config)

- (2003.01.17 - RAM)
 * Added routing of queries based on QRT.
 * Don't even try to insert in the search queue if hops-flow is set to 0.
 * Don't put leaf node's address in the hostcache for crawler pings.
 * Added highest_bit_set() routine.
 * Lowered the minimum amount of leaves from 50 to 25.
 * Refactored management of connections to be more aggressive when we
   lack nodes and avoid turning incoming connections down too early
   (closes 607268).
 * Don't ping leaf nodes to get pongs from them.
 * Avoid routing back a leaf node query to its sender.
 * Forgot to free word vector built for query routing purposes.
 * Fixed URL unescaping when given a truncated trailing escape sequence.

- (2003.01.14 - RAM)
 * New drop reason "Unexpected message".
 * New QRP Flag 'p' indicates ultrapeer receiving routing patch.
 * Fixed wrong QRP patch computation for leaf nodes.
 * Finalized reception of QRP patches and application to routing table.
 * Warn when receiving unknown vendor message, in debug mode.
 * Added QRP to the list of messages we "route", for routing tracing.
 * Do not drop routed TTL=0 messages whose target is a leaf node.
 * Drop leaf nodes that route messages.

- (2003.01.13 - cbiere)
 * [Gtk2] Set encoding for GIOChannels to NULL which is safe to use with 
   binary data

- (2003.01.12 - RAM)
 * Quote mesh URLs that contain the ',' character so other servents are
   not confused (GTKG does not need this).
 * Fixed skipping of trailing quote in URL parsing [From Alex Bennee].
 * New properties "normal_connections", "node_leaf_count", "node_normal_count"
   and "node_ultra_count".
 * The leaf node mode is no longer experimental, but Ultrapeer mode is.
 * Added Ultrapeer negotiation management (inter-ultra nodes and ultra / leaf).
 * Is now lenient about TTL=0 messages sent from ultrapeer to leaf.
 * Will ban ancient versions after 1 year only, instead of 1.5 years.
 * First take at QRP reception message management (partially done).

- (2003.01.11 - cbiere)
 * Fixed wrong date for ChangeLog
 * Tried to pop non-existent message from statusbar
 * [Gtk2] New locale_to_utf8: non-convertible characters are replaced by an
   underscore ('_')
 * [Gtk2] Downloads: Reenabled multi-selection
 * [Gtk2] Gnet stats: Save and restore column widths; use pretty alignments
 * [Gtk2] Nodes: Save and restore column widths
 * [Gtk2] Search results: Stop autoselecting during shutdown phase;
   Added status column; Sync column widths (still buggy but harmless);
   Use highlighting;
 * [Gtk2] Upload stats: Use custom CellDataFunc instead of invisible columns;
   prepared save/restore for column widths (not complete yet)

- (2003.01.11 - RAM)
 * New property "node_rx_flowc_ratio".
 * Make sure we're not remotely flow-controlled too often.
 * Replaced magical "7" with the new GTA_NORMAL_TTL constant.
 * New property "dl_qalive_count".
 * Downloads now update the "dl_qalive_count" to reflect the amount of
   sources that still reply to our requests.

- (2003.01.10 - RAM)
 * Was reading '*p' but could peruse 'c' instead (dmesh.c).
 * Generalized the use of walloc/wfree for small structures.
 * Try to allocate chunks of 4K at most for walloc(), or 8 objects at least.
 * Created new GTKG-specific GGEP extension "GTKGV1" to propagate version
   information and servent startup time in query hits.
 * Added inet_init() to ensure we have the no-connection timer set if we
   startup in non-firewalled mode.
 * Will now emit "GTKGV1" extensions in query hits when replying to a GTKG
   query, and display version information in search pane.
 * Exported version_str() for version string formatting.
 * Be sure to not call inet_firewalled() on first listening port change,
   i.e. when we read back the configuration file, or the persisted
   "is_firewalled" property will be ignored!

- (2003.01.08 - RAM)
 * Forgot to check for alternate locations on 503 replies.
 * Also compare SHA1 of requested files when checking for upload duplicates.

- (2003.01.05 - cbiere)
 * [Gtk2] gnutellaNet: Nodes can be removed manually    
 * [Gtk2] Enable proper sorting of upload stats by size and normalized
 * [Gtk2] reenabled "clear" buttons for caches
 * [Gtk2] Revisited code; removed unnecessary functions in search_{cb,gui}2.c
 * [Gtk2] removed unused variable 'error' in monitor_gui2.c
 * [Gtk2] locale_to_utf8: extended error message
 * Include version.h for version_is_too_old() in ban.c

- (2003.01.04 - RAM)
 * Had forgotten that we must "goto next" instead of "continue" in
   the URL parsing loop from dmesh_collect_locations().
 * Added argument to download_remove_file(), so that we can reset the fileinfo
   of manually removed files, in order to not discard the entry at the
   next startup.
 * Fixed hops-flow handling in mq_service(): was generating bad iovec entries
   for dropped messages!
 * Don't need to send the "Connect Back" message as a control message.
 * Seeing a vendor-specific message sets the NODE_A_CAN_VENDOR attribute as
   if we had seen a Vendor-Message header.
 * Drop ping/pongs/pushes that are smaller than their normal size.
 * Added support for initial advertising of supported vendor messages.
 * Count unhandled vendor-specific messages as being of an "unknown type".
 * Was wrongly putting a trailing 's' to the Vendor-Message header.

- (2003.01.03 - RAM)
 * Added support for vendor-specific messages.
 * Ban ancient-enough versions of GTKG.
 * Ignore leading/trailing quotes in "quoted" URLs from Alternate-Location.
 * Keep track of IDs from unknown GGEP extensions we see.
 * New miscellaneous routing hex_escape().
 * Now supports the "Hops Flow" vendor-specific message (BEAR/4v1).
 * New version_is_too_old() routine.
 * Exported vendor_code_cmp() and added vendor_code_str().
 * Make sure there is a private extension in the query hit before calling
   ext_parse() on it.
 * New Gnutella node flag 'h' or 'f' to indicate hops-flow or flow-control
   on the receiving side (hops flow message sent to remote node so that it
   limits the traffic sent to us).
 * Added pre-condition to gmsg_check_ggep().
 * Sockets now allocated via walloc0() instead of g_malloc0().
 * Implemented the "Connect Back" vendor-specific message (BEAR/7v1).

- (2003.01.03 - cbiere)
 * [Gtk2] Added multichoice for toolbar style
 * [Gtk2] Added property for collapsed/expanded status of nodes in tree menu
 * [Gtk2] Added multichoice for toolbar style
 * [Gtk2] Several syncs with Gtk1 version
 * [Gtk2] Moved "Freeze queue" button from toolbar to download pane
 * Gtk2 version isn't marked as experimental any more
 * Added check for 192.0.2/24 TEST-NET [RFC 3330] to host_is_valid()

- (2003.01.02 - Richard)
 * Added GtkHBox around child where GtkViewports are used.
 * Added new props to gui ("dl_queue_count", "dl_running_count", 
   "dl_byte_count" and "ul_byte_count")
 * Fixed percentage toggle for "drop reasons" table in gnet stats  

- (2003.01.02 - RAM)
 * New properties: "dl_queue_count", "dl_running_count", "dl_byte_count"
   and "ul_byte_count".
 * Maintains two new property counters: amount of running downloads and amount
   of queued downloads.
 * Now counts total useful bytes uploaded.
 * Now counts total useful bytes downloaded.
 * Added error reporting for failed download mesh URL parsing.
 * Added error reporting for failed HTTP URL parsing.
 * Added Shinobu (SHNB) vendor code.
 * Fixed "was a duplicate" computation, which falsely reported duplicates
   with oneself!
 * Was not filling the ultra cache correctly upon startup.

- (2003.01.02 - cbiere)
 * Bugfix: Wrote into stats array out of bounds (gnet_stats.c)

- (2003.01.02 - Richard)
 * Added UP host catcher to gnet panel
 * Redesigned a few config panels
 * Added "ko" to contibutors
 * Added information about the OS to the about dialog
 * Added hidden RCSID label to the gui (about dialog)

- (2003.01.01 - RAM)
 * Removed the G_INLINE_FUNC attribute in node_add_tx() and friends, as
   it no longer links properly.
 * Template props.tpl was not defining the default value correctly for
   the new "multichoice" type, resulting in badly initialized properties
   whereby the default of the previous property was used.
 * Replaced an "inline" directive in nodes.h with G_INLINE_FUNC.
 * Added a wrapper on top of the qrp_patch_compress() user-defined callback to
   cleanly remove the task from the list where we put it at creation time.
 * Added tracing of extensions for big pings/pongs/pushes.
 * Validate all the /uri-res/N2R?urn:sha1 alternate locations we might get.
 * Whenever we can do a successful /uri-res/N2R? request, force the download
   to always request that URL from the server to avoid problems in case the
   library is reshuffled remotely (for non-GTKG servents).  This also forces
   the /uri-res/N2R? URL into the download mesh.
 * Fixed logic bug in upload code for checking that followup requests still
   refer to the same source.
 * Check for duplicate download in new download_convert_to_urires().
 * In leaf node mode, ignore the "hops_random_factor" property.

- (2003.01.01 - cbiere)
 * Fixed identifiers with leading underscores
 * Removed usage of __FUNCTION__ as it's a gcc-only feature
 * [Gtk2] Hide label with RCSID

- (2002.12.31 - RAM)
 * Added static RCS Id to all the C files.
 * Now accepts and forwards big pings/pongs/pushes to nodes that will
   advertize "GGEP: 0.5" (at least) in their handshakes.  Other nodes
   will get a stripped down message without the GGEP extensions.
 * Do not send a RESET before subsequent PATCH messages if we already
   sent a routing table to our ultrapeer, unless the new table has a
   different size.

- (2002.12.31 - cbiere)
 * [Gtk2] Added and removed properties for gnet stats
 * Size for received packets was wrongly added
 * Added enum PROXY_NONE (gnet.h)
 * Rearranged gnet stats
 * Simplified proxy and peer mode configuration
 * Use enums for proxy protocol (sockets.c)
 * [Gtk2] Upload stats are sortable now (not by size yet)
 * Skip manual int->string conversion (upload_stats_gui2.c)
 * Added RCSID macro which should be used in every .c file: RCSID("$Id")

- (2002.12.30 - Richard)
 * Added PROP_BW_ALLOW_STEALING to gui
 * Replaced radiobuttons with GtkCombo for PROP_PROXY_PROTOCOL
 * Removed cruft code from gui_update_all()
 * Removed cruft code: on_search_stats_type_selected()

- (2002.12.30 - RAM)
 * Added ability to share bandwidth between HTTP and Gnet.
 * New property "bw_allow_stealing" to control bandwidth sharing.
 * New flag q/Q to indicate query routing table sending/sent.
 * Send query routing table faster, as bandwidth permits.
 * Prevent bandwidth stealing from a disabled scheduler.
 * Avoid overflow of signed integer when stealing bandwidth.
 * Actually limit the memory size we figure by the max allowed size for
   the data segment.
 * Made the "is_firewalled" property persistent to accelerate warm startup.

- (2002.12.30 - cbiere)
 * Fixed phys. RAM detection so it should work with Linux, Free/Net/OpenBSD
   and Solaris (settings.c)

- (2002.12.29 - RAM)
 * When "enable_ultrapeer" is FALSE, forbid setting "current_peermode" to
   anything other than NODE_P_NORMAL, forcing the value if necessary.
 * Fixed improper assertion in node_send_qrt(), and forgot to cleanly
   unref the old query table, if present.
 * Space alive pings more for a leaf <-> ultra connection.
 * When in leaf mode, no need to demultiplex pongs.  Also don't forward
   cached pongs when we get a ping.

- (2002.12.28 - guruz)
 * [Gtk1] Made PROP_MAX_ULTRAPEERS GUI-configurable depending on the setting
   of PROP_ENABLE_ULTRAPEER.

- (2002.12.28 - Richard)
 * Added PROP_CURRENT_PEERMODE and PROP_ENABLE_ULTRAPEER to gui
 * Added PROP_BAN_MAX_FDS and PROP_BAN_RATIO to gui
 * Added PROP_LIB_DEBUG to gui
 * Removed PROP_DEFAULT_POLICY: can be done using a filter rule in global
   post filter. Is hardcoded to DO DISPLAY now.
 * Added new property type: PROP_TYPE_MULTICHOICE. This is useful for 
   property-controlled dropdown menus (GtkCombo).
 * Added automatic bindings for GtkCombo widgets if they are in the
   property_map in settings_gui.c.
 * Added gtk_combo_init_choices to gtk-missing.c
 * Dropdown menu for PROP_SEARCH_STATS_MODE is now fully property controlled.
 * Dropdown menu for PROP_CURRENT_PEERMODE is now fully property controlled.
 * Cleant up props.tpl. Uses more scheme code now.

- (2002.12.28 - RAM)
 * Added ban_max_recompute() to recompute max amount of file descriptors.
 * Now sets the "max_banned_fd" property with the configured amount of fds.
 * New properties: "max_banned_fd", "sys_nofile" and "sys_physmem".
 * Added assertion in gnet_stats.c: cannot send a message with TTL=0.
 * Don't send our IP to web cache if we're a leaf node.
 * Renamed network_init() as node_init() for consistency.
 * New routing next_pow2().
 * Reworked the code sending BYE messages to not include a header payload
   on 200, and force a trailing NUL.
 * Was sending the QRT too early after connecting (before setting up the
   TX stack).
 * Refuse connections from leaf nodes when we're a normal node.
 * Don't demultiplex pongs nor honour TTL=2 pings when in leaf mode.
 * Pre-compute the default QRT patch (against NULL table) to immediately
   be able to send it on new connections.
 * Added computation of sys_xxx properties at startup.
 * Don't try to compact queries when in leaf mode, since we don't relay.
 * Fixed node_bye_flags() to skip already removing or shutdown nodes.

- (2002.12.27 - RAM)
 * Only report compression error when there is actually an error, not when
   the task is cancelled.
 * Forgot to send the X-Query-Routing header when not in "normal" mode.
 * Fixed hcache_get_caught() to swap the caught/valid lists if necessary.
 * Fixed bad trailing assertion in qrt_update_send_next().
 * Was sending QRP patch messages with wrong length -> desynchronizing.
 * Forgot that we could still get 0.4 connections whilst in leaf mode.
 * Was returning bad status in qrt_update_send_next(), not sending last patch.
 * Wrong signature for node_qrt_changed().
 * Fixed wrong complaint from bg tasks about user code forgetting exit status.
 * When in leaf mode, pong all 0.4 connections.
 * Fixed cleanup order in qrp update to avoid crash at exit time.
 * Fixed wrong complaint about error whilst freeing compressor.
 * Also forbid outgoing connections to 0.4 nodes when in leaf mode.

- (2002.12.26 - RAM)
 * New properties: "current_ip_stamp", "average_ip_uptime", "start_stamp",
   "average_servent_uptime", "force_ultrapeer", "force_leaf",
   "max_ultrapeers", "max_leaves", "enable_ultrapeer", "current_peermode".
 * Plugged support for GTA_MSG_QRP messages.
 * Added management of QRP updating messages (RESET and PATCH).
 * Now recognizes Ultrapeer-marked pongs (non-GGEP).
 * Added support for handshaking as a leaf node and sending QRP updates.
 * Added is_pow2() routine.
 * `start_time' is no longer a variable, we now use the "start_stamp" property.
 * Added host_add_ultra(), and adapted connecting loop to pay attention to
   the "max_ultrapeers" property when acting in leaf mode.
 * Made sure leaf nodes don't send connectible pongs back.

- (2002.12.24 - cbiere)
 * 'Uploaded stats: splitted into gui and core
 * renamed ul_* functions to upload_*' (src/Makefile.am, src/Makefile.in,
   gnet.h, gui.h, main.c, main_gui.c, settings.c, settings_gui.c,
   upload_stats.[ch], upload_stats_gui.[ch], uploads.c, uploads_cb.c)
 * [Gtk2] Upload stats: Replaced GtkCList with GtkTreeView
 * [Gtk2] About dialog: freenode.org -> freenode.net (gtk2-gnutella.glade,
   interface-glade2.c)

- (2002.12.22 - RAM)
 * Turned the Type colum in the gnet display into flags.
 * Forgot to cancel the hostcache reading tasks at shutdown time.
 * Look at the file's timestamp to ensure the SHA1 we have is up to date.

- (2002.12.22 - cbiere)
 * [Gtk2] Added columns for connected time and uptime (sync with Gtk1)
   (nodes_gui2.c)

- (2002.12.20 - cbiere)
 * Rearranged gnet stats; reduced CPU load for gnet stats (gnet_stats_gui2.c,
   gtk2-gnutella.glade, interface-glade2.c)

- (2002.12.18 - cbiere)
 * Fixed race condition in shell_dump_cookie(); moved g_string_printf
   compatibility quirk to misc.h (shell.c)
 * Added #define for g_string_printf (misc.h)
 * Fixed non-local #include (shell.h, gnet_stats_gui2.c)

- (2002.12.17 - RAM)
 * Had to regenerate configure et al. because it complained it could not
   find automake-1.4 on my system with --enable-maintainer-mode.
 * Avoid writing back the fileinfo trailer when there was no new data
   and the fileinfo is not otherwise dirty.
 * Simplified gnet_stats.c to always use the stats_lut[] array.
 * Fixed typo "Prefered" -> "Preferred".
 * Was wrongly using strcasecmp(var, "http://") instead of the correct form
   strncasecmp(var, "http://", 7) in dmesh.c.

- (2002.12.17 - Richard)
 * Added optional remote shell support (add --enable-remote-shell to configure)
   Documentation is in doc/other/remote-shell.txt
 * About dialog should be opened centered now
 * Quit dialog should open at mouse position now
 * [Gtk2] Moved #define of g_ascii_strcasecmp from dmesh.c to misc.h
 * Fixed wrong argument type in inputevt_add (gint -> guint).
 * Added inputevt_remove(). Please use this instead of g_source_remove().
 * Removed reissue_timeout argument from search_gui_new_search(). (Also [Gtk2])

- (2002.12.15 - cbiere)
 * [Gtk2] Replaced deprecated GtkCList in gnet stats pane by GtkTreeView

- (2002.12.12 - RAM)
 * Fixed crash at exit time: was calling hcache_clear() from hcache_free().

- (2002.12.10 - Richard)
 * Updated gnet stats again
 * Split off gnet_stats_gui2.h

- (2002.12.09 - Richard)
 * Fixed typo: c_gs_recieved
 * Backported new stats from Gtk2 and reorganized stats display.

- (2002.12.08 - cbiere)
 * [Gtk2] Added new stats pane with information about flow-control

- (2002.12.08 - RAM)
 * Added TASK_F_RUNNABLE flag to ensure non-duplication of tasks in run queue.
 * When a host cache is freed, reset its pointer to NULL to prevent reuse.
 * Was calling hcache_close() too soon.
 * Made sure Location headers in replies are absolute URIs, per HTTP/1.1 specs.
 * Added hcache_remove_all() to decouple hcache_free() from hcache_clear().

- (2002.12.07 - RAM)
 * Even when node is connected, it can lack the "alive_ping" object.
 * Refuse connection from "Gtk-Gnutella" (spoofed/tempered-with string).
 * Changed "Transmit timeout" message into "Flow-controlled for too long".
 * Added vendor codes GDNA and GNTD.
 * Switched vendor searching from linear to dichotomic lookup.

- (2002.12.06 - RAM)
 * Added properties "download_require_urn" and "download_require_server_name".
 * Added more cases where we remove source from the download mesh on error.
 * Added alive_get_roundtrip_ms() to extract roundtrip times.
 * Show average/last ping-pong roundtrip time in milliseconds in node's Info.
 * Two query hits or push messages with same hop count are now discriminated
   via their TTL: the lowest it is, the more priority we give.
 * Removed all GDK input dependencies, using a new input event facade on top
   of the Glib I/O routines [Patch from ko].

- (2002.12.05 - cbiere)
 * Cleanup for 64-bit architectures; replaced non-portable casts by
   GINT_TO_POINTER() et al.

- (2002.12.02 - RAM)
 * ban.c: forgot missing trailing space after the "Gnucleus" name.

- (2002.11.30 - RAM)
 * Was passing 'len' as a macro argument, which was then copying this into
   a local variable called 'len' => was getting garbage into that value.
 * Do not store trailing NUL within aliases (in fileinfo trailer).
 * Regenerated configuration files via autogen.sh: was complaining that I
   needed automake-1.4 on my system, which I have!  Grr, I hate auto* tools.
 * First take at the separation between the regular "host" cache and the
   new "ultra" cache which will store ultranode pongs.
 * Renamed check_valid_host() into host_is_valid().
 * Would fail to parse saved downloads whose filename starts with a '#'.
   We now forbid comments in the file passed the preamble.
 * Allow file moving and SHA1 verification tasks to process zero-sized files.

- (2002.11.29 - RAM)
 * Added "Gnucleus 1.6.0.0" to the servent ban list (broken Morpheus version).
 * Safely handle very long lines when parsing the fileinfo text file.
 * Do not write aliases larger than 1024 bytes to the trailer.

- (2002.11.25 - RAM)
 * When considering whether a download has a SHA1 for abortion, use the
   SHA1 information in the fileinfo, not the one in the download structure.
 * Factorized configuration file opening/creating logic into "file.c".
 * Will now allow HTTP headers of up to 8K in size, before failing with
   a "header line too long" error.

- (2002.11.24 - RAM)
 * Parse Mutella's Uptime header (xDD xHH xMM).
 * Also collect pongs from X-Try lines if the third handshaking step fails.

- (2002.11.26 - cbiere)
 * Fixed detection of zlib because it could accidently default to "yes"

- (2002.11.24 - cbiere)
 * [Gtk2] Port search pane to Gtk2 (search_cb2.[ch], search_gui2.c)

- (2002.11.23 - RAM)
 * Flag downloads when overlapping checks have been done to avoid doing
   them twice when we got exactly as many bytes as the overlapping window.
   (Bug found by Richard)
 * Also apply vendor-specific banning to nodes we connect to.
 * Added bootstrapping web cache file [Patch from Markus Goetz].
 * Added Markus Goetz to the AUTHORS file.

- (2002.11.23 - Richard)
 * Added key != NULL assertion to atom_get and atom_free.
 * Made dmesh cope with buggy alternate locations from LimeWire.

- (2002.11.22 - RAM)
 * Will now ban gtk-gnutella/0.90 and gtk-gnutella/0.91u because they are
   harmful (could corrupt Gnutella traffic).
 * Fixed buglet that caused GTKG to warn again and again for the same "more
   recent" version on stderr.

- (2002.11.22 - Richard)
 * Show more information on failed uploads (the HTTP request).
 * Add new debug level variable "common_dbg" controlled by PROP_LIB_DEBUG
 * Clean up includes
 * Polished toolbar
 * Show URN queries in search stats
 * Moved parsing of magnet: and urn:sha1: searches from 
   search_cb.c to search_gui.c
 
# v 0.91.1  2002.11.22  [stable]

Highlight of changes (user-visible):

- Will now verify the SHA1 of downloaded files in the background.
- New configuration parameter for the directory where "bad files" not
  matching their advertised SHA1 should be put (don't forget to configure
  it, as it defaults to /tmp).
- Files are now copied in the background, so it is possible to setup the
  various "download" directories on different filesystems.
- Node connection time and remote node's uptime (if available) are now shown.
- It is now possible to paste a "magnet:" URI in the search to launch a
  SHA1 search.
- The "connection indicator" at the bottom left is now a toggle.  Depressing
  it will terminate any Gnet connection but will continue to serve uploads and
  process downloads.
- The active download status now shows how many sources are available and
  how many are currently active (i.e. downloading).  It will also show the
  estimated remaining time for the whole file, as well as the global reception
  rate for the file, accounting for all currently active sources.
- Fixed bug that prevented proper downloading from recent BearShare (4.1.x or
  better) and Shareaza (1.6.0.x or better) nodes when the SHA1 of the file
  is known.
- Will now protect against "PUSH floods" by banning the relevant IPs.
- At startup, scan the download "tmp" dir for orphan files and reintegrate
  them into the fileinfo database, moving completed files to the relevant
  directory (depending on whether its SHA1 checked OK).
- Minor bug fixing: improper countdown for push timeout when falling back,
  fixed corner-case processing that could lead to crashes or incorrect
  behaviour, accidental localization on X-Live-Since headers, freezing of the
  GUI when clearing many uploads, obscure portability fixes.

- (2002.11.20 RAM)
 * New `version_number' variable is now built to hold the version number string.
 * Do not show them new development versions if they don't run one.
 * Display message every 10 minutes in the status bar if they run an ancient
   version, more than one year old.
 * Added copyright statements for David Walker.
 * Do strftime("%z") formatting ourselves, since %z is a GNU extension.

- (2002.11.22 RAM)
 * Moved sendfile() checks where they belong, i.e. in bio_sendfile(), with
   additional paranoid checks.
 * Unplugged QRT computation for 0.91.1.
 * Fixed maximum random value computation when random() is being used on
   other machines than Linux [With the help from Uros Bizjak].

- (2002.11.17 Richard)
 * [Gtk2] Fix crash when removing a search and switching to a new search.
   [Patch from Christian Biere].

- (2002.11.17 RAM)
 * Added support for urn:bitprint:, although only its SHA1 part is processed.
 * Always verify that we have 32 chars before calling base32_decode_into()
   to decode an urn:sha1.
 * Now understands "magnet:" URIs in search [Patch from David Belius].
 * Will now use GGEP "H" in query hits when replying to a query from GTKG 0.91
   or better, since we're sure the querying host will understand it.
 * Clearing of completed uploads now done "incrementally" to avoid freezing
   the GUI when there is a lot to clear [Patch from Christian Biere].

- (2002.11.15 RAM)
 * Servers understanding /uri-res/N2R? may not send X-Gnutella-Content-URN.
 * No need to unlink the file in download_move_done().

- (2002.11.14 Richard)
 * Don't try to connect to new hosts in offline mode
 * Display "loading..." in host catcher while reading the file
 * Change plug icon if manually switching to offline mode

- (2002.11.12 RAM)
 * New file moving code was not properly stripping trailing fileinfo.

- (2002.11.12 Richard)
 * [Gtk2] Add new widgets from Gtk1 frontend
 * [Gtk2] Filled in contributors to about box
 * [Gtk2] Greatly improved search monitor performance

- (2002.11.11 Richard)
 * Added entry for PROP_BAD_FILE_PATH to download config
 * Added icons to reflect state of PROP_FILE_MOVING
 * Added uptime and connected time columns to nodes table

- (2002.11.11 RAM)
 * New http://gwebcache.bearshare.net/gcache.php replaces the old zero-g.net
   hardwired bootstrapping web cache, which was shutdown due to traffic.
 * No longer uses strftime() to format date string for X-Live-Since, since
   it insists on using the user's locale.
 * Added asynchronous moving of downloaded files.
 * Renamed node_connected() as node_is_connected().
 * The verify_queue() routine no longer knows about download states.
 * Don't reject PUSH comming from a private IP if we're connected to it
   (this is mainly for testing purposes but will not hurt).
 * Changed property descriptions of "download paths" to remove any constraint
   on them being on the same filesystem.
 * Also parse the Uptime header instead of X-Live-Since (Gnucleus nodes).
 * Show the server's uptime, even if we're not connected to the node.

- (2002.11.09 RAM)
 * The BSD sendfile() requires that first two arguments be swapped (wrt linux).
 * Now computes and displays the overall swarming downloading rate and the
   time that remains to get the complete files.  Also shows how many sources
   we're currently using out of the ones we know.
 * New unique_filemame() routine.
 * New "file_moving" property to indicate that we move files in the background.
 * Default for dynamic upload slot allocation is now FALSE.
 * Added logic to make the new "online mode" toggle actually work.
 * Shortened retry delay to 2 seconds when server cannot understand /uri-res.
   (unless server explicitly set a Retry-After, in which case we honour it).
 * When we abort a download due to a header reception timeout, we might
   not have got the full status line.
 * Now computes the "startup date" for the nodes to which we connect, parsing
   the X-Live-Since header.
 * Ensure we have "LC_TIME=C" in our environment.  Some X-Live-Since headers
   are still incorrectly localized by strftime().

- (2002.11.07 RAM)
 * Fixed memory leak in search_stats_notify_word() [From Christian Biere].
 * Added new property "bad_file_path" to indicate where files which do not
   match their advertised SHA1 should be moved.
 * Was wrongly testing for queued download instead of running one in
   queue_suspend_downloads_with_file(), which could mess up with lifecount.
 * Will now retry downloads for which the SHA1 did not match.
 * When unlinking a file, display its SHA1 (if any) and the done/size info
   to stderr.
 * The BSD sendfile() has different signature and semantics.  Emulate the
   Linux behaviour on those systems.

- (2002.11.07 Richard)
 * [Gtk2] Added new icons from Gtk1 and"prefer compressed" switch.
 * [Gtk2] Columns in gnet panel automatically grow in width again
 * [Gtk2] Fixed bug showing status information in version row on gnet panel.
 * Fixed sizeof issue (memory corruption?). Thanks to Christian Biere for
   pointing it out.

- (2002.11.06 RAM)
 * More tweakings with fileinfos: will now physically remove files that are
   SHA1 or name/size ignored (if not completed already).
 * Forgot a few calls to file_info_clear_download() which releases the
   association between a download entry and a chunk in the file.

- (2002.11.05 RAM)
 * Don't show SHA1 computation rate if we did not hash anything (e.g. after
   a recovery crash where we jump to the "SHA1 verified state" directly).
 * Revisited fileinfo handling: try to not discard them when a download
   stops, unless it was an explicit removal from the user or we are told to
   ignore its SHA1, for instance.
 * Fixed possible discrepancy between the download's SHA1 and the fileinfo's.
   In particular, we could associate a download with a known SHA1 with a
   fileinfo not bearing a SHA1 at all.

- (2002.11.04 RAM)
 * Restored broken support for sendfile(): configure was no longer setting
   the proper variables, leading to sendfile() being ruled out everywhere
   even when present.
 * Inclusion of sys/sendfile.h now protected by HAVE_SYS_SENDFILE_H.
 * Prevent concurrent downloads from being stuck in the "Waiting for SHA1..."
   when another one finishes: requeue them as they are suspended.
 * Will now say "SHA1 figure OK" instead of "SHA1 check OK" when we correctly
   computed the SHA1 but none was originally known for the file.
 * Skip non-plain files when scanning the "tmp" directory for orphan files
   [From Uros Bizjak].
 * Persist settings of the "prefer compressed connections" toggle button
   [From Christian Biere].
 * Will now protect against "PUSH floods" by banning the relevant IPs.
 * Avoid doing some work if we are going to use the sendfile() system call.
 * Added temporary sanity checking around sendfile(), just in case it does
   not behave as advertised.
 * Freeze GUI list when clearing completed uploads [From Christian Biere].

- (2002.11.03 RAM)
 * Refuse to start a "suspended" download, requeuing it as "Suspended".
 * Moved settings of the DL_F_SUSPENDED after download is allocated
   (thanks to Paul Cassella for spotting this).
 * Log vendor string when HTTP/1.1 server gives us more bytes than requested.
 * When we have to trim data, we can't use keep-alive connections: remember
   bad servers so we don't request upper-bounded ranges from them again.
 * When logging to "done.sha1", use the output filename as name, not the
   server name, which could be an obscure urn:sha1: string.
 * When resuming after crash, forgot to handle the case where a completed
   file could be listed many times in the queue.
 * Was showing bytes/s instead of kbytes/s in the final SHA1 computing
   rate display.
 * Added new is_faked_download() routine.

- (2002.11.03 Richard)
 * Added default extensions: doc, nes, smc, smd, rom
 * Changed default sidebar width to 140
 * Changed default filter-tree size in filter dialog to 140
 * Changed default 'Jump to download' to FALSE
 * Fixed tooltips of the firewalled/non-firewalled icons
    
- (2002.11.02 RAM)
 * Added asychronous SHA1 verification routines.
 * Extended the background task model to also support "daemon" tasks, which
   are tasks that sleep in the background and are woken up when work is to
   be performed.
 * Plugged in SHA1 verification when a download is complete.
 * Display SHA1 computation status in the download window.
 * At startup, scan the download "tmp" dir for orphan files and reintegrate
   them into the fileinfo database, moving complete files to "done".
 * Only send urlfile requests to web caches once every 8 hours.
 * Split ignore_add() into ignore_add_sha1() and ignore_add_filesize().
 * Old code that could move back a file from the "done" directory to the "tmp"
   directory was removed.  We now have stricter file management with SHA1.
 * Fixed routing_log() which was not logging anything.
 * Removed spurious checks in get_file_to_upload_from_index(), replacing
   them with assertions.

- (2002.10.30 RAM)
 * Raised logging level for some innermost traces in bg.c.
 * Moved check for "no GUID to use PUSH" to download_push() to avoid seeing
   retry countdowns when a connection cannot be made.
   This updates yesterday's fix.
 * Integrated batch of portability and cleanup fixes from Christian Biere.
 * Don't call search_close() too early [Fix from Juli Mallett].
 * Avoid dereferencing a NULL `current_search' variable [From Juli Mallett].
 * When falling back to push, reset the time for accurate push timeout.

- (2002.10.29 RAM)
 * New background task layer.
 * Added X-Host: support to specify non-firewalled server's IP address to
   pushed uploads.  A pushed download seeing X-Host in the reply knows that
   the server is not firewalled and that a direct connection can be made.
 * Added provision for storing computed SHA1 in fileinfo trailer.
 * Plugged background task timer.
 * Converted existing SHA1 and QRP computation code to new background tasks.
 * Integrated random() support from Christian Biere.
 * Added Christian Biere to AUTHORS.

- (2002.10.26 RAM)
 * varargs copying fixes from Michel Daenzer for powerpc platforms.
 * Raised size of the search queue to 256 entries.
 * Integrated portability fixes from Christian Biere for NetBSD.

- (2002.10.24 RAM)
 * Opening version 0.92u.
 * Stricter banning policy: ban after 5 reqs/minute instead of 10.
 * Fixed typo "interaface" -> "interface" in some includes.
 * Show download's disk filename when all we have from server is an URN.
 * Don't show "503 rebuilding library" when in fact we don't share anything.
 * New walloc0() routine.
 * Now allow again setting "min Gnet connections" to 0.

# v 0.91   2002.10.19  [stable]

Highlight of changes (user-visible):

- Now uses HTTP/1.1, which implies support for persistent connections.
- gtk-gnutella will now monitor whether we're connected to Internet and
  slow down its connection requests when it detects the connection was broken
  (after a delay of ~3 minutes at most).
- Download swarming is now supported: gtk-gnutella will download different
  portions of the same file from many hosts, as long as alternate sources
  are available.
- The download mesh (alternate source collection during downloads) is now
  used to fill the download queue with more sources.
- Alternate locations can also be passively collected from query hits.
  You can enable this in the swarming section on the download config pane.
- Download scheduling was entiretly redesigned to avoid hammering busy hosts
  and scale to 5000+ entries in the queue without slowing down the whole.
- Is now smart about the "push" flag and will try to ignore it if possible,
  in case the remote host wrongly set the flag but is not firewalled.
- gtk-gnutella now remembers the files it downloaded and will ignore further
  requests to download the same file.  It will visually mark those files, as
  well as the ones it already shares, by showing them in lighter color in the
  search results.
- It is possible to supply to gtk-gnutella your own ignore lists by SHA1 and
  by name/size but the feature is under-documented.
- Added an "expert mode".  Only when this is enabled will gtk-gnutella show
  the users some of the most complex settings.
- New Gnutella statistics pane, showing the packets we sent and received,
  how many we generated, and the reasons why we drop packets, by packet type.
- Now understands UTF-8 queries, but does not generate them.
- Fixed important bugs whereby all earlier versions of gtk-gnutella were
  unintentionally corrupting the Gnutella traffic!
- Moved away from the public hostcaches and now uses the Gnutella Web Cache.
- Will now show all upload attempts, not only the ones that are transferring.
  If the connection is aborted, the reason is also shown.
- New search stats types: queries by router, whole query.
  . "Queries by router" shows how many queries have been recieved
    from any node gtk-gnutella was directly connected to.
  . "Whole query" shows stats based on the complete query string
    instead of individual query words.
- New visual indications via icons in the status bar: whether gtk-gnutella
  is rebuilding the library, computing SHA1 of shared files in the background,
  and whether we are connected to Internet or not.

KNOWN BUGS/PROBLEMS:

- When changing the directory for incomplete/complete files, all 
  partially downloaded files recorded in ~/.gtk-gnutella/fileinfo 
  will still be downloaded to the old directory. You need to manually
  change the paths in above file using search/replace and your 
  favourite text editor.
- Sorting order of tables is not perserved across sessions.
- Marking/highlighting of results/downloads/uploads heavily depends
  on your GTK theme. Especially most themes do not set fg[ACTIVE] and 
  fg[NORMAL] to different values.
- There is currently no way to un-ignore a file via the gui. You 
  can however edit the done.sha1 and done.namesize files in your
  ~/.gtk-gnutella directory manually. Unignoring via gui is planned
  for the next release.

- (2002.10.19 RAM)
 * Changed error code for non-compressed connections from 401 to 403.
 * Cleaned up manual page: removed obsolete information about config options.
 * Cleaned up Gnet & GUI properties.

- (2002.10.18 RAM)
 * Small cleaning of whitelist/local (patch #623100).
 * Switched from 409 to 503 when "already downloading that file" so that
   user can retry later on: this is not a fatal error.
 * Added pre-condition in download_request().
 * Revised the descriptions of gnutella properties, and changed a few
   limit values that were wrong (TTL, max TTL, etc...).
 * Make sure we do not fill a query hit with more than 255 results.
 * Only trim TTL larger than our max_ttl for broadcasted packets.

- (2002.10.17 RAM)
 * Reset "Clear Completed" correctly in upload pane when auto-clear is on.
 * Disabled failing assert in file_info_find_hole(), replaced by a warning
   for now, pending further investigation after the release.
 * Fixed Gnet compression rejection messages.
 * Also send out X-Try when rejecting connections based on lack of compression.

- (2002.10.17 Richard)
 * Fixed several bugs in filter_cb.c when copying/pasting a rule.
 * Fixed bug: hostcatcher does not update properly in gui if no hosts 
   file was found.
 * Added "prefer compressed connections" option to gnet config pane.
   (expert mode) [thanks to Markus "guruz" Goetz]
 * Replaced GtkSpinButtons with GtkEntry in the size-rule part of the
   filter dialog. Should give the full range of sized up to 2GB.

- (2002.10.15 RAM)
 * Added GGEP parsing and generation code.
 * Added support for COBS (required by GGEP).
 * Fixed "abort from host" routine.
 * Fixed improper lifecount in downloads, when resuming leads to a Duplicate.
 * Added assertions in gmsg_dump() and gmsg_split_dump().
 * Forgot to cancel the "urlfile" retry event during shutdown.
 * dump_hex() can now handle zero-sized dumps.
 * Will now recognize GGEP "H" extensions in query hits.
 * Protected some GUI warnings with "if (gui_debug)" tests.
 * Now knows how to generate GGEP "H" extensions in query hits, code disabled.

- (2002.10.14 RAM)
 * Fixed bug when following HTTP redirection during downloads.
 * Lowercase the Content-Range header value before parsing.
 * Don't send them the download mesh entries if they abort on "Stopped (EOF)",
   as they might choke on the HTTP continuation.
 * Converted to new gnet_prop_get/set_type_val() macros.
 * Generated property routines now have the opening "(" after the name.
 * Merge adjacent "unknown" extensions in vector.
 * Added new REMAP_ZALLOC compile flag to remap zalloc() and walloc() to
   malloc(), indepently of the USE_DMALLOC flag.
 * Added new properties: "library_rebuilding" and "sha1_rebuilding".
 * Forgot to reclaim current web cache URL atom during final cleanup.
 * Be nice to pushed uploads and don't impose them to follow a 301 if they
   don't request the proper file and give a SHA1 in the HTTP header.

- (2002.10.14 Richard)
 * Added icons to display state of background processes (building lib/sha1)
   to statusbar. 

- (2002.10.13 RAM)
 * Made socket_destroy() a private routine of sockets.c, which now takes
   a reason string that can be propagated back to the socket's resource
   for better error logging.
 * Fixed stupid error in vendors.c: was comparing aginst '0', instead of '\0'.
 * Give more precise feedback for failed pushed uploads.
 * Forgot to initialize flags in HTTP async requests.
 * Fixed HTTP redirection bug: had put a wrong assertion.
 * Applied Solaris portability patch [From Uros Bizjak] (patch #579522).
 * Always parse query hits bearing 4 bytes of open data, whatever the vendor.
 * Fixed some function formatting, according to point 4.5 of STYLE guide.
 * When creating a new search, immediately send message to the search queue
   as soon as the search is unfrozen (fixes bug #617206).
 * Turn fuzzy name matching off by default, since it is potentially unsafe.

- (2002.10.12 Richard)
 * Option to visually mark ignored files in the search results.
 * Update local address displays when listen port is changes (closes 622020).
 * Optionally accept the first chunk of a file from a source that does not
   supply a urn to match against. This dramatically reduces the number of
   "No URN on server". This only helps in cases where you never get a file
   because the only source you have does not provide a urn.
 * Add a viewport to all config panes so they can be scrolled if the window
   too small to show them completely.
 * In gwcache.c: when stopping because we get 50+ lines, use
   http_async_close() and not http_async_cancel() as it is not an error,
   so we don't want the error callback to be called.
 * In http.c: when making a subrequest, disable timeouting of the now idle
   parent request.

- (2002.10.12 RAM)
 * Fixed get_file_to_upload_from_index() to avoid writing to freed memory.
 * Added pre-condition in io_read_data().
 * Added asynchronous disposal of HTTP async requests to avoid writing
   into freed memory upon user callback returns.
 * Just because a hostname starts with a digit does not mean the host was
   given as an IP address (fixes bug 617315).
 * Display pushed uploads in light gray ("insensitive"), just as we do for
   pushed downloads.
 * Was not properly reporting errors when given bad URN in /uri-res.
 * Also report 503 if given a /uri-res and we are still rebuilding, in case
   we do not find the file for the URN: we might not have parsed it in the
   library if it is large.
 * When downloading, ignore SHA1 of files we already share in our library
   (fixes bug #618722).
 * Made `current_url' an atom in gwcache.c to avoid race conditions with
   the entry being superseded.
 * Delay next urlfile webcache request when the previous failed.

- (2002.10.05 RAM)
 * Never send pushes if we think we're firewalled.
 * Made "misc.h" include "config.h" for compiles on FreeBSD.
 * Further changed the upload request checking order for better GUI reporting.

- (2002.09.28 RAM)
 * Added ATOM vendor code.
 * Check HTTP upload request after we extracted the vendor information.
 * Drop "QTRAX2_CONNECTION" queries.
 * When we're firewalled, answer pings at regular intervals, to help us
   determine whether we're really firewalled.  Even if we have no slot.
 * Moved "TTL exceeded" reason at the top, with related reasons.
 * Fixed download fileinfo reparenting bug.

- (2002.09.25 RAM)
 * Added ACQX and EVIL vendor codes.
 * Shuffled code around in upload_request() to gather as much information from
   the request as early as possible for GUI display purposes in case of error.
 * Now recognizes UTF-8 queries starting with Byte Order Mark tag.
 * Drop and count malformed UTF-8 queries we encounter.
 * Removed unused count_running_downloads_with_sha1().
 * Added my own cache to the bootstrap list.
 * Fixed the _shutdown() routine in property template to avoid freeing NULL.
 * Vendor ACQX can include XML payload in query hits.

- (2002.09.24 - Richard)
 * Cleant up search_xml.c a little
 * Fixed another memory leak in search_xml.c
 * Partially fixed: Uploads and downloads won't abort (#612374)
   Should work for uploads, "abort by SHA1" and "abort by name". The
   "abort by host" was optimized by Raphael and I dont see the bug right now.

- (2002.09.24 RAM)
 * Added the EXT_NONE extension to hold separator overhead.
 * Don't warn at exit time on fileinfo entries with refcount=0.
 * At debug level 5+, can now log the packets we emit, and the non-broadcasted
   messages we relay..
 * Suppressed MSG_DROP_MULTIPLE_SHA1, added MSG_DROP_QUERY_OVERHEAD.
 * Renamed MSG_DROP_MISFORMED_SHA1_QUERY as MSG_DROP_MALFORMED_SHA1_QUERY.
 * Documented web cache usage policy.
 * Added cache seeding when the caches we inspect have few entries.
 * Fixed memory leak in nodes.c.
 * No longer send the trailing "urn:\0" in queries.
 * When issuing SHA1 queries, was not copying the trailing NUL.
 * Will now drop queries with too many (unneeded) separators in extension.
 * Now supports queries with multiple SHA1.
 * Split our query hit packets in chunks of ~2KB for better flow control.
 * Fixed missing counter decrements on completed uploads.

- (2002.09.23 RAM)
 * When replacing URLs in the web cache, delete from the known URL table
   before re-inserting, for the rare cases where we're inserting the same
   URL at the same slot.
 * Removed spurious block that crept in inside gwc_store().

- (2002.09.23 - Richard)
 * fixed memory leak in:
   - search_xml.x (config_comment)
   - hosts.c (parse_netmasks)
   - settings.c (move_file_path_changed)
   - settings.c (save_file_path_changed)
   (thanks Rhamphoryncus for spotting)
 * Gui/core separation for uploads
 * Better monitoring of the gtk-gnutella internal server activity including
   monitoring of failed upload attempts and connections that are being kept
   open.
 * Fixed: upload status bar fails to decrement (closes #609479)
 * Should no longer give floating point exception on Alpha (closes #609253)
   Always use gtk_progress_bar_set_fraction and check that we don't do a
   div-by-zero when calculating the fraction.
 * Started to move gui initialization code from main_gui.c to the respective
   initialization functions of the different gui modules. That gives less 
   problems with migrating to Gtk2 specific frontend modules.
 * Revisited gui/core separation code for gNet connections. Don't transfer
   the whole node information on each update. Don't alloc/free memory on
   each status update.
 * Use GtkTreeView instead of a GtkCList to list the gNet connections.
   Breaks popup menu and removal of nodes in the experimental Gtk2 version.
 * Destroy sorting arrow in search results panel when a search is closed.
   (thanks to Bjorge Dijkstra for spotting and providing a fix).
 * Moved PROP_AUTOCLEAR_UPLOADS from gnet_props.ag to gui_props.ag
 * Give more warnings if a widget is not found in settings_gui.c
 * Added "searches by router" to search stats.
 * Remove sidebar viewport again (Gtk1)

- (2002.09.22 RAM)
 * Forgot to initialize a field when starting an aync HTTP request.
 * QRP hash code no longer uses tolower() and only translates [A-Z] to [a-z].
 * Adapted zalloc/walloc code to be usable under dmalloc.
 * Added support for transparent redirection in async HTTP requests.
 * Unplugged all support for the now-dead public hostcaches.
 * Fixed a few "free(NULL)" calls spotted by dmalloc.
 * Save URLs in gwcache starting with the oldest ones.
 * Rotate the web cache used after a few updates.
 * Downloads were still using obsolete index==0 convention to indicate the
   /uri-res URLs.  It is now index==URN_INDEX that must be used.
 * Fixed embarrassing bug: we were bluntly changing the query text on the
   fly by calling st_search() on the original query text!
 * Fixed memory leak in fileinfo.c.

- (2002.09.21 RAM)
 * Removed hostcache "gnutella-again.hostscache.com": no longer resolves.
 * Added http_async_close() to cleanly request connection close.
 * Added url_escape_query() to escape query string parameters in URLs.
 * Periodically save Gnutella web cache ring if dirty.
 * Finalized web cache support to publish our IP and propagate ring.

- (2002.09.20 RAM)
 * Forgot to update the name hash-table when changing fileinfo.
 * Must always seek before writing to a downloaded file, even when swarming
   is OFF, since we always update the trailer, hence changing the write
   pointer.
 * Don't lseek to the trailer if we're not going to write it anyway.
 * Finalized asynchronous HTTP request support.
 * First implementation of Gnutella web cache support.  No update yet.
 * Added new core property "incoming_connecting_timeout".
 * Improved str_chomp() to also strip trailing "\r\n" or plain "\r".

- (2002.09.19 RAM)
 * Added COCO to the vendor list.
 * Check for sendfile() or write() returning 0 in case the underlying file
   disappears on a non-Unix filesystem such as FAT32.  This avoid endless
   loops (fixes bug 611537).
 * Check for the HTTP protocol tag before URL-unescaping the request,
   which could shift the string backward in the buffer.
 * Vendor tags are now defined in "vendors.h".
 * Fixed wrong drop message.
 * More untested code on asynchronous HTTP requests.

- (2002.09.18 RAM)
 * Factorized asynchronous I/O header parsing code.
 * More embryon of code for asynchronous HTTP requests.
 * Automatically compact query text in messages we send.
 * Now only compacts white-spaces in query text, and only for messages
   we are going to relay.

- (2002.09.16 RAM)
 * Fixed Alternate-Location parsing to avoid mistaking an URL for a date.
 * Should now correctly guess whether a "," in an URL is a separator of
   two URLs or is part of the current URL.
 * Special index to indicate URN is now 0xffffffff instead of 0.
 * IP/port parsing of URLs is now done in http.c.
 * Embryon of code for asynchronous HTTP requests.
 * Fixed download problem with swarming deactivated.
 * Socket type/direction constant refactoring.
 * Capitalized first letter of all Gnet stats.
 * Removed MSG_DROP_RESULT_DOUBLE_NUL, which was wrong.
 * Changed MSG_DROP_QUERY_TOO_LONG into MSG_DROP_QUERY_NO_NUL.
 * Added MSG_DROP_PONG_UNUSABLE.
 * Query compaction is now enabled by default.
 * Now counts unusable pongs that we drop.
 * No longer alter open-data of query hits inplace for LimeWire/Swapper hits!
 * Will now detect query hit trailer with GGEP extensions.
 * Parse trailer extensions for validation only (currently).
 * Count queries with no trailing NUL as such.

- (2002.09.15 Richard)
 * (Hopefully) fixed flickering in gui by jailing label_items_found and
   label_search_stats_count into GtkViewports (Gtk1 & Gtk2)
 * Added "(Globally) drop results from host" to search popup
 * Added "New search from selected" action from search results
   pane. Creates a new search based on the filename found and
   adds a filter to it based on the sha1 hash if it has one or the
   exact filename if it hasn't.
   (patch by Andrew Meredith <andrew@anvil.org>)
 * Fixed up build files following suggestions from Andrew
 * Bumped version in configure.in
 * Fixed warnings in gtk-missing.c when compiling with Gtk2

- (2002.09.12 RAM)
 * Was mistakenly going through routing_log() formatting even if the debug
   level did not justify it.
 * Query compacting is now UTF-8 safe.
 * No longer transform UTF-8 queries into ISO-8859 inplace: we now let UTF-8
   queries go through as-is.
 * utf8_to_iso8859() forgot to decrement length of original string.

- (2002.09.12 Richard)
 * Renamed share_gui2.c to monitor_gui2.c
 * Added checkbutton to config-UI panel to toggle expert mode
 * Fixed freeze-bug when adding filter rules via search popup
 * Optional compaction of queries (default off). This cleans up
   the search stats and saves a little bandwidth but in turn costs
   a little cpu.
 * Enabled Gtk2 frontend again (experimental)
 * Fixed typo "No item found" => "No items found"
 * Reordered result processing in share.c: first check wether results
   should be dropped, then notify listeners (search monitor/stats), 
   then check wether to perform a local search.

- (2002.09.11 RAM)
 * Make sure we leave enough room in the reply HTTP header for final "\r\n".
 * Re-organized download_request(), with better detection and handling
   of header timeouts.

- (2002.09.10 Richard)
 * Expanded gnet statistics
 * Added percentage display for gnet statistics
 * Moved "(globally) drop..." do submenus. More to come
 * Renamed "local" to "generated" in the gnet statistics
 * "Can't remove node" bug should be fixed now
 * Fixed serious bug in idtable: last_id was not initialized!
 * Removed wrong assertion: node handle may be 0
 * Fixed bug: when removing multiple nodes, only the first is
   removed
 * Expanded search stats. Can choose between "word" and "query" stats.
 * Renamed search_stats.[ch] to search_stats_gui.[ch]
 * Integreted search stats in gui_update_global.

- (2002.09.09 RAM)
 * Fixed reference count problem when resetting fileinfo.
 * Made socket_connected() private.
 * Count sent message size from queue accurately.
 * Cleanup of statistics, separating reception: header and payload counted
   separately.
 * When reading back fileinfo cache, guard against duplicate ALIA entries.
 * Split sent statistics into local and relayed.
 * Requeue downloads with a SHA1 in the fileinfo but for which the server
   gives no URN: it will wait for an overlap to resume, provided the user
   has at least configured 64 bytes of overlap (fixes bug #606373).

- (2002.09.09 Richard)
 * Finally added the "expert mode". This means you'll not see lots of 
   settings in the config panes next time you start. If you want to
   enable the expert mode, edit your "config_gui" file in ~/.gtk-gnutella
   manually and set "expert mode" to TRUE.
 * Added drop statistics for every message type and accumulated traffic
   statistics for every message type.
 * Reduced number of drop reasons and use same reason for different
   message types.
 * Don't bother trying to find a hit if we don't share any file.
 * Added stats for local query hits
 * Again changed gNet pane update behaviour (once per second)

- (2002.09.08 Richard)
 * Update nodes in gNet panel more often.
 * Added gnet statistics
 * Added "User interface" settings to config pane.
 * Made (most) tooltips optional.
 * Show confirmation dialog when leaving gtk-gnutella (optional)
 * Moved code from callbacks.[ch] to downloads_cb.[ch] and uploads_cb.[ch]
 * Moved code from gui.[ch] to main_gui.[ch]
 * Moved code from gui.[ch] to downloads_gui.[ch] and uploads_gui.[ch]
 * Moved code from main.c to main_gui.[ch]
 * Moved declarations of functions needed by gui from downloads.h to
   gnet.h
 * Temporarily relocated a struct declaration from upload_stats to gnet.h
 * Changed code to update sidebar stats
 * Added feature summary to output of configure script
 * Mark files downloaded by "Watch searches for alternate sources" as
   "queued" in search results (same marking as when you manually download
   them)
 * Don't generate duplicate filter rules when creating rules from
   a number of selected search results.
 * Updated clist_collect_data to be more usable
 * Moved code from upload_stats.[ch] to upload_stats_gui.[ch]
 * Use properties to set scan extensions

- (2002.09.08 RAM)
 * Fixed problem when requeuing a stopped download from the GUI.
 * Internal invalidation of the "fileinfo" was leaving a NULL pointer and
   this is confusing: always reget a proper fileinfo when invalidating.
 * Resize fileinfo when we get a larger file with same SHA1.
 * When about to move to "disconnected from the Internet" state, look whether
   there was incoming traffic received recently.
 * Don't assert that size_atom exists on fi_free(), it could be missing.
 * Fixed Richard's sent counter stats.

- (2002.09.07 RAM)
 * Added "int" atoms.
 * Refactored swarming meta-information management to avoid conflicts between
   different files, and really put identical sources to the same output file.
 * Make sure we don't display negative retry times for downloads.

- (2002.09.06 RAM)
 * Factored out handling of (name, size) tuples.
 * Was wrongly forwarding query hits with bad SHA1s when debugging disabled.
 * Made guid_random_fill() a public routine.
 * Was badly computing position in queue when it holds more than 1024 entries.

- (2002.09.02 RAM)
 * Fixed duplicate server free bug (fixes bug #603365).

- (2002.09.01 RAM)
 * Made local_ip persistent, in case it takes time to determine dynamically.
 * Fixed some English typos in the gnet properties ("then" -> "than").
 * Was missing a trailing "\n" in whitelist.c debugging statement.
 * Added workaround for sscanf() parsing bug: always end parsing with a
   scanned parameter.
 * If remote HTTP/1.1 does not honour keep-alive on the connection as promised,
   mark it as not supporting keep-alives.
 * Also defer reclaiming of the server structure when freeing a download.

- (2002.09.01 Richard)
 * Search panel redesign
 * Minor cosmetic fixes
 * Adjust idtable to RAM's suggestions
 * Make search reissue timeout setting in GUI behave properly again

- (2002.08.31 RAM)
 * Changed the way GUID are generated for messages and servents.

- (2002.08.29 RAM)
 * Actual freeing of download structures is now deferred to avoid race
   conditions with list traversals.
 * Plugged download ignore lists.  The lists are kept in ~/.gtk-gnutella.
   Files ignore.sha1 and ignore.namesize are user-supplied, files
   done.sha1 and done.namesize are generated by gtk-gnutella.  The format
   of the *.sha1 file is that of "sha1sum", the format of *.namesize
   is that of "wc -c".
 * Removed wrong assert in file_info_recreate() (fixes bug #601626).
 * Make sure upload slot is reserved between two consecutive queries on
   a persistent HTTP/1.1 connection.
 * Fixed minor style issues in  vendors.h and whitelist.c.
 * Fixed improper display when new version is encountered.
 * Fixed file descriptor leak in ignore.c.

- (2002.08.29 Richard)
 * Droped g_hash_tables to lookup handles in search.c and nodes.c and use
   new id_table instead.

- (2002.08.28 Richard)
 * Changed justification of columns in search stats
 * Moved search stats to gui side. Use the same callback as the
   search monitor to get information from backend.
 * Fix search stats so that a change in the update interval does immediatly
   take effect.
 * Expanded search_request_listener signature to contain a query type and
   a query string. This way the gui can decide how to handle SHA1 queries.
   (Search monitor displays them, search stats drop them)
 * Fixed up search monitor to handle SHA1 queries on the gui side.
 * Moved all search stats properties to gui.
 * Moved more stuff out of callbacks.[ch]
 * Moved build_url_from_download from misc.c to downloads.c
 * Moved gtk_gnutella_exit prototype to common.h
 * Cleant up gui.[ch]. Moved code to downloads_gui.[ch] and search_gui.[ch]
 * Made column headers insensitive for tables that can not be sorted.
 * Moved node_ip and message_dump from misc.c to nodes.c
 * Added upload_kill() to uploads.[ch]
 * More include cleanups for gui<->core separation
 * Export host_clear_cache in gnet.h

- (2002.08.27 - RAM)
 * When swarming: if we do not upper-bound the chunk, display a "+" after the
   displayed chunk size in the download Range column.
 * Banned URLs with an /uri-res/N2R? were not properly recorded/persisted.

- (2002.08.27 Richard)
 * Moved vendor code resolving to vendors.[ch]
 * Added ARES to known vendors 
 * Juggled includes: 
   - All GUI modules should include gui.h
   - All CORE modules shound include gnutella.h
   - Both, gui.h and gnutella.h include common.h
   - Any module included by common.h may not include any module from
     the GUI or CORE. 
   Later we will moved files belonging to the different sections of
   gtk-gnutella to sub-directories.
 * Moved more gui initialization and shutdown code to main_gui.c
 * Moved main gui timer to main_gui.c
 * Moved loading of legacy config file to main_gui.c
 * Moved search_extract_host from search.c as node_extract_host to nodes.c
 * Display message in statusbar when manuall connection to node failed
 * oldconfig.c is now considered GUI code (needs to access gnet and gui
   props)
 * Properly update GUI when listen_ip or listen_port changes
 * Moved all code from share_gui.[ch] to monitor_gui.[ch]
 * Moved gui_new_version found as version_new_found to version.c
 * Removed gui init calls from share.c

- (2002.08.26 - Vidar)
 * Added a node whitelist. Listed entries will always be allowed a
   connection, and we will actively try to stay connected to them.

- (2002.08.26 - RAM)
 * When cloning downloads, was properly duplicating "push state" of the clone.
 * Fixed assertion failure when bumping into a BUSY chunk (fixes bug #600272).
 * When HTTP/1.1 download chunk is done, mark it as "Chunk done" and not
   as "Completed" to avoid confusion.
 * Fill in Range column of downloads with the actual range requested.

- (2002.08.26 Richard)
 * Added Vidar to the "About" dialog
 * Fixed minimum speed callback in search pane (connect after now)
 * Adjusted lots of files to the new function names exported from
   search.[ch] and search_gui.[ch]
 * Moved all GUI code from search.c to search_gui.c and have them
   communicate via callbacks. Still there is work to do cleaning up
   includes and function naming.
 * search_xml.[ch] are now considered GUI code. As are filter.c, filter_gui.c
   and filter_cb.c, since the saving/restoring of searches/filters and all
   the filtering takes place inside the GUI. The backend is only responsible
   to collect search results and push it to the GUI.
 * search.c and nodes.c use a g_hash_table now to resolve handles and don't
   map the internal pointers directly as handles.
 * current_search is no longer exported and must be accessed through
   search_gui_get_current_search().
 * __search_send_packet uses minimum speed setting from search and not
   global default minimum speed setting.
 * Moved from gnet_props.ag to gui_props.ag (reset to default on startup):
   - PROP_MINIMUM_SPEED (now PROP_DEFAULT_MINIMUM_SPEED)
   - PROP_FILTER_DEFAULT_POLICY
 * Added "Range" column to active downloads
 * Move lots of callbacks from callback.[ch] to search_cb.[ch]
 * Clobbered some more unwanted includes in several files

- (2002.08.25 - RAM)
 * Use /dev/urandom to initialize seed on systems that have it.
 * Skip empty lines silently when retrieving banned mesh entries.
 * Added support for HTTP/1.1 connections on downloads.
 * Swarming code now uses persistent connections and tailored range requests
   when remote server is known to support HTTP/1.1.
 * GUI will now report proper completion speed for the range requested.
 * Could think we were disconnected from the Internet when not making any
   outgoing connections, whilst still receiving some.

- (2002.08.24 - RAM)
 * Fixed style issues in fileinfo.c.
 * Mark changes to the dl_by_time list so we know it was modified when we
   are iterating through it.
 * Converted download mesh to zone allocator.
 * Added banning mesh to avoid filling the mesh with URLs we know are bad.

- (2002.08.23 - RAM)
 * Properly reparent all downloads after a file_info_recreate() call which
   creates a new fileinfo structure to supersede the old one.
 * Dump handshaking header on misparsing to stderr, if debugging.
 * Fixed misparsing of header fields: allow spaces before the ':' separator.

- (2002.08.23 - Vidar)
 * Added a missing status reset in search.c, which should fix the wrongly
   set Push flags.

- (2002.08.22 - RAM)
 * Refactored scheduling of chunk ranges, and re-enabled checks for completed
   file in the "done" directory when swarming.
 * Detect disconnection from Internet sooner: 150 seconds instead of 300.
 * Doubled allowed max line size and header sizes because too many broken
   servents don't use header continuations yet, although it's a standard!

- (2002.08.22 - Vidar)
 * Fixed Search Monitor to display urn:sha1-queries properly.
 * Changed fileinfo.c to use hashes instead of a linked list.
 * Made manual node 'Add'ing accept a ":port" suffix.

- (2002.08.20 - RAM)
 * Integrated Christophe Tronche's patch to schedule alternative sources
   from the download mesh.
 * Stopped downloads now get requeued immediately and no longer lag in the
   upper pane.

- (2002.08.20 - Vidar)
 * Added fuzzy autoselection in Search pane.

- (2002.08.19 - RAM)
 * Suppress warning about "truncated fileinfo" when file was empty.
 * Use SHA1 to create a decent random seed, portably (no use of /dev/urandom).
 * All bytes of message GUID are now random: removed internal message counter.

- (2002.08.18 - RAM)
 * Defer disposal of vendor string in nodes for GUI display.
 * Added duplicate detection and eviction in fileinfo retrieval.
 * Only sync metainfo to files every 10 seconds or so, not at every write.
 * Fixed the crash when aborting a stopped download.
 * Try to smartly ignore the Push flag and attempt direct connection, since
   many broken servent wrongly set the flag.
 * Stop scheduling downloads when we detect we're no longer connected.
 * Query hit parsing now resets Push flag on servers known to wrongly set it.
 * When comparing filesizes for auto-downloads, account for the possible
   swarming trailer within the "download" directory.
 * Fixed stupid typo in atoms that caused final memory fault.
 * Forgot to dispose of file_info structure during final download shutdown.
 * No need to flush fileinfo trailer when resetting chunk states for downloads
   that are moved back to the queue.

- (2002.08.17 - RAM)
 * Integrated swarming patch from Vidar Madsen.
 * Will now drop query hits with bad SHA1 records.
 * Obsoleted "appconfig.h".  Superseded by the new property system.
 * Ensure `search_table' is initialized early in the process.

- (2002.08.15 - RAM)
 * Re-organized firewall detection code, and added Internet connection
   monitoring.

- (2002.08.15 - Richard)
 * Support NULL as default value of string properties.
 * Fixed default listen port (typo)
 * Don't display "no new version" in the statusbar all the time.
 * Set default min/max values (0x0000000/0xFFFFFFFF) for guint32
   properties when not specified in .ag file.
 * Ignore incomplete number-vector config lines when reading in
   legacy config file.
 * Check value of PROP_NODE_SENDQUEUE_SIZE when PROP_NODE_SENDQUEUE_SIZE,
   PROP_SEARCH_QUERIES_KICK_SIZE or PROP_SEARCH_ANSWERS_KICK_SIZE are
   changed and adjust when needed.
 * Mapped more properties in GUI.
 * Debug levels configurable from GUI.
 * Makefile target to generate sources from the glade file is now
   glade_files in both Makefiles.
 * Fixed bug: changes to bandwidth settings have no effect.
 
- (2002.08.14 - RAM)
 * Send them back a "501 Method not implemented" if we can't figure out
   what they send and we see the string HTTP somewhere.
 * When listening port changes, move back to firewalled state
   (fixes bug #594477).
 * The "is_firewalled" flag is now handled by the property system.

- (2002.08.14 - Richard)
 * Updated scan extensions (Affects 583093)
 * Changed label of the "remove downloaded" checkbutton to explain that
   we only mean to remove items manually selected for download. 
   (Closes 594503)
 * Changed tooltip texts of "firewalled" and "not firewalled" icons.
 * Added preliminary configuration interface and properties for swarming.
 * Made callbacks for GtkToggleButtons and GtkSpinButtons automatic and
   generic when connecting them to the property system. Callbacks for those
   widgets are not defined within Glade, but added automatically when the
   widget is bound to a property.
 * Always update vendor and protocol information when updating node information.
 * Removed all spinbutton callbacks which modify a property from settings_cb
   and from the glade file and add callbacks for them manually in
   settings_config_widget(). All call a common callback function which makes
   use of the property map in settings_gui. Some special cases are filtered
   out in this common callback function (spinbutton_adjustment_value_changed).
    
- (2002.08.13 - Richard)
 * Introduced property system. A property can be monitored for changes.
   They are defined in the gui_props.ag and gnet_props.ag files. From those
   the actual C sources are generated with autoconf. Properties can be 
   persistent and thus make the old config.c obsolete. oldconfig.c acts
   as a legacy config loader. If none of the new config files are found,
   it will read in the old config file and save to the new ones on exit.
   The tooltips of widgets and (where applicable) the bounds of values
   enterd into the widgets are also read from the property definitions.
 * Creating a separation layer between GUI and core. The property system is
   part of this. gnet.h contains the core API and common definitions.
 * Added 'properties' target to Makefile to regenerate the property source
   files.
 * Changed all GtkSpinbutton callbacks to react on the "changed" signal 
   instead of the "focus lost" and "activate" signals. (Closes #558906)
 * Changed some more GtkEntries to GtkSpinbuttons
 * Added "Default reissue timeout" to gnet config pane
 * Reissue timeout is configurable individually for every search and
   persistent.
 * Recoded a lot of the callbacks and moved them from callbacks.c to
   various other _cb files, mainly to settings_cb.c
 * Recoded a lot of the update calls from gui.c which were responsible
   of updating the GUI when a config variable was changed. This is done
   via callbacks by the property system now. Moved most of the property-
   change callbacks to settings_gui.c.
 * Moved other calls which update the GUI when something in the core has
   changes from gui.c to nodes_gui.c, search_gui.c or statusbar_gui.c.
 * Small changes to various files to make them work with the property system.
 * Created custom gtk_spin_button_get_value which parses the value to a 
   double instead of a float.

- (2002.08.11 - RAM)
 * We know that gtk-gnutella hosts support /uri-res if they returned HUGE data.
 * Renamed socket_monitor_incoming() as socket_timer().
 * HTTP server now at the 1.1 level, supporting persistent connections.

- (2002.08.10 - RAM)
 * Added RCS Id expansion to all source files.
 * Fixed display of hosts in cache (fixes bug #585830).
 * Fixed display of servent ID in the Info column, vectorized flags procesing.

- (2002.08.09 - RAM)
 * Forgot to update filename counters when server replied with 301.
 * All protocol exchanges now logged at dbg=3.
 * When closing node connection, don't log EOF as a failure: stick to the
   original BYE condition.

- (2002.07.27 - RAM)
 * Finished writing download_redirect_to_server().

- (2002.07.13 - RAM)
 * Forgot to initialize GUID in results_set after switching to new
   zone allocators (fixes bug #580817).
 * Now also triggers "Nothing more to get" when the file to download
   is smaller or equal than something we have in the "done" dir,
   preventing eclosion of .01, .02 files...

- (2002.07.11 - RAM)
 * Installed workaround for the reception of SIGPIPE on broken systems,
   despite explicit SIG_IGN action (but does not fix bug #578151).
 * Added zone allocators.
 * Forgot to send "Content-Range: bytes */size" on HTTP 416 errors.
 * Refactored download scheduling queue for scalability.
 * Optimized pattern matching and searches further.
 * Remove assert in gmsg_cmp(), a routine called many times!

- (2002.07.11 - Richard)
  * Fixed segfault when creating new IP rule
  * Fixed some widget names in filter_gui.c which caused the wrong
    widgets to be updated when editing a size or text rule.
  * Fixed "widget not found: popup nodes remove" warning

- (2002.07.10 - Richard)
  * Fixed two serious typos in filter_gui.c causing removed filters
    to be removed from dialog. Gtk-gnutella would crash when selecting
    such a filter.

- (2002.07.09 - Richard)
  * Have two versions of share_gui (API compatible), one for Gtk1 using
    a GtkCList and one for Gtk2 using a GtkTreeView (GtkListStore)
  * Optimized redrawing of download queue.
  
- (2002.07.09 - Richard)
  * Gtk-gnutella is now compatible with Gtk2. To compile against Gtk2, 
    use the --enable-gtk2 switch with the configure script.
  * Now have two glade files, one for Gtk1.2/Glade 0.6.4 and one for
    Gtk2/Glade 1.1.0. The format is not trivially upgradable, so for
    a while changes will have to be maintained in both files, until
    we abandon Gtk1.2.
  * Remove the extern.tcl HACK. Now using the Glade-way of doing things
    with a lookup_widget() call.
  * Also now have interface-glade[12].[ch] and support-glade[12].[ch].
    Depeding on which version of Gtk you compile against, the one or
    the other will be included in gui.h and linked against. Don't
    include any of the files directly, include gui.h instead.
  * Added some _gui.h files. The gui.[ch] files are too monolothic and
    there are still gui calls in some backend files. Those should be
    moved to the corresponding _gui.[ch] files from now on. 
    Actually we will need 3 files: 
    - backend (model: what will one day become the lib/deamon api) 
    - gui (view: gui modification/update and callbacks)
    - control (controller: application workflow)
    Backend and gui should not communicate directly with each other, but
    must call the control layer to mediate. We should already now try
    to separate into gui and backend parts. The control layer is still
    spread across the callbacks and what we now have as "gui.c" or
    "_gui" files.

# v 0.90   2002.07.07  [stable]

Highlight of changes (user-visible):

- All configuration can now be made from the GUI.
- Fully redesigned search filters to work like ipchains/iptable on Linux.
- Obsoleted experimental "auto-download", superseded by the new filtering code.
- Added Gnutella bandwidth management.
- Both HTTP and Gnet bandwidth is now displayed real time.
- Added full HUGE support (Hash/URN Gnutella Extensions).
- Added support for local host preference.
- Gtk-gnutella can do traffic compression when connecting to a node that
  also supports it.
- Upload and downloads will now show User-Agent/Server information.
- Added status to the download queue.
- You can now freeze the download queue whilst manipulating it.
- Searches can now be listed on the left side of the screen, or as tabs like
  in the previous versions.
- Added automatic banning of servents that are hammering us.
- Many more cool new features that you'll discover whilst playing with it.

- (2002.07.07 - RAM)
  * Raised limit for requeries from 300 to 600 seconds.
  * Updated manual page.

- (2002.07.06 - RAM)
  * In case there are unfreed atoms at exit time, dump their values.
  * Don't forbid connections to local host on different port.
  * Allocate only minimal amount of memory when simply validating query hits.
  * When notifying for new versions, distinguish between releases and
    development, and show their timestamps.
  * Protected more warnings to show only in debugging mode.
  * Default TX flow-control timeout of 300 was too much: reduced to 60.

- (2002.07.05 - RAM)
  * Random cleanup: sanity checks in query hits and pongs, RX timeouts.
  * host_init() was spuriously declaring pcache_init() in its body.
  * Don't enter SHA1 filtering rules for records with no SHA1 [From Richard].
  * Added regular alive pings.
  * Preserve status message when moving stopped downloads to the queue.
  * Will now send "connection" pongs during the first 5 minutes of startup,
    even if it thinks it's firewalled, in the hope we'll get an incoming
    connection.

- (2002.07.02 - Richard)
  * Added "Apply" and "Revert" buttons to filter dialog
  * Made the "filter enabled" state work with shadows
  * Added "Add/Replace" and "Abort" buttons to rule editors
  * Removed double meaning of "Ok" button in filter dialog and replaced
    that with the "Add/Replace" button in the rule editors
  * Filter rule count, rule list and enabled/disabled states should
    properly show after a apply/revert
  * Try to preserve expansion state of nodes in the filter tree.
  * Removed the notion of a "session" from the filter code. Now 
    filters_current, filters_added and filters_removed are always expected
    to have valid content.
  * Gave search_xml access to the filters_current list to properly load
    the saved filters.
  * Added missing "if (filter_dialog == NULL) return" to some callbacks.
  * Try to reduce list updates in filter window to a minimum.
  * Fixed some debug messages where refcount was shown wrong.
  * Increased debug level on rule matching.
  * Pressing [enter] in search results list will download the selected items.

- (2002.07.02 - RAM)
  * Will no longer be tricked into saying it's not firewalled because a local
    connection to the node is attempted. (fixes bug #562127).
  * Added pseudo-extension "--all--" which allows to share all files, whether
    they have an extension or not [Debian patch from Zygo Blaxell].
  * Don't enter ourselves in the pong/host cache.
  * Typo minumum -> minimum in GUI.
  * When overriding upload slots, use recent bandwidth for computation, not
    the average, or we'll override more often when the limit is raised.
  * When "Nothing more to get" on downloads. remove all identical files from
    the queue as well.
  * Avoid needless display flickering in search screens [From Richard].
  * During shutdown, make sure we neither accept nor make Gnet connections.
  * Ignore XML size in QHD for Swapper.
  * Remove freeze/thaw calls to node clists during update.

# v 0.90   2002.07.01  [beta2]

Highlight of changes (user-visible):

- Bug fixes and slight improvements.
- Greatly enhanced auto-selection in searches to use far less CPU.
- Will now warn user when encountering a newer version of gtk-gnutella.
- URN searches now supported, by typing "urn:sha1:" in search text, followed
  by the base32 value.

- (2002.07.01 - RAM)
  * Added configure check for mandatory zlib.
  * Was wrongly stopping at GGEP magic byte when grabbing XML extension.
  * Optimized GUI update of node information, traversing list once only.
  * When closing a search, remove pending messages from all the search queues.

- (2002.06.30 - RAM)
  * Tuned auto-selection in search window to be an O(n) algorithm instead
    of O(n*n), which greatly improves performance [From Richard].
  * Protected a few pong-cache warnings, so that they be emitted only
    when running in debugging mode.
  * When removing completed downloads from queue, also remove first-order
    aliases by SHA1, if available.
  * Fixed upload crash when we can't send back the whole HTTP status
    [From Paul Cassella].

- (2002.06.29 - RAM)
  * More Solaris fixes [Uros Bizjak, patch #575037].
  * Added hardwired list of servent GUIDs to ban for push routes.
  * Now banning GUID "20d262ff0e6fd6119734004005a207b1" for push routing.
    (this GUID seems to be bundled as a constant in Morpheus)
  * Rationalize right-click menu handling in all panes [From Richard].
  * Fixed crashes with the filter popup window when search was closed
    before the filter popup [From Richard].

- (2002.06.28 - RAM)
  * Portability fix in socks v5 code [From Bruce Momjian, patch #574919].
  * Portability fixes for FreeBSD [From Aron, patch #574111].
  * Can now enter an urn:sha1: search directly (will beep if invalid).
  * Simplified URL parsing, and accept leading http:// case-insensitively.
  * Raised BYE grace period to 30 seconds to be compatible with shutdown grace.
  * Don't flag as new a version bearing the same timestamp as ours.
  * Don't throw away node from hostcache if we can't connect due to lack
    of file descriptor.

- (2002.06.27 - RAM)
  * Stop all processing for 0.4 handshaking after Tue Jul  1 00:00:00 2003.
  * Added configure check for glib >= 1.2.10 [From Richard].
  * Make sure GUI configuration for download overlap does not exceed the
    size of the socket's buffer [From Richard].
  * Added version checking: gtk-gnutella will now warn when it sees a newer
    version than itself.
  * Fixed base32 decoding to use gint8 instead of gchar to be sure to
    get signed characters.
  * Removed heartbeat warnings about skewed clock when not debugging.
  * Fixed dynamic upload slots spinbutton sensitivity (fixes bug #574592)
    [From Richard].
  * Changed getdate to parse dates as DD/MM/YYYY, not as MM/DD/YYYY.
  * Fixed Gnutella size reading in message headers: alignment constraints
    would cause a bus error on some CPUs.
  * Added configure check for strcasestr(), which is present on some systems.
  * Better seed the random number generator.

- (2002.06.25 - RAM)
  * Did not include proper gui.c version in 0.90 beta.
  * Do not abort when regular expression in queue matching is invalid!
  * Avoid using all file descriptors for banning.  Now configurable via two
    new config variables, namely ban_max_fds and ban_ratio_fds.
  * Fixed bug in dmesh_url_parse(), caused by buggy sscanf(), grrr...

# v 0.90   2002.06.24  [beta]

History of changes since 0.85 stable:

- (2002.06.24 - RAM)
  * Debian package now requires glib1.2 >= 1.2.10.
  * Added warning in dmesh_alternate_location() in case we overflow buffer.
    Also check returned val from g_snprintf() to account for trailing NUL.
  * Integrated Richard's filter cleanup patch.
  * Added nicer servent name for two new servents: RAZA and SWFT.
  * Mark callout queue event as freed to avoid memory corruptions in case
    of misuse (i.e. usage bug).
  * Forgot that dm_expire() could empty the mesh entry (fixes bug #573027).
  * Fixed buggy node_remove_non_nearby() (closes bug #572918).
  * Added vendor information to warning about improper pong-caching.

- (2002.06.23 - Richard)
  * Added RETURN back to filter tree on request
  * Enabled stats for RETURN
  * Free rule clipboard before exiting to prevent dmalloc from suspecting
    a memory leak.
  * Update credits
  * Made vertical scrollbars at some points always visible to reduce 
    flickering

- (2002.06.23 - RAM)
  * Forgot that scheduling in callout queue uses milli-seconds units: was
    purging uploading mesh info too often.  Also added mesh info traces.
  * Added periodic savings of the search/filters.
  * Saving of search.xml is done to a .new file, renamed upon success,
    to prevent one loosing precious data in case of a crash whilst saving.
  * Forgot to clear callout queue callback info before freeing structure
    (fixes bug # 572800).
  * Fixed root cause of GTK critical warnings regarding progress bar.
  * Forgot to include Alex Bennee in AUTHORS.
  * Make sure we detect a duplicate node connection before dropping a node
    in favour of a local one (fixes bug # 572748).

- (2002.06.23 - Richard)
  * Also set foreground color for root nodes and builtin targets in 
    filter dialog
  * Removed "search again" items from download/queue popups
  * Correctly unselect when doing a "connect to host" on download/queue popup
  * Don't display RETURN target in filter tree. Stats don't work properly
    and it's actually a metatarget which is not intersting to see.
  * Removed coloring of builtin targets in filter dialog because I can't set
    the foreground of the leave node.

- (2002.06.23 - RAM)
  * Fixed size computation problems when generating alternate location header.
  * Now displays Server name in downloads as soon as it is known.  Previously,
    it needed to be known beforehand (from a previous try) to be displayed.
  * Obsoleted old "autodownload" feature, since we now have more flexible
    download selection features with the filter chains.
  * Mesh information will now only be sent to uploaders when a change occurred.
  * Christophe Tronche was missing from AUTHORS.

- (2002.06.23 - Richard)
  * Fixed bug: active downloads not unfreezed after "force push"
  * Mark active "push mode" downloads and "always push" downloads in queue
  * Tagret combos are correctly updated when adding and removing a filter
  * "About" box added.
  * Added builtin targets to filter tree to have the stats (not selectable)
  * Added stats to builtin targets
  * Remember node state in filter tree
  * BEEP if user tries to create filter with invalid name (empty or filter
    with same name does already exist) It's not a problem to have two
    searches for exactly the same though.
  * added filter_find_by_name_in_session routine to filter.c (used to 
    determine wether a filter name is valid, i.e. does not exist)

- (2002.06.22 - RAM)
  * Fixed memory leak in search queues.
  * Fixed possible use of uninitialized value in analyse_status().
  * Added debugging traces in huge.c cache flushing... Which made the
    problem I witnessed go away.
  * Unplugged non-functional QRP stuff.

- (2002.06.22 - Richard)
  * Added STATE rule which uses the DOWNLOAD and DISPLAY filter result
    properties for the condition.
  * Added RETURN target to filter dialog. It aborts the processing of the
    current chain returning to the caller.
  * Make filter root-nodes in filter dialog not selectable
  * Builtin filter targets have uppercase names.
  * Removed cruft: search_strict_and
  * Synced GUI limits with config reader limits. (Closes #557681)
  * Removed "autodownload" checkbox from GUI and deleted it's callback
    This is to be replaced by the filtering system.
  * More cleanup of the config.c file
  * Rule count in filter tree is correctly updated when a rule is
    inserted/removed.
  * #527208 is closed since autoselection does respect hashes since
    a few days.
  * Hopefully now really fixed: access rule members after freeing the rule in
    filter_replace_rule_in_session
  * Added filter_gui_update_rule_count call to filter_gui
  * Rename old searches file when moving to XML mode instead of delting.
    Also move this from search_init to search_shutdown.
  * Item count above results list is correctly updated when the
    search is cleared.

- (2002.06.22 - RAM)
  * Bandwidth limit is now up to BS_BW_MAX, included.
  * Now attempts to free memory as soon as a search record is removed from
    the GUI, and not when the search is closed.
  * Would be omitting to send a SHA1 starting with a leading NUL byte.
  * Forgot to clear the node's search queue at final cleanup.

- (2002.06.21 - Richard)
  * BUG: access rule members after freeing the rule in 
    filter_replace_rule_in_session
  * Added popup to rules list in filter dialog (copy/paste rule)
  * Made filter_free_rule public

- (2002.06.21 - RAM)
  * Forgot to free dmesh slots sometimes.
  * General cleanup to be able to compile with dmalloc.
  * Watch out the g_snprintf() return code: it can return more than the
    buffer size with glibc >= 2.1.

- (2002.06.20 - RAM)
  * Was not properly parsing more than one GGEP extension block in a row.
  * First take at download mesh implementation, with code refactoring.
  * Lowered max banning period to 3 hours, instead of 1 whole day.
  * Removed the gnotella.fileflash.com host cache: host no longer exists.
  * New date_to_iso_gchar() to emit the ISO date for the download mesh.
  * Now keeps track of the time we received the query hits, for the
    download mesh.
  * Simplified parsing of the query hit trailer, keeping only the vendor
    code around instead of the whole trailer.  Adapted sorting algorithm
    accordingly.
  * shared_file_by_sha1_base32() is no longer used (share.c).
  * New url_escape_into() routine (url.c).
  * HTTP status parsing routine now called http_status_parse().

- (2002.06.20 - Richard)
  * Bug: segfault during autoselection (NULL rowdata) (Thanks Daniel)
  * Filtering now supports multiple properties to set (display/download)
  * Added "Auto-download by [name|hash]" to search popup
  * Changed valid values for the filter_default_policy config value from
    0,1 to 1,2 (mapped on load for backward compatibility)
  * Changes in filtering code make all filter stats count double
    (one count for every property).
  * merges search_gui_update into search_matched (search.c)
  * split search_gui_add_record out of search_gui_update

- (2002.06.17 - Richard)
  * Bugfix to "Autoselect identical" is handled
  * Column visibility is persistant in search panel

- (2002.06.16 - Richard)
  * Added ability to filter by urn:sha1 and by flags (push, stable, busy)
    (urn:sha1 filter is not editable yet)
  * Added "Don't show results with urn:sha1" to search popup
  * Added "Edit filter" back to search popup
  * Changed header of urn column in search results to "urn:sha1" and
    centered it
  * Added "Abort all with urn:sha1" to downloads and queue popup.
  * Made the download_remove_all* return the number of removed downloads
  * Display the number of removed downloads in the status bar
  * Freeze queue and downloads list when acting on a "Abort all..."
  * When a new rule or filter is added, display "new" instead of
    "none yet" in the stats column to show that this filter will
    not be used unless the user closes the filter dialog with "Ok".
  * Started to use scid_info for general temporary information in 
    the status bar.
  * Make autoselection also select files with the same hash as the
    selected in addition to those with the same name
  * Added "Globally drop results with [name|urn:sha1]" to search popup.
    I wanted to be able to drop definite spam once and for all.
  * Netmask for ip filter rules defaults to 255.255.255.255
  * Column visibility in search pane now affects all searches
    (internally the visibility state is propagated from the old to
    the new clist on a switch)
  * Added "Autoselect identical" checkbutton to search pane.

- (2002.06.15 - Richard)
  * Added URN column to the search results (hidden by default)
  * Made gui and backend use same code for comparing records
    (search_compare). 
  * Made passive searches persistant

- (2002.06.15 - RAM)
  * Propagate SHA1 from query hits to download requests.
  * Now recognizes old base32 encoding, translated into new one.
  * Had not properly plugged in the 301 Moved triggering for uploads.
  * Until we have received a message from nodes, handle them with the
    "connecting" timeout.  This works because of the handshaking ping.
  * Reworked upload HTTP parsing so that we can handle HEAD requests on
    /uri-res/N2R? queries as well.
  * Download code will now honour 301 Moved replies from other nodes.
  * Added debugging traces for queries/hits holding more than 32 extensions.

- (2002.06.13 - RAM)
  * Added rigorous extension parsing.
  * Fixed hash table init for GUID/SHA1 atoms.
  * Make sure we use POSIX extended regular expressions.
  * Added strcasestr() routine to misc.c.
  * Now extracts SHA1 out of query hits for each record.
  * Now validates SHA1 representation in queries, dropping bad queries.
  * Fixed handling of GET /uri-res/N2R: the "urn:sha1:" part is a
    case-insensitive string.  Likewise when extracting SHA1 from HTTP headers.

- (2002.06.11 - Richard)
  * Fixed bug: default filter not set on passive searches.
  * Fixed bug: rule editor not properly cleared when work_filter
    gets removed because it's bound search got removed
  * Fixed bug: filter dialog size not remembered correctly
  * More clean up of the filter api
  * More moving gtk code to from filter.c to filter_gui.c
  * Adding/removing of filters is also shadowed now (meaning you can
    cancel it in the dialog)
  * Added calls to bypass shadowing for adding and removing rules.
  * Added "Don't show selected" to search popup. This adds a drop rule to
    the search filter for all files which match exactly the filenames from
    the selected records. It does not jet check for duplicates.

- (2002.06.08 - Richard)
  * Remove optionmenu widget for selecting filters from filter dialog
    and added a tree instead.
  * Filters can now be deactivated
  * Added some buttons to reset filter/rule stats
  * Started to split up callbacks.c/h and filter.c/h and created
    filter.c (controller), filter_cb.c (callbacks) filtler_gui.c
    (gui calls). This is a first attempt to seperate backend from
    frontend calls so we don't fix something up now and tear it
    apart later. Better try to do it right from the start.
  * Fixed bug: bw_ul_usage_enabled was not properly persistant
  * Added general macros to set/clear flags to misc.h
  * Added a flag_t type for storing flags binary (use with above macros)
  * Filter stats update periodically

- (2002.06.07 - RAM)
  * Added atoms, allowing sharing of common constants.
  * Made callbacks.c use new gui_allow_rescan_dir().
  * Raised default TTL to 7 (was 5) and default max TTL to 10 (was 7) to
    match what appears to be a common setting in other servents.
  * Plugged in atom strings for downloads.c, huge.c, main.c, search.c,
    share.c and uploads.c.
  * Moved Gnutella query message definitions from search.h to gnutella.h.
  * When non-local nodes are removed to favor local ones, send BYE 202 messages.
  * Second stab at QRP: Computes routing table patches incrementally.
  * Now requests URNs in all our queries.
  * Reworked library scanning to use atoms, and in particular store the full
    file path as an atom (shared with huge.c in the SHA1 cache).
  * Added support for transparent index remapping for older servents sending
    a request with an incorrect index.
  * Made common warnings in sockets.c silent unless debugging enabled.
  * Fixed improper dump of incoming data on first long lines.
  * Send a 301 Moved with proper Location redirection when requesting a file
    with an improper index and an X-Gnutella-Content-URN is given and does
    not match the request, but another file we have.
  * Added incremental deflating routines for QRP patch compression.

- (2002.06.03 - RAM)
  * Fixed improper semantics of the "contains words" filter.  ALL the
    words must be present for a match to occur.

- (2002.06.02 - Richard) 
  * Format of RULE_SIZE display string changed.
  * Added "Create filter" button to dialog.
  * Normalize upper/lower value in filter_new_size_rule()
  * Replaced all g_message calls with printf (fixes log corruption)
  * Filter rules can now be deactivated
  * When a filter has the "don't display" target, the user may choose
    to grey out the result instead of completely dropping it using the
    "mark only" flag.
  * Make filter dialog size persistant.
  * The xml backend gives better information when unable to read in the
    xml file and can cope with missing rule flags.
  * Information about how often a rule matched is displayed in the
    filter dialog (but not updated periodically)
  * Fixed default filter selection when adding a new search.
    
- (2002.06.02 - RAM)
  * Added build dependency on libxml2-dev in debian control.
  * Force --enable-xml-store in debian's build.
  * Will now prevent propagation of badly formed/too short queries.
  * Replaced more gtk_idle_add() calls with g_idle_add().

- (2002.06.01 - Richard)
  * Disabled xml backend by default. Use "configure --enable-xml-store"
    to enable it. You need libxml2 and libxml2-dev packages installed 
    for it to work.
  * Fixed bug: assertion failure when trying to edit filters without
    any search existing.
  * It's no longer possible to edit the builtin filters (was a bug
    that this was possible).
  * Added widgets to configure the minimal upload b/w percentage patch 
    [From Tobias Frech] to the bandwidth config panel.
  * Changes build scripts to remove dependency on gnome-config and 
    added checks for libxml2.

- (2002.05.30 - Richard)
  * New filter code and dialog.
  * Moved from callback.c on_search_switch as gui_view_search to gui.c 
  * Changed searches list from GSList to GList.  
  * Use search_t instead of struct search.  
  * Began to move search related gtk code to gui.c (gui_search_close) 
  * Optionally use xml backend or simple text file for makeing searches
    persistent.  
  * Use "search_close" instead of manually closing searches in
     search_shutdown().
  * Changed handling of "minium speed" widget. You can change the minimum 
    speed on a existant search and change the default minimum speed on the 
    gnutellaNet config pane.
  * Moved the gui part of removing a search from search.c to gui.c 
  * Removed macro definitions of the notebook page numbers
    and switched to enums.  
  * Moved main_window and shutdown_window to gui.c and have them as externs 
    in gui.h 
  * Added gui_show_search(search).
  * Added some functions to handle option menus more easily (gtk-missing)

- (2002.05.29 - RAM)
  * Added date parsing.
  * Now parses Retry-After in HTTP replies, supersedes user-defined timeouts.
  * When banning, emmit a Retry-After header.
  * Renamed getdate() to date2time() to avoid conflict on Solaris.
  * Integrated minimal upload b/w percentage patch [From Tobias Frech].

- (2002.05.27 - RAM)
  * Fixed ipf_unban() to test rounded integer counter and not float in removal.
  * Was not properly updating SHA1 info when library was being rebuilt.
  * Was not properly sending back urn:sha1 in query hits (truncating the
    ':' separator).
  * All SHA1 digests are now stored in binary internally.
  * Added padding chars to base32 encoding, and "const" in the signatures.

- (2002.05.24 - RAM)
  * First stab at QRP.  Computes the routing table, but it is not used yet.
  * Added QRP message definition.
  * Callout queue is now a global service and is initialized from main.
  * Scan library after GUI is brought up.
  * Was not accounting Gnet header traffic as Gnet bandwidth.
  * Added anti-hammering feature, that will ban users sending more
    than 10 requests per minute (sliding window).
  * Always honour HEAD requests, even when busy, provided no hammering.

- (2002.05.24 - Richard)
  * allow shrinking of main window to smaller then minimum size required
    by the child widgets
  * Added a optional search list to the sidebar. Displays: search name,
    hits, new hits (number and color), paused searches (color)
  * Made tree menu resizable in both directions.
  * Added "copy url" item to queue popup
  * Added "connect to host" item to queue and downloads popup
  * Added "configure columns" item to search results popup.
    Note: the visibility state of the colums is not persistent, this
    is only a proof of concept for the selection widget yet.
  * Carry information about which tab is associated with which menu item
    from the tree menu directly in the user_data of the node instead
    of in a static array.
  * Freeze clists during all actions which take place on the the selection.
  * Replaced g_assert(0) with g_assert_not_reached() where found.
  * Made "unselect" signal callback for downloads and queue call the
    "select" signal. Same actions needed.
  * Instead of unrealizing and removing the arrow widget, just destroy
    it. 
  * If the tab in notebook_main is switched, the tree menu reflects the
    change.
  * Fixed bug which caused both, "firewalled" and "not firewalled" icons
    to be displayed when hiding and then showing the statusbar again.
  * Increased default sidebar size to 128 pixels. (closes #558890)
  * Almost finished cleaning up config.c. The config file looks much
    cleaner again.
  * Use gtk_events_pending() instead of g_main_pending() in gtk_main_flush().
  * Add hack to set the internal column name in a clist. Currently this is
    needed for the GtkColumnChooser widget to work properly.
  * Moved menu initialization from main.c to gui.c. This means most of
    the gtk stuff is now removed from main.c
  * Added more enums to gui.h to describe important gui values (like
    giving names to notebook pages)
  * Moved the updateing of the traffic stats from gui_update_global() to
    gui_update_traffic_stats and only call it in the main timer. No need
    to call it more often (gui_update_global is called from some callbacks
    and stuff).
  * Made notebook tabs in search results tab not hide if there is no search.
    This had conflicted with either showing tabs or sidebar list.

- (2002.05.21 - RAM)
  * huge.c: cast all file sizes to long before printf("%ld") since some
    machines have 64-bit off_t (but Gnuetlla only has a 32-bit field for
    propagating file sizes, so it does not matter).
  * Forgot to emit initial header when appending values to disk SHA1 cache.
  * Hacked a quick fix for the duplicate SHA1 work problem.
  * downloads.c and huge.c: Another batch of off_t args cast into gulong.
  * Added UTF-8 decoder for queries, and transformation to ISO-8859-1.
    The query text are now interpreted as ISO-8859-1 by default, unless
    the query "looks like" UTF-8.  In any case: no full Unicode support.
  * Fixed search statistics scheduling mess, and removed spurious main
    initialization since GUI settings already triggered search_stats_enable().

- (2002.05.20 - RAM)
  * When queuing a download from the same GUID/file, check the IP:port in
    case it changed since we queued it, and not solely reject it as a
    duplicate.
  * When the full SHA1 hashing credit is not used, do not perform the
    feedback adjustment, since those assume all the credit was used.
  * In share.c: now uses gtk_main_flush() to update the GUI, not the single
    loop iteration.
  * uploads.c: fixed segfault at shutdown time (dup free of user_agent field).
  * Honour X-Gnutella-Content-URN in requests and send a 404 error if
    the file we have does not match.
  * Will now send back X-Gnutella-Content-URN in the HTTP reply with the SHA1
    (if we have it) on 503 Busy errors.
  * Applied cleanup patch #557071 [From Uros Bizjak].
  * Applied Solaris compile patch #558202 [From Uros Bizjak].
  * Applied structure packing, SOCKS error message fix, and cleanup patch
    [From Michael Core].

- (2002.05.20 - Richard)
  * Switched names of arrow_up.xpm and arrow_down.xpm (closes #558219)
  * Added "User agent" column to uploads
  * Added "Server" column to downloads and queue
  * Display sort order in searches in column header
    (closes #557690)
  * Remove "stop sorting" from search popup. This can now be achived
    by clicking on the column headers.

- (2002.05.19 - RAM)
  * Integrated SHA1 / HUGE patch [From Ch. Tronche].
  * Force creation of config directory if it does not exist
    (fixes bug #557114).
  * Don't run file name searches on small query texts when there is an URN
    match attempted.
  * Keep track of User-Agent and Server in HTTP requests.
  * Further adjustments in huge.c:
    + Use glib timeouts, not gtk ones to not needlessly tie to the GUI.
    + Improved timer adjustment feedback to shoot for 3/2 of the max life.
    + Added debugging SHA1 computation rate traces.

- (2002.05.19 - Richard)
  * Removed "clear queue" button. This is not necessary. To clear the
    whole queue, just use a empty regex to select all and then use
    "abort" from the popup menu. We don't want people to accidentially
    purge thier queue.
  * Made non-editable entries sensitive, so that at thier content is
    copy-pastable.
  * Increased sleep time during shutdown to 200ms again, but process any
    pending Gtk events before sleeping.
  * Made size of sidebar (menu, stats) persistent.
  * Changed tooltip text for the "local netmask" stuff.

- (2002.05.18 - RAM)
  * Improved shutdown code to avoid segfaults in grace period and deny all
    pending Gnet connections cleanly.
  * Moved pong-caching code to pcache.c.
  * Reorganized the way we detect that BYE was sent, and added support for
    probing the size of the TX stack.
  * Pay attention to GUI settings for bandwidth limitation before enabling
    the corresponding schedulers: only do so when they explicitly wish
    to limit traffic (provided allocated bandwidth is >0).

- (2002.05.17 - Richard)
  * Fixed bug: drag in queue while queue is freezed unfreezes queue.
  * Reflect freezeing of queue in the gui (as would explicit freezing).
  * Reduce min value for listen_port to 0 in glade.
  * Display notice window when shutting down.
  * Made menu expand and used gtkpaned so size of sidebar can be changed.
    Size is not yet persistent.
  * Removed stream button from search panel since unused.
  * Tried to fix problem with segfault during shutdown and thus
    disabled timer calls in main timer for things that were
    already closed (uploads/downloads) during grace period.
    Failed miserably because we still have a segfault.

- (2002.05.17 - RAM)
  * Applied enum/macro cleanup patch #555837 [From Uros Bizjak].
  * Display download queue status entries.
  * Fixed guess_local_ip() to never replace a previous non-private IP with
    a private one.
  * Added exit grace period to make sure final BYE messages get a reasonable
    chance of being sent.
  * Added extended copyright notices, per FSF recommendations.
  * Added copy of the GPL in the LICENSE file.

- (2002.05.16 - Richard)
  * The position of the divider in the downloads pane is persisitent.
    Attention: I implemented the missing gtk_paned_get_position function
    and it has the same name as the GTK2 function will have.
  * Started to tidy up config file
  * Hopefully fixed sourceforge bug #555758: Crash when drag lasts too long?
    Catch the drag signals and freeze the queue during drag. This prevents
    items to be removed from the list during the drag which I think was
    the cause for the crash.

- (2002.05.15 - Richard)
  * Fixed bug with spinbuttons: manually entering a value did require
    to hit enter two times or did not work at all. Had to use
    connect_after() to connect the signals.
  * Save width of "Status" column added to queue.
  * Display notice in the statusbar if the address has changed.
  * Added gNet traffic display and reworked the View menu and stats
    display a little
  * Replaced the hosts_in_catcher entry with a progressbar.
  * Changed some limits on the new configuration items.
  * Obsoleted all *bps* config variables and replaced them with
    *bws* counterparts to reflect the internal changing of names
    within bsched. Kept code to load the values from the *bps*
    variables though.
  * Added configuration of gNet bandwidth control

- (2002.05.14 - Richard)
  * Added lots of config stuff.

- (2002.05.14 - RAM)
  * Added traffic compression ratios.
  * Added support for Gnet bandwidth limiting (core only, no GUI settings).
  * Fixed flow-control problems on TX stack.
  * Fixed assertions on search sending to account for initial random hop count.

- (2002.05.12 - Richard)
  * Added "Status" column to queue. Not working properly yet.
  * Added icon to display "firewalled" and "not firewalled"
    status in statusbar
  * Change spinbutton support from using int to using float.
  * Fixed decimal values in the bandwidth settings
  * Unselect all before using regex to select (more intuitive)
  * Updated debian/substvars: added depends on zlib1g

- (2002.05.12 - RAM)
  * Removed debugging warning on Z_BUF_ERROR when TX flushing.
  * Search stats configuration unit is now the second.
  * Fixed assertion failure in deflate_rotate_and_send(): the culprit
    was deflate_nagle_timeout(), calling that routine without checking.
  * Added Debian build dependency on zlib1g-dev (in debian/control).
  * Compressed node traffic indicated by TXc and/or RXc in Info field.
  * Fixed typo in cq.c that caused hash bucket chaining to be mixed up.
  * Fixed order in the CH_INSERT_AFTER macro that was corrupting tail too
    early (forgot it was a macro, and not a function call).
  * Made destruction of the RX stack a true depth-first operation.
  * The RX inflater will stop delivering packets as soon as RX is disabled.
  * The TX deflater writev() routine was not accurately detecting flow-control.
  * Need to dispose of the RX stack asynchronously, not on the interrupt stack.

- (2002.05.11 - Richard)
  * Added a saftey call to disable the tabs of notebook_main even
    if left on in glade.
  * Added "local node" information to the main nodes display.
  * Added boxes around the queue and downloads frames, so the vpaned
    scales better.
  * Changed "Remove all matching regex" to "Select all matching regex".
  * Renamed some config variables and widgets to get better naming
    consistency.
  * Changed "Listen port" and "proxy port" to spinbuttons.
  * Added "Enable autoselect" to search panels. This binds to the
    search_pick_all config variable.
  * Made missing checkbutton states persistent.
  * Added some macro magic to gui.c, config.c and callbacks.c. More readbility,
    less writing effort.
  * Moved updating of gui widgets at startup from config_init() to
    gui_update_all().
  
- (2002.05.11 - RAM)
  * Allowed "configure --enable-no-rfc1918" to default to off (was forced on).
  * Exported bsched_disable().
  * Re-architected RX stack.
  * Added first support for Gnet traffic compression (still some rough edges).

- (2002.05.08 - RAM)
  * Ensured no line is longer than 80 characters in main.c and gui.c.
  * Dynamically setting bandwidth to 0 prevented all traffic instead of
    disabling bandwidth limiting.
  * Even if bandwidth scheduler is disabled, go through the EMA computation
    of the bandwidth actually used, for GUI display purposes.
  * Added Roles section to the AUTHORS file.

- (2002.05.07 - RAM)
  * Now that local_ip is persistent, we need to refresh it regularily in case
    it changes from one invocation to the other, and not always trust its
    persisted settings.
  * Changed "Shutdowning" -> "Closing".

- (2002.05.07 - Richard)
  * Added "Remove all matching regex from queue" to downloads panel
    (case sensitivity is not persistent yet)
  * Fixed memory leak in dialog-filters.c regex handling code
    (g_free(re)).

- (2002.05.04 - Richard)
  * Added "Max uploads to single host" to uploads panel
  * The usual cleanup of spacings and labels and stuff I came across
  * Added preliminary designs of a new filter dialog to the glade
    file. No functionality yet. Will probably be redesigned before
    actually being integrated.
  * Fixed bug: search field does not clear when search is added
  * Fixed bug: search tab headers do not update the result count
    properly when having "remove downloaded items from list" checked.
  * Fixed typo: "QUEUE FROZEN" instead of "QUEUE FREEZED"
  * Note: for autocompletition on a GtkCombo (e.g. search combo), try
    Alt-Tab. Works in any application.
  * moved more code from main.c to gui_init
  * removed clist_connections (old stats) from glade and gui code

- (2002.05.02 - RAM)
  * Fixed bug #551185: was not initializing local_netmasks_string.
  * Fixed bug #552255: could be wrongly freeing static string.

- (2002.05.01 - RAM)
  * Integrated the search queue patch: searches are now sent once every
    10 seconds on a per-connection basis [From Alex Bennee].
  * Was improperly counting duplicates as "bad" messages.
  * Now displays both dup/bad message counts in the Info column for nodes.
  * Searches now made persistent [From Michael Tesch].
  * Got rid of the local-config-file overwriting.  All configuration files
    are now exclusively saved in the config dir, never locally (unless you
    run from that config dir!).
  * Fixed bug #538946: was incorrectly moving complete files out of the
    done directory.  Also, "Nothing more to get" error is now reported if
    one tries to downloads a smaller file (it was not flagged as an error,
    so the "Completed" message was shown instead of the error text).

- (2002.05.01 - Richard)
  * fixed sensitivity of "copy url" in downloads popup
  * make search history work (though not persistent)
  * added "Remove downloaded items from list" checkbox to search panel
    Use this to have items selected for download automatically be 
    removed from the result list.

- (2002.04.30 - Richard)
  * Put statistics into a handlebox so they can be displayed seperatly
    from the main window
  * Went throught the gui layout and set a consistent layout style:
    horizonal spacing: 4; vertical spacing: 2; border: 2
  * removing of unnecessary widgets and more clean up of the widget
    tree
  * make "remove file" in downloads popup work
  * removed "abort and delete file" from downloads popup
  * made "copy url" really supply an escaped url which should work
    when pasted to a browser
  * changed the widget for entering search strings in the search panel
    from a GtkEntry to a GtkCombo as a preparation to supply a search
    history in future.
  * fixed sensitivity of several items in the downloads popup which
    were sensitive even if they would have done nothing when activated.

- (2002.04.27 - RAM)
  * Reversed logic for forced IP, to make it behave properly: the IP is
    now only updated dynamically when "force IP" is not checked.
  * Added download_remove_file() and download_file_exists().
  * Check for new "download_delete_aborted" condition in download_abort() to
    remove file when it is set.
  * Added debug logging of bad packets, to help diagnose why we receive
    bad packets from gtk-gnutella.
  * Made nodes.c compile on the Alpha, where varargs objects are different.
    (fixes bug #537460)

- (2002.04.25 - Richard)
  * moved more code from main.c to gui_init() in gui.c.
  * added checkbutton "Delete file on abort" to downloads panel. When this
    is on, aborting a download will also remove the associated file from the
    hard disk. This is to prevent us from having multiple "Abort..." and
    "Abort and delete..." entries in the popup menu.
    This functionality still has to be integrated into the download logic.
  * remove the "update" button for port configuration on the config network
    panel. This entry now behaves just like every other entry (enter or 
    change focus to accept changes).
  * replaced more entries in the config panels with GtkSpinButtons.
  * added a "copy url" item to the downloads popup. This can be used to 
    copy the url of a single download to the clipboard and paste it
    e.g. to your browser. This is only selectable, if a single download
    is selected.
  * added build_url_from_download() to misc.c because of the above
  * cleaned up lots of stuff in gui.c, including coding style but mostly
    changing the way focus-out signals were handled. Now a focus-out signal
    triggers a activate-callback on all widgets to update the program state. 
    Meaning, we no longer use "grab_focus(menutree)" to trigger a focus-out
    event (useless focus jumping). Instead when pressing "enter" on a widget,
    the change is accepted and the focus stays where it is.
  * more layout in the config panels.
    
- (2002.04.22 - RAM)
  * Always update actual bandwidth used, even when the scheduler is disabled,
    so that the GUI can display the current usage whether bandwidth is
    limited or not.
  * Removed useless SIG_Ignore() signal handling trap, just SIG_IGN them.
  * Ignore SIGXFSZ so that subsequent write() fail: if not ignored, that
    signal will kill the process.
  * Added debugging output for auto-downloads, and refactored list iteration
    bits to be more in line with the other uses.

- (2002.04.21 - Richard)
  * click on bandwidth stats to toggle display mode (normal/average)
  * added "authenticate to proxy" to network config. The associated
    config variable is called proxy_auth.
  * made bandwidth stats more readable

# change of changelog format to better accomodate multiple contributors.

- made reissue timeout spinbutton on search-pane wider. (Richard)
- made config pane a tabbed pane. (Richard)
- added bandwidth control to config pane. (Richard)
- added support for temporary statusbar messages (Richard)
- reorganized configuration pane (made a tabbed pane) (Richard)
- added gui controls for changing bandwidth allocation in the config
  pane. (Richard)
- added indicators for current bandwidth allocation to left panel.
  (Richard)
- now really use statusbar contexts and the GtkStatusbar stack features.
  (Richard)
- Moved freeze toggle-button out of the context menu and display a
  message in the statusbar to warn the user that the queue is freezed.
  (Richard)
- added several new popup menu items to popup-download and popup-queue,
  but disabled them for now since they are not backed up by code yet.
  (Richard)
- removed useless host catcher popup code (Richard)
- added "freeze" toggle button to queue context menu. This can be used to 
  enable/disable the automatic moving of files to and from the queue
  (i.e. disable download_timer). To make this work properly, the
  download timer is the only function now to call download_pickup_queued.
  (Richard)
- added "kill all named" and "kill all from" to popup-queue and popup-downloads.
  These will remove all queued downloads and abort all active downloads
  matching any of the selected items. (Richard)
- visually distinguish items in search list that where already selected for
  downloading (Richard)
- Added uptime of servent to statusbar. (Richard)
- Modified multiple-selection handling in on_button_uploads_kill_clicked,
  on_button_downloads_queue_remove_clicked and on_download_start_now_activate.
  This should fix problems where the selection was not actually acted on.
- made popup_queue_start_now (de)activate correctly when maximum
  number of downloads is reached (Richard)
- Missed out to hide notebook tabs after modifing the gui. 
- Rearranged widgets to reduce minimum window size. On my box this means
  604x503 (sorry 640x480 guys... maybe later). 
  Enabled both scrollbars on nodes list
  Closes #540610 (Richard)
- Changed lots of stuff on the gui layout (Richard)
- Changed menu from list to tree (Richard)
- Renamed lots of widgets (Richard)
- Fixed several popup action handlers to cope with multiple selections 
  (Richard)
- Can add searches from the monitor pane (only if monitoring is off, because
  otherwise the selection would be gone too fast).
  (Richard)
- Replace numeric text fields (like max no of downloads) with a spinbutton
  (Richard)
- Disable autoselection when more that one file is already selected (search).
  (Richard)
- Hidden old stats frame (Richard)
- Added menu bar and statusbar (both optional) (Richard)
- Added progress bars to display connection/upload/download stats (optional)
  (Richard)
- Made build-glade target in Makefile really regererate the code from the
  gtk-gnutella.glade file by calling src/Makefile glade_files
  (Richard)
- Updated Debian's control file.
- Now accounts for bytes transferred in interrupted uploads as well, and in
  particular at servent shutdown time.
- When not sharing, return HTTP error 503 instead of 410, since it is a
  server-side problem, not a client-side problem.
- When facing an HTTP/1.1 request, make sure there is a Host: header.
- Added routines for on-the-fly bandwidth settings, and access macros for
  getting the instantaneous and average bandwidth usage per second.
- Refactoring of network TX layer.
- Display the uptime as either "HH:MM:SS" or "d HH:MM" with blinking ":".
- Optionally favor local Gnet hosts over remote ones, per netmask [Mike Perry].

# v 0.85   2002.04.04  [stable]

- Changed bzero() into memset() in sockets.c for Solaris [patch #538619].
- Hidden useless gnutellaNet stats window.

# v 0.85   2002.03.30  [beta2]

Summary of changes (user-visible):

- Portability fixes.
- Memory leak fixes.
- Was moving to wrong pane when "jump-to-downloads" enabled.

Detailed changes:

- Define SOL_TCP as IPPROTO_TCP for non-linux machines.
- Added a return to shut up compiler warnings in bio_sendfile().
- Fixed memory leaks in queue.
- Shutdown TX side of socket after having sent Bye.
- Fixed memory leak in uploads, in push request handling (bug #534434).
- Was moving to wrong pane when "jump-to-downloads" enabled
  (bug #535000, with fix from Steven Walter).
- Increased receive buffer size for nodes from 48K to 112K.
- Fixed node_sent_ttl0(), which assumed node was kicked-out when Bye is sent,
  although it is no longer the case, unless Bye was already sent.
- Will now report error 414, "Requested URL Too Large", when encountered.
- Could mistakenly report 404, "Not Found" when rebuilding library.

# v 0.85   2002.03.23  [beta1]

Summary of changes (user-visible):

- Now support Gnutella traffic prioritization and flow-control for enhanced
  stability of connections.
- Can now use an HTTP proxy for outgoing connections, in addition to SOCKS
  v4 and v5 proxies.
- When "Force local IP" is ticked, gtk-gnutella will try to automatically
  update the value if it detects a change in your IP address.
- Added search statistics.
- Added persistent upload statistics, keeping track of which files were
  uploaded by users, and how many times.
- Will now show the size of the uploaded file and the requested range,
  under the form "request @ offset" in the Range column.
- Node servent names are now displayed in the gnutellaNet window, if known.
- Bandwidth management for input and output traffic is now possible.  It can
  only be configured via the config file though, not via the GUI.  It only
  accounts upload/download traffic, not Gnet traffic.
- Displayed transfer rates are now instantaneous transfer rates, not average.
- Upon completion, uploads and downloads show the time spent in transfer.

Detailed changes:

- Node send queue is now managed as a real queue.
- Added node transmission flow control.
- Routing decisions and actual routing are now two distinct operations.
- Some download control hardwired constants were made config parameters.
- Fixed downloading policy to avoid retrying ad infinitum when the connection
  cannot be made at the TCP/IP level (because there's nothing listening).
- Added support for the Bye packet.
- Dispatched heartbeat timer routines to the relevant files.
- Integrated HTTP proxy patch [From Szabolcs Self].
- Properly handle Range requests such as "123-456" and "-567".  Still no
  handling for things like "123-456,457-789" though.
- Extract and log vendor information of nodes we connect to.
- Fixed improper counting of TX-dropped packets in flow-control as RX-dropped.
- All % completion figures now shown with 2 decimals.
- Since we can now automatically determine our IP correctly, make sure the
  "force local IP" parameter is true by default.
- Could be sending pongs with TTL=0 by mistake.
- Was always sending pings with TTL=1 by mistake.
- Initial take at bandwidth management -- can only be configured via the
  config file, i.e. once and for all.  Gnet traffic does not count.
- HTTP error code 408 is retryable.
- Include Date and Last-Modified headers in our HTTP success replies.
- Switched to real-time download/upload transfer rate and ETA computations.
- Fixed number of columns in search table to 5.
- Fixed bug in handling node_bye() for ponging-only connections (#518822).
- When current transfer rates are too low, switch to average rate for
  estimating time remaining.
- More cleanup in the routing code, which fixes a potentially harmful bug.
- Ensure original downloads are saved in downloads.orig, and protect against
  sudden death whilst saving.
- Turn on TCP_CORK for uploads, to optimize outgoing bandwidth.
- Makes use of sendfile(2) if available.
- Huge cleanup in routing.c: function renaming, signature changes, assertion
  cleanup and comment additions.  In particular, removed a wrong assertion,
  known as "m->nodes" when failing.
- Trace user interface, OS type, OS version and CPU type in User-Agent.
- In the "Config" page, show total size of files shared.
- Adapted proxy_connect() signature to be able to get it to compile on IRIX.
- Now detects and handles the situation wereby time goes backwards or forwards
  due to time synchronization (NTP deaemon).
- Display the time spent uploading or downloading when entry is completed.
- TCP reception buffer is raised to 112K for downloads.
- The default node queue size is now 96K (150% of 64K, the max message size).
- Added support for higher-priority control messages.
- Node statistics now show amount of messages in queue, and percentage of
  the send queue filled with messages.
- Alive pings are now replied to with a higher priority pong.
- Tuned flow control to avoid too many memory allocation/free, and saturation
  of the queue (lowered high watermark to 50%).
- Now also emits the Remote-IP header when connecting to other nodes.
- Node statistics are now updated once per second on the GUI.
- Added Morpheus (MRPH) to the list of vendor codes.
- Fixed bugs #524773, #524987, #523762, #524988.
- Added Size/Range columns to the upload screen.
- Added Vendor and protocol Ver(sion) columns in the node screen.
- The GUID of a servent is now made persistent and flagged as such, in order
  to prepare the possible implementation of gnet: URLs.
- Factorized generation of random numbers into random_value().
- Added search statistics pane [From Michael Tesch, patch #524921].
- When "Never send a push request" is ticked, don't bother showing results
  from explicitely firewalled servents.
- Disable the "Start now" menu entry if we don't have any more download slot.
- Removed broken support for computation of lower-cased directory paths in
  the shared library.
- Fixed broken recursive scan of the library, with help from Michael Tesch.
- Ensure we do not launch two copies of gtk-gnutella backed by the same
  configuration, and protect any configuration change made whilst the
  program was running by saving a copy of the old configuration if needed.
- Fixed push bug, by allowing several downloads to be recorded for the
  same (index, GUID) tuple.  This can happen if we don't notice a re-indexing
  on the remote host.
- Fobid the multicast IP range, and also the new 169.254/16 private range.
  Downloads at those addresses will be pushed.
- Don't remove queued downloads whose size is greater than the one we completed.
- When downloading a file bigger than the one in the done directory,
  and provided it's on the same filesystem as the tmp directory, move it out
  for resuming.  This is safe now that we perform range overlapping.
- Changed error message "Route lost" into "Push route lost".
- Don't abort with "Push route lost" when we only fell back to push, but the
  address does not seem to be private and there was no push indication in the
  query hit.
- Added upload statistics pane [From Michael Tesch, patch #529294].
- Attempt to flush upload statistics on a regular basis when changed.
- Try to flush queued messages on nodes as fast as possible by turning
  on TCP_NODELAY to disable Nagle's algorithm.
- Reworked on the shutdowning/bye code to maximize chances of proper delivery
  of the BYE indication.
- Must duplicate filenames in uploads in case library is rebuilt, or it will
  corrupt the upload statistics.
- Save config and host cache in a temporary file first, then rename as the
  final file when everything is OK to avoid corrupting precious data via an
  incomplete write.
- Be sure to disable a queue becoming empty in mq_clear() if it was enabled
  (fixes bug #530811).
- Split I/O vectors larger than the max allowed size (fixes bug #530106).
- Fixed off-by-one error in url_escape_cntrl() causing memory corruptions.
- When needed, must disable reading before calling node_bye(), in case we're
  facing a temporary "ponging" connection, which node_bye() happily removes
  (fixes bug #531167).
- Now handle parsing of 0.6 handshake headers on Ponging connections, to grab
  any Node: header and fake a pong.  This also allows Ponging 0.6 hosts to
  be seen in the GUI: they used to be discarded very early in the process,
  making display impossible.
- Was mistakenly displaying last offset as size in uploads.
- Negative range requests are offsets from the end of the file.
- Added upload stats "average count" [From Michael Tesch, patch #533257]
  (will convert existing stats to the new format).
- Ensure minimum value for node_sendqueue_size (1.5 * max packet size).
- Fixed cornercase, a leftover of bug #530811.
- Fixed crash when upload stats are cleared (bug #533904).

# v 0.80   2002.01.31  [stable]
# v 0.80   2002.01.22  [beta2]

- Fixed I/O memory leaks.
- Fixed filter memory leaks.
- Fixed ping/pong counting memory leaks (in obsolete code anyway).
- At end of download, also remove "Retry in 10s" entries bearing same name.
- Now makes accurate use of the HTTP "Connection:" header.
- Don't try to open local "config" directory as a file.
- Improved the download selection logic on pushes.
- Be sure to reinstall the SIGPIPE signal handler within the handler
- Fixed bug in header parsing when NUL is the first char on the line.
- Stop filling our Query Hit packets when we reach our own max size limit.

# v 0.80   2002.01.19  [beta]

Summary of changes (user-visible):

- Download queue made persistent: your pending downloads will be saved and
  resumed the next time gtk-gnutella is started.
- The download queue will now show the Host information.
- Pushes now work correctly, and gtk-gnutella can also serve push requests to
  others, so people behind firewalls may now share as well.
- Search results filtering has been implemented: until now, there was only
  the GUI part without any real work done.
- Sorting by host now works on search results.
- Supports the 0.6 handshaking protocol, both for incoming and outgoing
  connections.  Still accepts 0.4 incoming requests, or issues 0.4 outgoing if
  the remote node does not appear to support 0.6.
- Ping/pong traffic is now limited to a few hundred bytes per second on each
  connection, lowering the bandwidth usage: you should be able to open more
  connections than before for the same bandwidth used.

Detailed changes:

- gtk-gnutella.spec now generated at configure time. [From: Sam Varshavchik]
- LimeWire shut down their router.limewire.com pong cache.
- Trace IP of HTTP requests/replies we send or receive.
- Check for valid index/name combination before checking for upload slots.
- Automatically and silently ignore 0-byte files in search results.
- Silentlently ignore files located in private IPs if we don't send pushes
  (this is a temporary hack until someone adds a radio button to achieve this).
- Detect changes in indices for files we already found, and update the
  download queue accordingly (patch from Vladimir Klebanov).
- Improved hex dumping routine and use it to dump data on connection problems.
- Don't send user/password to proxy if none was configured
- Assume we're firewalled and advertise so until we get an incoming connection
- Try to parse all extended Query Hit Data (the open part) assuming BS compat.
- Started to reorganize GUI/callbacks in search.c, moving relevant code to
  callbacks.c and gui.c.  There is still a fair amount of mixing between the
  GUI stuff and the program logic, requiring further fine tuning.
- Rewrote NUL detection logic in search query, and now dumps yet unhandled
  extra query data.
- Constant refactoring: moved download/upload/socket constants and state
  inspection predicates into their respective headers.
- Now scan uploads for timeouts, and added configuration of the various
  time limits via two new config variables: "upload_connected_timeout" and
  "upload_connecting_timeout".
- Proxy connection errors were not reported (show_error() was not implemented).
- Now parses HTTP headers correctly.
- Handles HTTP "HEAD" requests correctly.
- Handles Gnet handshaking at the 0.6 level.  All handshakes are now made at
  the 0.6 level, and upon failure, retried at 0.4.  As for incoming
  connections, both 0.4 and 0.6 are supported.
- Cancelled uploads are now logged with details, since they don't appear
  in the GUI currently.
- Mark upload/download as stalled if no I/O within the last minute
- The amount of seconds between two automatic re-queries of the network
  now has to be at least of 300 seconds.
- Fixed memory leak in uploads (found by Nate).
- Connection statistics now show two figures, as "x/y": x is the amount of
  connected sockets, and y is the amount of attempts made in the background
  but not yet fully connected at the application level.
- Node connections statistics are dumped for debugging.
- Downloads now use the new HTTP header parsing code.
- Don't hammer host caches, allow a reasonable delay between two consecutive
  connection attemps to the same host.
- Now uses fresh pongs when the saved caught host list has been re-read.
- Send 10 fresh pongs to old 0.4 servents to whom we deny the connection.
- Sent Pushes now use the Gnet connection socket, so they will work when
  behind a masquerading+forwarding firewall with only the Gnet port opened.
- Fixed a couple of buglets introduced by the late re-organization of code.
- Added handling of push requests sent by remote servents, i.e gtk-gnutella
  will now reply when others request us to push a file to them.
- If search results say remote servent is firewalled, start immediately in
  push mode when downloading, provided pushes are authorized.
- Recognizes more vendor codes in QHD (Query Hit Descriptor).
- Implemented LimeWire's ping/pong reducing scheme.
- Created doc/gnutella directory, populated with reference on the recently
  implemented algorithms.
- Fixed index-updating bug for downloads in push mode: the mapping was
  not updated correctly, resulting in a failed assertion later on.
- Advertise "Pong-Caching: 0.1" in the 0.6 handshake reply.
- Factorized creation of version string, in a "version_string" global
  that is now used everywhere the name of the program and its version needs
  to be output in a header (User-Agent and Server headers).
- Forgot that search reissue timeout of 0 meant "no reissue".  Fixed, and
  adapted the label text in front of the entry textarea.  Also enlarged
  the area a bit.  [From: Nate]
- Fixed IP/port setups for socks4 and socks5 proxies: now use network order
  instead of native. [From: Robert Bihlmeyer]
- Was not validating config variable `min_dup_ratio'.  Adapted its comment,
  and made other cosmetic change to the config file output.
- Now initializes version string once and for all, at main() time.
  This string is then consistently used in all emitted headers.
- Parses remote "Pong-Caching:" hanshaking header.
- During download requests, force push immediately if the remote end's IP:port
  appears to be not connectible, even if the "Push" bit is not set in QHD.
- Created new "Stopped" state, which is used on retry-able error conditions,
  such as EOF or "Connection reset by peer" errors.  The retry timer was
  shortened from 60 to 15 seconds, awaiting to make it configurable.
- Detect and print as such a failed outgoing connection that sent us
  connection pongs nonetheless.
- Fixed improper trailer generation in query hits: the last flag byte was
  not copied at all.
- Suppressed md5 from the source, it's no longer used.
- Refactoring in routing logic, mainly for push packet handling.
- Push packets are now routed correctly, and no longer widely broadcasted.
- Pushed downloads will abort when the route to the remote servent is lost.
- Forgot to detect TTL=0 pings in our new ping/pong handling logic.
- In case the handshaking fails with a remote strange server, read more data
  to be able to trace more of their reply.
- Now parses the Query Hit packets only once, no matter how many searches open.
- Integrated filtering patch [From Robert Bihlmeyer].  You may now apply
  filters to your searches.
- Double-clicking on a file in the search window will request downloading
  of the selected files. [From Noel T.Nunkovich]
- Removed useless and memory hog host catcher list in the gnutellaNet screen:
  saves 2 MB of RAM plus avoids cost of updating it [From Mark Schreiber].
- Be tolerant on servents that do not send a Content-Length but send
  a proper Content-Range line instead (which we tolerantly parse as well).
- Accept searches even though we might not be connected to the net yet
  [From Mark Schreiber].
- Added Host indication in the download screen [From Mark Schreiber].
- Fixed buglet in has_same_active_download() where "waiting" downloads
  were not considered when looking for duplicates, which could lead to
  assertion failures for pushes later on.
- When not sharing, don't return query hits [From Mark Schreiber].
- When not sharing, send them a "410 Sharing currently disabled" error.
- Added X-Live-Since: to all our HTTP replies.
- Added download queue persistence.
- Download resuming now checks for proper file via an overlap of 512 bytes.
- Split hostcache into two distinct lists: the reserve, and the list of
  nodes we tried and are known to be valid Gnutella servers.  In an attempt
  to limit the tendency of the hostcache to remove hosts rapidly.
- Will now automatically determine that the forced local IP is obsolete
  and change it on the fly, provided we're connecting to modern servents,
  which make use of the Remote-IP header during handshaking.
- Compute IP address of public hostcaches once, to avoid many long DNS lookups.
- When low on hosts in cache, collect "semi-pongs" from Query Hits
  (an idea from Mike Green).  The "low" threshold is 12.5% of maximum.
- Added URL escaping routines.
- Now supports URL-escaped requests, but still sends un-escaped requests to
  remote servents.
- Advertise our node address/port using the Node: header on all outgoing
  handshakes.
- Minor reformatting of config file comments, and raising of default max
  messages to be more tolerent on replies, whilst reducing greatly the max
  size of queries to limit potential of abuse.

# v 0.18   2001.11.19

- Further improved auto-download to not request things we already got
- Refuse to record a download if we still have an identical active one
- Integrated search results limiting patch, from Brian St. Pierre
- Fixed incremental sort logic, which was not accurate for big values
- Made search results sortable by Host and by Info
- Integrated new manpage from Brian St. Pierre (in debian directory)
- Never overwrite files in "completed dir"; rename target file if needed
- Missed "return" statements in error path for "download resuming" checks
- Made auto-download.txt case sensitive, and leading '#' is treated as comment
- Auto-download flag made persistent, and file name set via config file
- Integrated auto-download.txt patch from Brian St. Pierre
- Integrated patch from Brian St. Pierre to burst gnutella.h into small files

# v 0.17   2001.10.24

- Integrated routing table optimization patch from Mark Schreiber
- Shortened default connecting timeouts, especially to other nodes
- Index shared files in an array for faster retrieval
- Enforce strict NUL termination of Query packets we process
- Integrated search table bin categorization patch from Kenn Brooks Hamm

# v 0.16   2001.10.03

- Further optimized library lookups to avoid useless matching operations
- Added two host caches: public.bearshare.net and gnotella.fileflash.com
- Was mistakenly using signed integer in GET requests for file indices
- Double check requested file names with those in our library for extra safety
- When download completes, remove all queued entries for same filename
- Results differing only by connection speed are now considered identical
- The payload size of query hits was written in native format, instead of LE!
- Optimized query hit packet construction, reducing mem fragmentation
- Now shows itself as "Gtk-Gnut" instead of "Gtk-Gnutella"
- Fixed important sharing bug where extensions were not matched for correctly
- Can now configure a max size for the host cache (defaults to 20480)
- Kicking policies for dup messages and high TTL now configurable
- Removed unneeded inclusion of <mcheck.h>
- Fixed broken "rm" in debian/rules, changed it to "rm -f"
- Show "<unparsed>" when results have an unparsed query hit trailer
- Ran all sources through "indent -kr", plus minimal reformating, ts=4 now

# v 0.15   2001.09.20

- No longer depends on having "glade" or "tcl" for building
- Try to simultaneously connect to as many hosts as permitted by min settings
- Can now stop and resume passive searches as well.
- Only resort to host catchers when host catch is empty
- Now uses 4 host catchers: router.limewire.com, connect[1..3].gnutellanet.com
- Fixed improper GUI dependency between min/max node connection settings
- Identify as a "modern" client in the GUID, handling protocol 0.4.
- Allocate node reception buffer once, not each time a >4K message is received.
- Avoid dropping replies on high TTL, adjust the field down
- Send back pongs and query hits using the hop count of request as TTL
  (since replies must be routed along the same path, it need not be greater)
- Kick out nodes sending us messages with TTL=0.
- Initial host catcher is now router.limewire.com.
- Ignore file count and sizes in pongs when high bits are set (obviously wrong!)

# v 0.14   2001.09.12

- New project admin Raphael Manfredi <Raphael_Manfredi@pobox.com>
- Integrated all pending (to date) patches on sourceforge.
- Fixed all memory leaks found by dmalloc.
- Fixed segmentation faults.
- Use more efficient pattern scanning to grep through the library file names
- Searches in local library now use begining-of-word matchings
- Configuration now saved in ~/.gtk-gnutella/config
- Many new configuration variables, none settable through GUI yet
- More efficient handling of host catching list to avoid long startup times
- Can limit uploads per IP address (from config file only)
- Better error reporting during read/write errors
- Show more information about connected nodes (TX/RX/Drop/Bad)
- Installed node kicking policies
- Avoid hammering hosts from which we download via smarter scheduling
- Handle upload and download resuming
- Uses much less CPU under stable operation, but can still be improved.
- Lots of other minor fixes and many hours of testing

# v 0.13   2001.05.25

- Searches now show client, busy and MP3 tag info
- Columns now saved correctly
- Downloads do not hammer host, wait 20 seconds+, same IP handled
- Downloads behave better and I found the segfault bug!
- Search select all feature added (config option)
- Search strict AND filter feature added (config option)
- Debug assist code added, prints hex, dbg variable added
- Some readme doc updates
- Client identifies itself properly as Gtk-Gnutella 'GTKG' to the net
- 503 and other returns handled better, queue is better
- Lots of other fixes and many hours testing

 stuff from Goswin:

- parse for any 2xx http header
- recognise 5xx busy headers
- check for non resuming clients
- don't download the same filename twice
- dequeue one download once a second in the main loop
- download_pickup_queued disabled
- move file from completed dir to partial dir when a bigger one with
  the same name is downloaded (both dirs should be on the same drive,
  otherwise the copying will take so long on big files that most
  connections will timeout).
- requeue on timeout
- don't remember that you gone into push mode, try a direct connect
  each time.
- accept long urls on uploads such as a proxy would send


# v 0.13      2001.01.05

- File Sharing (woohoo!)
- force_local_ip fixed (more than one fix)
- Max simultaneous uploads
- gui_update_upload moved into main timer
- Autoconnect to gnutellahosts.com on startup
- Automatically connect to new hosts when below "atleast connections" 
- Configure option to discard non-routable ip's
- Solaris (maybe win23?) build fix
- Allow passive search results
- Ignore duplicate search results
- "never send push request" option
- "Jump to Downloads" switch added
- "Clear Results" button added to search screen
- Auto-repeat searches on new control connections
- All sorts of other random fixes
 
* v 0.13          2000.07.??

- 32 bits overflow when computing the size of all files on the GnutellaNet
  (in the gnutellanet stats) should been fixed
- Currently implementing the multiple simultaneous searches and the search
  results filters
- The widths of the different clists's columns are now remembered
- You can now force your local IP to whatever you want [NEED TESTS PLEASE]
- 'Current port' label is now updated
- Automatic retry for failed downloads
- A new option limits the number of downloads from a single GnutellaNet host
- Users with big default fonts should now see all the menus
- A quit button has been added
- gtk-gnutella is now linked against libresolv if needed for inet_aton()

* v 0.12          2000.05.03

- All C++ style comments have been replaced by C style comments
- Incoming connections are now accepted again (lame bug created in 0.11 fixed)
- Slashes are replaced by backslashes in downloaded files names
- Downloaded files are no more created before we actually receive data for them
- Queued downloads can now be reordered by drag and drop
- Queued downloads can now be started at any time (using right mouse button on
  them)
- Active downloads can now be forced to push mode, moved back to the queue,
  or killed (with the output file removed) using right mouse button on them
- Preferences and configuration are now saved in a directory instead of a
  single file. You can choose the path of the directory to be used by setting
  the GTA_GNUTELLA_DIR environment variable before running gtk-gnutella.
  By default it will be ~/.gtk-gnutella/ 
- Estimated TR (Time Remaining) is displayed while downloading files
- Catched hosts are now saved in clear text in a separate file:
  GTA_GNUTELLA_DIR/hosts
- Catched hosts can be imported from and exported to any text file (using
  right mouse button on the gnutella host catcher)
- Gtk-Gnutella should now compile (using gcc) and run on more processors
- A few memory leaks removed, but some remain (I don't know where yet)
- Serious bug that made Gtk-Gnutella send garbage when the sendqueue for slow
  nodes excedeed 1024 bytes has been fixed
- Completed download files are now moved to a different directory, that can be
  choosen in the config screen
- Gtk-Gnutella now remembers the position and the size of the window
- Automatic sorting of search results can be stopped by right clicking in the
  search results list (GTK doesn't seem to handle well auto sorting)


* v 0.11          2000.04.19

- Sizes of files in the gnutellanet stats, in search results and in downloads
  lists are now displayed in B, KB, MB or GB. By the way, the gnutellanet
  stats will display the right number of shared bytes...
- Search results can now be sorted by File name, Size, or Speed.
- Buttons 'abort selected', 'resume selected' and 'clear completed' in the
  download section should be less randomly active / unactive.
- The numbers of active and completed downloads should be more accurate.
- The number of routing errors should be more accurate too.
- Some warnings about malformed packets have been removed (that happens too
  often to be displayed...)
- Do not allow more than one incoming connection from the same IP, to prevent
  connect flood attacks (Somebody tried to establish more than 32 simultaneous
  connections (from the same IP) to my client today...)
- Catched hosts are now saved, and reloaded next time Gtk-Gnutella is started.


* v 0.1           2000.04.16

- First release of Gtk-Gnutella :)

