Commit Graph

3116 Commits

Author SHA1 Message Date
Saúl Ibarra Corretgé
c9c00cdc0d doc: clarify how uv_async_send behaves
Closes #29

PR-URL: https://github.com/libuv/libuv/pull/122
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
2015-01-07 14:01:16 +01:00
Saúl Ibarra Corretgé
85d6624768 doc: clarify the behavior of uv_tty_init
Closes #120

PR-URL: https://github.com/libuv/libuv/pull/121
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
2015-01-07 13:58:55 +01:00
Saúl Ibarra Corretgé
72e4b5ab66 test: skip TTY select test if /dev/tty can't be opened
PR-URL: https://github.com/libuv/libuv/pull/123
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
2015-01-07 13:53:12 +01:00
Saúl Ibarra Corretgé
295fc41d29 unix: remove unused dtrace file
PR-URL: https://github.com/libuv/libuv/pull/119
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
2015-01-06 18:25:08 +01:00
Saúl Ibarra Corretgé
3fd823ac60 Add SHA to ChangeLog 2015-01-05 20:30:04 +01:00
Saúl Ibarra Corretgé
09f25b13cd 2015.01.06, Version 1.2.0 (Stable)
Changes since version 1.1.0:

* linux: fix epoll_pwait() sigmask size calculation (Ben Noordhuis)

* tty: implement binary I/O terminal mode (Yuri D'Elia)

* test: fix spawn test with autotools build (Ben Noordhuis)

* test: skip ipv6 tests when ipv6 is not supported (Ben Noordhuis)

* common: move STATIC_ASSERT to uv-common.h (Alexey Melnichuk)

* win/thread: store thread handle in a TLS slot (Alexey Melnichuk)

* unix: fix ttl, multicast ttl and loop options on IPv6 (Saúl Ibarra
  Corretgé)

* linux: fix support for preadv/pwritev-less kernels (Ben Noordhuis)

* unix: make uv_exepath(size=0) return UV_EINVAL (Ben Noordhuis)

* darwin: fix uv_exepath(smallbuf) UV_EPERM error (Ben Noordhuis)

* openbsd: fix uv_exepath(smallbuf) UV_EINVAL error (Ben Noordhuis)

* linux: fix uv_exepath(size=1) UV_EINVAL error (Ben Noordhuis)

* sunos: preemptively fix uv_exepath(size=1) (Ben Noordhuis)

* win: fix and clarify comments in winapi.h (Bert Belder)

* win: make available NtQueryDirectoryFile (Bert Belder)

* win: add definitions for directory information types (Bert Belder)

* win: use NtQueryDirectoryFile to implement uv_fs_scandir (Bert Belder)

* unix: don't unlink unix socket on bind error (Ben Noordhuis)

* build: fix bad comment in autogen.sh (Ben Noordhuis)

* build: add AC_PROG_LIBTOOL to configure.ac (Ben Noordhuis)

* test: skip udp_options6 if there no IPv6 support (Saúl Ibarra
  Corretgé)

* win: add definitions for MUI errors mingw lacks (Bert Belder)

* build: enable warnings in autotools build (Ben Noordhuis)

* build: remove -Wno-dollar-in-identifier-extension (Ben Noordhuis)

* build: move flags from Makefile.am to configure.ac (Ben Noordhuis)
2015-01-05 20:28:35 +01:00
Saúl Ibarra Corretgé
36f90342a3 doc: updated version reference for TTY mode changes 2015-01-05 20:21:57 +01:00
Saúl Ibarra Corretgé
147993d4a5 Merge branch 'v0.10' into v1.x
Conflicts:
	ChangeLog
	src/version.c
2015-01-05 20:20:25 +01:00
Saúl Ibarra Corretgé
8d07ddb8c2 Now working on v0.10.33 2015-01-05 20:10:50 +01:00
Saúl Ibarra Corretgé
378de30c59 2015.01.06, Version 0.10.32 (Stable)
Changes since version 0.10.31:

* linux: fix epoll_pwait() sigmask size calculation (Ben Noordhuis)
2015-01-05 20:10:43 +01:00
Ben Noordhuis
e6e871ac1c build: move flags from Makefile.am to configure.ac
Move compile-time flags that are not platform-specific defines to
configure.ac where they can be properly feature-detected.

PR-URL: https://github.com/libuv/libuv/pull/24
Reviewed-By: Saúl Ibarra Corretgé <saghul@gmail.com>
2015-01-05 17:46:02 +01:00
Ben Noordhuis
c66edd4e64 build: remove -Wno-dollar-in-identifier-extension
Don't check if -Wno-dollar-in-identifier-extension is supported in the
autotools build; that flag was only necessary on OS X and only when the
dtrace probes were enabled (because dtrace(1) generates identifiers with
sigils in them).  The probes were removed in commit cb51400, making the
check unnecessary.

PR-URL: https://github.com/libuv/libuv/pull/24
Reviewed-By: Saúl Ibarra Corretgé <saghul@gmail.com>
2015-01-05 17:46:00 +01:00
Ben Noordhuis
959a82f601 build: enable warnings in autotools build
Turn on -Wall -Wextra -Wno-unused-parameter, just like we do in gyp
builds.

PR-URL: https://github.com/libuv/libuv/pull/24
Reviewed-By: Saúl Ibarra Corretgé <saghul@gmail.com>
2015-01-05 17:45:15 +01:00
Bert Belder
6da887f416 win: add definitions for MUI errors mingw lacks
PR-URL: https://github.com/libuv/libuv/pull/110
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
Reviewed-By: Saúl Ibarra Corretgé <saghul@gmail.com>
2015-01-05 17:15:00 +01:00
Saúl Ibarra Corretgé
69678e27c8 test: skip udp_options6 if there no IPv6 support
PR-URL: https://github.com/libuv/libuv/pull/115
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
2015-01-05 12:32:57 +01:00
Ben Noordhuis
43e256aaff build: add AC_PROG_LIBTOOL to configure.ac
It should fix the following build error with old autoconf/automake
versions:

    Makefile.am:24: Libtool library used but `LIBTOOL' is undefined
    Makefile.am:24: The usual way to define `LIBTOOL' is to add
    `AC_PROG_LIBTOOL'
    Makefile.am:24: to `configure.ac' and run `aclocal' and `autoconf'
    again.

Fixes: https://github.com/libuv/libuv/issues/111
PR-URL: https://github.com/libuv/libuv/pull/113
Reviewed-By: Rod Vagg <rod@vagg.org>
Reviewed-By: Saúl Ibarra Corretgé <saghul@gmail.com>
2015-01-05 10:48:57 +01:00
Ben Noordhuis
0ac26d3a25 build: fix bad comment in autogen.sh
The serial-tests option is available in automake v1.12, not v0.12.

PR-URL: https://github.com/libuv/libuv/pull/113
Reviewed-By: Rod Vagg <rod@vagg.org>
Reviewed-By: Saúl Ibarra Corretgé <saghul@gmail.com>
2015-01-05 10:46:41 +01:00
Ben Noordhuis
43818ade32 unix: don't unlink unix socket on bind error
Don't unlink the socket in uv_pipe_bind().  If the bind operation fails,
the socket is most likely not ours.

Fixes: https://github.com/libuv/libuv/issues/108
PR-URL: https://github.com/libuv/libuv/pull/109
Reviewed-By: Saúl Ibarra Corretgé <saghul@gmail.com>
2015-01-05 09:39:04 +01:00
Bert Belder
0729ce8b39 win: use NtQueryDirectoryFile to implement uv_fs_scandir
PR-URL: https://github.com/libuv/libuv/pull/105
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
Reviewed-By: Saúl Ibarra Corretgé <saghul@gmail.com>
2015-01-05 01:38:28 +01:00
Bert Belder
2af8294895 win: add definitions for directory information types
PR-URL: https://github.com/libuv/libuv/pull/105
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
Reviewed-By: Saúl Ibarra Corretgé <saghul@gmail.com>
2015-01-05 01:38:28 +01:00
Bert Belder
7a322479ad win: make available NtQueryDirectoryFile
PR-URL: https://github.com/libuv/libuv/pull/105
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
Reviewed-By: Saúl Ibarra Corretgé <saghul@gmail.com>
2015-01-05 01:38:27 +01:00
Bert Belder
dfd908fc9b win: fix and clarify comments in winapi.h
PR-URL: https://github.com/libuv/libuv/pull/105
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
Reviewed-By: Saúl Ibarra Corretgé <saghul@gmail.com>
2015-01-05 01:38:27 +01:00
Ben Noordhuis
1b0ac59179 sunos: preemptively fix uv_exepath(size=1)
I'm not 100% sure whether the behavior of readlink() with size=0 is
well-defined on Solaris; it can return either 0 or fail with EINVAL.
POSIX is not explicit about the mandated behavior.

This commit adds a little caution and makes it skip the readlink()
call when size=1 and simply writes the terminating zero byte.

PR-URL: https://github.com/libuv/libuv/pull/104
Reviewed-By: Saúl Ibarra Corretgé <saghul@gmail.com>
2015-01-03 23:40:34 +01:00
Ben Noordhuis
555a9647a0 linux: fix uv_exepath(size=1) UV_EINVAL error
uv_exepath() should write as much as possible to the output buffer.
In the case of size=1, skip the call to readlink() because it will
fail with EINVAL; just write the terminating zero byte.

PR-URL: https://github.com/libuv/libuv/pull/104
Reviewed-By: Saúl Ibarra Corretgé <saghul@gmail.com>
2015-01-03 23:40:31 +01:00
Ben Noordhuis
d17a8e45f5 openbsd: fix uv_exepath(smallbuf) UV_EINVAL error
Write as much of the path as possible to the output buffer.  Before this
commit, passing in a buffer that was too small to hold the result failed
with a UV_EINVAL error.

PR-URL: https://github.com/libuv/libuv/pull/104
Reviewed-By: Saúl Ibarra Corretgé <saghul@gmail.com>
2015-01-03 23:40:29 +01:00
Ben Noordhuis
885b1ecda0 darwin: fix uv_exepath(smallbuf) UV_EPERM error
Passing a buffer that was too small to hold the result made it fail
with UV_EPERM because the -1 status code from _NSGetExecutablePath()
was returned unmodified to the caller.

This commit rewrites uv_exepath() to:

1. Not allocate heap memory, and

2. Not clobber the result buffer on error, and

3. Handle _NSGetExecutablePath()'s and realpath()'s idiosyncracies, and

4. Store as much of the path in the output buffer as possible, don't
   fail with an error.  Makes it behave the same as other platforms.
   The result is always zero-terminated.

Fixes: https://github.com/libuv/libuv/issues/103
PR-URL: https://github.com/libuv/libuv/pull/104
Reviewed-By: Saúl Ibarra Corretgé <saghul@gmail.com>
2015-01-03 23:40:24 +01:00
Ben Noordhuis
afb319215d unix: make uv_exepath(size=0) return UV_EINVAL
Make the behavior of a call to uv_exepath() with a size argument of zero
consistent with the Windows implementation where it returns UV_EINVAL.

PR-URL: https://github.com/libuv/libuv/pull/104
Reviewed-By: Saúl Ibarra Corretgé <saghul@gmail.com>
2015-01-03 23:39:55 +01:00
Ben Noordhuis
af96f458e2 linux: fix support for preadv/pwritev-less kernels
The fix from commit 269ff0be is wrong in that it sniffs system headers
to determine if preadv() and pwrite() are supported.

It breaks the fs_write_multiple_bufs test on one of my ARM systems;
its glibc has preadv() and pwritev() wrappers but its kernel has no
support for the corresponding system calls.

Simply try the system call and fall back to a normal read or write
loop if not supported.  Move the no_preadv and no_pwritev variables
around to squelch two -Wpedantic warnings about mixing declarations
with code.

PR-URL: https://github.com/libuv/libuv/pull/90
Reviewed-By: Saúl Ibarra Corretgé <saghul@gmail.com>
2015-01-02 18:02:34 +01:00
Saúl Ibarra Corretgé
2daee9fbeb unix: fix ttl, multicast ttl and loop options on IPv6
Fixes #93

PR-URL: https://github.com/libuv/libuv/pull/99
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
2015-01-02 17:34:13 +01:00
Alexey Melnichuk
a31024865b win/thread: store thread handle in a TLS slot
Using a static thread local variable to store the thread handle causes
crashes on Windows XP/2003 when libuv is loaded as a dynamic library.
With this patch, a TLS slot is allocated dynamically.

PR-URL: https://github.com/libuv/libuv/pull/82
Reviewed-By: Bert Belder <bertbelder@gmail.com>
2015-01-02 16:17:16 +01:00
Alexey Melnichuk
0473ac90bb common: move STATIC_ASSERT to uv-common.h
PR-URL: https://github.com/libuv/libuv/pull/82
Reviewed-By: Bert Belder <bertbelder@gmail.com>
Reviewed-By: Saúl Ibarra Corretgé <saghul@gmail.com>
2015-01-02 16:17:10 +01:00
Ben Noordhuis
ebc50aee1d Revert "unix: only set SO_REUSEADDR when bind() fails"
This reverts commit a9e95a33bc.

This seems to cause regressions in the test suite when IPv6 is disabled.

As optimizations go, it's a very minor one so let's not spend too much
effort trying to track down the cause of the regressions but revert the
change before it makes its way into a release.

PR-URL: https://github.com/libuv/libuv/pull/92
Reviewed-By: Saúl Ibarra Corretgé <saghul@gmail.com>
2014-12-29 17:15:20 +01:00
Ben Noordhuis
a09e77e180 test: skip ipv6 tests when ipv6 is not supported
To verify on Linux, run `sudo sysctl net.ipv6.conf.all.disable_ipv6=1`
before the test suite.

Fixes: https://github.com/libuv/libuv/issues/10
PR-URL: https://github.com/libuv/libuv/pull/92
Reviewed-By: Saúl Ibarra Corretgé <saghul@gmail.com>
2014-12-29 17:14:48 +01:00
Ben Noordhuis
9141f48ea5 test: fix spawn test with autotools build
Fix spawn_reads_child_path when executed as `test/run-tests` or
`make check`:

1. `make check` builds a dynamic libuv.so or libuv.dyld by default.

2. spawn_reads_child_path spawns a new instance of the test runner
   by consulting uv_exepath() and executing the result.

3. `test/run-tests` is normally a shell script that sets up
   DYLD_LIBRARY_PATH or LD_LIBRARY_PATH before executing the
   real test runner in `test/.libs`.

4. uv_exepath() (corectly) returns the path of the binary in
   `test/.libs`.  The binary is linked against libuv.so but that
   library is not on any of the default linker paths; and if it is,
   it's almost certainly the wrong version.

5. Ergo, carry over the value of the (DY)LD_LIBRARY_PATH environment
   variable into the environment of the child process so that the
   dynamic linker knows where to find the library.

Alternatively, we could link the test runner statically against libuv.a
but that breaks `make check` when configured with `--disable-static`.

Fixes: https://github.com/libuv/libuv/issues/85
PR-URL: https://github.com/libuv/libuv/pull/91
Reviewed-By: Saúl Ibarra Corretgé <saghul@gmail.com>
2014-12-28 22:51:05 +01:00
Saúl Ibarra Corretgé
c71e7b753c doc: indicate the version where uv_tty_set_mode was changed
PR-URL: https://github.com/libuv/libuv/pull/89
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
2014-12-27 19:04:59 +01:00
Ben Noordhuis
a9e95a33bc unix: only set SO_REUSEADDR when bind() fails
Only call setsockopt() when the initial bind() fails with EADDRINUSE,
then retry.  Saves a system call in what is normally the common case.

PR-URL: https://github.com/libuv/libuv/pull/88
Reviewed-By: Saúl Ibarra Corretgé <saghul@gmail.com>
2014-12-27 18:41:15 +01:00
Yuri D'Elia
025602da13 tty: implement binary I/O terminal mode
Introduce a uv_tty_mode_t enum for uv_tty_set_mode(), with backward
compatible values.  Add a new mode UV_TTY_MODE_IO, which uses
cfmakeraw() internally.

PR-URL: https://github.com/libuv/libuv/pull/86
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
Reviewed-By: Saúl Ibarra Corretgé <saghul@gmail.com>
2014-12-27 18:18:24 +01:00
Ben Noordhuis
fa0b08ff5a linux: fix epoll_pwait() sigmask size calculation
Revisit the fix from commit b705b53.  The problem with using sigset_t
and _NSIG is that the size of sigset_t and the value of _NSIG depend
on what headers libuv picks up first, <signal.h> or <asm/signal.h>.
With the former, sizeof(sigset_t) = 128; with the latter, it's 8.

Simply sidestep the issue by calculating the signal mask as a 64 bits
integer, without using sigset_t or _NSIG.

This is a partial cherry-pick of commit 751ac48 from the v1.x branch.

Original PR-URL: https://github.com/libuv/libuv/pull/83
PR-URL: https://github.com/libuv/libuv/pull/84
Reviewed-By: Saúl Ibarra Corretgé <saghul@gmail.com>
2014-12-25 15:30:52 +01:00
Ben Noordhuis
751ac48baa linux: fix epoll_pwait() sigmask size calculation
Revisit the fix from commit b705b53.  The problem with using sigset_t
and _NSIG is that the size of sigset_t and the value of _NSIG depend
on what headers libuv picks up first, <signal.h> or <asm/signal.h>.
With the former, sizeof(sigset_t) = 128; with the latter, it's 8.

Simply sidestep the issue by calculating the signal mask as a 64 bits
integer, without using sigset_t or _NSIG.

PR-URL: https://github.com/libuv/libuv/pull/83
Reviewed-By: Saúl Ibarra Corretgé <saghul@gmail.com>
2014-12-25 14:37:02 +01:00
Saúl Ibarra Corretgé
a6d3d5a0f5 2014.12.25, Version 1.1.0 (Stable)
Changes since version 1.0.2:

* test: test that closing a poll handle doesn't corrupt the stack (Bert
  Belder)

* win: fix compilation of tests (Marc Schlaich)

* Revert "win: keep a reference to AFD_POLL_INFO in cancel poll" (Bert
  Belder)

* win: avoid stack corruption when closing a poll handle (Bert Belder)

* test: fix test-fs-file-loop on Windows (Bert Belder)

* test: fix test-cwd-and-chdir (Bert Belder)

* doc: indicate what version uv_loop_configure was added on (Saúl Ibarra
  Corretgé)

* doc: fix sphinx warning (Saúl Ibarra Corretgé)

* test: skip spawn_setuid_setgid if we get EACCES (Saúl Ibarra Corretgé)

* test: silence some Clang warnings (Saúl Ibarra Corretgé)

* test: relax osx_select_many_fds (Saúl Ibarra Corretgé)

* test: fix compilation warnings when building with Clang (Saúl Ibarra
  Corretgé)

* win: fix autotools build of tests (Luis Lavena)

* gitignore: ignore Visual Studio files (Marc Schlaich)

* win: set fallback message if FormatMessage fails (Marc Schlaich)

* win: fall back to default language in uv_dlerror (Marc Schlaich)

* test: improve compatibility for dlerror test (Marc Schlaich)

* test: check dlerror is "no error" in no error case (Marc Schlaich)

* unix: change uv_cwd not to return a trailing slash (Saúl Ibarra
  Corretgé)

* test: fix cwd_and_chdir test on Unix (Saúl Ibarra Corretgé)

* test: add uv_cwd output to platform_output test (Saúl Ibarra Corretgé)

* build: fix dragonflybsd autotools build (John Marino)

* win: scandir use 'ls' for formatting long strings (Kenneth Perry)

* build: remove clang and gcc_version gyp defines (Ben Noordhuis)

* unix, windows: don't treat uv_run_mode as a bitmask (Saúl Ibarra
  Corretgé)

* unix, windows: fix UV_RUN_ONCE mode if progress was made (Saúl Ibarra
  Corretgé)
2014-12-24 09:03:51 +01:00
Saúl Ibarra Corretgé
0e526b200a Merge branch 'v0.10' into v1.x
Conflicts:
	AUTHORS
	ChangeLog
	src/version.c
2014-12-24 08:58:02 +01:00
Saúl Ibarra Corretgé
03444aa4a0 Now working on v0.10.32 2014-12-24 08:53:52 +01:00
Saúl Ibarra Corretgé
4dbd27e221 2014.12.25, Version 0.10.31 (Stable)
Changes since version 0.10.30:

* test: test that closing a poll handle doesn't corrupt the stack (Bert
  Belder)

* win: fix compilation of tests (Marc Schlaich)

* Revert "win: keep a reference to AFD_POLL_INFO in cancel poll" (Bert
  Belder)

* win: avoid stack corruption when closing a poll handle (Bert Belder)

* gitignore: ignore Visual Studio files (Marc Schlaich)

* win: set fallback message if FormatMessage fails (Marc Schlaich)

* win: fall back to default language in uv_dlerror (Marc Schlaich)

* test: improve compatibility for dlerror test (Marc Schlaich)

* test: check dlerror is "no error" in no error case (Marc Schlaich)

* build: link against -pthread (Logan Rosen)

* win: scandir use 'ls' for formatting long strings (Kenneth Perry)
2014-12-24 08:53:45 +01:00
Saúl Ibarra Corretgé
e58dc26968 unix, windows: fix UV_RUN_ONCE mode if progress was made
If pending I/O callbacks were ran before polling, do a zero timeout
poll.

PR-URL: https://github.com/libuv/libuv/pull/58
Reviewed-By: Bert Belder <bertbelder@gmail.com>
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
2014-12-23 09:49:12 +01:00
Saúl Ibarra Corretgé
e37a2a0d53 unix, windows: don't treat uv_run_mode as a bitmask
The modes are not meant to be combined, and doing so may hide problems
in the future.

PR-URL: https://github.com/libuv/libuv/pull/58
Reviewed-By: Bert Belder <bertbelder@gmail.com>
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
2014-12-23 09:48:49 +01:00
Ben Noordhuis
fcb2223da8 build: remove clang and gcc_version gyp defines
The clang and gcc_version defines were used to:

1. Conditionally enable -fvisibility=hidden, a switch introduced in
   gcc 4.0.  Because 4.2 is the minimum supported version, we can
   make it unconditional.  People that want to build with older
   versions, can use '-Dvisibility='.

2. To conditionally enable -Wno-dollar-in-identifier-extension,
   an Apple extension that suppressed warnings about sigils in
   dtrace probe names.  Dtrace probes were removed in cb514002.

PR-URL: https://github.com/libuv/libuv/pull/76
Reviewed-By: Saúl Ibarra Corretgé <saghul@gmail.com>
2014-12-20 23:12:07 +01:00
Bert Belder
c1025117ea Merge branch 'v0.10' into v1.x
Conflicts:
	config-unix.mk
2014-12-19 17:03:53 +01:00
Kenneth Perry
796425205b win: scandir use 'ls' for formatting long strings
PR-URL: https://github.com/libuv/libuv/pull/75/files
Reviewed-By: Bert Belder <bertbelder@gmail.com>
2014-12-19 16:59:48 +01:00
Logan Rosen
ccd9745a68 build: link against -pthread
Please see https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=773341 for
more information.  Libuv uses some of pthread's symbols, but it doesn't
link against it, which causes underlinking issues, especially in Ubuntu
where we use ld --as-needed.  The issue also shows up as warnings in
Debian's build logs.

PR-URL: https://github.com/libuv/libuv/pull/73
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
2014-12-18 19:14:42 +01:00
John Marino
3ccd95ec67 build: fix dragonflybsd autotools build
Fixes multiple definition linker errors due to what seems to be multiple
inclusions of src/unix/freebsd.c and src/unix/kqueue.c.

Fixes #72, refs joyent/libuv#1576.

PR-URL: https://github.com/libuv/libuv/issues/72
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
2014-12-16 15:06:16 +01:00