Current priorities:

- Memory leak 486 (now known for certain to be a leak: leaks 2000
  allocs per day)

- Making it able to run for periods of longer than 24 hours without
crashing or filling memory

- any SEGFAULT errors not covered by #1

- any memory leaks not covered by #1

- Any other contributed patches that address errors that cause
permanent damage (corrupting files, crashing the whole system, etc.)

- Any other contributed patches that address errors that make gnut
crash

- Any other contributed patches that address errors that make gnut
fail to share, search, upload, download, etc.

- Any other contributed patches that address errors that make gnut
work in a way other than what Josh and the other writers intended

- Any contributed patches that cause gnut to be much more useful to
more than half of its users

- Stop getting treated differently by BearShare

- Any contributed patches that cause gnut to be a little more useful
to more than half of its users

- Any contributed patches that cause gnut to be a much more useful
to a smaller fraction of its users

- Any contributed patches that cause gnut to be a little more useful
to a smaller fraction of its users


 Technical
 ---------
 Reduce number of threads used (e.g. by doing all retry-wait
connections in a single thread)
 **MAYBE** support http://gnutscape.tripod.com/techdoc/callback.html
 setting to impose minimum transfer rate for items adding to cache
 don't send out any more query packets if query reply list is already full
 instant search - fill query reply list from the new qreply LRU hash
 **HALFWAY** overlap-test on resumed transfer, if not match, abort or
restart from byte 0 according to user preference
 logging of host stats periodically (currently only does this when in
daemon mode)
 smarter filtering of trivial queries
 Different players based on extension.
 Allow specification of local IP in config file.
 Configurable displaying of paths in search results.
 **HALFWAY**Better configuration system.
 ***DONE*** generate and read extended query reply packet
 ***DONE***Caching of frequently requested files.
 ***DONE***more intelligent host stats (aging and/or decayed-average)
 ***DONE***aging host cache to optimize keeping connections list full
 ***DONE***handling aging of host list and very low good/dead ratios
 ***DONE***automatic retry of failed connections and partial downloads
 ***DONE***monitor push requests we route (to discover what's hot
right now) -- implies storing query replies.
 ***DONE***Logging.
 ***DONE***Allow specification of local port in config file.
 ***DONE***Merge patch for better locking.
 ***DONE***Configure using the web interface.
 ***DONE***All values munge configurable.
 ***DONE***Command to wait.
 ***DONE***Notification when downloads are queued.
 ***DONE***Config option to not wait after find.
 ***DONE***Queueing of downloads.
 ***DONE***Make update only clear hosts if configured to do so.
 ***DONE***Make write's and read handle all possible error conditions.

 UI
 ----------------------
 conf.c variable per-version default history (to support #old# and #factory#)
 #old# command, with per-variable didset flags
 #factory# command, like #old# but overrides (ignores) didset's
 infoc_format
 new clean/terse display (requires #old# command)
 field length in response_format ( .17 17. 17 .17. to show where you want ..)
 option to send log_level messages to a file instead of STDOUT
 Pagination is broken.
 Show full URL in search responses.
 Save config to .gnutrc without losing commands and comments in .gnutrc
 ***HALFWAY***Save config options to file.
 ***DONE***Shell tool of some sort.
 ***DONE***Select extensions (like .htm or .vbs) to omit from search results
 ***DONE***Beep on first response.
 ***DONE***Sorting of responses.
 ***DONE***Paging of all results.
 ***DONE***Message when download is finished.

KNOWN BUGS:

 - Sometimes a transfer thread dies in such a way that an entry is left in
the transfer list with a null filename. Related to this, sometimes file
cache downloads end without calling cache_unlock() (this is the reason
for the existence of cache_fixlock())

 - double-free error 149

 - Stopping a download doesn't always work -- it comes back in RETRY
state and you have to stop it a second time (and then it's really
gone)

 - gnut_queue_insert q=nil d=0x... tn=506
