Commit 1eb0d3d3 authored by Max Lv's avatar Max Lv

add missing license files

parent 41e7c75c
Revision history for libev, a high-performance and full-featured event loop.
TODO: ev_loop_wakeup
TODO: EV_STANDALONE == NO_HASSEL (do not use clock_gettime in ev_standalone)
TODO: faq, process a thing in each iteration
TODO: dbeugging tips, ev_verify, ev_init twice
TODO: ev_break for immediate exit (EVBREAK_NOW?)
TODO: ev_feed_child_event
TODO: document the special problem of signals around fork.
TODO: store pid for each signal
TODO: document file descriptor usage per loop
TODO: store loop pid_t and compare isndie signal handler,store 1 for same, 2 for differign pid, clean up in loop_fork
TODO: embed watchers need updating when fd changes
TODO: document portbaility requirements for atomic pointer access
4.15 Fri Mar 1 12:04:50 CET 2013
- destroying a non-default loop would stop the global waitpid
watcher (Denis Bilenko).
- queueing pending watchers of higher priority from a watcher now invokes
them in a timely fashion (reported by Denis Bilenko).
- add throw() to all libev functions that cannot throw exceptions, for
further code size decrease when compiling for C++.
- add throw () to callbacks that must not throw exceptions (allocator,
syserr, loop acquire/release, periodic reschedule cbs).
- fix event_base_loop return code, add event_get_callback, event_base_new,
event_base_get_method calls to improve libevent 1.x emulation and add
some libevent 2.x functionality (based on a patch by Jeff Davey).
- add more memory fences to fix a bug reported by Jeff Davey. Better
be overfenced than underprotected.
- ev_run now returns a boolean status (true meaning watchers are
still active).
- ev_once: undef EV_ERROR in ev_kqueue.c, to avoid clashing with
libev's EV_ERROR (reported by 191919).
- (ecb) add memory fence support for xlC (Darin McBride).
- (ecb) add memory fence support for gcc-mips (Anton Kirilov).
- (ecb) add memory fence support for gcc-alpha (Christian Weisgerber).
- work around some kernels losing file descriptors by leaking
the kqueue descriptor in the child.
- work around linux inotify not reporting IN_ATTRIB changes for directories
in many cases.
- include sys/syscall.h instead of plain syscall.h.
- check for io watcher loops in ev_verify, check for the most
common reported usage bug in ev_io_start.
- chose socket vs. WSASocket at compiletime using EV_USE_WSASOCKET.
- always use WSASend/WSARecv directly on windows, hoping that this
works in all cases (unlike read/write/send/recv...).
- try to detect signals around a fork faster (test program by
Denis Bilenko).
- work around recent glibc versions that leak memory in realloc.
- rename ev::embed::set to ev::embed::set_embed to avoid clashing
the watcher base set (loop) method.
- rewrite the async/signal pipe logic to always keep a valid fd, which
simplifies (and hopefuly correctifies :) the race checking
on fork, at the cost of one extra fd.
- add fat, msdos, jffs2, ramfs, ntfs and btrfs to the list of
inotify-supporting filesystems.
- move orig_CFLAGS assignment to after AC_INIT, as newer autoconf
versions ignore it before
(https://bugzilla.redhat.com/show_bug.cgi?id=908096).
- add some untested android support.
- enum expressions must be of type int (reported by Juan Pablo L).
4.11 Sat Feb 4 19:52:39 CET 2012
- INCOMPATIBLE CHANGE: ev_timer_again now clears the pending status, as
was documented already, but not implemented in the repeating case.
- new compiletime symbols: EV_NO_SMP and EV_NO_THREADS.
- fix a race where the workaround against the epoll fork bugs
caused signals to not be handled anymore.
- correct backend_fudge for most backends, and implement a windows
specific workaround to avoid looping because we call both
select and Sleep, both with different time resolutions.
- document range and guarantees of ev_sleep.
- document reasonable ranges for periodics interval and offset.
- rename backend_fudge to backend_mintime to avoid future confusion :)
- change the default periodic reschedule function to hopefully be more
exact and correct even in corner cases or in the far future.
- do not rely on -lm anymore: use it when available but use our
own floor () if it is missing. This should make it easier to embed,
as no external libraries are required.
- strategically import macros from libecb and mark rarely-used functions
as cache-cold (saving almost 2k code size on typical amd64 setups).
- add Symbols.ev and Symbols.event files, that were missing.
- fix backend_mintime value for epoll (was 1/1024, is 1/1000 now).
- fix #3 "be smart about timeouts" to not "deadlock" when
timeout == now, also improve the section overall.
- avoid "AVOIDING FINISHING BEFORE RETURNING" idiom.
- support new EV_API_STATIC mode to make all libev symbols
static.
- supply default CFLAGS of -g -O3 with gcc when original CFLAGS
were empty.
4.04 Wed Feb 16 09:01:51 CET 2011
- fix two problems in the native win32 backend, where reuse of fd's
with different underlying handles caused handles not to be removed
or added to the select set (analyzed and tested by Bert Belder).
- do no rely on ceil() in ev_e?poll.c.
- backport libev to HP-UX versions before 11 v3.
- configure did not detect nanosleep and clock_gettime properly when
they are available in the libc (as opposed to -lrt).
4.03 Tue Jan 11 14:37:25 CET 2011
- officially support polling files with all backends.
- support files, /dev/zero etc. the same way as select in the epoll
backend, by generating events on our own.
- ports backend: work around solaris bug 6874410 and many related ones
(EINTR, maybe more), with no performance loss (note that the solaris
bug report is actually wrong, reality is far more bizarre and broken
than that).
- define EV_READ/EV_WRITE as macros in event.h, as some programs use
#ifdef to test for them.
- new (experimental) function: ev_feed_signal.
- new (to become default) EVFLAG_NOSIGMASK flag.
- new EVBACKEND_MASK symbol.
- updated COMMON IDIOMS SECTION.
4.01 Fri Nov 5 21:51:29 CET 2010
- automake fucked it up, apparently, --add-missing -f is not quite enough
to make it update its files, so 4.00 didn't install ev++.h and
event.h on make install. grrr.
- ev_loop(count|depth) didn't return anything (Robin Haberkorn).
- change EV_UNDEF to 0xffffffff to silence some overzealous compilers.
- use "(libev) " prefix for all libev error messages now.
4.00 Mon Oct 25 12:32:12 CEST 2010
- "PORTING FROM LIBEV 3.X TO 4.X" (in ev.pod) is recommended reading.
- ev_embed_stop did not correctly stop the watcher (very good
testcase by Vladimir Timofeev).
- ev_run will now always update the current loop time - it erroneously
didn't when idle watchers were active, causing timers not to fire.
- fix a bug where a timeout of zero caused the timer not to fire
in the libevent emulation (testcase by Péter Szabó).
- applied win32 fixes by Michael Lenaghan (also James Mansion).
- replace EV_MINIMAL by EV_FEATURES.
- prefer EPOLL_CTL_ADD over EPOLL_CTL_MOD in some more cases, as it
seems the former is *much* faster than the latter.
- linux kernel version detection (for inotify bug workarounds)
did not work properly.
- reduce the number of spurious wake-ups with the ports backend.
- remove dependency on sys/queue.h on freebsd (patch by Vanilla Hsu).
- do async init within ev_async_start, not ev_async_set, which avoids
an API quirk where the set function must be called in the C++ API
even when there is nothing to set.
- add (undocumented) EV_ENABLE when adding events with kqueue,
this might help with OS X, which seems to need it despite documenting
not to need it (helpfully pointed out by Tilghman Lesher).
- do not use poll by default on freebsd, it's broken (what isn't
on freebsd...).
- allow to embed epoll on kernels >= 2.6.32.
- configure now prepends -O3, not appends it, so one can still
override it.
- ev.pod: greatly expanded the portability section, added a porting
section, a description of watcher states and made lots of minor fixes.
- disable poll backend on AIX, the poll header spams the namespace
and it's not worth working around dead platforms (reported
and analyzed by Aivars Kalvans).
- improve header file compatibility of the standalone eventfd code
in an obscure case.
- implement EV_AVOID_STDIO option.
- do not use sscanf to parse linux version number (smaller, faster,
no sscanf dependency).
- new EV_CHILD_ENABLE and EV_SIGNAL_ENABLE configurable settings.
- update libev.m4 HAVE_CLOCK_SYSCALL test for newer glibcs.
- add section on accept() problems to the manpage.
- rename EV_TIMEOUT to EV_TIMER.
- rename ev_loop_count/depth/verify/loop/unloop.
- remove ev_default_destroy and ev_default_fork.
- switch to two-digit minor version.
- work around an apparent gentoo compiler bug.
- define _DARWIN_UNLIMITED_SELECT. just so.
- use enum instead of #define for most constants.
- improve compatibility to older C++ compilers.
- (experimental) ev_run/ev_default_loop/ev_break/ev_loop_new have now
default arguments when compiled as C++.
- enable automake dependency tracking.
- ev_loop_new no longer leaks memory when loop creation failed.
- new ev_cleanup watcher type.
3.9 Thu Dec 31 07:59:59 CET 2009
- signalfd is no longer used by default and has to be requested
explicitly - this means that easy to catch bugs become hard to
catch race conditions, but the users have spoken.
- point out the unspecified signal mask in the documentation, and
that this is a race condition regardless of EV_SIGNALFD.
- backport inotify code to C89.
- inotify file descriptors could leak into child processes.
- ev_stat watchers could keep an erroneous extra ref on the loop,
preventing exit when unregistering all watchers (testcases
provided by ry@tinyclouds.org).
- implement EV_WIN32_HANDLE_TO_FD and EV_WIN32_CLOSE_FD configuration
symbols to make it easier for apps to do their own fd management.
- support EV_IDLE_ENABLE being disabled in ev++.h
(patch by Didier Spezia).
- take advantage of inotify_init1, if available, to set cloexec/nonblock
on fd creation, to avoid races.
- the signal handling pipe wasn't always initialised under windows
(analysed by lekma).
- changed minimum glibc requirement from glibc 2.9 to 2.7, for
signalfd.
- add missing string.h include (Denis F. Latypoff).
- only replace ev_stat.prev when we detect an actual difference,
so prev is (almost) always different to attr. this might
have caused the problems with 04_stat.t.
- add ev::timer->remaining () method to C++ API.
3.8 Sun Aug 9 14:30:45 CEST 2009
- incompatible change: do not necessarily reset signal handler
to SIG_DFL when a sighandler is stopped.
- ev_default_destroy did not properly free or zero some members,
potentially causing crashes and memory corruption on repeated
ev_default_destroy/ev_default_loop calls.
- take advantage of signalfd on GNU/Linux systems.
- document that the signal mask might be in an unspecified
state when using libev's signal handling.
- take advantage of some GNU/Linux calls to set cloexec/nonblock
on fd creation, to avoid race conditions.
3.7 Fri Jul 17 16:36:32 CEST 2009
- ev_unloop and ev_loop wrongly used a global variable to exit loops,
instead of using a per-loop variable (bug caught by accident...).
- the ev_set_io_collect_interval interpretation has changed.
- add new functionality: ev_set_userdata, ev_userdata,
ev_set_invoke_pending_cb, ev_set_loop_release_cb,
ev_invoke_pending, ev_pending_count, together with a long example
about thread locking.
- add ev_timer_remaining (as requested by Denis F. Latypoff).
- add ev_loop_depth.
- calling ev_unloop in fork/prepare watchers will no longer poll
for new events.
- Denis F. Latypoff corrected many typos in example code snippets.
- honor autoconf detection of EV_USE_CLOCK_SYSCALL, also double-
check that the syscall number is available before trying to
use it (reported by ry@tinyclouds).
- use GetSystemTimeAsFileTime instead of _timeb on windows, for
slightly higher accuracy.
- properly declare ev_loop_verify and ev_now_update even when
!EV_MULTIPLICITY.
- do not compile in any priority code when EV_MAXPRI == EV_MINPRI.
- support EV_MINIMAL==2 for a reduced API.
- actually 0-initialise struct sigaction when installing signals.
- add section on hibernate and stopped processes to ev_timer docs.
3.6 Tue Apr 28 02:49:30 CEST 2009
- multiple timers becoming ready within an event loop iteration
will be invoked in the "correct" order now.
- do not leave the event loop early just because we have no active
watchers, fixing a problem when embedding a kqueue loop
that has active kernel events but no registered watchers
(reported by blacksand blacksand).
- correctly zero the idx values for arrays, so destroying and
reinitialising the default loop actually works (patch by
Malek Hadj-Ali).
- implement ev_suspend and ev_resume.
- new EV_CUSTOM revents flag for use by applications.
- add documentation section about priorities.
- add a glossary to the dcoumentation.
- extend the ev_fork description slightly.
- optimize a jump out of call_pending.
3.53 Sun Feb 15 02:38:20 CET 2009
- fix a bug in event pipe creation on win32 that would cause a
failed assertion on event loop creation (patch by Malek Hadj-Ali).
- probe for CLOCK_REALTIME support at runtime as well and fall
back to gettimeofday if there is an error, to support older
operating systems with newer header files/libraries.
- prefer gettimeofday over clock_gettime with USE_CLOCK_SYSCALL
(default most everywhere), otherwise not.
3.52 Wed Jan 7 21:43:02 CET 2009
- fix compilation of select backend in fd_set mode when NFDBITS is
missing (to get it to compile on QNX, reported by Rodrigo Campos).
- better select-nfds handling when select backend is in fd_set mode.
- diagnose fd_set overruns when select backend is in fd_set mode.
- due to a thinko, instead of disabling everything but
select on the borked OS X platform, everything but select was
allowed (reported by Emanuele Giaquinta).
- actually verify that local and remote port are matching in
libev's socketpair emulation, which makes denial-of-service
attacks harder (but not impossible - it's windows). Make sure
it even works under vista, which thinks that getpeer/sockname
should return fantasy port numbers.
- include "libev" in all assertion messages for potentially
clearer diagnostics.
- event_get_version (libevent compatibility) returned
a useless string instead of the expected version string
(patch by W.C.A. Wijngaards).
3.51 Wed Dec 24 23:00:11 CET 2008
- fix a bug where an inotify watcher was added twice, causing
freezes on hash collisions (reported and analysed by Graham Leggett).
- new config symbol, EV_USE_CLOCK_SYSCALL, to make libev use
a direct syscall - slower, but no dependency on librt et al.
- assume negative return values != -1 signals success of port_getn
(http://cvs.epicsol.org/cgi/viewcvs.cgi/epic5/source/newio.c?rev=1.52)
(no known failure reports, but it doesn't hurt).
- fork detection in ev_embed now stops and restarts the watcher
automatically.
- EXPERIMENTAL: default the method to operator () in ev++.h,
to make it nicer to use functors (requested by Benedek László).
- fixed const object callbacks in ev++.h.
- replaced loop_ref argument of watcher.set (loop) by a direct
ev_loop * in ev++.h, to avoid clashes with functor patch.
- do not try to watch the empty string via inotify.
- inotify watchers could be leaked under certain circumstances.
- OS X 10.5 is actually even more broken than earlier versions,
so fall back to select on that piece of garbage.
- fixed some weirdness in the ev_embed documentation.
3.49 Wed Nov 19 11:26:53 CET 2008
- ev_stat watchers will now use inotify as a mere hint on
kernels <2.6.25, or if the filesystem is not in the
"known to be good" list.
- better mingw32 compatibility (it's not as borked as native win32)
(analysed by Roger Pack).
- include stdio.h in the example program, as too many people are
confused by the weird C language otherwise. I guess the next thing
I get told is that the "..." ellipses in the examples don't compile
with their C compiler.
3.48 Thu Oct 30 09:02:37 CET 2008
- further optimise away the EPOLL_CTL_ADD/MOD combo in the epoll
backend by assuming the kernel event mask hasn't changed if
ADD fails with EEXIST.
- work around spurious event notification bugs in epoll by using
a 32-bit generation counter. recreate kernel state if we receive
spurious notifications or unwanted events. this is very costly,
but I didn't come up with this horrible design.
- use memset to initialise most arrays now and do away with the
init functions.
- expand time-out strategies into a "Be smart about timeouts" section.
- drop the "struct" from all ev_watcher declarations in the
documentation and did other clarifications (yeah, it was a mistake
to have a struct AND a function called ev_loop).
- fix a bug where ev_default would not initialise the default
loop again after it was destroyed with ev_default_destroy.
- rename syserr to ev_syserr to avoid name clashes when embedding,
do similar changes for event.c.
3.45 Tue Oct 21 21:59:26 CEST 2008
- disable inotify usage on linux <2.6.25, as it is broken
(reported by Yoann Vandoorselaere).
- ev_stat erroneously would try to add inotify watchers
even when inotify wasn't available (this should only
have a performance impact).
- ev_once now passes both timeout and io to the callback if both
occur concurrently, instead of giving timeouts precedence.
- disable EV_USE_INOTIFY when sys/inotify.h is too old.
3.44 Mon Sep 29 05:18:39 CEST 2008
- embed watchers now automatically invoke ev_loop_fork on the
embedded loop when the parent loop forks.
- new function: ev_now_update (loop).
- verify_watcher was not marked static.
- improve the "associating..." manpage section.
- documentation tweaks here and there.
3.43 Sun Jul 6 05:34:41 CEST 2008
- include more include files on windows to get struct _stati64
(reported by Chris Hulbert, but doesn't quite fix his issue).
- add missing #include <io.h> in ev.c on windows (reported by
Matt Tolton).
3.42 Tue Jun 17 12:12:07 CEST 2008
- work around yet another windows bug: FD_SET actually adds fd's
multiple times to the fd_*SET*, despite official MSN docs claiming
otherwise. Reported and well-analysed by Matt Tolton.
- define NFDBITS to 0 when EV_SELECT_IS_WINSOCKET to make it compile
(reported any analysed by Chris Hulbert).
- fix a bug in ev_ebadf (this function is only used to catch
programming errors in the libev user). reported by Matt Tolton.
- fix a bug in fd_intern on win32 (could lead to compile errors
under some circumstances, but would work correctly if it compiles).
reported by Matt Tolton.
- (try to) work around missing lstat on windows.
- pass in the write fd set as except fd set under windows. windows
is so uncontrollably lame that it requires this. this means that
switching off oobinline is not supported (but tcp/ip doesn't
have oob, so that would be stupid anyways.
- use posix module symbol to auto-detect monotonic clock presence
and some other default values.
3.41 Fri May 23 18:42:54 CEST 2008
- work around an obscure bug in winsocket select: if you
provide only empty fd sets then select returns WSAEINVAL. how sucky.
- improve timer scheduling stability and reduce use of time_epsilon.
- use 1-based 2-heap for EV_MINIMAL, simplifies code, reduces
codesize and makes for better cache-efficiency.
- use 3-based 4-heap for !EV_MINIMAL. this makes better use
of cpu cache lines and gives better growth behaviour than
2-based heaps.
- cache timestamp within heap for !EV_MINIMAL, to avoid random
memory accesses.
- document/add EV_USE_4HEAP and EV_HEAP_CACHE_AT.
- fix a potential aliasing issue in ev_timer_again.
- add/document ev_periodic_at, retract direct access to ->at.
- improve ev_stat docs.
- add portability requirements section.
- fix manpage headers etc.
- normalise WSA error codes to lower range on windows.
- add consistency check code that can be called automatically
or on demand to check for internal structures (ev_loop_verify).
3.31 Wed Apr 16 20:45:04 CEST 2008
- added last minute fix for ev_poll.c by Brandon Black.
3.3 Wed Apr 16 19:04:10 CEST 2008
- event_base_loopexit should return 0 on success
(W.C.A. Wijngaards).
- added linux eventfd support.
- try to autodetect epoll and inotify support
by libc header version if not using autoconf.
- new symbols: EV_DEFAULT_UC and EV_DEFAULT_UC_.
- declare functions defined in ev.h as inline if
C99 or gcc are available.
- enable inlining with gcc versions 2 and 3.
- work around broken poll implementations potentially
not clearing revents field in ev_poll (Brandon Black)
(no such systems are known at this time).
- work around a bug in realloc on openbsd and darwin,
also makes the erroneous valgrind complaints
go away (noted by various people).
- fix ev_async_pending, add c++ wrapper for ev_async
(based on patch sent by Johannes Deisenhofer).
- add sensible set method to ev::embed.
- made integer constants type int in ev.h.
3.2 Wed Apr 2 17:11:19 CEST 2008
- fix a 64 bit overflow issue in the select backend,
by using fd_mask instead of int for the mask.
- rename internal sighandler to avoid clash with very old perls.
- entering ev_loop will not clear the ONESHOT or NONBLOCKING
flags of any outer loops anymore.
- add ev_async_pending.
3.1 Thu Mar 13 13:45:22 CET 2008
- implement ev_async watchers.
- only initialise signal pipe on demand.
- make use of sig_atomic_t configurable.
- improved documentation.
3.0 Mon Jan 28 13:14:47 CET 2008
- API/ABI bump to version 3.0.
- ev++.h includes "ev.h" by default now, not <ev.h>.
- slightly improved documentation.
- speed up signal detection after a fork.
- only optionally return trace status changed in ev_child
watchers.
- experimental (and undocumented) loop wrappers for ev++.h.
2.01 Tue Dec 25 08:04:41 CET 2007
- separate Changes file.
- fix ev_path_set => ev_stat_set typo.
- remove event_compat.h from the libev tarball.
- change how include files are found.
- doc updates.
- update licenses, explicitly allow for GPL relicensing.
2.0 Sat Dec 22 17:47:03 CET 2007
- new ev_sleep, ev_set_(io|timeout)_collect_interval.
- removed epoll from embeddable fd set.
- fix embed watchers.
- renamed ev_embed.loop to other.
- added exported Symbol tables.
- undefine member wrapper macros at the end of ev.c.
- respect EV_H in ev++.h.
1.86 Tue Dec 18 02:36:57 CET 2007
- fix memleak on loop destroy (not relevant for perl).
1.85 Fri Dec 14 20:32:40 CET 2007
- fix some aliasing issues w.r.t. timers and periodics
(not relevant for perl).
(for historic versions refer to EV/Changes, found in the Perl interface)
0.1 Wed Oct 31 21:31:48 CET 2007
- original version; hacked together in <24h.
All files in libev are
Copyright (c)2007,2008,2009,2010,2011,2012 Marc Alexander Lehmann.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following
disclaimer in the documentation and/or other materials provided
with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Alternatively, the contents of this package may be used under the terms
of the GNU General Public License ("GPL") version 2 or any later version,
in which case the provisions of the GPL are applicable instead of the
above. If you wish to allow the use of your version of this package only
under the terms of the GPL and not to allow others to use your version of
this file under the BSD license, indicate your decision by deleting the
provisions above and replace them with the notice and other provisions
required by the GPL in this and the other files of this package. If you do
not delete the provisions above, a recipient may use your version of this
file under either the BSD or the GPL.
libev is a high-performance event loop/event model with lots of features.
(see benchmark at http://libev.schmorp.de/bench.html)
ABOUT
Homepage: http://software.schmorp.de/pkg/libev
Mailinglist: libev@lists.schmorp.de
http://lists.schmorp.de/cgi-bin/mailman/listinfo/libev
Library Documentation: http://pod.tst.eu/http://cvs.schmorp.de/libev/ev.pod
Libev is modelled (very losely) after libevent and the Event perl
module, but is faster, scales better and is more correct, and also more
featureful. And also smaller. Yay.
Some of the specialties of libev not commonly found elsewhere are:
- extensive and detailed, readable documentation (not doxygen garbage).
- fully supports fork, can detect fork in various ways and automatically
re-arms kernel mechanisms that do not support fork.
- highly optimised select, poll, epoll, kqueue and event ports backends.
- filesystem object (path) watching (with optional linux inotify support).
- wallclock-based times (using absolute time, cron-like).
- relative timers/timeouts (handle time jumps).
- fast intra-thread communication between multiple
event loops (with optional fast linux eventfd backend).
- extremely easy to embed (fully documented, no dependencies,
autoconf supported but optional).
- very small codebase, no bloated library, simple code.
- fully extensible by being able to plug into the event loop,
integrate other event loops, integrate other event loop users.
- very little memory use (small watchers, small event loop data).
- optional C++ interface allowing method and function callbacks
at no extra memory or runtime overhead.
- optional Perl interface with similar characteristics (capable
of running Glib/Gtk2 on libev).
- support for other languages (multiple C++ interfaces, D, Ruby,
Python) available from third-parties.
Examples of programs that embed libev: the EV perl module, node.js,
auditd, rxvt-unicode, gvpe (GNU Virtual Private Ethernet), the
Deliantra MMORPG server (http://www.deliantra.net/), Rubinius (a
next-generation Ruby VM), the Ebb web server, the Rev event toolkit.
CONTRIBUTORS
libev was written and designed by Marc Lehmann and Emanuele Giaquinta.
The following people sent in patches or made other noteworthy
contributions to the design (for minor patches, see the Changes
file. If I forgot to include you, please shout at me, it was an
accident):
W.C.A. Wijngaards
Christopher Layne
Chris Brody
Changes in version 2.0.21-stable (18 Nov 2012)
BUGFIXES:
o ssl: Don't discard SSL read event when timeout and read come close together (576b29f)
o ssl: Stop looping in "consider_reading" if reading is suspended. (f719b8a Joachim Bauch)
o ssl: No need to reserve space if reading is suspended. (1acf2eb Joachim Bauch)
o dns: Avoid a memory-leak on OOM in evdns. (73e85dd, f2bff75 George Danchev)
o build: Use python2 rather than python (0eb0109 Ross Lagerwall)
o build: Compile without warnings on mingw64 (94866c2)
o build: Fix compilation on mingw64 with -DUSE_DEBUG (62bd2c4)
o build: Make rpcgen_wrapper.sh work on systems without a "python2" binary (f3009e4)
o iocp: Close IOCP listener socket on free when LEV_OPT_CLOSE_ON_FREE is set (cb853ea Juan Pablo Fernandez)
o core: Avoid crash when event_pending() called with no event_base set on event (e3cccf3)
o misc: remove stray 'x' so print_err will compile when uncommented (ac35650 Patrick Pelletier)
o tests: Fix renegotiation test to work around openssl 1.0.1 bug (c2f3086)
o tests: Warn when openssl version in unit test mismatches compiled version. (ac009f9)
Changes in version 2.0.20-stable (23 Aug 2012)
BUGFIXES:
o core: Make event_pending() threadsafe. (be7a95c Simon Liu)
o win32: avoid crash when waiting forever on zero fds. (160e58b)
o evhttp: Fix a memory leak on error in evhttp_uriencode (11c8b31)
o evbuffer: Avoid possible needless call to writev. Found by coverity. (6a4ec5c)
o evdns: memset sockaddr_in before using it. Found by coverity. (a1a0e67)
o evhttp: Check more setsockopt return values when binding sockets. Found by coverity (a0912e3)
o evdns: Avoid segfault on weird timeout during name lookup. (dc32077 Greg Hazel)
o bufferevent_ssl: Correctly invoke callbacks when a SSL bufferevent reads some and then blocks. (606ac43)
PORTABILITY FIXES:
o check for arc4random_buf at runtime, on OS X (bff5f94 Greg Hazel)
o Correctly check for arc4random_buf (fcec3e8 Sebastian Hahn)
o Add explicit AC_PROG_SED to configure.in so all autoconfs will expose $(SED) (ca80ea6)
BUILD FIXES:
o Add GCC annotations so that the vsprintf functions get checked properly (117e327)
o Fix an unused variable warning on *BSD. (c0720c1)
UNIT TEST FIXES:
o Fix a couple of memory leaks (found with Valgrind). (3b2529a Ross Lagerwall)
o Remove deadcode in http regression tests. Found by coverity. (5553346)
o Fix possible uninitialized read in dns regression tests. Found by coverity. (2259777)
o Set umask before calling mkstemp in unit tests. Found by coverity (f1ce15d)
o Fix various check-after-dereference issues in unit tests: found by coverity (4f3732d)
o Fix resource leaks in the unit tests; found by coverity (270f279)
o Add some missing null checks to unit tests; found by coverity (f021c3d)
o Avoid more crashes/bad calls in unit tests; found by coverity (3cde5bf)
o Remove unused variable; spotted by coverity (6355b2a)
o Add checks to various return values in unit tests. Found by coverity (b9e7329)
o Move assignment outside tt_assert in ssl unit tests. Appeases coverity. (a2006c0)
Changes in version 2.0.19-stable (3 May 2012)
BUGFIXES (CORE):
o Refactor event_persist_closure: raise and extract some common logic (bec22b4)
o If time has jumped so we'd reschedule a periodic event in the past, schedule it for the future instead (dfd808c)
o If a higher-priority event becomes active, don't continue running events of the current priority. (2bfda40)
BUGFIXES (SSL):
o Fixed potential double-readcb execution with openssl bufferevents. (4e62cd1 Mark Ellzey)
BUGFIXES (DNS):
o Cancel a probe request when the server is freed, and ignore cancelled probe callbacks (94d2336 Greg Hazel)
o Remove redundant DNS_ERR_CANCEL check, move comment (46b8060 Greg Hazel)
o When retransmitting a timed-out DNS request, pick a fresh nameserver. (3d9e52a)
DOCUMENTATION FIXES:
o Fix a typo in the bufferevent documentation (98e9119)
o Add missing ) to changelog; spotted by rransom (4c7ee6b)
o Fix the website URL in the readme (f775521)
COMPILATION FIXES:
o Fix a compilation error with MSVC 2005 due to use of mode_t (336dcae)
o Configure with gcc older than 2.95 (4a6fd43 Sebastian Hahn)
o Generate event-config.h with a single sed script (30b6f88 Zack Weinberg)
FORWARD-COMPATIBILITY:
o Backport: provide EVENT_LOG_* names, and deprecate _EVENT_LOG_* (d1a03b2)
TESTING/DEBUGGING SUPPORT:
o dns-example.c can now take a resolv.conf file on the commandline (6610fa5)
o Make some evdns.c debug logs more verbose (d873d67)
o Work-around a stupid gcov-breaking bug in OSX 10.6 (b3887cd)
Changes in version 2.0.18-stable (22 Mar 2012)
BUGFIXES (core):
o Make uses of open() close-on-exec safe by introducing an internal evutil_open_closeonexec. (d2b5f72 Ross Lagerwall, 03dce42)
BUGFIXES (kqueue):
o Properly zero the kevent in kq_setup_kevent() (c2c7b39 Sebastian Hahn)
BUILD FIXES:
o Added OPENSSL_LDFLAGS env variable which is appended to SSL checks. (9278196 Mark Ellzey)
o Changed OPENSSL_LDFLAGS to OPENSSL_LIBADD (2d67b63 Mark Ellzey)
o Don't do clang version detection when disabling some flags (083296b Sebastian Hahn)
BUGFIXES (dns):
o Stop crashing in evdns when nameserver probes give a weird error (bec5068)
Changes in version 2.0.17-stable (10 Feb 2012)
BUGFIXES (core):
o Be absolutely sure to clear pncalls before leaving event_signal_closure (11f36a5)
o check for sysctl before we use it (358c745 Mike Frysinger)
o Remove bogus casts of socket to int before calling ev_callback (f032516)
o Make evconnlistener work around bug in older Linux when getting nmapped (ecfc720)
o Fix a list corruption bug when using event_reinit() with signals present (6e41cdc)
o Fix a fd leak in event_reinit() (3f18ad1)
o Do a memberwise comparison of threading function tables (c94a5f2 Nate R)
o Use C-style comments in C source files (for compatibility with compilers such as xlc on AIX). (d84d917 Greg Hewgill)
o Avoid crash when freeing event_iocp and using event_set_mem_functions (19715a6)
o In the kqueue backend, do not report EBADF as an EV_READ (5d7bfa1 Nicholas Marriott)
BUGFIXES (evbuffer and bufferevents):
o Fix behavior of evbuffer_peek(buf,-1,NULL,NULL,0) (c986f23 Zack Weinberg)
o Loop on filtering SSL reads until we are blocked or exhausted. (5b4b812)
BUGFIXES (evhttp):
o Force strict validation of HTTP version in response. (790f6b3 Catalin Patulea)
BUGFIXES (evdns):
o evdns: fix a bug in circular-queue implementation (d6094b1)
BUILD FIXES:
o Fix a silly compilation error with the sun compiler (1927776 Colin Watt)
o Suppress a gcc warning from ignoring fwrite return in http-sample.c (7206e8c)
DOCUMENTATION FIXES:
o Slightly clarify evbuffer_peek documentation (7bbf6ca)
o Update copyright notices to 2012 (e49e289)
NEW APIS:
o Backport evhttp_connection_get_bufferevent to Libevent 2.0 (da70fa7 Arno Bakker)
TESTS AND TEST FIXES:
o Fix a race condition in the dns/bufferevent_connect_hostname test. (cba48c7)
o Add function to check referential integrity of an event_base (27737d5)
o Check event_base correctness at end of each unit test (3312b02)
o Workaround in the unit tests for an apparent epoll bug in Linux 3.2 (dab9187)
o Better workaround for Linux 3.2 edge-triggered epoll bug (9f9e259)
Changes in version 2.0.16-stable (18 Nov 2011)
BUGFIXES (core):
o More detailed message in case of libevent self-debugging failure. (9e6a4ef Leonid Evdokimov)
o epoll: close fd on alloc fail at initialization (1aee718 Jamie Iles)
o Fix compile warning from saying event2/*.h inside a comment (447b0ba)
o Warn when unable to construct base because of failing make_base_notifiable (4e797f3)
o Don't try to make notifiable event_base when no threading fns are configured (e787413)
BUGFIXES (evbuffer):
o unit test for remove_buffer bug (90bd620 Greg Hazel)
o Fix an evbuffer crash in evbuffer_remove_buffer() (c37069c)
BUGFIXES (bufferevent_openssl):
o Refactor amount-to-read calculations in buffervent_ssl consider_reading() (a186e73 Mark Ellzey)
o Move SSL rate-limit enforcement into bytes_to_read() (96c562f)
o Avoid spinning on OpenSSL reads (2aa036f Mark Ellzey)
BUGFIXES (dns)
o Empty DNS reply with OK status is another way to say NODATA. (21a08d6 Leonid Evdokimov)
TESTING:
o Tests for 94fba5b and f72e8f6 (d58c15e Leonid Evdokimov)
o Test for commit aff6ba1 (f7841bf Leonid Evdokimov)
o Style and comment tweaks for dns/leak* tests (5e42202)
o improve test to remove at least one buffer from src (7eb52eb Greg Hazel)
DOCUMENTATION:
o Add note about evhttp_send_reply_end to its doxygen (724bfb5)
o Update copyright dates to 2011. (3c824bd)
o Fix typo in whatsnew-2.0.txt (674bc6a Mansour Moufid)
o Improve win32 behavior of dns-sample.c code (a3f320e Gisle Vanem)
Changes in version 2.0.15-stable (12 Oct 2011)
BUGFIXES (DNS):
o DNS: add ttl for negative answers using RFC 2308 idea. (f72e8f6 Leonid Evdokimov)
o Add DNS_ERR_NODATA error code to handle empty replies. (94fba5b Leonid Evdokimov)
BUFGIXES (bufferevents and evbuffers):
o Make evbuffer callbacks get the right n_added value after evbuffer_add (1ef1f68 Alex)
o Prefer mmap to sendfile unless a DRAINS_TO_FD flag is set. Allows add_file to work with SSL. (0ba0af9)
BUGFIXES (event loop):
o When a signal callback is activated to run multiple times, allow event_base_loopbreak to work even before they all have run. (4e8eb6a)
DOCUMENTATION FIXES:
o Fix docstring in dns.h (2b6eae5 Leonid Evdokimov)
o refer to non-deprecated evdns functions in comments (ba5c27d Greg Hazel)
BUILD AND TESTING FIXES:
o le-proxy and regress depend on openssl directly (9ae061a Sergey Avseyev)
o Use _SOURCES, not _sources, in sample/Makefile.am (7f82382)
o Fixed compiler warnings for unchecked read/write calls. (c3b62fd Mark Ellzey)
o Make write-checking fixes use tt_fail_perror (2b76847)
o Fix some "value never used" warnings with gcc 4.6.1 (39c0cf7)
Changes in version 2.0.14-stable (31 Aug 2011)
BUGFIXES (bufferevents and evbuffers):
o Propagate errors on the underlying bufferevent to the user. (4a34394 Joachim Bauch)
o Ignore OpenSSL deprecation warnings on OS X (5d1b255 Sebastian Hahn)
o Fix handling of group rate limits under 64 bytes of burst (6d5440e)
o Solaris sendfile: correctly detect amount of data sent (643922e Michael Herf)
o Make rate limiting work with common_timeout logic (5b18f13)
o clear read watermark on underlying bufferevent when creating filtering bev to fix potentially failing fragmented ssl handshakes (54f7e61 Joachim Bauch)
BUGFIXES (IOCP):
o IOCP: don't launch reads or writes on an unconnected socket (495c227)
o Make IOCP rate-limiting group support stricter and less surprising. (a98da7b)
o Have test-ratelim.c support IOCP (0ff2c5a)
o Make overlapped reads result in evbuffer callbacks getting invoked (6acfbdd)
o Correctly terminate IO on an async bufferevent on bufferevent_free (e6af35d)
BUGFIXES (other):
o Fix evsig_dealloc memory leak with debugging turned on. (9b724b2 Leonid Evdokimov)
o Fix request_finished memory leak with debugging turned on. (aff6ba1 Leonid Evdokimov)
BUILD AND TESTING FIXES:
o Allow OS-neutral builds for platforms where some versions have arc4random_buf (b442302 Mitchell Livingston)
o Try to fix 'make distcheck' errors when building out-of-tree (04656ea Dave Hart)
o Clean up some problems identified by Coverity. (7c11e51 Harlan Stenn)
Changes in version 2.0.13-stable (18 Jul 2011)
BUGFIXES
o Avoid race-condition when initializing global locks (b683cae)
o Fix bug in SSL bufferevents backed by a bev with a write high-watermarks (e050703 Joachim Bauch)
o Speed up invoke_callbacks on evbuffers when there are no callbacks (f87f568 Mark Ellzey)
o Avoid a segfault when all methods are disabled or broken (27ce38b)
o Fix incorrect results from evbuffer_search_eol(EOL_LF) (4461f1a)
o Add some missing checks for mm_calloc failures (89d5e09)
o Replace an assertion for event_base_free(NULL) with a check-and-warn (09fe97d)
o Report kqueue ebadf, epipe, and eperm as EV_READ events (1fd34ab)
o Check if the `evhttp_new_object' function in `http.c' returns NULL. (446cc7a Mansour Moufid)
o Use the correct printf args when formatting size_t (3203f88)
o Complain if the caller tries to change threading cbs after setting them (cb6ecee)
DOCUMENTATION FIXES AND IMPROVEMENTS
o Revise the event/evbuffer/bufferevent doxygen for clarity and accuracy (2888fac)
o Update Doxyfile to produce more useful output (aea0555)
TEST FIXES
o Fix up test_evutil_snprintf (caf695a)
o Fix tinytest invocation from windows shell (57def34 Ed Day)
BUILD FIXES
o Use AM_CPPFLAGS in sample/Makefile.am, not AM_CFLAGS (4a5c82d)
o Fix select.c compilation on systems with no NFDBITS (49d1136)
o Fix a few warnings on OpenBSD (8ee9f9c Nicholas Marriott)
o Don't break when building tests from git without python installed (b031adf)
o Don't install event_rpcgen.py when --disable-libevent-install is used (e23cda3 Harlan Stenn)
o Fix AIX build issue with TAILQ_FOREACH definition (e934096)
Changes in version 2.0.12-stable (4 Jun 2011)
BUGFIXES
o Fix a warn-and-fail bug in kqueue by providing kevent() room to report errors (28317a0)
o Fix an assert-inducing fencepost bug in the select backend (d90149d)
o Fix failing http assertion introducd in commit 0d6622e (0848814 Kevin Ko)
o Fix a bug that prevented us from configuring IPv6 nameservers. (74760f1)
o Prevent size_t overflow in evhttp_htmlescape. (06c51cd Mansour Moufid)
o Added several checks for under/overflow conditions in evhttp_handle_chunked_read (a279272 Mark Ellzey)
o Added overflow checks in evhttp_read_body and evhttp_get_body (84560fc Mark Ellzey)
DOCUMENTATION:
o Add missing words to EVLOOP_NONBLOCK documentation (9556a7d)
BUILD FIXES
o libssl depends on libcrypto, not the other way around. (274dd03 Peter Rosin)
o Libtool brings in the dependencies of libevent_openssl.la automatically (7b819f2 Peter Rosin)
o Use OPENSSL_LIBS in Makefile.am (292092e Sebastian Hahn)
o Move the win32 detection in configure.in (ceb03b9 Sebastian Hahn)
o Correctly detect openssl on windows (6619385 Sebastian Hahn)
o Fix a compile warning with zlib 1.2.4 and 1.2.5 (5786b91 Sebastian Hahn)
o Fix compilation with GCC 2, which had no __builtin_expect (09d39a1 Dave Hart)
o Fix new warnings from GCC 4.6 (06a714f)
o Link with -lshell32 and -ladvapi32 on Win32. (86090ee Peter Rosin)
o Make the tests build when OpenSSL is not available. (07c41be Peter Rosin)
o Bring in the compile script from automake, if needed. (f3c7a4c Peter Rosin)
o MSVC does not provide S_ISDIR, so provide it manually. (70be7d1 Peter Rosin)
o unistd.h and sys/time.h might not exist. (fe93022 Peter Rosin)
o Make sure TINYTEST_LOCAL is defined when building tinytest.c (8fa030c Peter Rosin)
o Fix winsock2.h #include issues with MSVC (3d768dc Peter Rosin)
o Use evutil_gettimeofday instead of relying on the system gettimeofday. (0de87fe Peter Rosin)
o Always use evutil_snprintf, even if OS provides it (d1b2d11 Sebastian Hahn)
o InitializeCriticalSectionAndSpinCount requires _WIN32_WINNT >= 0x0403. (816115a Peter Rosin)
o cygwin: make it possible to build DLLs (d54d3fc)
Changes in version 2.0.11-stable (27 Apr 2011)
[Autogenerated from the Git log, sorted and cleaned by hand.]
BUGFIXES:
o Fix evport handling of POLLHUP and POLLERR (b42ce4b)
o Fix compilation on Windows with NDEBUG (cb8059d)
o Check for POLLERR, POLLHUP and POLLNVAL for Solaris event ports (0144886 Trond Norbye)
o Detect and handle more allocation failures. (666b096 Jardel Weyrich)
o Use event_err() only if the failure is truly unrecoverable. (3f8d22a Jardel Weyrich)
o Handle resize failures in the select backend better. (83e805a)
o Correctly free selectop fields when select_resize fails in select_init (0c0ec0b)
o Make --enable-gcc-warnings a no-op if not using gcc (3267703)
o Fix a type error in our (unused) arc4random_stir() (f736198)
o Correctly detect and stop non-chunked http requests when the body is too long (63a715e)
o Have event_base_gettimeofday_cached() always return wall-clock time (a459ef7)
o Workaround for http crash bug 3078187 (5dc5662 Tomash Brechko)
o Fix incorrect assertions and possible use-after-free in evrpc_free() (4b8f02f Christophe Fillot)
o Reset outgoing http connection when read data in idle state. (272823f Tomash Brechko)
o Fix subtle recursion in evhttp_connection_cb_cleanup(). (218cf19 Tomash Brechko)
o Fix the case when failed evhttp_make_request() leaved request in the queue. (0d6622e Tomash Brechko)
o Fix a crash bug in evdns server circular list code (00e91b3)
o Handle calloc failure in evdns. (Found by Dave Hart) (364291e)
o Fix a memory leak on win32 socket->event map. (b4f89f0)
o Add a forgotten NULL check to evhttp_parse_headers (12311ff Sebastian Hahn)
o Fix possible NULL-deref in evdns_cancel_request (5208544 Sebastian Hahn)
PORTABILITY:
o Fall back to sscanf if we have no other way to implement strtoll (453317b)
o Build correctly on platforms without sockaddr_storage (9184563)
o Try to build correctly on platforms with no IPv6 support (713c254)
o Build on systems without AI_PASSIVE (cb92113)
o Fix http unit test on non-windows platforms without getaddrinfo (6092f12)
o Do not check for gethostbyname_r versions if we have getaddrinfo (c1260b0)
o Include arpa/inet.h as needed on HPUX (10c834c Harlan Stenn)
o Include util-internal.h as needed to build on platforms with no sockaddr_storage (bbf5515 Harlan Stenn)
o Check for getservbyname even if not on win32. (af08a94 Harlan Stenn)
o Add -D_OSF_SOURCE to fix hpux builds (0b33479 Harlan Stenn)
o Check for allocation failures in apply_socktype_protocol_hack (637d17a)
o Fix the check for multicast or broadcast addresses in evutil_check_interfaces (1a21d7b)
o Avoid a free(NULL) if out-of-memory in evdns_getaddrinfo. Found by Dave Hart (3417f68)
DEFENSIVE PROGRAMMING:
o Add compile-time check for AF_UNSPEC==PF_UNSPEC (3c8f4e7)
BUGS IN TESTS:
o Fix test.sh output on solaris (b4f89b6 Dave Hart)
o Make test-eof fail with a timeout if we never get an eof. (05a2c22 Harlan Stenn)
o Use %s with printf in test.sh (039b9bd)
o Add an assert to appease clang's static analyzer (b0ff7eb Sebastian Hahn)
o Add a forgotten return value check in the unit tests (3819b62 Sebastian Hahn)
o Actually send NULL request in http_bad_request_test (b693c32 Sebastian Hahn)
o add some (void) casts for unused variables (65707d7 Sebastian Hahn)
o Refactor test_getaddrinfo_async_cancel_stress() (48c44a6 Sebastian Hahn)
o Be nice and "handle" error return values in sample code (4bac793 Sebastian Hahn)
o Check return value of evbuffer_add_cb in tests (93a1abb Sebastian Hahn)
o Remote some dead code from dns-example.c (744c745 Sebastian Hahn)
o Zero a struct sockaddr_in before using it (646f9fe Sebastian Hahn)
BUILD FIXES:
o Fix warnings about AC_LANG_PROGRAM usage (f663112 Sebastian Hahn)
o Skip check for zlib if we have no zlib.h (a317c06 Harlan Stenn)
o Fix autoconf bracket issues; make check for getaddrinfo include netdb.h (833e5e9 Harlan Stenn)
o Correct an AM_CFLAGS to an AM_CPPFLAGS in test/Makefile.am (9c469db Dave Hart)
o Fix make distcheck & installation of libevent 1 headers (b5a1f9f Dave Hart)
o Fix compilation under LLVM/clang with --enable-gcc-warnings (ad9ff58 Sebastian Hahn)
FEATURES:
o Make URI parser able to tolerate nonconformant URIs. (95060b5)
DOCUMENTATION:
o Clarify event_set_mem_functions doc (926f816)
o Correct evhttp_del_accept_socket documentation on whether socket is closed (f665924)
o fix spelling mistake in whatsnew-2.0.txt (deb2f73)
o Fix sample/http-server ipv6 fixes (eb692be)
o Comment internal headers used in sample code. (4eb281c)
o Be explicit about how long event loops run in event.h documentation (f95bafb)
o Add comment to configure.in to explain gc-sections test logic (c621359)
o Fix a couple of memory leaks in samples/http-server.c. Found by Dave Hart. (2e9f665)
BUILD IMPROVEMENTS:
o Use the gcc -ffunction-segments feature to allow gc when linking with static libevent (0965c56 Dave Hart)
o Add configure options to disable installation, regression tests (49e9bb7 Dave Hart)
Changes in version 2.0.10-stable (16 Dec 2010)
[Autogenerated from the Git log, sorted and cleaned by hand.]
BUGFIXES
o Minor fix for IOCP shutdown handling fix (2599b2d Kelly Brock)
o Correctly notify the main thread when activating an event from a subthread (5beeec9)
o Reject overlong http requests early when Expect:100-continue is set (d23839f Constantine Verutin)
o EVUTIL_ASSERT: Use sizeof() to avoid "unused variable" warnings with -DNDEBUG. (b63ab17 Evan Jones)
CODE CLEANUPS
o bufferevent-internal.h: Use the new event2/util.h header, not evutil.h (ef5e65a Evan Jones)
o Use relative includes instead of system includes consistently. (fbe64f2 Evan Jones)
o Make whitespace more consistent
TESTING
o tests: Use new event2 headers instead of old compatibility headers. (4f33209 Evan Jones)
DOCUMENTATION
o Document that the cpu_hint is only used on Windows with IOCP for now (57689c4)
o Add stuff to "whats new in 2.0" based on reading include changes since August. (18adc3f)
Changes in 2.0.9-rc (30 Nov 2010):
[Autogenerated from the Git log, sorted and cleaned by hand.]
NEW AND MODIFIED APIs
o Add a function to change a listener's callback. (46ee061)
o Make evbuffer_add_file take ev_off_t, not off_t (ac7e52d)
o Make rate-limits go up to SIZE_MAX/EV_SSIZE_MAX, not just INT32_MAX (2cbb1a1)
o Add a bufferevent_get_base function (aab49b6)
MAJOR BUGFIXES
o Disable changelist for epoll by default because of Linux dup() bug; add an option and/or an envvar to reenable it for speed. (9531763)
o Fix a 100%-CPU bug where an SSL connection would sometimes never stop trying to write (1213d3d)
o Fix a nasty bug related to use of dup() with epoll on Linux (c281aba)
o Fix bugs in posix thread-id calculation when sizeof(pthread_t) != sizeof(long) (fbaf077)
o Fix some ints to evutil_socket_t; make tests pass on win64. (f817bfa Dimitre Piskyulev)
o Set _EVENT_SIZEOF_VOID_P correctly on win32 and win64 (1ae82cd Dimitre Piskyulev)
o Avoid double-invocation of user callback with EVUTIL_EAI_CANCEL (abf01ed)
o Set SO_UPDATE_ACCEPT_CONTEXT on sockets from AcceptEx so that shutdown() can work (52aa419)
o When closing a filtering bufferevent, clear callbacks on the underlying bufferevent (fc7b1b0)
NEW AND MODIFIED HTTP APIs
o Add evhttp_parse_query_str to be used with evhttp_uri_parse. (2075fbc)
o Add evhttp_response_code to remove one more reason to include http_struct.h (22e0a9b)
o Define enumerators for all HTTP methods, including PATCH from RFC5789 (75a7341 Felix Nawothnig)
o Functions to actually use evhttp_bound_socket with/as evconnlistener. (006efa7)
o Add evhttp_request_get_command so code can tell GET from POST without peeking at the struct. (49f4bf7)
o Introduce absolute URI parsing helpers. (86dd720 Pavel Plesov)
o Revise evhttp_uri_parse implementation to handle more of RFC3986 (eaa5f1d)
o Add evhttp_connection_get_base() to get the event_base from an http connection (cd00079)
o Let evhttp_parse_query return -1 on failure (b1756d0)
o New evhttp_uri(encode|decode) functions to handle + and NUL characters right (a8148ce)
o Add evhttp_response_code to remove one more reason to include http_struct.h (22e0a9b)
o Tweak interface for allowed methods (f5b391e)
o Add evhttp server alias interface, correct flagging of proxy requests. (aab8c38 Christopher Davis)
HTTP BUGFIXES
o Add some comments to http.c and make a few functions static. (90b3ed5)
o Fix Content-Length when trying send more than 100GB of data (!) on an evhttp. (525da3e)
o Fix a bug where we would read too much data in HTTP bodies or requests. (58a1cc6)
o Correctly count req->body_size on http usage without Content-Length (8e342e5)
o Avoid missed-request bug when entire http request arrives before data is flushed (74c0e86)
o reset "chunked" flag when sending non-chunked reply (aa5f55f Joachim Bauch)
o evhttp_encode_uri encodes all reserved characters, including !$'()*+,/:=@ (2e63a60)
o Replace exact-version checks for HTTP/1.1 with >= or < checks (647e094)
o evhttp: Return 501 when we get an unrecognized method, not 400. (536311a)
o Don't disable reading from the HTTP connection after sending the request to be notified of connection-close in time (c76640b Felix Nawothnig)
o Never call evhttp_readcb while writing. (0512487)
o Try to fix an assertion failure related to close detection (0faaa39)
o Correctly detect timeouts during http connects (04861d5)
o Preliminary support for Continue expectation in evhttp. (fa9305f Christopher Davis)
OTHER BUGFIXES
o Correct logic for realigning a chain in evbuffer_add (e4f34e8)
o Fix a minor syntax error that most compilers didn't care about (e56ff65)
o Fix some uses of int for socket in regress (5d389dc)
o Check return value for ioctlsocket on win32 (f5ad31c Trond Norbye)
o Fix som event_warns that should have been event_warnx (19c71e7)
o Fix signal handler types for win64. (b81217f)
o Try to clear up more size_t vs int/long issues. (598d133)
o Make sure IOCP evconnlistener uses virtual events. (7b40a00 Christopher Davis)
o Don't free evdns_request handles until after the callback is invoked (9ed30de)
o Fix some more cancel-related bugs in getaddrinfo_async (c7cfbcf)
o Make evdns_getaddrinfo_cancel threadsafe (d51b2fc)
o Only clear underlying callbacks when the user hasn't reset them. (1ac5b23)
o Fix bug in bufferevent_connect on an openssl bufferevent that already had an fd (4f228a1)
o Resolve an evport bug in the thread/forking test (3a67d0b)
o Make sure the CLOEXEC flag is set on fds we open for base notification (3ab578f)
o Fix IRIX build. sa_family collides with a #define in sys/socket.h on IRIX. (e874982 Kevin Bowling)
o If not WIN32, include <sys/socket.h> in event2/util.h. (1cd45e5 Kevin Bowling)
o Fix some C99-style comments to work with the xlC compiler. (c2e5e22 Kevin Bowling)
o Add some checks since lack of TAILQ_FOREACH doesn't imply lack of FIRST, END, NEXT, or INSERT_BEFORE. Quiet some warnings in XL C. (c4dc335 Kevin Bowling)
o Reworked AIX __ss_family workaround to use AC_STRUCT_MEMBER. (2e2a3d7 Kevin Bowling)
o Take select from <sys/select.h> when testing in autoconf. AIX build fix. (a3a9f6b Kevin Bowling)
o Fix snprintf related failures on IRIX. (3239073 Kevin Bowling)
o Remove _event_initialized(); make event_initialized() a function(); make it consistent on windows and non-windows (652024b)
o Do not let EVLOOP_ONCE exit the loop until all deferred callbacks have run (2d5e1bd)
o Make EVLOOP_ONCE ignore internal events (0617a81)
o Possible crash fix when freeing an underlying bufferevent of an openssl bufferevent (29f7623)
HTTP CLEANUPS
o Stop using Libevent-1 headers in regress_http (1f507d7)
o Modernize header usage in bench_http.c (e587069)
o fix signed/unsigned warnings in http.c (74a91e5)
o Update the HTTP regression tests to use Libevent2 apis for non-http stuff (d9ffa89)
o Start porting http tests to not use legacy interfaces (8505a74)
o Convert the rest of the http tests to be non-legacy unit tests. (9bb8239)
o Rename the confusing "base" static variable in regress_http.c (353402a)
o Stop accessing http request struct directly from in the unit tests. (0b137f4)
o Refactor http version parsing into a single function (a38140b)
TESTING
o Improvements to tinytest_macros.h (ad923a1)
o Add a huge pile of tests for the new URI functions, and make them pass. (a5a76e6)
o Unit tests for evhttp_uri_set* (bc98f5e)
o Increase the skew tolerance to 2 seconds in thread/deferred_cb_skew (f806476 Christopher Davis)
o Reorder backends in test.sh to match preference order in event.c (ece974f)
o Add a stress test for getaddrinfo_cancel (da1bf52)
o Units test for unexpected evhttp methods. (75e3320)
DOCUMENTATION
o Document behavior of URI parsing more thoroughly. (3a33462)
o Document that two bufferevent functions only work on socket bufferevents (70e1b60)
o add a requested docstring for event_rpcgen.CommandLine.__init__ (f1250eb)
o Fix a mistake in http documentation found by Julien Blache (229714d)
o Add a basic example of how to write a static HTTP server. (4e794d5)
o Document event_get_assignment (88be27d)
o Note that reentrant calls to libevent from logging cbs may fail badly (e431bcd)
o Clarify EVLOOP_* documentation to be more precise. (057a514)
CLEANUPS
o Simplify the logic for choosing EPOLL_CTL_ADD vs EPOLL_CTL_MOD (2c66983)
o Rename "size" variables in win32select that were really fd counts. (b6a158c)
o Fix even more win64 warnings (7484df6)
o Fix even more win64 warnings: buffer, event_tagging, http, evdns, evrpc (545a611)
o Fix more wn64 warnings. (34b84b9 Christopher Davis)
o Use the label_len local variable in evdns instead of recalculating it over and over (ba01456)
o Fix some irix compilation warnings spotted by Kevin Bowling (7bcace2)
Changes in 2.0.8-rc (14 Oct 2010):
[Autogenerated from the Git log, sorted and cleaned by hand.]
NEW APIS
o Add error callback to evconnlistener (c4be8d8 Simon Perreault)
o Add a LEV_OPT_THREADSAFE option for threadsafe evconnlisteners (127d4f2)
CHANGED BEHAVIOR
o Correct logic on disabling underlying bufferevents when disabling a filter (ac27eb8)
BUGFIXES
o Obey enabled status when unsuspending (040a019 Simon Perreault)
o Warn when using the error-prone EV_SIGNAL interface in an error-prone way. Also, fix a couple of race conditions in signal.c (720bd93)
O Make default signal backend fully threadsafe (95a7d41)
o Put internal events at highest priority (90651b3)
o Fix warnings in the main codebase flagged by -Wsigned-compare (9c8db0, 5e4bafb, 5c214a, 6be589a, e06f514)
o Fix compile in kqueue.c (b395392 Sebastian Hahn)
o Do not search outside of the system directory for windows DLLs (d49b5e3)
o Fix a spurious-call bug on epoll.c (0faaee0)
o Send a shutdown(SHUT_WR) before closing an http connection (e0fd870 Christopher Davis)
o Fix warnings on mingw with gcc 4.5 (5b7a370)
o Fix an EINVAL on evbuffer_write_iovec on OpenSolaris. (fdc640b)
o Fix allocation error for IOCP listeners. Probably harmless, since struct event is big (481ef92)
o Make iocp/listener/error work; don't accept again if lev is disabled. (62b429a Christopher Davis)
o Handle rate-limiting for reading on OpenSSL bufferevents correctly. (819b171)
o Fix serious bugs in per-bufferevent rate-limiting code (34d64f8)
o Avoid spurious reads from just-created open openssl bufferevents (223ee40)
o Fix a case where an ssl bufferevent with CLOSE_ON_FREE didn't close its fd (93bb7d8)
o The corrected bufferevent filter semantics let us fix our openssl tests (34331e4)
TESTING
o Make SSL tests cover enabling/disabling EV_READ. (a5ce9ad)
o Bump to the latest version of tinytest (f0bd83e)
o Unit tests for listener error callbacks (045eef4)
o New unit test for ssl bufferevents starting with connected SSLs. (02f6259)
DEBUGGABILITY
o Make debugging output for epoll backend more comprehensive (ec2b05e)
o Make event.c debugging messages report fds (e119899)
o Make the --enable-gcc-warnings option include signed comparison warnings (d3b096c)
DEADCODE REMOVAL
o Remove the now-useless evsig_caught and evsig_process (4858b79)
o Remove event_base.evsigbase; nothing used it. (38d0960)
Changes in 2.0.7-rc (9 Sep 2010):
[Autogenerated from the Git log, sorted and cleaned by hand.]
NEW APIS
o Expose a evdns_base_nameserver_sockaddr_add() function to add a nameserver by sockaddr (1952143)
o Add event_config_set_num_cpus_hint() for tuning win32 IOCP thread pools, etc. (2447fe8 Christopher Davis)
BUGFIXES
o Fix a nasty dangling-event bug when using rate-limiting groups (0bffe43)
o Clean up syntax on TAILQ_ENTRY() usage to build correctly with recent MSVC (60433a0 Gilad Benjamini)
o Make definition of WIN32_LEAN_AND_MEAN in event.h conditional (3920172 Gilad Benjamini)
o Correctly detect failure to delete bufferevent read-timeout event (da6e7cd)
o Set close-on-exec bit for filedescriptors created by dns subsystem (d0b8843)
o Fix kqueue correctness test on x84_64 (6123d12)
o Detect events with no ev_base; warn instead of crashing (f1074b7)
o Fix an issue with forking and signal socketpairs in select/poll backends (d61b2f3)
o Stop using global arrays to implement the EVUTIL_ctype functions (1fdec20)
o On windows, make lock/thread function tables static (5de2bcb)
o Close th_notify_fds and open a new pair on reinit (495ed66)
o Declare signal handler function as "__cdecl" on Windows (f0056d0)
o Use the _func() replacements for open, fstat, etc in evutil.c on win32 (e50c0fc)
o Only process up to MAX_DEFERRED deferred_cbs at a time (17a14f1 Christopher Davis)
THREADING BUGFIXES
o Avoid deadlock when activating signals (970e6ad)
o Add a condition variable backend, with implementations for pthreads and win32 (d4977b5)
o Use conditions instead of current_event_lock to fix a deadlock (e0972c2)
o Fix logic error in win32 TRY_LOCK that caused problems with rate-limiting (4c32b9d)
o Avoid needlessly calling evthread_notify_base() when the loop is not running (c7a06bf)
o Minimize calls to base_notify implementation functions, thereby avoiding needless syscalls (4632b78)
IOCP BUGFIXES
o IOCP-related evbuffer fixes (03afa20 Christopher Davis)
o Stop IOCP when freeing the event_base (d844242 Christopher Davis)
o Some IOCP bufferevent tweaks (76f7e7a Christopher Davis)
TESTS
o Make the regress_pthread.c tests work on windows with current test APIs (d74ae38)
o Add a unit test for conditions (5fb1095)
o Allow more than one copy of regression tests to run at once (a97320a)
o Fix event_del(0) instance in bench.c (b0f284c Shuo Chen)
o Fix a few memory leaks in the tests (1115366)
o IOCP-related unit test tweaks (499452f Christopher Davis)
o Improve testing of when thread-notification occurs (ce85280)
BUILD AND DISTRIBUTION
o Add pkgconfig files for libevent_{openssl,pthreads} (ebcb1f0)
o Change include order in Makefile.nmake (4022b28)
o Make include/event2/event-config.h not included in source dist (a4af9be)
o Honor NDEBUG; build without warnings with NDEBUG; make NDEBUG always-off in unit test code (743f866)
o Declare evkeyvalq and event_list even if event_struct.h comes before sys/queue.h (d3ceca8)
o Move evkeyvalq into a separate header for evhttp_parse_query users (ca9048f)
o Prefer autoreconf -ivf to manual autogen.sh (7ea8e89)
CLEANUP
o Completely remove the (mostly-removed) obsolete thread functions (3808168)
o Rename regress_pthread.c to regress_thread.c (041989f)
o Make defer-internal.h use lock macros, not direct calls to lock fns (5218d2a)
DOCUMENTATION
o Document that DNS_NO_SEARCH is an obsolete alias for DNS_QUERY_NO_SEARCH (33200e7)
o Update the whatsnew-2.0.txt document (4991669)
Changes in 2.0.6-rc (6 Aug 2010):
[Autogenerated from the Git log, sorted by hand.]
DOCUMENTATION
o Document a change in the semantics of event_get_struct_event_size() (e21f5d1)
o Add a comment to describe our plan for library versioning (9659ece)
o Fix sentence fragment in docs for event_get_struct_event_size() (7b259b6)
NEW FEATURES AND INTERFACE CHANGES
o Remove the obsolete evthread interfaces (c5bab56)
o Let evhttp_send_error infer the right error reasons (3990669)
o Add a function to retrieve the other side of a bufferevent pair (17a8e2d)
o Add bufferevent_lock()/bufferevent_unlock() (215e629)
o Stop asserting when asked for a (unsupported) TCP dns port. Just return NULL. (7e87a59)
o Replace (unused,always 0) is_tcp argument to evdns_add_server_port*() with flags (e1c1167)
o Constify a couple of arguments to evdns_server_request_add_*_reply (cc2379d)
o Add an interface to expose min_share in ratelimiting groups (6ae53d6)
BUGFIXES
o Avoid event_del on uninitialized event in event_base_free (6d19510)
o Add some missing includes to fix Linux build again (75701e8)
o Avoid close of uninitialized socket in evbuffer unit test (bda21e7)
o Correctly recognize .255 addresses as link-local when looking for interfaces (8c3452b)
o If no evdns request can be launched, return NULL, not a handle (b14f151)
o Use generic win32 interfaces, not ASCII-only ones, where possible. (899b0a3)
o Fix the default HTTP error template (06bd056 Felix Nawothnig)
o Close the file in evutil_read_file whether there's an error or not. (0798dd1 Pierre Phaneuf)
o Fix possible nullptr dereference in evhttp_send_reply_end() (29b2e23 Felix Nawothnig)
o never let bufferevent_rlim functions return negative (0859870)
o Make sample/hello_world work on windows (d89fdba)
o Fix a deadlock related to event-base notification. Diagnosed by Zhou Li, Avi Bab, and Scott Lamb. (17522d2)
o Possible fix to 100% cpu usage with epoll and openssl (cf249e7 Mike Smellie)
o Don't race when calling event_active/event_add on a running signal event (fc5e0a2)
o Suppress a spurious EPERM warning in epoll.c (e73cbde)
o Fix wrong size calculation of iovec buffers when exact=1 (65abdc2 niks)
o Change bufferevent_openssl::do_write so it doesn't call SSL_write with a 0 length buffer (c991317 Mike Smellie)
o Fixed compilation of sample/le-proxy.c on win32 (13b912e Trond Norbye)
o Fix rate-limit calculation on openssl bufferevents. (009f300)
o Remember to initialize timeout events for bufferevent_async (de1f5d6 Christopher Davis)
BUILD AND DISTRIBUTION CHANGES
o Test the unlocked-deferred callback case of bufferevents (dfb75ab)
o Remove the now-unusable EVTHREAD_LOCK/UNLOCK constants (fdfc3fc)
o Use -Wlogical-op on gcc 4.5 or higher (d14bb92)
o Add the libtool-generated /m4/* stuff to .gitignore (c21c663)
o Remove some automake-generated files from version control. (9b14911)
o Have autogen.sh pass --force-missing to automake (8a44062)
o Set library version for libevent_pthreads correctly (b2d7440)
o Really only add libevent_core.la to LIBADD on mingw (1425003 Sebastian Hahn)
o Build more cleanly with NetBSDs that dislike toupper(char) (42a8c71)
o Fix unit tests with -DUSE_DEBUG enabled (28f31a4)
o Fix evdns build with -DUNICODE (5fa30d2)
o Move event-config.h to include/event2 (ec347b9)
TESTING
o Add options to test-ratelim.c to check its results (2b44dcc)
o Make test-ratelim clean up after itself better. (b5bfc44)
o Remove the now-obsolete setup_test() and cleanup_test() functions (e73f1d7)
o Remove all non-error prints from test/regress.c (8bc1e3d)
o Make test.sh exit with nonzero status if tests fail (faf2a04)
o Have the unit tests report errors from test.sh (3689bd2)
o Fix logic in correcting high values from FIONREAD (3467f2f)
o Add test for behavior on remote socket close (44d57ee)
o Unit test for event_get_struct_event_size() (7510aac)
o Make test/test.sh call test-changelist (7c92691)
o Fix badly-behaved subtest of dns/bufferevent_connect_hostname (840a72f Joachim Bauch)
o Add option to test-ratelim to test min_share (42f6b62)
o Fix an assertion bug in test-ratelim (b2c6202)
o Make tests quieter on local dns resolver failure (e996b3d)
o Increase the tolerance in our unit tests for sloppy clocks. (170ffd2)
o Use AF_INET socketpair to test sendfile on Solaris (9b60209)
o Make test-changelist count cpu usage right on win32 (ea1ea3d)
INTERNALS, PERFORMANCE, AND CODE CLEANUPS
o Mark the event_err() functions as __attribute__((noreturn)) (33bbbed)
o Do not check that event_base is set in EVBASE_ACQUIRE_LOCK (218a3c3)
o Replace (safe) use of strcpy with memcpy to appease OpenBSD (caca2f4)
o Remove some dead assignments (47c5dfb)
o Fix a pedantic gcc 4.4 warning in event2/event.h (276e7ee)
o Drain th_notify_fd[0] more bytes at a time. (a5bc15b)
o Tidy up the code in evthread_make_base_notifiable a little (61e1eee)
o Pass flags to fcntl(F_SETFL) and fcntl(F_SETFD) as int, not long (7c2dea1)
o Remove unused variables in test/test-changelist.c (b00d4c0)
o Fix whitespace. (cb927a5)
o Improve error message for failed epoll to make debugging easier. (9e725f7)
o Turn our socketpair() replacement into its own function (57b30cd)
Changes in 2.0.5-beta (10 May 2010):
[Autogenerated from the Git log, sorted by hand.]
DOCUMENTATION
o Update all our copyright notices to say "2010" (17efc1c)
o Add Christopher Clark and Maxim Yegorushkin to the LICENSE file (38b7b57)
o Clarify Christopher Clark's status as writer of original ht code. (78772c3)
o Try to comment some of the event code more (cdd4c49)
o Add a few more evmap/changelist comments (c247adc)
o Add a comment to explain why evdns_request is now separte from request (ceefbe8)
o Document evutil_secure_rng_init() and evutil_secure_rng_add_bytes() (a5bf43a)
o Stop distributing and installing manpages: they were too inaccurate (7731ec8)
NEW FEATURES AND INTERFACE CHANGES
o Remove signal_assign() and signal_new() macros. (2fac0f7)
o Make evdns use the regular logging system by default (b2f2be6)
o Allow evbuffer_read() to split across more than 2 iovecs (e470ad3)
o Functions to manipulate existing rate limiting groups. (ee41aca)
o Functions to track the total bytes sent over a rate limit group. (fb366c1)
o Detect and refuse reentrant event_base_loop() calls (b557b17)
o Limit the maximum number of events on each socket to 65535 (819f949)
o Add evbuffer_copyout to copy data from an evbuffer without draining (eb86c8c)
o Expose the request and reply members of rpc_req_generic() (07edf78 Shuo Chen)
o Add void* arguments to request_new and reply_new evrpc hooks (755fbf1 Shuo Chen)
o Seed the RNG using sysctl() as well as /dev/urandom (71fc3eb)
o Make evutil_secure_rng_init() work even with builtin arc4random (f980716)
o Report DNS error when lookup fails during bufferevent_socket_connect_hostname. (0ef4070 Christopher Davis)
o Release locks on bufferevents while executing callbacks (a5208fe Joachim Bauch) o Make debug mode catch mixed ET and non-ET events on an fd (cb67074)
o Catch attempts to enable debug_mode too late (9ecf0d4)
o Refuse null keys in evhttp_parse_query() (953e229 Frank Denis)
BUGFIXES
o Avoid a spurious close(-1) on Linux (70a44b6)
o Do not close(-1) when freeing an uninitialized socket bufferevent (b34abf3)
o Free evdns_base->req_heads on evdns_base_free (859af67)
o Avoid an (untriggerable so far) crash bug in bufferevent_free() (0cf1431)
o Set mem_offset for every bufferevent type (657d1b6)
o Fix infrequent memory leak in bufferevent_init_common(). (8398641 Jardel Weyrich)
o Make evutil_signal_active() match declaration. (e1e703d Patrick Galbraith)
o Fix minheap code to use replacement malloc functions (a527618)
o Fix a free(NULL) in minheap-internal.h (6f20492)
o Fix critical bug in evbuffer_write when writev is not available (cda56ab)
o Make the no_iovecs case of write_atmost compile (8e227b0)
o Fix a memory leak when appending/prepending to a buffer with unused space. (45068a3)
o Clean up a mistake in pointer manipulation in evbuffer_remove (28bfed4 Christopher Davis)
o Always round up when there's a fractional number of msecs. (8f9e60c Christopher Davis)
o Fix compiler warnings under WIN32 (d469c50 Giuseppe Scrivano)
o Clean up properly when adding a signal handler fails. (b84b598 Gilad Benjamini) o Ensure that evdns_request is a persistent handle. (15bb82d Christopher Davis)
o Free search state when finished searching to avoid an infinite loop. (a625840 Christopher Davis)
o Assert for valid requests as necessary. (67072f3 Christopher Davis)
o do not leak the request object on persistent connections (9d8edf2)
o Make evdns logging threadsafe (b1c7950)
o Fix a couple of bugs in the BSD sysctl arc4seed logic (a47a4b7)
o Remove one last bug in last_with_datap logic. Found with valgrind (d49b92a)
o fix a leak when unpausing evrpc requests (94ee125)
o Fix a memory leak when unmarshalling RPC object arrays (f6ab2a2)
o Fix compilation when openssl support is disabled (40c301b)
o Allow empty reason line in HTTP status (739e688 Pierre Phaneuf)
o Fix a compile warning introduced in 739e688 (bd1ed5f Sebastian Hahn)
o Fix nonstandard TAILQ_FOREACH_REVERSE() definition (71afc52 Frank Denis)
o Try /proc on Linux as entropy fallback; use sysctl as last resort (20fda29)
o Fix symbol conflict between mm_*() macros and libmm (99e50e9)
o Fix some crazy macro mistakes in arc4random.c (90d4225)
o Make evbuffer_add_file() work on windows (dcdae6b)
o Fix unused-variable warning when building with threads disabled (ad811cd)
o Numerous opensolaris compilation fixes (c44de06)
o Fix getaddrinfo with protocol unset on Solaris 9. Found by Dagobert Michelsen (2cf2a28)
o Fix another nasty solaris getaddrinfo() behavior (3557071)
o Define _REENTRANT as needed on Solaris, elsewhere (c1cd32a)
o Fix some autoconf issues on OpenBSD (7c519df)
BUILD AND DISTRIBUTION CHANGES
o Distribute libevent.pc.in, not libevent.pc (22aff04)
o Avoid errors in evutil.c when building with _UNICODE defined (b677032 Brodie Thiesfield)
o Avoid errors in http.c when building with VC 2003 .NET (13e4f3b Brodie Thiesfield)
o Support the standard 'make check' target in place of 'make verify' (426c8fb)
o Remove redundant stuff from EXTRA_DIST (b660edf)
o Switch to using AM conditionals in place of AC_LIBOBJ (2e898f5)
o Remove an orphaned RELEASE flag in Makefile.am (0794b0d)
o Give a better warning for bad automake versions. (77c917d)
o Use dist_bin_SCRIPTS, not EXTRA_DIST, to distribute scripts (9eb2fd7)
o Never test for select() on windows (3eb044d Trond Norbye)
o Do not inhibit automake dependencies generation (10c4c90 Giuseppe Scrivano)
o Create shared libraries under Windows (3cbca86 Giuseppe Scrivano)
o Add ctags/etags files to .gitignore (0861d17)
o Only specify -no-undefined on mingw (25433b9)
o Only add libevent_core.la to LIBADD on mingw (fdc6297)
TESTING
o Get bench_http to work on Windows; add a switch to enable IOCP. (4ac38a5 Christopher Davis)
o VC has no getopt(), so do without in bench_http. (1273d2f Christopher Davis)
o Fix an obnoxious typo in the bufferevent_timeout_filter test (0d047c3)
o Fix a write of uninitialized RAM in regression tests (68dc742)
o Fix some memory leaks in the unit tests (274a7bd)
o Make 'main/many_events' test 70 fds, not 64. (33874b0)
o Unit-test every evbuffer_add_file() implementation. (06a4443)
o Add more unit tests for evbuffer_expand (8c83e99)
o Test another case of evbuffer_prepend (1234b95)
o Fix a possible double-free bug in SSL bufferevents with CLOSE_ON_FREE (7501895) o Add dns/search_cancel unit test. (39b870b Christopher Davis)
o Make http_base_test stop leaking an event_base. (96730d3)
o Detect broken unsetenv at unit-test runtime (f37cd4c)
o Implement regress_make_tempfile on win32 to test evbuffer_add_file (b4f12a1)
o add more (currently skipped) add_file tests on win32 (05de45d)
o Fix bench_http build on win32. (384d124)
o Make unit test for add_file able to tell "error" from "done" (88a543f)
o Make test for bufferevent_connect_hostname system-neutral (f89168e)
o Make test.sh support mingw/msys on win32 (0ee6f6c)
o Fix test.sh on freebsd (3d9e05b)
INTERNALS, PERFORMANCE, AND AND CODE CLEANUPS
o Improve the speed of evbuffer_readln() (cc1600a)
o more whitespace normalization (2c2618d)
o Revise evbuffer to add last_with_data (2a6d2a1)
o Use last_with_data in place of previous_to_last (c8ac57f)
o Remove previous_to_last from evbuffer (6f47bd1)
o Fix last_with_data compilation on windows (1e7b986)
o Add some glass-box tests for the last_with_data code. (17da042)
o Improve robustness for refcounting (f1bc125)
o Remove a needless min_heap_shift_up_() call (7204b91)
o Increase MIN_BUFFER_SIZE to 512 (1024 on 64-bit) (2014ae4)
o Do not use evbuffer_expand() to add the first chain to a buffer (5c0ebb3)
o Make evbuffer_prepend handle empty buffers better (c87272b)
o Replace last_with_data with a slightly smarter version (b7442f8)
o Turn the increasingly complex *_CHAIN() macros into functions (96865c4)
o Rewrite evbuffer_expand and its users (d5ebcf3)
o Add evutil_tv_to_msec for safe conversion of timevals to milliseconds. (850c3ff Christopher Davis)
o Initialize last_with_datap correctly in evbuffer_overlapped (a0983b6)
o Replace EVUTIL_CLOSESOCKET macro with a function (899c1dc Sebastian Sjöberg)
o Move domain search state to evdns_request. (beaa14a Christopher Davis)
o Remove redundant checks for lock!=NULL before calling EVLOCK_LOCK (50ec59f)
o Rename current_base symbol to event_global_current_base_ (c16e684)
o Fix whitespace in evutil.c (935e150)
o Replace users of "int fd" with "evutil_socket_t fd" in portable code (c7cf6f0)
Changes in 2.0.4-alpha (28 Feb 2010):
[Autogenerated from the Git log, sorted by hand.]
DOCUMENTATION
o Add stub header for 2.0.4-alpha changelog. (94d0065)
o Improve the README with more information and links. (0b42726)
o Add more people who wrote patches to the acknowledgments (0af10d5)
o Add a warning about the use of event_initialized. (f32b575)
o Add a LICENSE file so people can find our license easily (7067006)
o Add a new "hello world" sample program (becb9f9)
o Clarify status of example programs (d60a1bd)
o Update time-test.c to use event2 (f4190bf)
o Add the arc4random.c license to the LICENSE file. (e15e1e9)
NEW FEATURES AND INTERFACE CHANGES
o Improved optional lock debugging. (0cd3bb9)
o Rate-limiting for bufferevents; group and individual limits are supported. (737c9cd)
o Testing code for bufferevent rate-limiting. (f0c0124)
o Make the initial nameserver probe timeout configurable. (1e56a32)
o Revise the locking API: deprecate the old locking callbacks and add trylock. (347952f)
o Do not make bufferevent_setfd implicitly disable EV_READ and EV_WRITE. (8274379)
o Do not ignore bufferevent_enable(EV_READ) before bufferevent_connect(). (4a5b534)
o Introduced evutil_make_socket_closeonexec() to preserve fd flags for F_SETFD. (d0939d2 Jardel Weyrich)
o evdns_getaddrinfo() now supports the /etc/hosts file. (72dd666)
o Look at the proper /etc/hosts file on windows. (66c02c7)
o Allow http connections to use evdns for hostname looksups. (c698b77)
o Changelist code to defer event changes until just before dispatch (27308aa)
o do not use a function to assign the evdns base; instead assign it via evhttp_connection_base_new() which is a new function introduced in 2.0 (5032e52)
o Functions to access more fields of struct event. (0683950)
o Make kqueue use changelists. (45e5ae3)
o Remove kqueue->pend_changes. (3225dfb)
o Minimize epoll_ctl calls by using changelist (c8c6a89)
o Add support for a "debug mode" to try to catch common errors. (cd17c3a)
o Note a missing ratelim function (361da8f)
o Add ev_[u]intptr_t to include/event2/util.h (1fa4c81)
o const-ify a few more functions in event.h (d38a7a1)
o Deprecate EVENT_FD and EVENT_SIGNAL. (f6b2694)
o Remove EVUTIL_CHECK_FMT. (6c21c89)
o Add EV_*_MAX macros to event2/util.h to expose limits for ev_* types. (aba1fff) o Functions to view and manipulate rate-limiting buckets. (85047a6)
o Add the rest of the integer limits, and add a test for them. (60742d5)
o Remove the 'flags' argument from evdns_base_set_option() (1dd7e6d)
o Add an arc4random implementation for use by evdns (d4de062)
o Use off_t for the length parameter of evbuffer_add_file (3fe60fd)
o Construct Windows locks using InitializeCriticalSectionAndSpinCount (32c6f1b)
o Expose view of current rate limit as constrained by group limit (162ce8a)
o Provide consistent, tested semantics for bufferevent timeouts (d328829)
BUGFIXES AND TESTS
o Tolerate code that returns from a fatal_cb. (91fe23f)
o Parenthesize macro arguments more aggressively (07e9e9b)
o Fix memory-leak of signal handler array with kqueue. (e1ffbb8)
o Stop passing EVTHREAD_READ and EVTHREAD_WRITE to non-rw locks. (76cd2b7)
o Fix two use-after-free bugs in unit tests spoted by lock debugging (d84d838)
o Fix a locking bug in event_base_loop() (da1718b)
o Fix an evdns lock violation. (2df1f82 Zhuang Yuyao)
o Valgrind fix: Clear struct kevent before checking for OSX bug. (56771a3 William Ahern)
o Fix up evthread compilation on windows (bd6f1ba Roman Puls)
o Fix regress_iocp.c usage of old lock allocation macros. (31687b4 unknown)
o Update nmake makefile to build evthread.c (b62d979 unknown)
o Fix a crash when reading badly formatted resolve.conf; from Yasuoka Masahiko (6c7c579 Yasuoka Masahiko)
o Fix a snow leopard compile warning in the unit tests. (7ae9445)
o Fix compile on Snow Leopard with gcc warnings enabled (70cdfe4 Sebastian Hahn)
o Only define _GNU_SOURCE if it is not already defined. (ea6b1df Joachim Bauch)
o Update sample/signal-test.c to use newer APIs and not leak. (f6430ac Evan Jones)
o Fix a segfault when writing a very fragmented evbuffer onto an SSL (a6adeca Joachim Bauch)
o Fix a segfault when freeing SSL bufferevents in an unusual order (a773df5 Joachim Bauch)
o Drop install-sh from our git repo: a mismatched version could break "make dist" (6799527)
o Set all instances of the version number correctly. (5a112d3)
o Fix a few locking issues on windows. (c51bb3c unknown)
o Use evutil_socket_t, not int, when logging socket errors. (292467c)
o Fix up behavior of never-defered callbacks a little (390e056)
o Replace some cases of uint32_t with ev_uint32_t. (a47d88d)
o Fix compilation of devpoll.c by adding missing thread includes. (fee2c77 Dagobert Michelsen)
o Make evutil_make_socket_nonblocking() leave any other flags alone. (4c8b7cd Jardel Weyrich)
o Fix an fd leak in evconnlistener_new_bind(). (24fb502 Jardel Weyrich)
o Fix a bogus free in evutil_new_addrinfo() (0d64051 Jardel Weyrich)
o Adjusted fcntl() retval comparison on evutil_make_socket_nonblocking(). (4df7dbc Jardel Weyrich)
o Fix the code that allowed DNS options to not end with : (ee4953f)
o Fix crash bugs when a bufferevent's eventcb is not set. (2e8eeea)
o Fix test-ratelim compilation on Linux. (885b427)
o Fix compilation of rate-limiting code on win32. (165d30e)
o Eradicated the last free() call. Let mm_free() take care of deallocation. (0546ce1 Jardel Weyrich)
o Fix byte counts when mixing deferred and non-deferred evbuffer callbacks. (29151e6)
o Fixed a memory leak on windows threads implementation. The CRITICAL_SECTION was not being free'd in evthread_win32_lock_free(). (2f33e00 Jardel Weyrich)
o Fixed a fd leak in start_accepting(), plus cosmetic changes (4367a33 Jardel Weyrich)
o Improved error handling in evconnlistener_new_async(). Also keeping the fd open because it is not opened by this function, so the caller is responsible for closing it. Additionally, since evconnlistener_new_bind() creates a socket and passes it to the function above, it required error checking to close the same socket. (fec66f9 Jardel Weyrich)
o Don't use a bind address for nameservers on loopback (8d4aaf9)
o Fix compilation of rate-limit code when threading support is disabled (97a8c79)
o Detect setenv/unsetenv; skip main/base_environ test if we can't fake them. (7296971)
o Check more internal event_add() calls for failure (ff3f6cd)
o Fix windows and msvc build (5c7a7bc)
o Call event_debug_unassign on internal events (a19b4a0)
o Try to fix a warning in hash_debug_entry (137f2c6)
o Fix a dumb typo in ev_intptr_t definitions. (27c9a40)
o do not fail while sending on http connections the client closed. (93d7369)
o make evhttp_send() safe against terminated connections, too (3978180)
o Make Libevent 1.4.12 build on win32 with Unicode enabled. (000a33e Brodie Thiesfield)
o Fix some additional -DUNICODE issues on win32. (a7a9431)
o Add a check to make soure our EVUTIL_AI flags do not conflict with the native ones (c18490e)
o Always use our own gai_strerror() replacement. (6810bdb)
o Make RNG work when we have arc4random() but not arc4random_buf() (4ec8fea)
o validate close cb on server when client connection closes (2f782af)
o Fix two unlocked reads in evbuffer. (7116bf2)
o When working without a current event base, don't try to use IOCP listeners (cb52838)
o Fix getpid() usage on Windows (ff2a134)
o Add a unit test for secure rng. (48a29b6)
o Add some headers to fix freebsd compilation (b72be50)
o When connect() succeeds immediately, don't invoke the callback immediately. (7515de9)
o Suspend read/write on bufferevents during hostname lookup (db08f64)
o Make bufferevent_free() clear all callbacks immediately. (b2fbeb3)
o Fix some race conditions in persistent events and event_reinit (e2642f0)
o Fix a bug in resetting timeouts on persistent events when IO triggers. (38ec0a7)
o Add a test for timeouts on filtering bufferevents. (c02bfe1)
o Add test for periodic timers that get activated for other reasons (8fcb7a1)
o Use new timeval diff comparison function in bufferevent test (f3dfe46)
o Delete stack-alloced event in new unit test before returning. (7ffd387)
o Fix mingw compilation (23170a6)
o Try to define a sane _EVENT_SIZEOF_SIZE_T for msvc compilation (1e14f82)
o Fix arc4random compilation on MSVC. (98edb89)
o deal with connect() failing immediately (7bc48bf)
o Small cleanups on freebsd-connect-refused patch. (57b7248)
BUILD AND DISTRIBUTION CHANGES
o Remove the contents of WIN32-Prj as unmaintained. (c69d5a5)
o Allow the user to redirect the verbose output of test/test.sh to a file (c382de6)
o Allow test.sh to be run as ./test/test.sh (7dfbe94)
o Never believe that we have pthreads on win32, even if gcc thinks we do. (78ed097)
o Make it compile under gcc --std=c89. (e2ca403)
o Fix a number of warnings from gcc -pedantic (918e9c5)
o Add the msvc-generated .lib files to .gitignore. (e244a2e)
o Add the "compile" script to gitignore. (1ba6bed)
INTERNALS AND CODE CLEANUPS
o Add a .gitignore file. (ba34071)
o New EVTHREAD_TRY_LOCK function to try to grab a lock. (689fc09)
o Add the abilitity to mark some buffer callbacks as never-deferred. (438f9ed)
o Refactor our 'suspend operation' logic on bufferevents. (0d744aa)
o Simplify the read high-watermark checking. (5846bf6)
o Improve readability of evutil_unparse_protoname() (5a43df8 Jardel Weyrich)
o Expose our cached gettimeofday value with a new interface (47854a8)
o Whitespace fixes in test.sh (0b151a9)
o Enable branch-prediction hints with EVUTIL_UNLIKELY. (eaaf27f)
o Refactor code from evdns into a new internal "read a file" function. (0f7144f)
o Comestic changes in evconnlistener_new(), new_accepting_socket(), accepted_socket_invoke_user_cb() and iocp_listener_enable(). (510ab6b Jardel Weyrich)
o Add unit-test for bad_request bug fixed in 1.4 recently. (6cc79c6 Pavel Plesov) o Add a comment on evthread_enable_lock_debuging. (b9f43b2)
o Fix test.sh on shells without echo -n (94131e9)
o More unit tests for getaddrinfo_async: v4timeout and cancel. (a334b31)
o Make http use evconnlistener. (ec34533)
o move dns utility functions into a separate file so that we can use them for http testing (b822639)
o add a test for evhttp_connection_base_new with a dns_base (26714ca)
o forgot to add void to test function (78a50fe)
o Add a forgotten header (changelist-internal.h) (4b9f307)
o Remove some commented-out code in evutil (26e1b6f)
o Remove a needless include of rpc_compat.h (70a4a3e)
o Use less memory for each entry in a hashtable (a66e947)
o Try to untangle the logic in server_port_flush(). (439aea0)
o Use ev_[u]intptr_t types in place of [u]intptr_t (cef61a2)
o Reduce windows header includes in our own headers. (da6135e)
o clean up terminate_chunked test (e8a9782)
o Increment the submicro version number. (63e868e)
o Update event-config.h version number to match configure.in (aae7db5)
o Clean up formatting: Disallow space-before-tab. (8fdf09c)
o Clean up formatting: use tabs, not 8-spaces, to indent. (e5bbd40)
o Clean up formatting: remove trailing spaces (e5cf987)
o Clean up formatting: function/keyword spacing consistency. (4faeaea)
Changes in 2.0.3-alpha (20 Nov 2009):
o Add a new code to support SSL/TLS on bufferevents, using the OpenSSL library (where available).
o Fix a bug where we didn't allocate enough memory in event_get_supported_methods().
o Avoid segfault during failed allocation of locked evdns_base. (Found by Rocco Carbone.)
o Export new evutil_ascii_* functions to perform locale-independent character type operations.
o Try to compile better with MSVC: patches from Brodie Thiesfield
o New evconnlistener_get_fd function to expose a listener's associated socket.
o Expose an ev_socklen_t type for consistent use across platforms.
o Make bufferevent_socket_connect() work when the original fd was -1.
o Fix a bug in bufferevent_socket_connect() when the connection succeeds too quickly.
o Export an evutil_sockaddr_cmp() to compare to sockaddr objects for equality.
o Add a bufferevent_get_enabled() to tell what a bufferevent has been configured to do.
o Add an evbuffer_search_eol() function to locate the end of a line nondestructively.
o Add an evbuffer_search_range() function to search a bounded range of a buffer.
o Fix a rare crash bug in evdns.
o Have bufferevent_socket_connect() with no arguments put a bufferevent into connecting mode.
o Support sendfile on Solaris: patch from Caitlin Mercer.
o New functions to explicitly reference a socket used by an evhttp object. Patches from David Reiss.
o When we send a BEV_EVENT_CONNECTED to indicate connected status, we no longer invoke the write callback as well unless we actually wrote data too.
o If the kernel tells us that there are a negative number of bytes to read from a socket, do not believe it. Fixes bug 2841177; found by Alexander Pronchenkov.
o Do not detect whether we have monotonic clock support every time a new event base is created: instead do it only once. Patch taken from Chromium.
o Do not allocate the maximum event queue for the epoll backend at startup. Instead, start out accepting 32 events at a time, and double the queue's size when it seems that the OS is generating events faster than we're requesting them. Saves up to 374K per epoll-based event_base. Resolves bug 2839240.
o Treat an event with a negative fd as valid but untriggerable by Libevent. This is useful for applications that want to manually activate events.
o Fix compilation on Android, which forgot to define fd_mask in its sys/select.h
o Do not drop data from evbuffer when out of memory; reported by Jacek Masiulaniec
o New event_base_got_exit() and event_base_got_break() functions to tell whether an event loop exited because of an event_base_loopexit() or an event_base_loopbreak(). Patch from Ka-Hing Cheung.
o When adding or deleting an event from a non-main thread, only wake up the main thread when its behavior actually needs to change.
o Fix some bugs when using the old evdns interfaces to initialize the evdns module.
o Detect errors during bufferevent_connect(). Patch from Christopher Davis.
o Fix compilation for listener.h for C++ - missing extern "C". Patch from Ferenc Szalai.
o Make the event_base_loop() family of functions respect thread-safety better. This should clear up a few hard-to-debug race conditions.
o Fix a bug when using a specialized memory allocator on win32.
o Have the win32 select() backend label TCP-socket-connected events as EV_WRITE, not EV_READ. This should bring it in line with the other backends, and improve portability. Patch from Christopher Davis.
o Stop using enums as arguments or return values when what we mean is a bitfield of enum values. C++ doesn't believe that you can OR two enum values together and get another enum, and C++ takes its typing seriously. Patch from Christopher Davis.
o Add an API to replace all fatal calls to exit() with a user-provided panic function.
o Replace all assert() calls with a variant that is aware of the user-provided logging and panic functions.
o Add a return value to event_assign so that it can fail rather than asserting when the user gives it bad input. event_set still dies on bad input.
o The event_base_new() and event_base_new_with_config() functions now never call exit() on failure. For backward "compatibility", event_init() still does, but more consistently.
o Remove compat/sys/_time.h. It interfered with system headers on HPUX, and its functionality has been subsumed by event2/util.h and util-internal.h.
o Add a new bufferevent_socket_connect_hostname() to encapsulate the resolve-then-connect operation.
o Build kqueue.c correctly on GNU/kFreeBSD platforms. Patch pulled upstream from Debian.
o Alternative queue-based timeout algorithm for programs that use a large number of timeouts with the same value.
o New event_base_config option to disable the timeval cache entirely.
o Make EV_PERSIST timeouts more accurate: schedule the next event based on the scheduled time of the previous event, not based on the current time.
o Allow http.c to handle cases where getaddrinfo returns an IPv6 address. Patch from Ryan Phillips.
o Fix a problem with excessive memory allocation when using multiple event priorities.
o Default to using arc4random for DNS transaction IDs on systems that have it; from OpenBSD.
o Never check the environment when we're running setuid or setgid; from OpenBSD.
o Options passed to evdns_set_option() no longer need to end with a colon.
o Add an evutil_getaddrinfo() function to clone getaddrinfo on platforms that don't have it.
o Add an evdns_getaddrinfo() function to provide a nonblocking getaddrinfo using evdns, so programs can perform useful hostname lookup.
o Finally expose the IOCP-based bufferevent backend. It passes its unit tests, but probably still has some bugs remaining. Code by Nick Mathewson and Christopher Davis.
o Numerous other bugfixes.
o On FreeBSD and other OSes, connect can return ECONREFUSED immediately; instead of failing the function call, pretend with faileld in the callback.
o Fix a race condition in the pthreads test case; found by Nick Mathewson
o Remove most calls to event_err() in http and deal with memory errors instead
Changes in 2.0.2-alpha (25 Jul 2009):
o Add a new flag to bufferevents to make all callbacks automatically deferred.
o Make evdns functionality locked, and automatically defer dns callbacks.
o Fix a possible free(NULL) when freeing an event_base with no signals.
o Add a flag to disable checking environment varibles when making an event_base
o Disallow setting less than 1 priority.
o Fix a bug when removing a timeout from the heap. [Patch from Marko Kreen]
o Use signal.h, not sys/signal.h. [Patch from mmadia]
o Try harder to build with certain older c99 compilers.
o Make sure that an event_config's flags field is always initialized to 0. [Bug report from Victor Goya]
o Avoid data corruption when reading data entirely into the second-to-last chain of an evbuffer. [Bug report from Victor Goya]
o Make sendfile work on FreeBSD
o Do not use vararg macros for accessing evrpc structures; this is not backwards compatible, but we did not promise any backwards compatibility for the rpc code.
o Actually define the event_config_set_flag() function.
o Try harder to compile with Visual C++.
o Move event_set() and its allies to event2/event_compat.h where they belong.
o Remove the event_gotsig code, which has long been deprecated and unused.
o Add an event_get_base() function to return the base assigned to an event.
o New function to automate connecting on a socket-based bufferevent.
o New functions to automate listening for incoming TCP connections.
o Do case-insensitive checks with a locale-independent comparison function.
o Rename the evbuffercb and everrorcb callbacks to bufferevent_data_cb and bufferevent_event_cb respectively. The old names are available in bufferevent_compat.h.
o Rename the EVBUFFER_* codes used by bufferevent event callbacks to BEV_EVENT_*, to avoid namespace collision with evbuffer flags. The old names are available in bufferevent_compat.h.
o Move the EVBUFFER_INPUT and EVBUFFER_OUTPUT macros to bufferevent_compat.h
o Add a bufferevent_getfd() function to mirror bufferevent_setfd()
o Make bufferevent_setfd() return an error code if the operation is not successful.
o Shave 22 bytes off struct event on 32-bit platforms by shrinking and re-ordering fields. The savings on 64-bit platforms is likely higher.
o Cap the maximum number of priorities at 256.
o Change the semantics of evbuffer_cb_set_flags() to be set-flag only; add a new evbuffer_cb_clear_flags() to remove set flags.
o Change the interface of evbuffer_add_reference so that the cleanup callback gets more information
o Revise the new evbuffer_reserve_space/evbuffer_commit_space() interfaces so that you can use them without causing extraneous copies or leaving gaps in the evbuffer.
o Add a new evbuffer_peek() interface to inspect data in an evbuffer without removing it.
o Fix a deadlock when suspending reads in a bufferevent due to a full buffer. (Spotted by Joachim Bauch.)
o Fix a memory error when freeing a thread-enabled event base with registered events. (Spotted by Joachim Bauch.)
o Try to contain degree of failure when running on a win32 version so heavily firewalled that we can't fake a socketpair.
o Activate fd events in a pseudorandom order with O(N) backends, so that we don't systematically favor low fds (select) or earlier-added fds (poll, win32).
o Replace some read()/write() instances with send()/recv() to work properly on win32.
o Set truncated flag correctly in evdns server replies.
o Raise RpcGenError in event_rpcgen.py; from jmanison and Zack Weinberg
o Fix preamble of rpcgen-generated files to rely on event2 includes; based on work by jmansion; patch from Zack Weinberg.
o Allow specifying the output filename for rpcgen; based on work by jmansion; patch from Zack Weinberg.
o Allow C identifiers as struct names; allow multiple comments in .rpc files; from Zack Weinberg
o Mitigate a race condition when using socket bufferevents in multiple threads.
o Use AC_SEARCH_LIBS, not AC_CHECK_LIB to avoid needless library use.
o Do not allow event_del(ev) to return while that event's callback is executing in another thread. This fixes a nasty race condition.
o event_get_supported_methods() now lists methods that have been disabled with the EVENT_NO* environment options.
o Rename encode_int[64] to evtag_encode_int[64] to avoid polluting the global namespace. The old method names are still available as macros in event2/tag_compat.h.
Changes in 2.0.1-alpha (17 Apr 2009):
o free minheap on event_base_free(); from Christopher Layne
o debug cleanups in signal.c; from Christopher Layne
o provide event_base_new() that does not set the current_base global
o bufferevent_write now uses a const source argument; report from Charles Kerr
o improve documentation on event_base_loopexit; patch from Scott Lamb
o New function, event_{base_}loopbreak. Like event_loopexit, it makes an event loop stop executing and return. Unlike event_loopexit, it keeps subsequent pending events from getting executed. Patch from Scott Lamb
o Check return value of event_add in signal.c
o provide event_reinit() to reintialize an event_base after fork
o New function event_set_mem_functinons. It allows the user to give libevent replacement functions to use for memory management in place of malloc(), free(), etc. This should be generally useful for memory instrumentation, specialized allocators, and so on.
o The kqueue implementation now catches signals that are raised after event_add() is called but before the event_loop() call. This makes it match the other implementations.
o The kqueue implementation now restores original signal handlers correctly when its signal events are removed.
o Check return value of event_add in signal.c
o Add a more powerful evbuffer_readln as a replacement for evbuffer_readline. The new function handles more newline styles, and is more useful with buffers that may contain a nul characters.
o Do not mangle socket handles on 64-bit windows.
o The configure script now takes an --enable-gcc-warnigns option that turns on many optional gcc warnings. (Nick has been building with these for a while, but they might be useful to other developers.)
o move EV_PERSIST handling out of the event backends
o small improvements to evhttp documentation
o always generate Date and Content-Length headers for HTTP/1.1 replies
o set the correct event base for HTTP close events
o When building with GCC, use the "format" attribute to verify type correctness of calls to printf-like functions.
o Rewrite win32.c backend to be O(n lg n) rather than O(n^2).
o Removed obsoleted recalc code
o support for 32-bit tag numbers in rpc structures; this is wire compatible, but changes the API slightly.
o pull setters/getters out of RPC structures into a base class to which we just need to store a pointer; this reduces the memory footprint of these structures.
o prefix {encode,decode}_tag functions with evtag to avoid collisions
o fix a bug with event_rpcgen for integers
o Correctly handle DNS replies with no answers set (Fixes bug 1846282)
o add -Wstrict-aliasing to warnings and more cleanup
o removed linger from http server socket; reported by Ilya Martynov
o event_rpcgen now allows creating integer arrays
o support string arrays in event_rpcgen
o change evrpc hooking to allow pausing of RPCs; this will make it possible for the hook to do some meaning ful work; this is not backwards compatible.
o allow an http request callback to take ownership of a request structure
o allow association of meta data with RPC requests for hook processing
o associate more context for hooks to query such as the connection object
o remove pending timeouts on event_base_free()
o also check EAGAIN for Solaris' event ports; from W.C.A. Wijngaards
o devpoll and evport need reinit; tested by W.C.A Wijngaards
o event_base_get_method; from Springande Ulv
o Send CRLF after each chunk in HTTP output, for compliance with RFC2626. Patch from "propanbutan". Fixes bug 1894184.
o Add a int64_t parsing function, with unit tests, so we can apply Scott Lamb's fix to allow large HTTP values.
o Use a 64-bit field to hold HTTP content-lengths. Patch from Scott Lamb.
o Allow regression code to build even without Python installed
o remove NDEBUG ifdefs from evdns.c
o detect integer types properly on platforms without stdint.h
o udpate documentation of event_loop and event_base_loop; from Tani Hosokawa.
o simplify evbuffer by removing orig_buffer
o do not insert event into list when evsel->add fails
o add support for PUT/DELETE requests; from Josh Rotenberg
o introduce evhttp_accept_socket() to accept from an already created socket
o include Content-Length in reply for HTTP/1.0 requests with keep-alive
o increase listen queue for http sockets to 128; if that is not enough the evhttp_accpet_socket() api can be used with a prepared socket.
o Patch from Tani Hosokawa: make some functions in http.c threadsafe.
o test support for PUT/DELETE requests; from Josh Rotenberg
o rewrite of the evbuffer code to reduce memory copies
o Some older Solaris versions demand that _REENTRANT be defined to get strtok_r(); do so.
o Do not free the kqop file descriptor in other processes, also allow it to be 0; from Andrei Nigmatulin
o Provide OpenSSL style support for multiple threads accessing the same event_base
o make event_rpcgen.py generate code include event-config.h; reported by Sam Banks.
o switch thread support so that locks get allocated as they are needed.
o make event methods static so that they are not exported; from Andrei Nigmatulin
o make RPC replies use application/octet-stream as mime type
o do not delete uninitialized timeout event in evdns
o Correct the documentation on buffer printf functions.
o Don't warn on unimplemented epoll_create(): this isn't a problem, just a reason to fall back to poll or select.
o Correctly handle timeouts larger than 35 minutes on Linux with epoll.c. This is probably a kernel defect, but we'll have to support old kernels anyway even if it gets fixed.
o Make name_from_addr() threadsafe in http.c
o Add new thread-safe interfaces to evdns functions.
o Make all event_tagging interfaces threadsafe.
o Rename internal memory management functions.
o New functions (event_assign, event_new, event_free) for use by apps that want to be safely threadsafe, or want to remain ignorant of the contents of struct event.
o introduce bufferevent_read_buffer; allows reading without memory copy.
o expose bufferevent_setwatermark via header files and fix high watermark on read
o fix a bug in buffrevent read water marks and add a test for them
o fix a bug in which bufferevent_write_buffer would not schedule a write event
o provide bufferevent_input and bufferevent_output without requiring knowledge of the structure
o introduce bufferevent_setcb and bufferevent_setfd to allow better manipulation of bufferevents
o convert evhttp_connection to use bufferevents.
o use libevent's internal timercmp on all platforms, to avoid bugs on old platforms where timercmp(a,b,<=) is buggy.
o Remove the never-exported, never-used evhttp_hostportfile function.
o Support input/output filters for bufferevents; somewhat similar to libio's model. This will allow us to implement SSL, compression, etc, transparently to users of bufferevents such as the http layer.
o allow connections to be removed from an rpc pool
o add new evtimer_assign, signal_assign, evtimer_new, and signal_new functions to manipulate timer and signal events, analagous to the now-recommended event_assign and event_new
o switch internal uses of event_set over to use event_assign.
o introduce evbuffer_contiguous_space() api that tells a user how much data is available in the first buffer chain
o introduce evbuffer_reserve_space() and evbuffer_commit_space() to make processing in filters more efficient.
o reduce system calls for getting current time by caching it.
o separate signal events from io events; making the code less complex.
o support for periodic timeouts
o support for virtual HTTP hosts.
o turn event_initialized() into a function, and add function equivalents to EVENT_SIGNAL and EVENT_FD so that people don't need to include event_struct.h
o Build test directory correctly with CPPFLAGS set.
o Provide an API for retrieving the supported event mechanisms.
o event_base_new_with_config() and corresponding config APIs.
o migrate the evhttp header to event2/ but accessors are still missing.
o deprecate timeout_* event functions by moving them to event_compat.h
o Move windows gettimeofday replacement into a new evutil_gettimeofday().
o Make configure script work on IRIX.
o provide a method for canceling ongoing http requests.
o Make vsnprintf() returns consistent on win32.
o Fix connection keep-alive behavior for HTTP/1.0
o Fix use of freed memory in event_reinit; pointed out by Peter Postma
o constify struct timeval * where possible
o make event_get_supported_methods obey environment variables
o support for edge-triggered events on epoll and kqueue backends: patch from Valery Kholodkov
o support for selecting event backends by their features, and for querying the features of a backend.
o change failing behavior of event_base_new_with_config: if a config is provided and no backend is selected, return NULL instead of aborting.
o deliver partial data to request callbacks when chunked callback is set even if there is no chunking on the http level; allows cancelation of requests from within the chunked callback; from Scott Lamb.
o allow min_heap_erase to be called on removed members; from liusifan.
o Rename INPUT and OUTPUT to EVRPC_INPUT and EVRPC_OUTPUT. Retain INPUT/OUTPUT aliases on on-win32 platforms for backwards compatibility.
o Do not use SO_REUSEADDR when connecting
o Support 64-bit integers in RPC structs
o Correct handling of trailing headers in chunked replies; from Scott Lamb.
o Support multi-line HTTP headers; based on a patch from Moshe Litvin
o Reject negative Content-Length headers; anonymous bug report
o Detect CLOCK_MONOTONIC at runtime for evdns; anonymous bug report
o Various HTTP correctness fixes from Scott Lamb
o Fix a bug where deleting signals with the kqueue backend would cause subsequent adds to fail
o Support multiple events listening on the same signal; make signals regular events that go on the same event queue; problem report by Alexander Drozdov.
o Fix a problem with epoll() and reinit; problem report by Alexander Drozdov.
o Fix off-by-one errors in devpoll; from Ian Bell
o Make event_add not change any state if it fails; reported by Ian Bell.
o Fix a bug where headers arriving in multiple packets were not parsed; fix from Jiang Hong; test by me.
o Match the query in DNS replies to the query in the request; from Vsevolod Stakhov.
o Add new utility functions to correctly observe and log winsock errors.
o Do not remove Accept-Encoding header
o Clear the timer cache on entering the event loop; reported by Victor Chang
o Only bind the socket on connect when a local address has been provided; reported by Alejo Sanchez
o Allow setting of local port for evhttp connections to support millions of connections from a single system; from Richard Jones.
o Clear the timer cache when leaving the event loop; reported by Robin Haberkorn
o Fix a typo in setting the global event base; reported by lance.
o Set the 0x20 bit on outgoing alphabetic characters in DNS requests randomly, and insist on a match in replies. This helps resist DNS poisoning attacks.
o Make the http connection close detection work properly with bufferevents and fix a potential memory leak associated with it.
o Restructure the event backends so that they do not need to keep track of events themselves, as a side effect multiple events can use the same fd or signal.
o Add generic implementations for parsing and emiting IPv6 addresses on platforms that do not have inet_ntop and/or inet_pton.
o Allow DNS servers that have IPv6 addresses.
o Add an evbuffer_write_atmost() function to write a limited number of bytes to an fd.
o Refactor internal notify-main-thread logic to prefer eventfd to pipe, then pipe to socketpair, and only use socketpairs as a last resort.
o Try harder to pack all evbuffer reads into as few chains as possible, using readv/WSARecv as appropriate.
o New evthread_use_windows_threads() and evthread_use_pthreads() functions to set up the evthread callbacks with reasonable defaults.
o Change the semantics of timeouts in conjunction with EV_PERSIST; timeouts in that case will now repeat until deleted.
o sendfile, mmap and memory reference support for evbuffers.
o New evutil_make_listen_socket_reuseable() to abstract SO_REUSEADDR.
o New bind-to option to allow DNS clients to bind to an arbitrary port for outgoing requests.
o evbuffers can now be "frozen" to prevent operations at one or both ends.
o Bufferevents now notice external attempts to add data to an inbuf or remove it from an outbuf, and stop them.
o Fix parsing of queries where the encoded queries contained \r, \n or +
o Do not allow internal events to starve lower-priority events.
Changes in 1.4.0:
o allow \r or \n individually to separate HTTP headers instead of the standard "\r\n"; from Charles Kerr.
o demote most http warnings to debug messages
o Fix Solaris compilation; from Magne Mahre
o Add a "Date" header to HTTP responses, as required by HTTP 1.1.
o Support specifying the local address of an evhttp_connection using set_local_address
o Fix a memory leak in which failed HTTP connections whould not free the request object
o Make adding of array members in event_rpcgen more efficient, but doubling memory allocation
o Fix a memory leak in the DNS server
o Fix compilation when DNS_USE_OPENSSL_FOR_ID is enabled
o Fix buffer size and string generation in evdns_resolve_reverse_ipv6().
o Respond to nonstandard DNS queries with "NOTIMPL" rather than by ignoring them.
o In DNS responses, the CD flag should be preserved, not the TC flag.
o Fix http.c to compile properly with USE_DEBUG; from Christopher Layne
o Handle NULL timeouts correctly on Solaris; from Trond Norbye
o Recalculate pending events properly when reallocating event array on Solaris; from Trond Norbye
o Add Doxygen documentation to header files; from Mark Heily
o Add a evdns_set_transaction_id_fn() function to override the default
transaction ID generation code.
o Add an evutil module (with header evutil.h) to implement our standard cross-platform hacks, on the theory that somebody else would like to use them too.
o Fix signals implementation on windows.
o Fix http module on windows to close sockets properly.
o Make autogen.sh script run correctly on systems where /bin/sh isn't bash. (Patch from Trond Norbye, rewritten by Hagne Mahre and then Hannah Schroeter.)
o Skip calling gettime() in timeout_process if we are not in fact waiting for any events. (Patch from Trond Norbye)
o Make test subdirectory compile under mingw.
o Fix win32 buffer.c behavior so that it is correct for sockets (which do not like ReadFile and WriteFile).
o Make the test.sh script run unit tests for the evpoll method.
o Make the entire evdns.h header enclosed in "extern C" as appropriate.
o Fix implementation of strsep on platforms that lack it
o Fix implementation of getaddrinfo on platforms that lack it; mainly, this will make Windows http.c work better. Original patch by Lubomir Marinov.
o Fix evport implementation: port_disassociate called on unassociated events resulting in bogus errors; more efficient memory management; from Trond Norbye and Prakash Sangappa
o support for hooks on rpc input and output; can be used to implement rpc independent processing such as compression or authentication.
o use a min heap instead of a red-black tree for timeouts; as a result finding the min is a O(1) operation now; from Maxim Yegorushkin
o associate an event base with an rpc pool
o added two additional libraries: libevent_core and libevent_extra in addition to the regular libevent. libevent_core contains only the event core whereas libevent_extra contains dns, http and rpc support
o Begin using libtool's library versioning support correctly. If we don't mess up, this will more or less guarantee binaries linked against old versions of libevent continue working when we make changes to libevent that do not break backward compatibility.
o Fix evhttp.h compilation when TAILQ_ENTRY is not defined.
o Small code cleanups in epoll_dispatch().
o Increase the maximum number of addresses read from a packet in evdns to 32.
o Remove support for the rtsig method: it hasn't compiled for a while, and nobody seems to miss it very much. Let us know if there's a good reason to put it back in.
o Rename the "class" field in evdns_server_request to dns_question_class, so that it won't break compilation under C++. Use a macro so that old code won't break. Mark the macro as deprecated.
o Fix DNS unit tests so that having a DNS server with broken IPv6 support is no longer cause for aborting the unit tests.
o Make event_base_free() succeed even if there are pending non-internal events on a base. This may still leak memory and fds, but at least it no longer crashes.
o Post-process the config.h file into a new, installed event-config.h file that we can install, and whose macros will be safe to include in header files.
o Remove the long-deprecated acconfig.h file.
o Do not require #include <sys/types.h> before #include <event.h>.
o Add new evutil_timer* functions to wrap (or replace) the regular timeval manipulation functions.
o Fix many build issues when using the Microsoft C compiler.
o Remove a bash-ism in autogen.sh
o When calling event_del on a signal, restore the signal handler's previous value rather than setting it to SIG_DFL. Patch from Christopher Layne.
o Make the logic for active events work better with internal events; patch from Christopher Layne.
o We do not need to specially remove a timeout before calling event_del; patch from Christopher Layne.
Libevent is available for use under the following license, commonly known
as the 3-clause (or "modified") BSD license:
==============================
Copyright (c) 2000-2007 Niels Provos <provos@citi.umich.edu>
Copyright (c) 2007-2012 Niels Provos and Nick Mathewson
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
3. The name of the author may not be used to endorse or promote products
derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
==============================
Portions of Libevent are based on works by others, also made available by
them under the three-clause BSD license above. The copyright notices are
available in the corresponding source files; the license is as above. Here's
a list:
log.c:
Copyright (c) 2000 Dug Song <dugsong@monkey.org>
Copyright (c) 1993 The Regents of the University of California.
strlcpy.c:
Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com>
win32select.c:
Copyright (c) 2003 Michael A. Davis <mike@datanerds.net>
evport.c:
Copyright (c) 2007 Sun Microsystems
ht-internal.h:
Copyright (c) 2002 Christopher Clark
minheap-internal.h:
Copyright (c) 2006 Maxim Yegorushkin <maxim.yegorushkin@gmail.com>
==============================
The arc4module is available under the following, sometimes called the
"OpenBSD" license:
Copyright (c) 1996, David Mazieres <dm@uun.org>
Copyright (c) 2008, Damien Miller <djm@openbsd.org>
Permission to use, copy, modify, and distribute this software for any
purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
0. BUILDING AND INSTALLATION (Briefly)
$ ./configure
$ make
$ make verify # (optional)
$ sudo make install
1. BUILDING AND INSTALLATION (In Depth)
To build libevent, type
$ ./configure && make
(If you got libevent from the git repository, you will
first need to run the included "autogen.sh" script in order to
generate the configure script.)
You can run the regression tests by running
$ make verify
Install as root via
# make install
Before, reporting any problems, please run the regression tests.
To enable the low-level tracing build the library as:
CFLAGS=-DUSE_DEBUG ./configure [...]
Standard configure flags should work. In particular, see:
--disable-shared Only build static libraries
--prefix Install all files relative to this directory.
The configure script also supports the following flags:
--enable-gcc-warnings Enable extra compiler checking with GCC.
--disable-malloc-replacement
Don't let applications replace our memory
management functions
--disable-openssl Disable support for OpenSSL encryption.
--disable-thread-support Don't support multithreaded environments.
2. USEFUL LINKS:
For the latest released version of Libevent, see the official website at
http://libevent.org/ .
There's a pretty good work-in-progress manual up at
http://www.wangafu.net/~nickm/libevent-book/ .
For the latest development versions of Libevent, access our Git repository
via
"git clone git://levent.git.sourceforge.net/gitroot/levent/libevent"
You can browse the git repository online at
http://levent.git.sourceforge.net/git/gitweb-index.cgi .
To report bugs, request features, or submit patches to Libevent,
use the Sourceforge trackers at
https://sourceforge.net/tracker/?group_id=50884 .
There's also a libevent-users mailing list for talking about Libevent
use and development: http://archives.seul.org/libevent/users/
3. ACKNOWLEDGMENTS
The following people have helped with suggestions, ideas, code or
fixing bugs:
Arno Bakker
Alejo
Weston Andros Adamson
William Ahern
Ivan Andropov
Sergey Avseyev
Avi Bab
Gilad Benjamini
Stas Bekman
Joachim Bauch
Denis Bilenko
Julien Blache
Kevin Bowling
Tomash Brechko
Kelly Brock
Ralph Castain
Adrian Chadd
Lawnstein Chan
Shuo Chen
Ka-Hing Cheung
Andrew Cox
George Danchev
Andrew Danforth
Antony Dovgal
Ed Day
Christopher Davis
Mike Davis
Mihai Draghicioiu
Mark Ellzey
Shie Erlich
Leonid Evdokimov
Juan Pablo Fernandez
Christophe Fillot
Mike Frysinger
Remi Gacogne
Alexander von Gernler
Artur Grabowski
Sebastian Hahn
Dave Hart
Greg Hazel
Michael Herf
Savg He
Mark Heily
Greg Hewgill
Andrew Hochhaus
Aaron Hopkins
Tani Hosokawa
Jamie Iles
Claudio Jeker
Evan Jones
George Kadianakis
Phua Keat
Kevin Ko
Brian Koehmstedt
Marko Kreen
Valery Kyholodov
Ross Lagerwall
Scott Lamb
Christopher Layne
Adam Langley
Philip Lewis
Zhou Li
David Libenzi
Yan Lin
Moshe Litvin
Simon Liu
Mitchell Livingston
Hagne Mahre
Lubomir Marinov
Abilio Marques
Nick Mathewson
James Mansion
Nicholas Marriott
Andrey Matveev
Caitlin Mercer
Dagobert Michelsen
Mansour Moufid
Felix Nawothnig
Trond Norbye
Linus Nordberg
Richard Nyberg
Jon Oberheide
Phil Oleson
Dave Pacheco
Tassilo von Parseval
Catalin Patulea
Patrick Pelletier
Simon Perreault
Pierre Phaneuf
Ryan Phillips
Dimitre Piskyulev
Pavel Plesov
Jon Poland
Nate R
Robert Ransom
Bert JW Regeer
Peter Rosin
Maseeb Abdul Qadir
Wang Qin
Alex S
Hanna Schroeter
Ralf Schmitt
Mike Smellie
Kevin Springborn
Harlan Stenn
Steve Snyder
Dug Song
Dongsheng Song
Hannes Sowa
Ferenc Szalai
Brodie Thiesfield
Jason Toffaletti
Gisle Vanem
Bas Verhoeven
Constantine Verutin
Colin Watt
Zack Weinberg
Jardel Weyrich
Alex
Taral
propanbutan
mmadia
If we have forgotten your name, please contact us.
Most of pdnsd was written by Thomas Moestl (tmoestl@gmx.net).
In the "par" versions large parts of the code have been revised
and several features have been added by Paul Rombouts.
Small parts of this program are based on code that was taken from nmap (IP
checksumming), the isdn4k-utils (ippp interface uptest), glibc 2.1.2 (some
definitions for kernel 2.2.x missing in 2.0 glibcs) and FreeBSD
(SIZEOF_ADDR_IFREQ in netdev.c).
nmap was written by Fyodor. The insd4k-utils were written by Fritz Elfert and
others. The GNU C library (glibc) is copyright by the Free Software
Foundation.
The following people have contributed code:
Andrew M. Bishop contributed support for server labels
Carsten Block contributed 'configure'-able rc scripts
Stephan Boettcher contributed the SCHEME= option.
P.J. Bostley contributed patches to get pdnsd working on
alpha
Frank Elsner contributed rc script fixes
Christian Engstler contributed patches for SuSE compatability
Bjoern Fischer contributed code to make pdnsd leave the case of names
in the cache unchanged
Torben Janssen contributed RedHat rc scripts
Olaf Kirch contributed a security fix for the run_as()
function
Bernd Leibing contributed fixes to the spec file.
Sourav K. Mandal contributed the autoconf/automake code, gdbm
caching facility and many suggestions
Markus Mohr contributed Debian rc scripts
Alexandre Nunes contributed autoconf fixes
Wolfgang Ocker contributed the server_ip option
Soenke J. Peters contributed patches and suggestions for RedHat
compatability
Roman Shterenzon contributed many helpful hints and patches for
FreeBSD compatability.
Andreas Steinmetz contributed the code for the query_port_start and
query_port_end options (which I changed slightly,
so blame any breakage on me ;)
Marko Stolle contributed the contrib/pdnsd_update.pl script that
makes pdnsd usable in a DHCP setup.
Lyonel Vincent extended the serve_aliases option to support an
arbitrary number of aliases
Paul Wagland contributed a patches for bind9-compatability
and for some memory leaks on error paths.
Sverker Wiberg contributed IPv6 build fixes
Michael Wiedmann contributed the pdnsd-ctl.8 man page.
Ron Yorston contributed the dev-uptest for Linux ppp dial-
on-demand devices
Nikita V. Youshchenko contributed extensions to the "if" uptest
Mahesh T. Pai contributed the pdnsd.8 man page.
Nikola Kotur contributed the Slackware start-up script.
Kiyo Kelvin Lee contributed a patch for Cygwin support.
Rodney Brown contributed a patch for Darwin (Apple Mac OS X) support.
Jan-Marek Glogowski contributed a patch implementing the "use_nss" option.
Please look into the THANKS file for people who helped me in various ways on
this project.
If this list is incomplete, pease drop me a mail!
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The GNU General Public License is a free, copyleft license for
software and other kinds of works.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users. We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors. You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received. You must make sure that they, too, receive
or can get the source code. And you must show them these terms so they
know their rights.
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.
For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software. For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.
Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so. This is fundamentally incompatible with the aim of
protecting users' freedom to change the software. The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable. Therefore, we
have designed this version of the GPL to prohibit the practice for those
products. If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
0. Definitions.
"This License" refers to version 3 of the GNU General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based
on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Use with the GNU Affero General Public License.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
<program> Copyright (C) <year> <name of author>
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<http://www.gnu.org/licenses/>.
The GNU General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read
<http://www.gnu.org/philosophy/why-not-lgpl.html>.
A small part of the pdnsd source is licensed under the following BSD-style
license:
Copyright (C) 2001 Thomas Moestl
This file is part of the pdnsd package.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
This source diff could not be displayed because it is too large. You can view the blob instead.
2000-02-15
Version 0.2. First working alpha with the extended feature set.
2000-02-16
Version 0.3 with many bugfixes, better standard conformity and
some new features.
2000-02-17
Did a lint on the code, implemented soft timeouts, again bugfixes,
drastically reduced cache memory requirements, implemented local
records.
Version 0.4 released.
2000-02-19
Recursive query finally implemented. Version 0.5 out.
2000-02-20
Various bugfixes. The server now always tries to get an AA answer
if possible; this implies recursion. This is to deal better with
caching servers that may return incomplete results on * queries.
This may be a little sub-optimal since it may not take the full
effect of caching, but it is the only real possibility of getting
complete records.
Redid the deps in the makefile for now.
Version is now 0.6.
2000-02-21
Another set of bugfixes. Version is 0.6.1.
2000-02-22
Another set of bugfixes. It should stabilize by now. Answer compression
is there finally. Version is therefore up again, 0.7 by now.
2000-02-23
Minor bugfixes, isdn interface uptest added. The new record types as of
rfc1700 are implemented, but as a compile-time option, since normally
there is no need to waste space for them.
Version is 0.7.1.
2000-02-24
Version 0.7.2 with all rrs up to KX (36). #define DNS_NEW_RRS in
config.h and (re)compile if you want to use them. Delete the cache
file before using a version with this option changed!
NSAP-PTR does NOT WORK (any incoming answer containing it may cause
a format error) because it is ill-designed (see TODO). Never mind, it
is officially deprecated anyway.
The secure DNS extension record types defined in RFC 2065 (KEY, SIG,
NXT) are cached only and therefore useless.
2000-02-26
Version 0.8 with parallel query (and probably new bugs) introduced.
2000-02-27
Version 0.8.1 with minor bugfixes on the new features.
2000-02-27
Version 0.8.5 with authority support and the usual bugifxes. Some issues
with standard conformity were also fixed (wow, two versions a day).
2000-02-28
Implemented caching of non-authoritative records. This allows better
usage of other caching name servers. This may return non-authoritative
records to any non-wildcard query. If a wildcard query arrives, we
always look for authoritative records, so we do if the non-authoritative
answer does not contain at least one answering record to the query.
This fixes the sub-optimal behaviour since 0.6.
Version is therefore up to 0.8.7 (0.8.6 was also released today
containing bugfixes)
2000-02-29
Better thread support, avoiding deadlocks in signal handling. The cost
is unfortunately one more thread.
New option server_port in config file.
Version is 0.8.8.
2000-03-01
Nailed a renitent memory leak bug to the wall (shame, what a trivial
mistake). Also improved handling of error conditions slightly.
Version is 0.8.9.
2000-03-01
Cache code cleanup. The development of the non-parallel query code
is discontinued, although it still works. If you want serial query,
just set PAR_QUERIES to 1.
Additional information finally implemented.
We are up to 0.9.
2000-03-02
Fixed a DoS possibility.
More rfc compatability fixups and a smarter resolver logic.
Version 0.9.1
2000-03-02
Added the source section to the config file handling. This allows to
source your /etc/hosts file. Version 0.9.2.
2000-03-02
Avoiding double additional records now. Version 0.9.3.
2000-03-09
Fixed some REALLY STUPID bugs. Uuummph, thought it was finished.
However, the number of bugs remaining is always n+1...
Anyway, we are up to 0.9.4. Hope that there are no mean bugs left.
2000-03-14
Added another uptest, exec. See README for details. Also grained the
cache size finer (it's now specified in kB). Version 0.9.5
2000-04-07
Fixed some really stupid bugs, what else? Version is 0.9.6
To be more exact: fixed misc bugs, cleaned up hash.c and cache.c
2000-04-20
Again fixed some bugs, version is now 0.9.7.
2000-04-29
Fixed a build problem caused by some missing #defines in glibc2.0 and a
minor bug.
Version is up to 0.9.8
2000-04-30
Fixed some unclean C code and did a general C lint. Thanks to Byrial
Jensen for pointing out some issues. Now using stricter compiler flags.
Also replaced the daemon() call in main.c for improved portability.
Pre-Released 0.9.9p1
2000-05-03
Released 0.9.9p2 with the changes of 0.9.9p1, Documentation updates,
bugfixes, and the Red Hat rc scripts contributed by Torben Janssen.
Also, the meaning of the command line option -v has changed.
There is a new config file option "lean_query" that is on by
default. It is an optimization, so please look in the docs when
updating whether you want it switched on or not.
Removed the long-dead serial query code from the distribution tree.
Some resolvers seem to be broken somehow in a respect that it cares
about order in which the records appear. In particular, it wants
cname to appear before other records. Ok, so it be...
2000-05-04
Save all names in lower case in the rrs.
Tidying up the source tree.
The long-awaited cache structure changes have been started. Please
delete you cache files before using this new release.
2000-05-05
Fixed several bugs in the old and in the new source tree.
Use time_t instead of long for internal time storage for compatibility.
2000-05-06
Version 0.9.10.
This fixes a bug in uptest=if. Red Hat and configuration fixes
suggested by Soeren J. Peters were included.
2000-05-08
Version 0.9.11
This fixes a locally exploitable security problem (pdnsd.cache was
world-writeable). This is actually a one-line fix; for a description of
possible dangers, please refer to the html documentation.
Thanks to Alan Swanson for reporting.
The installation instructions are in doc/html/doc.html and doc/txt/manual.txt.
The system requirements are listed in doc/html/index.html and doc/txt/intro.txt.
I recommend using the html version.
Following are generic installation instructions for autoconf programs.
I strongly recommend to read the Installation section in the docs!
Basic Installation
==================
These are generic installation instructions.
The `configure' shell script attempts to guess correct values for
various system-dependent variables used during compilation. It uses
those values to create a `Makefile' in each directory of the package.
It may also create one or more `.h' files containing system-dependent
definitions. Finally, it creates a shell script `config.status' that
you can run in the future to recreate the current configuration, a file
`config.cache' that saves the results of its tests to speed up
reconfiguring, and a file `config.log' containing compiler output
(useful mainly for debugging `configure').
If you need to do unusual things to compile the package, please try
to figure out how `configure' could check whether to do them, and mail
diffs or instructions to the address given in the `README' so they can
be considered for the next release. If at some point `config.cache'
contains results you don't want to keep, you may remove or edit it.
The file `configure.in' is used to create `configure' by a program
called `autoconf'. You only need `configure.in' if you want to change
it or regenerate `configure' using a newer version of `autoconf'.
The simplest way to compile this package is:
1. `cd' to the directory containing the package's source code and type
`./configure' to configure the package for your system. If you're
using `csh' on an old version of System V, you might need to type
`sh ./configure' instead to prevent `csh' from trying to execute
`configure' itself.
Running `configure' takes awhile. While running, it prints some
messages telling which features it is checking for.
2. Type `make' to compile the package.
3. Optionally, type `make check' to run any self-tests that come with
the package.
4. Type `make install' to install the programs and any data files and
documentation.
5. You can remove the program binaries and object files from the
source code directory by typing `make clean'. To also remove the
files that `configure' created (so you can compile the package for
a different kind of computer), type `make distclean'. There is
also a `make maintainer-clean' target, but that is intended mainly
for the package's developers. If you use it, you may have to get
all sorts of other programs in order to regenerate files that came
with the distribution.
Compilers and Options
=====================
Some systems require unusual options for compilation or linking that
the `configure' script does not know about. You can give `configure'
initial values for variables by setting them in the environment. Using
a Bourne-compatible shell, you can do that on the command line like
this:
CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure
Or on systems that have the `env' program, you can do it like this:
env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure
Compiling For Multiple Architectures
====================================
You can compile the package for more than one kind of computer at the
same time, by placing the object files for each architecture in their
own directory. To do this, you must use a version of `make' that
supports the `VPATH' variable, such as GNU `make'. `cd' to the
directory where you want the object files and executables to go and run
the `configure' script. `configure' automatically checks for the
source code in the directory that `configure' is in and in `..'.
If you have to use a `make' that does not supports the `VPATH'
variable, you have to compile the package for one architecture at a time
in the source code directory. After you have installed the package for
one architecture, use `make distclean' before reconfiguring for another
architecture.
Installation Names
==================
By default, `make install' will install the package's files in
`/usr/local/bin', `/usr/local/man', etc. You can specify an
installation prefix other than `/usr/local' by giving `configure' the
option `--prefix=PATH'.
You can specify separate installation prefixes for
architecture-specific files and architecture-independent files. If you
give `configure' the option `--exec-prefix=PATH', the package will use
PATH as the prefix for installing programs and libraries.
Documentation and other data files will still use the regular prefix.
In addition, if you use an unusual directory layout you can give
options like `--bindir=PATH' to specify different values for particular
kinds of files. Run `configure --help' for a list of the directories
you can set and what kinds of files go in them.
If the package supports it, you can cause programs to be installed
with an extra prefix or suffix on their names by giving `configure' the
option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
Optional Features
=================
Some packages pay attention to `--enable-FEATURE' options to
`configure', where FEATURE indicates an optional part of the package.
They may also pay attention to `--with-PACKAGE' options, where PACKAGE
is something like `gnu-as' or `x' (for the X Window System). The
`README' should mention any `--enable-' and `--with-' options that the
package recognizes.
For packages that use the X Window System, `configure' can usually
find the X include and library files automatically, but if it doesn't,
you can use the `configure' options `--x-includes=DIR' and
`--x-libraries=DIR' to specify their locations.
Specifying the System Type
==========================
There may be some features `configure' can not figure out
automatically, but needs to determine by the type of host the package
will run on. Usually `configure' can figure that out, but if it prints
a message saying it can not guess the host type, give it the
`--host=TYPE' option. TYPE can either be a short name for the system
type, such as `sun4', or a canonical name with three fields:
CPU-COMPANY-SYSTEM
See the file `config.sub' for the possible values of each field. If
`config.sub' isn't included in this package, then this package doesn't
need to know the host type.
If you are building compiler tools for cross-compiling, you can also
use the `--target=TYPE' option to select the type of system they will
produce code for and the `--build=TYPE' option to select the type of
system on which you are compiling the package.
Sharing Defaults
================
If you want to set default values for `configure' scripts to share,
you can create a site shell script called `config.site' that gives
default values for variables like `CC', `cache_file', and `prefix'.
`configure' looks for `PREFIX/share/config.site' if it exists, then
`PREFIX/etc/config.site' if it exists. Or, you can set the
`CONFIG_SITE' environment variable to the location of the site script.
A warning: not all `configure' scripts look for a site script.
Operation Controls
==================
`configure' recognizes the following options to control how it
operates.
`--cache-file=FILE'
Use and save the results of the tests in FILE instead of
`./config.cache'. Set FILE to `/dev/null' to disable caching, for
debugging `configure'.
`--help'
Print a summary of the options to `configure', and exit.
`--quiet'
`--silent'
`-q'
Do not print messages saying which checks are being made. To
suppress all normal output, redirect it to `/dev/null' (any error
messages will still be shown).
`--srcdir=DIR'
Look for the package's source code in directory DIR. Usually
`configure' can determine that directory automatically.
`--version'
Print the version of Autoconf used to generate the `configure'
script, and exit.
`configure' also accepts some other, not widely useful, options.
Version 1.2.9a fixes a bug in the 1.2.9 release that causes a build failure when
pdnsd is configured with --enable-strict-rfc2181. Unless you use this option to
compile pdnsd, there is no need to upgrade from 1.2.9 to 1.2.9a.
Version 1.2.9 has support for many additional RR types, in particular those
needed for DNSSEC (though no support for the DNSSEC protocol itself yet in
pdnsd). Caching data structures are now more efficient when they only store the
most commonly used RR types. Fine-grained configurability over which RR-types
are cache-able. Pdnsd now has support for EDNS (Extension mechanisms for DNS),
although its usefulness is currently limited to enabling UDP messages larger
than 512 bytes. Defining local TXT records in the configuration file is now
supported. A new configuration option provides a fix in case the query uptest
fails due to remote servers ignoring empty queries. Several bugs have been fixed
including a UDP socket descriptor leak that affected the FreeBSD platform, and
an IPv6 port binding bug.
Version 1.2.8 implements support for automatic discovery of root servers.
There are also some improvements in the resolver and a new default setting for
the neg_rrs_pol configuration option.
Version 1.2.7-par fixes some security problems. It contains a fix for a
"dangling pointer" bug that could cause pdnsd to crash when it received a long
reply. It also addresses some of the issues raised in the CERT vulnerability
note VU#800113 by making the default of query_port_start equal to 1024, thereby
ensuring that source ports are randomly selected by the pdnsd resolver in the
range 1024-65535. This release also fixes problems with compiling pdnsd for the
ARM architecture and for the Darwin platform (Max OS X). There are a number of
(minor) new features. pdnsd now supports "include" files, essentially
configuration files that only contain definitions for local records. It is now
possible to define interactively, using pdnsd-ctl, any local record that can be
defined in a configuration file.
Version 1.2.6-par has an upgraded license: GPL version 3.
A bug has been fixed which which caused pdnsd to handle NXDOMAIN replies
inefficiently when configured with neg_domain_pol=on. Also the code for the
ping test has been fixed, which was broken for 64-bit systems. A new option
randomize_servers can be used to give each server in a section of the
configuration file an equal chance of being queried. The new options reject,
reject_policy and reject_recursively make it possible to check for the presence
of certain IP addresses in the replies of name servers and to correct some types
of unwanted replies or to censor these IP addresses.
The pdnsd-ctl 'add a' and 'add aaaa' commands now allow multiple IP addresses to
be specified for the same name. There are some further improvements to pdnsd's
recursive resolver.
Version 1.2.5-par introduces a new query method: udp_tcp. With this method a UDP
query is tried first and, if the UDP answer is truncated, the query is repeated
using TCP, which is the behaviour that seems to be recommended by the DNS
standards. There is a new configuration option use_nss, which can be turned off
to prevent lengthy timeouts and stalls in certain situations. A bug has been
fixed which could cause pdnsd to crash if debug output was generated before the
debug output stream was properly initialized.
In version 1.2.4-par a memory leak and a minor buffer-overflow problem have been
fixed. There is now a fix for some situations that would previously cause pdnsd
to exit prematurely (such as ACPI S3 sleep or trying to attach strace to pdnsd).
Time intervals specified in the configuration file can now be expressed in
minutes, hours, days and weeks as well as seconds. Support for Apple Mac OS X
v10.4 Tiger has been improved. The "pdnsd-ctl status" command now also provides
some information about the status of the running threads. There are some further
improvements in the debugging information provided by pdnsd.
TCP-query support is now compiled in by default (but can still be disabled using
the configure option --disable-tcp-queries).
In version 1.2.3-par the "pdnsd-ctl empty-cache" command can be provided with an
include/exclude list, allowing the user to specify a selection of names to be
removed, instead of emptying the cache completely.
Additional improvements: pdnsd should now remain responsive while executing the
"pdnsd-ctl empty-cache" command. With the query_method=tcp_udp option pdnsd will
now also try a UDP query after a TCP connection times out, which should allow
pdnsd to resolve the same names with query_method=tcp_udp as with
query_method=udp_only, although perhaps with an occasional delay.
"pdnsd-ctl config" or "pdnsd-ctl server" commands should now run without delays,
even if pdnsd is performing ping or query uptests at the time. A problem with
resolving certain names using root servers has been fixed.
Version 1.2.2-par has a number of important portability improvements. A bug has
been fixed that prevented pdnsd from compiling successfully on some 64 bit
architectures. The code for determining endianness (most significant or least
significant byte first) should now be more portable. This release has
(experimental) support for the Darwin (Apple Mac OS X) platform. On Linux
systems, the configure script will now try to detect automatically whether the
system implements the Native POSIX Thread Library, but the method used may not
necessarily be foolproof. In addition, the debug features have been improved and
should make it easier to find out why pdnsd considers some queries or replies
malformed.
Version 1.2.1-par has improved support for non-Linux platforms. This release has
(experimental) support for the Cygwin platform, and should also fix some
compilation glitches that have been reported by FreeBSD users.
Version 1.2-par is a new and improved version of pdnsd! Most of the changes
effect the internal workings of pdnsd, but there are also a number of
interesting new features (well, I think they are interesting). Among the bugs
fixed are two rather nasty ones which involve the handling of NXT and NAPTR
records and which can cause pdnsd to crash or abort. The new features include a
new server availability test which can be specified with uptest=query, support
for reading the DNS configuration from resolv.conf files, a new option for
optimizing the use of root servers, a new option that makes defining local
records for reverse resolving easier, support for defining wildcard records, a
new pdnsd-ctl command for reloading the config file without restarting pdnsd,
and a new pdnsd-ctl command for dumping information about the names stored in
the cache.
The documentation has also been updated: there is now a pdnsd.conf man page. For
a more complete list of the changes I'll have to refer you to README.par and the
ChangeLog.
Version 1.1.11a-par contains a fix for FreeBSD users that bypasses a problem
with the macro ENONET, which can cause a compilation failure when it is
undefined. Linux users will notice no difference between 1.1.11a-par and
1.1.11-par.
Version 1.1.11-par has a rather large number of small changes, which are rather
difficult to summarize. Among the bugs fixed are a race condition in the cache
lookup code, a flaw in the code that caused a busy spin when a remote server
answered with "Not Implemented", and problems with the -4 and -6 command-line
options. Among the improvements are an alternative sorting algorithm which
should allow pdnsd to start up faster when reading a large cache file from disk,
automatic mapping of IPv4 to IPv6 addresses when running in IPv6 mode, somewhat
more efficient memory use, better compression of the replies and changes in the
parallel querying algorithm that should improve the chances of catching a reply
from a remote server. For a more complete list of the changes I'll have to
refer you to README.par and the ChangeLog.
Version 1.1.10-par has a new parser for configuration files, completely
rewritten from scratch in C. The main advantages are: (f)lex and yacc/bison are
no longer needed to build pdnsd, more informative error messages instead of
merely "parse error", and string literals no longer need to be enclosed in
quotes in most cases. Furthermore, a bug has been fixed that caused incorrect
IPV6-type PTR records to be generated when sourcing /etc/hosts like files.
There have been other small changes, more details can be found in the ChangeLog.
Version 1.1.9-par adds some missing pieces to the documentation (the pdnsd
manual and the man page for pdnsd-ctl). The changes to the code consist mostly
of optimizations, removal of some size limits due to fixed-size buffers, and
some cleaning up. I've also tried to make the error responses of pdnsd-ctl more
helpful. More details can be found in the ChangeLog.
Version 1.1.8b1-par8 introduces a "delegation-only" feature that may be useful
for blocking Verisign's Sitefinder. The parser for the configuration file now
tolerates domain names missing a dot at the end. I have provided alternative
implementations for some GNU extensions that I used in an effort to make the
code more portable. In particular, the code should build on FreeBSD again. More
details can be found in the README.par file.
Version 1.1.8b1-par7 fixing a number of bugs. I have also reworked some of the
code for adding and removing entries in the cache in an effort to improve
efficiency and stability. More details can be found in the ChangeLog.
Version 1.1.8b1-par6 introduces some further code cleanup. In addition the
documentation has been revised.
Version 1.1.8b1-par5 fixes a troublesome allocation size error that has been
discovered in Thomas Moestl's code. In practice this bug only wastes memory but
it could also potentially lead to memory corruption. Upgrading is
recommended. More details can be found in the ChangeLog.
Version 1.1.8b1-par4 has been released. Due to incompatibilities between
various implementations of the pthread library on Linux systems, problems can
occur with signal handling in pdnsd. The usual symptom is failure by pdnsd to
save the cache to disk, and /var/cache/pdnsd/pdnsd.cache remaining empty. If you
experience this kind of trouble, try reconfiguring with different values for the
new --with-thread-lib option. The allowable values are described in the
documentation.
pdnsd is no longer maintained by Thomas Moestl: I have not had time to maintain
pdnsd for quite a while now, and have been very slow to respond to issues, or
did not respond at all. It is time that I officially announce that pdnsd is no
longer actively maintained; I apologize to all those who reported bugs or asked
questions without receiving any reply. However, Paul A. Rombouts has published a
patch set against the last released version at
http://www.phys.uu.nl/~rombouts/pdnsd.html, which cleans up a lot of code fixes
many bugs.
Version 1.1.7a fixes a reversed assertion that would cause pdnsd to terminate
if used with the ping uptest. No other changes were made.
Version 1.1.7 fixes some problems that might be remotely exploitable to
gain access as the user pdnsd runs as (an unprivileged user by default). To do
this, an attacker needs to control a name server that is queried by pdnsd, and
send a malicious reply to such a query. Upgrading is strongly recommended!
There are also minor bug fixes and stability improvements.
Version 1.1.6 adds the query_port_start and query_port_end options (contributed
by Andreas Steinmetz), that allow confining the ports pdnsd uses for outgoing
queries to a certain range. It also fixes numerous bugs, one of which could
cause pdnsd to hang; update is therefore recommended.
Version 1.1.5 contains a fix for a security bug that would allow local users
that are allowed to use pdnsd-ctl on a running pdnsd server to execute
arbitrary code as the user that pdnsd runs as (or on Linux, when strict_setuid
is not enabled, as the user that started pdnsd). The danger of this is usually
quite limited; the status socket is not enabled by default, it's default
permissions do only allow the user pdnsd runs as to use the socket,
strict_setuid is enabled by default and pdnsd runs as an unprivileged user.
There is also a new configure option, --enable-underscores, that will make
pdnsd allow underscores in domain names. Furthermore, the SRV record handling
has been fixed to allow underscores in any case (this was not allowed
previously, but is required by the RFC). SOA records are not put in the
answer section any more if no answers are found (this violates the RFC's).
It may be put in the authority section in a later version.
There are also various bugfixes in this release.
Upgrade is recommended.
Version 1.1.4 fixes various smaller bugs, and should also improve the cache
write performance especially for larger caches. There are also two new
features: servers can now be given a label (using the label server option)
which can be used to identify them for the pdnsd-ctl server command
(contributed by Andrew M. Bishop), and local records can be marked to make
the domain record authoritative in pdnsd's cache (which means that pdnsd will
assume that records that are not present in the cache for that domain are
non-existent); this is on by default now, and can be controlled using the new
authrec server option).
Version 1.1.3 added contrib/ and had a lot of robustness fixes.
This release addresses a security hole that affects only Linux systems. Due to
a bug in glibc, pdnsd could crash during a port scan. This release contains
a workaround for this, as well as a fix for a deadlock under heavy load
conditions. It also fixes a possible problem that could be triggered by
malicious servers, and contains numerous bug fixes.
A script, contributed by Marko Stolle, makes pdnsd useful in a DHCP setup.
pdnsd also preservers the case of names in the cache, and should work much
better on alpha machines (thanks for the contributions by Bjoern Fischer
and P.J. Bostley that made this possible). New types were dded for rr
sections and pdnsd-ctl.
Upgrade is recommended.
Version 1.1.2 has a fix for a bug that could cause SERVFAIL to be
returned when NXDOMAIN would be appropriate. The bug surfaced only when
pdnsd queried name servers with a behaviour different from BIND's in the
NXDOMAIN case, e.g. pdnsd querying another pdnsd or e.g. djbdns.
Version 1.1.1 fixes a possible race condition in status socket creation.
This race might be used by a local attacker to change the access
permissions of a certain file in /tmp. The risk of this is probably
negligible. The default setup uses a non-privileged user, default mode
0600, and the status socket is disabled normally, so this should be
relatively safe. I don't see any possibility to exploit this, it is
more of a paranoia fix.
There are also some other minor fixes and documentation improvements.
Upgrade is recommended.
Version 1.1.0 introduces negative cacheing, pdnsd-ctl enhancements and
a much improved FreeBSD support. The cache file format has changed from
prior releases. Some configuration defaults have changed, too.
Version 1.0.15 is mostly a bugfix release. It also has a new option:
randomize_recs in the global section.
Version 1.0.14 has a fix in icmp.c that will make it build properly
on FreeBSD and older Linux systems.
Version 1.0.13 has some code cleanup, a fix for the Debian rc install,
and a security fix (contributed by Olaf Kirch): when changing
user and group id, pdnsd did not drop supplementary group IDs that
the original user was member of.
Version 1.0.12 is a bugfix release and contains some security
enhancements. There are also inclusion/exclusion lists for servers
(new options include=, exclude=, policy= in the server
section).
Version 1.0.11 fixes two bugs that might be used for denial-of-service
attacks, upgrading is recommended.
Versions 1.0.9 and 1.0.10 are bugfix releases.
Version 1.0.8 introduces special linux ppp device support contributed
by Ron Yorston, and has some bugfixes.
Version 1.0.7 introduces autoconf support, many new config file options and
the new pdnsd-ctl run-time configuration program.
Version 1.0.6 has another set of bugfixes, in addition to higher compile-
time configurability and UDP query support. It also contains Debian rc
scripts contributed by Markus Mohr.
Version 1.0.5 has some bugfixes and the new "server_ip" option
contributed by Wolfgang Ocker.
Version 1.0.4 introduces the new options run_as, strict_setuid and
paranoid. These new options are optional security enhancements.
Versions 1.0.1, 1.0.2 and 1.0.3 are bugfix releases.
Version 1.0.0 has a lot of changes compared to the 0.9.x tree, but much of
them "under the hood":
- IPv6 support (experimental; compile- and run-time configurable)
- FreeBSD (and such hopefully *BSD) support
- better rfc2181 compatability
- new options:
- serve_aliases in source section
- linkdown_kluge in global section
- max_ttl in global section
- cache-code reorganization, only one unified hash (of variable depth)
- Optimizations & cleanups
- Automatic deps (only interesting for developers ;-)
Version 0.9.11 fixes a locally exploitable security hole (the cache file was
world writeable by default). Please see ChangeLog.old for details.
Version 0.9.10 fixes some bugs and improves build on Red Hat.
Version 0.9.9 contains the rc scripts for Red Hat Linux contributed by Torben
Janssen, in addition to code cleanups and bugfixes.
The meaning of the option -v has changed in this release.
There is also a new config file option "lean_query" that is on by default. It
is an optimization, so please look in the docs when updating whether you want
it switched on or not.
When compiling versions after 0.9.8, you will probably get more
compiler warningsthan before. This is because the C compiler settings
have been made stricter.
Version 0.9.8 fixes a minor bug some build problems with glibc2.0 systems.
The versions 0.9.6 and 0.9.7 are bugfix releases.
Version 0.9.5 introduces uptest=exec, and a modified config file syntax (cache
sizes are now specified in kB).
Version 0.9.4 was the first to be released to the public. For information on
changes, see ChangeLog.
You can find the documentation for pdnsd in the doc/ directory. The html
documentation (which I recommend) is in the doc/html/ subdirectory.
The pure text documentation (which is generated automatically from the
html documentation) is in doc/txt/.
The following documents are available:
index.html / intro.txt Overview, system requirements
doc.html / manual.txt Building, installation and usage instructions
faq.html / faq.txt The FAQ
Share and enjoy!
Thomas <tmoestl@gmx.net>
For news about recent changes in pdnsd the following files may be of
interest to you:
README.par
ChangeLog
NEWS
Last revised: 08 July 2007 by Paul Rombouts
pdnsd version 1.2.9a by Paul Rombouts
=====================================
This file describes the version of pdnsd that I maintain personally and am
making available so other people can enjoy the latest features and fixes. Thomas
Moestl no longer maintains pdnsd himself, so I am effectively the new
maintainer. This README describes the new features in version 1.2. This version
has a rather large number of internal changes and also some new features, which
I am rather pleased with, even if I say so myself. I think the changes are
significant enough to warrant increasing the minor version number from 1.1 to
1.2. The differences between my previous "official" release 1.1.11 and Thomas'
last release 1.1.7a are described in my previous README, which I have renamed
REAME.par.old. In this README I restrict myself to describing changes between
1.1.11 and 1.2.
The main difference between versions 1.2 and 1.2.1, aside from some minor
changes, is that 1.2.1 has (experimental) support for the Cygwin platform.
Version 1.2.2 has further improvements in portability and should in
particular now also compile on the Darwin (Apple Mac OS X) platform.
Version 1.2.4 has some important fixes for a memory leak, a minor buffer-
overflow problem and some situations which could cause pdnsd to exit
prematurely. Note that TCP-query support is now compiled in by default, but can
still be disabled using a configure option.
The main new feature of version 1.2.5 is the new query method "udp_tcp".
Version 1.2.6 has an updated license: GPL version 3. The main new feature of
version 1.2.6 is the "reject" option, which makes it possible to censor or
correct for unwanted IP addresses in replies.
Version 1.2.7 contains an important fix for a "dangling pointer" bug and
attempts to make pdnsd less vulnerable to the issues raised in CERT
vulnerability note VU#800113. It also contains some improvements for defining
local records interactively using the pdnsd-ctl utility.
The main new feature of version 1.2.8 is automatic discovery of root servers,
as well as some minor improvements in the resolver.
Version 1.2.9 among other things supports many addtional RR types, uses data
structures that should be more slightly more memory efficient and has support
for EDNS, which allows DNS UDP messages to be larger than 512 bytes.
Version 1.2.9a is a simple bugfix release that fixes a problem with compiling
1.2.9 after configuring with --enable-strict-rfc2181. Unless you use this option
to compile pdnsd, there is no need to upgrade from 1.2.9 to 1.2.9a.
For instructions how to compile and install pdnsd see doc/html/doc.html or
doc/txt/manual.txt. Note that I am no longer distributing a patch w.r.t. Thomas'
version because the (compressed) patch file is barely smaller than the
(compressed) tar archive.
Here follows a list of some of changes in version 1.2 from a user's perspective.
For a more technical description of some of the changes in the code see the ChangeLog.
For a short history about recent releases have a look at NEWS or doc/html/index.html.
- First of all, two potentially rather nasty bugs have been fixed in the code
for the handling of NXT and NAPTR records. A response from a remote server
containing NXT records (even well-formed ones) will very likely cause pdnsd to
crash. The code for handling NAPTR records contained incorrect ASSERT
statements, which could cause pdnsd to abort in a controlled fashion, but
completely unnecessarily.
- Sampo Lehtinen has remarked that pdnsd sometimes failed to resolve classless
reversed-delegated IP addresses, and that this has something to do with the
fact that pdnsd didn't accept '/' characters in domain names. After reading
some of the relevant RFCs I decided to remove all restrictions on the types
of characters that pdnsd accepts in domain names. Of course for most
applications, there are many characters which don't make sense in domain
names, but I feel that it is the responsibility of the client application to
reject these, not the proxy server.
- At the suggestion of Dan Tihelka, I have expanded to the server_ip= option to
allow the name of an interface to be specified instead of an IP address.
Presently this has been tested on Linux only. Can someone running pdnsd on
*BSD tell me if the code for getting the address of an interface is different
for Linux and BSD-type systems?
- At the suggestion of Juliusz Chroboczek I've added an new server availability
test which can be specified with uptest=query. This can be useful as an
alternative to "uptest=ping" in case the remote server does not respond to
ICMP_ECHO requests at all, which unfortunately is quite common these days.
"uptest=query" causes pdnsd to send an empty query to remote name servers. Any
well-formed response (apart from SERVFAIL) within the timeout period will be
interpreted as a sign that the server is "up".
- Instead of specifying the IP addresses of the name servers that pdnsd should
query in a server section of the config file, you may also specify a
resolv.conf-style file. Preferably this should not be /etc/resolv.conf. If the
contents of the resolv.conf type file changes while pdnsd is running, you can
make pdnsd aware of the changes with the "pdnsd-ctl config" command, see
below. Example:
server {
label=myisp;
file=/etc/ppp/resolv.conf;
timeout=10;
}
- There is a new option for "server" sections in the config file:
root_server=on/off.
In case a server section contains only addresses of root servers, which
usually only give the name servers of top level domains in their reply,
setting root_server=on will enable certain optimizations. This involves using
cached information to reduce queries to the root servers, thus speeding up the
resolving of new names.
- New option for "rr" sections in the config file: reverse=on/off.
If you want a locally defined name to resolve to a numeric address and vice
versa, you can now achieve this by setting reverse=on before defining the A
record, making it unnecessary to define a separate PTR record for the reverse
resolving.
Example:
rr {
name = localhost;
reverse = on;
a = 127.0.0.1;
}
has the same effect as:
rr {
name = localhost;
a = 127.0.0.1;
}
rr {
name = 1.0.0.127.in-addr.arpa;
ptr = localhost;
}
- In rr sections it is now possible to specify a wildcard name, i.e. a name
starting with the label *. The * in a wildcard can match one or more labels in
a queried name, but only whole labels. For example, *.mydomain will match
a.mydomain or www.a.mydomain, but not mydomain. Before you can specify an rr
section with name=*.mydomain you must define some records for mydomain,
typically NS and/or SOA records.
Example:
rr {
name = mydomain;
ns = localhost;
soa = localhost, root.localhost, 42, 86400, 900, 86400, 86400;
}
rr {
name = *.mydomain;
a = 192.168.1.10;
}
- There is a slight backwards compatibility problem which involves the name= and
owner= options in rr sections. The new version does not allow you to place
owner= before name=. On the other hand, you may now freely mix the owner
option with the a,ptr,cname,mx and soa options and define as many records of
this type as you like (including zero).
- pdnsd-ctl has three new commands:
config: Reloads pdnsd's configuration file. This is more efficient than
restarting pdnsd, and should not cause only noticeable interruption in DNS
service. However, some types of configuration changes cannot be put into
effect this way, and you will be prompted to restart pdnsd instead.
empty-cache: Empties the cache completely, freeing all existing entries.
In version 1.2.3 you can specify a selection of entries to delete by providing
a list of include/exclude patterns.
dump: Prints information about all the names stored in the cached. This is
mainly useful for diagnostic purposes.
- There is now a pdnsd.conf(5) man page, describing pdnsd's configuration file.
The man page has been generated from the html documentation using a customized
Perl script.
- New in version 1.2.4: Time intervals in the configuration files can now be
expressed in seconds, minutes, hours, days and weeks, using the suffixes
s,m,h,d,and w.
Example: 2h30m is interpreted as 2*60*60 + 30*60 = 9000 seconds.
- Version 1.2.5 introduces a new configuration option, contributed by Jan-Marek
Glogowski, called "use_nss" which can be turned off to prevent nasty delays in
certain situations.
Besides the query methods "udp_only", "tcp_only" and "tcp_udp" you can now
also specify "udp_tcp", which more closely adheres to the behaviour
recommended by DNS standards.
- Version 1.2.6 introduces the "randomize_servers" and "reject" options. By
setting "randomize_servers" on you can give each server in a server section an
equal chance of being queried, which is useful when resolving from root
servers, for instance. The "reject" option can be used to censor certain IP
addresses or correct for unwanted replies from servers you don't completely
trust.
- Version 1.2.7 contains support for "include" files which can be referenced
from configuration files or read interactively using pdnsd-ctl. These files
can be used to add local definitions to the cache without reconfiguring pdnsd.
The new "pdnsd-ctl eval" command can be used to interactively define local
records that could previously only be defined in configuration files but not
with the "pdnsd-ctl add" command.
- Version 1.2.8 contains support for automatic discovery of root servers.
Instead of supplying a complete list of IP addresses of root servers in a
server section of the configuration file, you need only enter one or two
addresses of name servers which know the names and addresses of the root
servers and set "root_server=discover".
The "neg_rrs_pol" option has a new default setting, which should allow
sensible negative caching of RRs in most situations, even if "proxy_only=on".
- Version 1.2.9 contains support for EDNS (Extension mechanisms for DNS), which
allows UDP messages to be larger than 512 bytes. Whether pdnsd uses EDNS in
outgoing queries is determined by the configuration option "edns_query". If
pdnsd receives a query using EDNS, it will reply using EDNS regardless of the
configuration settings.
Local TXT records can now be defined in the configuration file.
If the query uptest fails due to remote servers ignoring empty queries, this
can now be remedied using the new "query_test_name" config option.
The new features are described in greater detail in the manual doc/html/doc.html
or doc/txt/manual.txt.
Enjoy!
If you have any questions about my version of pdnsd, you can send these
to <p.a.rombouts@home.nl>. Questions about the original (unmaintained) pdnsd
version should be sent to <tmoestl@gmx.net> or <t.moestl@tu-bs.de>.
pdnsd maintenance version 1.1.11-par by Paul Rombouts
=======================================================
This file describes the version of pdnsd that I maintain personally and am
making available so other people can enjoy the latest features and fixes.
Thomas Moestl no longer maintains pdnsd himself, so I am effectively the new
maintainer. The current version is 1.1.11-par, which has a rather large number
of small changes. Among the bugs fixed are a race condition in the cache lookup
code, a flaw in the code that caused a busy spin when a remote server answered
with "Not Implemented", and problems with the -4 and -6 command-line options.
Among the improvements are an alternative sorting algorithm which should allow
pdnsd to start up faster when reading a large cache file from disk, automatic
mapping of IPv4 to IPv6 addresses when running in IPv6 mode, somewhat more
efficient memory use, and better compression of the replies. Some of the new
features are described in the second half of this file (look for "new in version
1.1.11"). For the rest of the changes I will have to refer you to the ChangeLog.
For a short history about recent releases have a look at doc/html/index.html.
Since version 1.1.9 I've added some missing pieces to the documentation (the
manual doc/html/doc.html,doc/txt/manual.txt and the man page doc/pdnsd-ctl.8).
Version 1.1.11 finally has a man page doc/pdnsd.8, thanks to a contribution by
Mahesh T. Pai.
The first part of this file describes how to patch, compile, install and run
pdnsd. The second part describes some of the changes I've made to Thomas
Moestl's code.
Unless you're using the pre-patched source archive pdnsd-1.1.11-par.tar.gz you
must first apply my patch file pdnsd-1.1.11-par.diff.gz before compiling and
installing pdnsd according to Thomas Moestl's instructions described in the the
documentation. Use a freshly untarred copy of Thomas Moestl's original version
1.1.7a source, cd into the source directory pdnsd-1.1.7a and apply the command:
gzip -cd <path_to_patch>/pdnsd-1.1.11-par.diff.gz | patch -p2 -N -Z
Note: I have used GNU extensions so there may be some portability issues. I have
supplied alternatives for some of the less portable functions. There should be no
problem with most Linux distributions.
That's it! You should now be able to compile, install and run pdnsd. See the
documentation in doc/html/doc.html or doc/txt/manual.txt for more detailed
instructions.
Some people may want change the compiler optimization flag. I use the -O2 flag,
but it might be safer to use a lower level of optimization or no optimization at
all. In that case prefix the configure command with the desired compiler flags
like this (assuming you're using a bash shell):
CFLAGS="-O1 -g -Wall" ./configure ...
I have added a new configuration option "--with-thread-lib=<lib>", which you
should use if you experience problems with signal handling under Linux. The
usual symptom is failure by pdnsd to save the cache to disk, and
/var/cache/pdnsd/pdnsd.cache remaining empty. If you experience this kind of
trouble, try reconfiguring with different values for the --with-thread-lib
option. The allowable values are "linuxthreads" (the default), "linuxthreads2"
(or "lt2" for short), and "nptl". I recommend that you first configure and
compile without the --with-thread-lib option, then if you experience trouble try
again with --with-thread-lib=lt2 and recompile.
If your Linux system has an implementation of the Native POSIX Thread Library,
which is the case with Red Hat 9 for instance, you should use
--with-thread-lib=nptl .
Ideally, I would like to write a configure script which automatically detects
which kind of thread library is being used on a Linux system, but I don't have a
clue yet how to do this. If you can help me with this please write to me at the
email address listed at the end of this file.
The rest of this file describes some of the modifications I've made, but you
don't have to read it if you simply want to run pdnsd as you're used to.
- The main new feature I've added enables you to change the server addresses
that pdnsd uses at run-time using pdnsd-ctl. I've done this because the ISPs I
use do not specify fixed DNS server addresses, but expect their clients to use
dynamic DNS configuration (DHCP in the case of the cable connection, RFC1877
in case of isdn). I've extended the options that can be given with the
"server" command to pdnsd-ctl, to allow IP addresses to be specified as an
additional argument after "up|down|retest". This allows me to put something
like this in my ifup-local script:
pdnsd-ctl server isp-label up "$DNS1 $DNS2"
For more details how to use pdnsd-ctl read the updated documentation in
the doc/html directory. There is also a manpage for pdnsd-ctl.
This was quite tricky to implement because there might be pending queries
while the addresses are being changed. It certainly was an interesting
exercise in writing multi-threaded code for me.
- I've implemented a feature which allowed me to specify multiple IP addresses
per server section in the configuration file. This allowed for a much more
compact configuration file (3 server sections instead of 7 in my case),
because most configuration options are identical for servers belonging to the
same ISP. It also made the output of "pdnsd-ctl status" more compact. And it
was necessary to enable a satisfactory implementation of the previous feature.
Example of the new syntax:
ip = 123.456.789.001, 123.456.789.002, 123.456.789.003;
At the suggestion of Greg Norris server sections no longer have to specify IP
addresses. A server section without IP addresses will remain inactive until it
is assigned one more addresses at run-time with pdnsd-ctl.
- I've changed the implementation of dynamic arrays to make it slightly more
efficient, and improve type safety. I also got rid of several arrays of fixed
size in favor of dynamically allocated arrays. In particular, I got rid of
all occurrences of MAXPATH. I also made several static variables "automatic".
- The output of the "status" command of pdnsd-ctl now gives more meaningful
constant names "ping|none|if|exec" instead of numbers for the "uptest" option.
I've also added some information that was previously missing.
- I've fixed I a problem that caused pdnsd to use up a lot of CPU time and slow
down my system considerably when it received a query that took a long time to
resolve. It turned out that pdnsd can get into a "busy spin" when one of the
DNS servers pdnsd is querying refuses the connection. Apart from fixing this
bug, to speed things up additionally, I thought it would be a good idea to
mark a server down (without retesting it) after detecting errno==ECONNREFUSED.
This gives me very satisfactory performance, with the problematic server being
tried only once during every testing interval.
New in version 1.1.11: An additional busy spin condition, triggered when a
remote server answers with "Not Implemented", has been discovered and fixed.
In case there are remaining bugs in the multiplexing code, I've added a test
that checks if the number of events reported by poll/select matches the number
of events handled by pdnsd. If not, pdnsd will log an error message and give
up. Although the bugs still need to be reported and fixed, at least this
should prevent pdnsd from wasting CPU cycles.
- Due to a bug in Thomas' code, pdnsd tries, but fails, to remove the control
socket "pdnsd.status" before exiting. This has also been fixed. In version
1.1.8b1-par6 I have cleaned this up some more so that pdnsd will handle
situations where it can't open or bind the control socket more gracefully.
- I've rewritten some of the code that saves the contents of the cache to the
file "pdnsd.cache" just before pdnsd exits. This is because I noticed in my
logfiles that pdnsd occasionally had problems reading this file back at
startup. I eliminated the use of fseek() in Thomas' code. I could not find
anything that was demonstrably incorrect about his use of fseek(), but it
seemed better to me to do without it and write the file in a strictly
sequential order. Anyway, it turned out my hunch paid off: no more error
messages about "pdnsd.cache" in my logfile.
New in version 1.1.11: I've added some new code for sorting the queue used for
purging stale cache entries. This should allow pdnsd to start up faster when
reading large cache files from disk.
- I've extended the configuration options for policies of inclusion/exclusion
lists in server sections. The new policies options are "simple_only" and
"fqdn_only". Setting policy=simple_only will cause the server to used only for
simple hostnames if no other rule matches. On the other hand, setting
policy=fqdn_only will cause the server to be used only for fully qualified
domain names (i.e. the name has at least one dot in-between). I find these
options useful for controlling which name servers (if any) will be used by
pdnsd for simple host names.
- I've added a new "delegation_only" option that can be used to undo the
unwanted effects of DNS "wildcards". It works roughly as the feature by the
same name in BIND. It is turned off by default. To block Verisign's
Sitefinder, add the following line to the global section of the configuration
file:
delegation_only= com, net;
If you find that this feature blocks some legitimate domain names, you will
probably need to add the address of a nameserver that provides good authority
information. More information can be found at
http://www.phys.uu.nl/~rombouts/pdnsd/delegationonly.html
- It is no longer mandatory that domain names in the configuration file end in a
dot.
- The parser for configuration files has been rewritten purely in C, so (f)lex
and yacc/bison are no longer needed to build pdnsd.
It is no longer necessary to place strings between quotes in the configuration
file, unless a string contains a special character such as whitespace, a token
that normally starts a comment, or one of the characters ",;{}". Note that
these special characters are illegal in domain names anyway.
- New in version 1.1.11: Negating whole domains with a neg section in the
config file will result in all the subdomains being negated as well.
For example, adding the lines
neg {name=doubleclick.com; types=domain;}
neg {name=doubleclick.net; types=domain;}
will also negate ad.doubleclick.com, ad.fr.doubleclick.net, etc.
- New in version 1.1.11: When running in IPv6 mode, pdnsd will now automatically
map any IPv4 addresses it reads in the config file to IPv6 addresses.
When pdnsd has been compiled with IPv6 support and runs in IPv4 mode, it will
skip IPv6 addresses with a warning message. This may result in certain server
sections becoming inactive, though.
The -4 and -6 options should now work as advertised.
I've added two new command-line options, "-a" and "-i <prefix>".
With the -a flag pdnsd will try to detect automatically if IPv6 support is
available on a system, and fall back to IPv4 if not. The -a flag can be used
instead of -4 or -6.
The -i option can be used to specify a prefix for mapping IPv4 to IPv6
address. The default is ::ffff.0.0.0.0. There is also a corresponding
ipv4_6_prefix= option for the config file.
- New in version 1.1.11: I've slightly changed the way pdnsd does parallel
queries. Active queries or not canceled until we have received a useful
response from a remote name server, or all the queries have failed or timed
out. Thus the par_queries parameter is no longer the maximum number of
parallel queries, but rather the increment with which the number of parallel
queries is increased when the previous set has timed out. In the worst case
there will be pending queries to all the servers in the list of available
servers simultaneously. We may be wasting more system resources this way, but
the advantage is that we have a greater chance of catching a reply. After all,
if we wait longer anyway, why not for more servers.
I've also introduced a global timeout parameter. This is the minimum period of
time pdnsd will wait after sending the first query to a remote server before
giving up without having received a reply. The timeout options in the
configuration file are now only minimum timeout intervals. Setting the global
timeout option makes it possible to specify quite short timeout intervals in
the server sections. This will have the effect that pdnsd will start querying
additional servers fairly quickly if the first servers are slow to respond
(but will still continue to listen for responses from the first ones). This
may allow pdnsd to get an answer more quickly in certain situations.
After receiving a reply from a remote server the server is marked up and its
time stamp is updated. This will have the effect that pdnsd doesn't bother
testing this server for availability for a period of time, and thus the
overhead caused by testing is reduced. After server timeouts, uptests are
performed by the separate server status thread, not by threads that have to
answer queries. Unresponsive servers with uptest=ping will not be marked down
immediately any more, but only after the ping test has definitely failed.
I've also included a number of bug-fixes contained in a patch file supplied to
me by Thomas Moestl. In addition to the things I had already fixed, the
following issues are addressed: some memory leaks, dropping of root privileges
before calling uptest scripts in case pdnsd was started setuid root (which is a
bad idea anyway), passing on open fd's to uptests, integer overruns in the
status reporting code, fixing string passing from the lexer, more consistent
treatment of underscores in domain names.
In addition to the things I've listed above, I've made various little changes to
fix minor bugs, improve efficiency or elegance, or simply to suit my my own
coding style. These changes are too numerous to list here, but some of them are
listed in the ChangeLog. Of course if you are really interested in the
nitty-gritty you can always compare the source of my version with Thomas'
original code.
If you have any questions about the modifications I've made, you can send these
to <p.a.rombouts@home.nl>. Questions about the original pdnsd version should
be sent to <tmoestl@gmx.net> or <t.moestl@tu-bs.de>.
This is a (hopefully complete) list of people I have to thank for helping me
develop and improve pdnsd:
David G. Andersen
Andrew M. Bishop
Daniel Black
Carsten Block
Stephan Boettcher
P.J. Bostley
Rodney Brown
Kevin A. Burton
Juliusz Chroboczek
Joachim Dorner
Frank Elsner
Christian Engstler
Stefan Erhardt
Bjoern Fischer
Stefan Frster
Bert Frederiks
Mike Hammer
Jonathan Hudson
Torben Janssen
Byrial Jensen
Olaf Kirch
Nikola Kotur
Kiyo Kelvin Lee
Bernd Leibing
Patrick Loschmidt
James MacLean
Sourav K. Mandal
Fraser McCrossan
Markus Mohr
Michael Mller
Gustavo Niemeyer
Alexandre Nunes
Wolfgang Ocker
Mahesh T. Pai
Bernhard Pelz
Soenke J. Peters
Erich Reitz
Paul A. Rombouts
Brian Schroeder
Roman Shterenzon
Daniel Smolik
Milan P. Stanic
Michael Steiner
Norbert Steinl
Andreas Steinmetz
Marko Stolle
Markus Storm
Michael Strder
Thomas Stromberg
Alan Swanson
Lyonel Vincent
Eelco Vriezekolk
Paul Wagland
Sverker Wiberg
Michael Wiedmann
Ron Yorston
Nikita V. Youshchenko
Jan-Marek Glogowski
Thomas Cort
Pierre Habouzit
Dirk Armbrust
Georg Schwarz
Ashish Shukla
- Implement a reference counter to ensure that newly entered records are not
purged immediately (really needed?)
- Perhaps do a two-step form of recursive query: first query those servers we
have got cached, then (if unsuccessful) look the others up and query again.
The impact of this optimisation may not be very big, because all sane servers
give A records for NS records if possible.
- Test for compatibility on other Unix-like Systems other than the BSDs and
Linux; rewrite the functions in netdev.c and icmp.c for those OSs if
necessary. Also try to get compatibility for other compilers than gcc.
- Write an install rule for the Slackware start-up script.
- Update the FAQ.
- Implement DNSSEC support. Since version 1.2.9, pdnsd is able to cache the RR
types necessary for DNSSEC, but the resolver is not yet security aware.
This tool allows you to redirect any TCP connection to SOCKS or HTTPS
proxy using your firewall, so redirection is system-wide.
Why is that useful? I can suggest following reasons:
* you use tor[1] and don't want any TCP connection to leak.
* you use DVB ISP and this ISP provides internet connectivity with some
special daemon that may be also called "Internet accelerator" and this
accelerator acts as proxy. Globax[2] is example of such an accelerator.
Linux/iptables, OpenBSD/pf and FreeBSD/ipfw are supported.
Linux/iptables is well-tested, other implementations may have bugs,
your bugreports are welcome.
Transocks[3] is alike project but it has noticable performance penality.
Transsocks_ev[4] is alike project too, but it has no HTTPS-proxy support
and does not support authentication.
Several Android apps also use redsocks under-the-hood: ProxyDroid[5][6] and
sshtunnel[7][8]. And that's over 100'000 downloads! Wow!
[1] http://www.torproject.org
[2] http://www.globax.biz
[3] http://transocks.sourceforge.net/
[4] http://oss.tiggerswelt.net/transocks_ev/
[5] http://code.google.com/p/proxydroid/
[6] https://market.android.com/details?id=org.proxydroid
[7] http://code.google.com/p/sshtunnel/
[8] https://market.android.com/details?id=org.sshtunnel
Another related issue is DNS over TCP. Redsocks includes `dnstc' that is fake
and really dumb DNS server that returns "truncated answer" to every query via
UDP. RFC-compliant resolver should repeat same query via TCP in this case - so
the request can be redirected using usual redsocks facilities.
Known compliant resolvers are:
* bind9 (server)
* dig, nslookup (tools based on bind9 code)
Known non-compliant resolvers are:
* eglibc resolver fails without any attempt to send request via TCP
* powerdns-recursor can't properly startup without UDP connectivity as it
can't load root hints
On the other hand, DNS via TCP using bind9 may be painfully slow. If your bind9
setup is really slow, you have at least two options: pdnsd[9] caching server
can run in TCP-only mode, ttdnsd[10][11] has no cache but can be useful for same
purpose.
[9] http://www.phys.uu.nl/~rombouts/pdnsd.html
[10] http://www.mulliner.org/collin/ttdnsd.php
[11] https://gitweb.torproject.org/ioerror/ttdnsd.git
Features
========
Redirect any TCP connection to SOCKS4, SOCKS5 or HTTPS (HTTP/CONNECT)
proxy server.
Login/password authentication is supported for SOCKS5/HTTPS connections.
SOCKS4 supports only username, password is ignored. for HTTPS, currently
only Basic and Digest scheme is supported.
Redirect UDP packets via SOCKS5 proxy server. NB: UDP still goes via UDP, so
you can't relay UDP via OpenSSH.
Sends "truncated reply" as an answer to UDP DNS queries.
Redirect any HTTP connection to proxy that does not support transparent
proxying (e.g. old SQUID had broken `acl myport' for such connections).
License
=======
All source code is licensed under Apache 2.0 license.
You can get a copy at http://www.apache.org/licenses/LICENSE-2.0.html
Packages
========
* Archlinux: https://aur.archlinux.org/packages.php?ID=41765
* Debian: http://packages.debian.org/search?searchon=names&keywords=redsocks
* Gentoo (pentoo overlay): https://code.google.com/p/pentoo/source/browse/portage/trunk/net-proxy/redsocks
* Gentoo (theebuilds overlay): http://code.google.com/p/theebuilds/source/browse/trunk/net-misc/redsocks
* Gentoo (zugaina overlay): http://gpo.zugaina.org/net-proxy/redsocks
* Ubuntu: http://packages.ubuntu.com/search?searchon=names&keywords=redsocks
Compilation
===========
libevent[5] is required.
gcc and clang are supported right now, other compilers can be used
but may require some code changes.
Compilation is as easy as running `make', there is no `./configure' magic.
GNU Make works, other implementations of make were not tested.
[5] http://libevent.org/ || http://www.monkey.org/~provos/libevent/
Running
=======
Program has following command-line options:
-c sets proper path to config file ("./redsocks.conf" is default one)
-t tests config file syntax
-p set a file to write the getpid() into
Following signals are understood:
SIGUSR1 dumps list of connected clients to log
SIGTERM and SIGINT terminates daemon, all active connections are closed
You can see configuration file example in redsocks.conf.example
iptables example
================
You have to build iptables with connection tracking and REDIRECT target.
# Create new chain
root# iptables -t nat -N REDSOCKS
# Ignore LANs and some other reserved addresses.
# See http://en.wikipedia.org/wiki/Reserved_IP_addresses#Reserved_IPv4_addresses
# and http://tools.ietf.org/html/rfc5735 for full list of reserved networks.
root# iptables -t nat -A REDSOCKS -d 0.0.0.0/8 -j RETURN
root# iptables -t nat -A REDSOCKS -d 10.0.0.0/8 -j RETURN
root# iptables -t nat -A REDSOCKS -d 127.0.0.0/8 -j RETURN
root# iptables -t nat -A REDSOCKS -d 169.254.0.0/16 -j RETURN
root# iptables -t nat -A REDSOCKS -d 172.16.0.0/12 -j RETURN
root# iptables -t nat -A REDSOCKS -d 192.168.0.0/16 -j RETURN
root# iptables -t nat -A REDSOCKS -d 224.0.0.0/4 -j RETURN
root# iptables -t nat -A REDSOCKS -d 240.0.0.0/4 -j RETURN
# Anything else should be redirected to port 12345
root# iptables -t nat -A REDSOCKS -p tcp -j REDIRECT --to-ports 12345
# Any tcp connection made by `luser' should be redirected.
root# iptables -t nat -A OUTPUT -p tcp -m owner --uid-owner luser -j REDSOCKS
# You can also control that in more precise way using `gid-owner` from
# iptables.
root# groupadd socksified
root# usermod --append --groups socksified luser
root# iptables -t nat -A OUTPUT -p tcp -m owner --gid-owner socksified -j REDSOCKS
# Now you can launch your specific application with GID `socksified` and it
# will be... socksified. See following commands (numbers may vary).
# Note: you may have to relogin to apply `usermod` changes.
luser$ id
uid=1000(luser) gid=1000(luser) groups=1000(luser),1001(socksified)
luser$ sg socksified -c id
uid=1000(luser) gid=1001(socksified) groups=1000(luser),1001(socksified)
luser$ sg socksified -c "firefox"
# If you want to configure socksifying router, you should look at
# doc/iptables-packet-flow.png and doc/iptables-packet-flow-ng.png
# Note, you should have proper `local_ip' value to get external packets with
# redsocks, default 127.0.0.1 will not go. See iptables(8) manpage regarding
# REDIRECT target for details.
# Depending on your network configuration iptables conf. may be as easy as:
root# iptables -t nat -A PREROUTING --in-interface eth_int -p tcp -j REDSOCKS
Note about GID-based redirection
========
Keep in mind, that changed GID affects filesystem permissions, so if your
application creates some files, the files will be created with luser:socksified
owner/group. So, if you're not the only user in the group `socksified` and your
umask allows to create group-readable files and your directory permissions, and
so on, blah-blah, etc. THEN you may expose your files to another user.
Ok, you have been warned.
Homepage
========
http://darkk.net.ru/redsocks/
Mailing list: redsocks@librelist.com
Mailing list also has archives[1].
[1] http://librelist.com/browser/redsocks/
TODO
====
Test OpenBSD (pf) and FreeBSD (ipfw) and write setup examples for those
firewall types.
Author
======
This program was written by Leonid Evdokimov <leon@darkk.net.ru>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<link rel="stylesheet" type="text/css" href="../site.css" />
<title>redsocks - transparent socks redirector</title>
</head>
<body>
<!-- Intro -->
<h1>redsocks - transparent socks redirector</h1>
<div class="navi">
<a href="../">darkk's homepage</a>
<a href="http://github.com/darkk/redsocks/tree/master">download source code</a>
</div>
<hr/>
<p>This tool allows you to redirect any TCP connection to SOCKS or HTTPS
proxy using your firewall, so redirection is system-wide.</p>
<p>Why is that useful? I can suggest following reasons:</p>
<ul>
<li>you use <a href="http://www.torproject.org">tor</a> and don't want any TCP connection to leak</li>
<li>you use DVB ISP and this ISP provides internet connectivity with some
special daemon that may be also called "Internet accelerator" and this
accelerator acts as proxy. <a href="http://www.globax.biz">Globax</a> is example of such an accelerator</li>
</ul>
<p>Linux/iptables, OpenBSD/pf and FreeBSD/ipfw are supported.
Linux/iptables is well-tested, other implementations may have bugs,
your bugreports are welcome.</p>
<p><a href="http://transocks.sourceforge.net/">Transocks</a> is alike project but it has noticable performance penality.</p>
<p><a href="http://oss.tiggerswelt.net/transocks_ev/">Transsocks_ev</a> is alike project too, but it has no HTTPS-proxy support
and does not support authentication.</p>
<p>Several Andoird apps also use redsocks under-the-hood: <a href="http://code.google.com/p/proxydroid/">ProxyDroid</a> (<a href="https://market.android.com/details?id=org.proxydroid">@AndroidMarket</a>) and
<a href="http://code.google.com/p/sshtunnel/">sshtunnel</a> (<a href="https://market.android.com/details?id=org.sshtunnel">@AndroidMarket</a>). And that's over 100'000 downloads! Wow!</p>
<p>Another related issue is DNS over TCP. Redsocks includes `dnstc' that is fake
and really dumb DNS server that returns "truncated answer" to every query via
UDP. RFC-compliant resolver should repeat same query via TCP in this case - so
the request can be redirected using usual redsocks facilities.</p>
<p>Known compliant resolvers are:</p>
<ul>
<li>bind9 (server)</li>
<li>dig, nslookup (tools based on bind9 code)</li>
</ul>
<p>Known non-compliant resolvers are:</p>
<ul>
<li>eglibc resolver fails without any attempt to send request via TCP</li>
<li>powerdns-recursor can't properly startup without UDP connectivity as it
can't load root hints</li>
</ul>
<p>On the other hand, DNS via TCP using bind9 may be painfully slow. If your bind9
setup is really slow, you have at least two options: <a href="http://www.phys.uu.nl/~rombouts/pdnsd.html">pdnsd</a> caching server
can run in TCP-only mode, <a href="http://www.mulliner.org/collin/ttdnsd.php">ttdnsd</a> (<a href="https://gitweb.torproject.org/ioerror/ttdnsd.git">git repo</a>) has no cache but can be useful for same
purpose.</p>
<h2>Features</h2>
<p>Redirect any TCP connection to SOCKS4, SOCKS5 or HTTPS (HTTP/CONNECT)
proxy server.</p>
<p>Login/password authentication is supported for SOCKS5/HTTPS connections.
SOCKS4 supports only username, password is ignored. for HTTPS, currently
only Basic and Digest scheme is supported.</p>
<p>Redirect UDP packets via SOCKS5 proxy server. NB: UDP still goes via UDP, so
you can't relay UDP via OpenSSH.</p>
<p>Sends "truncated reply" as an answer to UDP DNS queries.</p>
<p>Redirect any HTTP connection to proxy that does not support transparent
proxying (e.g. old SQUID had broken `acl myport' for such connections).</p>
<h2>License</h2>
<p>All source code is licensed under Apache 2.0 license.</p>
<p>You can get a copy at <a href="http://www.apache.org/licenses/LICENSE-2.0.html">http://www.apache.org/licenses/LICENSE-2.0.html</a></p>
<h2>Packages</h2>
<ul>
<li><img src="http://www.archlinux.org/favicon.ico" alt="" />
<a href="https://aur.archlinux.org/packages.php?ID=41765">Archlinux AUR</a></li>
<li><img src="http://www.debian.org/favicon.ico" alt="" />
<a href="http://packages.debian.org/search?searchon=names&keywords=redsocks">Debian</a></li>
<li><img src="http://www.gentoo.org/favicon.ico" alt="" />
<a href="https://code.google.com/p/pentoo/source/browse/portage/trunk/net-proxy/redsocks">Gentoo (pentoo overlay)</a></li>
<li><img src="http://www.gentoo.org/favicon.ico" alt="" />
<a href="http://code.google.com/p/theebuilds/source/browse/trunk/net-misc/redsocks">Gentoo (theebuilds overlay)</a></li>
<li><img src="http://www.gentoo.org/favicon.ico" alt="" />
<a href="http://gpo.zugaina.org/net-proxy/redsocks">Gentoo (zugaina overlay)</a></li>
<li><img src="http://www.ubuntu.com/sites/all/themes/ubuntu10/favicon.ico" alt="" />
<a href="http://packages.ubuntu.com/search?searchon=names&keywords=redsocks">Ubuntu</a></li>
</ul>
<h2>Compilation</h2>
<p><a href="http://libevent.org/">libevent</a> is required.</p>
<p>gcc is only supported compiler right now, other compilers can be used
but may require some code changes.</p>
<p>Compilation is as easy as running `make', there is no `./configure' magic.</p>
<p>GNU Make works, other implementations of make were not tested.</p>
<h2>Running</h2>
<p>Program has following command-line options:<br/>
-c sets proper path to config file ("./redsocks.conf" is default one)<br/>
-t tests config file syntax<br/>
-p set a file to write the getpid() into</p>
<p>Following signals are understood:<br/>
SIGUSR1 dumps list of connected clients to log<br/>
SIGTERM and SIGINT terminates daemon, all active connections are closed</p>
<p>You can see configuration file example in redsocks.conf.example</p>
<h2>iptables example</h2>
<p>You have to build iptables with connection tracking and REDIRECT target.</p>
<pre>
# Create new chain
<strong>root#</strong> <code>iptables -t nat -N REDSOCKS</code>
# Ignore LANs and some other reserved addresses.
# See <a href="http://en.wikipedia.org/wiki/Reserved_IP_addresses#Reserved_IPv4_addresses">Wikipedia</a> and <a href="http://tools.ietf.org/html/rfc5735">RFC5735</a> for full list of reserved networks.
<strong>root#</strong> <code>iptables -t nat -A REDSOCKS -d 0.0.0.0/8 -j RETURN</code>
<strong>root#</strong> <code>iptables -t nat -A REDSOCKS -d 10.0.0.0/8 -j RETURN</code>
<strong>root#</strong> <code>iptables -t nat -A REDSOCKS -d 127.0.0.0/8 -j RETURN</code>
<strong>root#</strong> <code>iptables -t nat -A REDSOCKS -d 169.254.0.0/16 -j RETURN</code>
<strong>root#</strong> <code>iptables -t nat -A REDSOCKS -d 172.16.0.0/12 -j RETURN</code>
<strong>root#</strong> <code>iptables -t nat -A REDSOCKS -d 192.168.0.0/16 -j RETURN</code>
<strong>root#</strong> <code>iptables -t nat -A REDSOCKS -d 224.0.0.0/4 -j RETURN</code>
<strong>root#</strong> <code>iptables -t nat -A REDSOCKS -d 240.0.0.0/4 -j RETURN</code>
# Anything else should be redirected to port 12345
<strong>root#</strong> <code>iptables -t nat -A REDSOCKS -p tcp -j REDIRECT --to-ports 12345</code>
# Any tcp connection made by `luser' should be redirected.
<strong>root#</strong> <code>iptables -t nat -A OUTPUT -p tcp -m owner --uid-owner luser -j REDSOCKS</code>
# You can also control that in more precise way using `gid-owner` from
# iptables.
<strong>root#</strong> <code>groupadd socksified</code>
<strong>root#</strong> <code>usermod --append --groups socksified luser</code>
<strong>root#</strong> <code>iptables -t nat -A OUTPUT -p tcp -m owner --gid-owner socksified -j REDSOCKS</code>
# Now you can launch your specific application with GID `socksified` and it
# will be... socksified. See following commands (numbers may vary).
# Note: you may have to relogin to apply `usermod` changes.
<strong>luser$</strong> <code>id</code>
uid=1000(luser) gid=1000(luser) groups=1000(luser),1001(socksified)
<strong>luser$</strong> <code>sg socksified -c id</code>
uid=1000(luser) gid=1001(socksified) groups=1000(luser),1001(socksified)
<strong>luser$</strong> <code>sg socksified -c "firefox"</code>
# If you want to configure socksifying router, you should look at
# <a href="doc/iptables-packet-flow.png">doc/iptables-packet-flow.png</a> and <a href="doc/iptables-packet-flow-ng.png">doc/iptables-packet-flow-ng.png</a>
# Note, you should have proper `local_ip' value to get external packets with
# redsocks, default 127.0.0.1 will not go. See iptables(8) manpage regarding
# <a href="http://dev.medozas.de/files/xtables/iptables.html#76">REDIRECT target</a> for details.
# Depending on your network configuration iptables conf. may be as easy as:
<strong>root#</strong> <code>iptables -t nat -A PREROUTING --in-interface eth_int -p tcp -j REDSOCKS</code>
</pre>
<h3>Note about GID-based redirection</h3>
<p>
Keep in mind, that changed GID affects filesystem permissions, so if your
application creates some files, the files will be created with luser:socksified
owner/group. So, if you're not the only user in the group `socksified` and your
umask allows to create group-readable files and your directory permissions, and
so on, blah-blah, etc. THEN you may expose your files to another user.
</p>
<p>
Ok, you have been warned.
</p>
<h2>Homepage</h2>
<p>Homepage: <a href="http://darkk.net.ru/redsocks/">http://darkk.net.ru/redsocks/</a></p>
<p>Mailing list: <a href="mailto:redsocks@librelist.com">redsocks@librelist.com</a></p>
<p>Mailing list also has <a href="http://librelist.com/browser/redsocks/">archives</a>.</p>
<h2>TODO</h2>
<ul>
<li>Test OpenBSD (pf) and FreeBSD (ipfw) and write setup examples for those
firewall types.</li>
</ul>
<h2>Author</h2>
This program was written by Leonid Evdokimov.
<!-- Outro -->
<a name="address"></a>
<pre>
(~~~~~~~~~~\ __
| jabber: ) / \
| mailto: ( /|oo \
\_________\(_| /_)
_ @/_ \
| | \ \\
leon | (*) | \ )) darkk.net.ru
|__U__| / \//
_//|| _\ /
(_/(_|(____/
<a href="http://jigsaw.w3.org/css-validator/check/referer">Valid CSS!</a>
<a href="http://validator.w3.org/check?uri=referer">Valid XHTML 1.0 Transitional</a>
</pre>
<!-- /Outro -->
<!-- vim:set tabstop=2 softtabstop=2 shiftwidth=2: -->
</body>
</html>
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment