@c ** FIXME: Link to files in source, not online.
@c ** FIXME: Where is the Java tutorial?
@itemize @bullet
-@item @uref{https://gnunet.org/git/gnunet.git/plain/doc/gnunet-c-tutoria
-l.pdf, GNUnet C tutorial}
+@item @uref{https://gnunet.org/git/gnunet.git/plain/doc/gnunet-c-tutorial.pdf, GNUnet C tutorial}
@item GNUnet Java tutorial
@end itemize
@item The Version control system keeps our code and enables distributed
development. Only developers with write access can commit code, everyone
else is encouraged to submit patches to the
-@uref{https://lists.gnu.org/mailman/listinfo/gnunet-developers,
-GNUnet-developers mailinglist}.
+@uref{https://lists.gnu.org/mailman/listinfo/gnunet-developers, GNUnet-developers mailinglist}
+.
@item The GNUnet bugtracking system is used to track feature requests,
open bug reports and their resolutions. Anyone can report bugs, only
developers can claim to have fixed them.
libgnunet_plugin_transport_tcp)
@end itemize
-@c ***********************************************************************
+@cindex Coding style
@node Coding style
@subsection Coding style
@item C99 struct initialization is fine
@item declare only one variable per line, so@
+@noindent
+instead of
+
@example
-int i; int j;
+int i,j;
@end example
@noindent
-instead of
+write:
@example
-int i,j;
+int i;
+int j;
@end example
+@c TODO: include actual example from a file in source
+
+@noindent
This helps keep diffs small and forces developers to think precisely about
-the type of every variable. Note that @code{char *} is different from
-@code{const char*} and @code{int} is different from @code{unsigned int}
-or @code{uint32_t}. Each variable type should be chosen with care.
+the type of every variable.
+Note that @code{char *} is different from @code{const char*} and
+@code{int} is different from @code{unsigned int} or @code{uint32_t}.
+Each variable type should be chosen with care.
@item While @code{goto} should generally be avoided, having a
@code{goto} to the end of a function to a block of clean up
deep(er) nesting. Thus, we would write:
@example
-next = head; while (NULL != (pos = next)) @{
- next = pos->next; if (! should_free (pos))
- continue;
+next = head;
+while (NULL != (pos = next)) @{
+ next = pos->next;
+ if (! should_free (pos))
+ continue;
GNUNET_CONTAINER_DLL_remove (head, tail, pos);
- GNUNET_free (pos); @}
+ GNUNET_free (pos);
+ @}
@end example
instead of
@example
next = head; while (NULL != (pos = next)) @{
- next = pos->next; if (should_free (pos)) @{
+ next = pos->next;
+ if (should_free (pos)) @{
/* unnecessary nesting! */
GNUNET_CONTAINER_DLL_remove (head, tail, pos);
- GNUNET_free (pos); @} @}
+ GNUNET_free (pos);
+ @}
+ @}
@end example
@item We primarily use @code{for} and @code{while} loops.
@example
/* simple iteration over a linked list */
-for (pos = head; NULL != pos; pos = pos->next)
+for (pos = head;
+ NULL != pos;
+ pos = pos->next)
@{
use (pos);
@}
@item The first argument to all higher-order functions in GNUnet must be
declared to be of type @code{void *} and is reserved for a closure. We do
not use inner functions, as trampolines would conflict with setups that
-use non-executable stacks.@ The first statement in a higher-order
-function, which unusually should be part of the variable declarations,
-should assign the @code{cls} argument to the precise expected type.
-For example:
+use non-executable stacks.
+The first statement in a higher-order function, which unusually should
+be part of the variable declarations, should assign the
+@code{cls} argument to the precise expected type. For example:
@example
int callback (void *cls, char *args) @{
- struct Foo *foo = cls; int other_variables;
+ struct Foo *foo = cls;
+ int other_variables;
/* rest of function */
@}
@section Build-system
If you have code that is likely not to compile or build rules you might
-want to not trigger for most developers, use "if HAVE_EXPERIMENTAL" in
-your Makefile.am. Then it is OK to (temporarily) add non-compiling (or
-known-to-not-port) code.
+want to not trigger for most developers, use @code{if HAVE_EXPERIMENTAL}
+in your @file{Makefile.am}.
+Then it is OK to (temporarily) add non-compiling (or known-to-not-port)
+code.
If you want to compile all testcases but NOT run them, run configure with
the @code{--enable-test-suppression} option.
@code{--enable-coverage} option and run the @file{coverage.sh} script in
the @file{contrib/} directory.
-@c ***********************************************************************
+@cindex gnunet-ext
@node Developing extensions for GNUnet using the gnunet-ext template
@section Developing extensions for GNUnet using the gnunet-ext template
-
For developers who want to write extensions for GNUnet we provide the
gnunet-ext template to provide an easy to use skeleton.
export LD_LIBRARY_PATH=/path/to/gnunet/lib
@end example
-@c ***********************************************************************
+@cindex writing testcases
@node Writing testcases
@section Writing testcases
the @file{Makefile.am} would contain the following lines:
@example
-check_PROGRAMS = test_foo TESTS = $(check_PROGRAMS) test_foo_SOURCES =
-test_foo.c test_foo_LDADD = $(top_builddir)/src/util/libgnunetutil.la
+check_PROGRAMS = test_foo
+TESTS = $(check_PROGRAMS)
+test_foo_SOURCES = test_foo.c
+test_foo_LDADD = $(top_builddir)/src/util/libgnunetutil.la
@end example
Naturally, other libraries used by the testcase may be specified in the
testcases. Thus the canonical command @code{make check install} has to be
changed to @code{make install check} for GNUnet.
-@c ***********************************************************************
+@cindex TESTING library
@node GNUnet's TESTING library
@section GNUnet's TESTING library
* Testing with multiple processes::
@end menu
-@c ***********************************************************************
+@cindex TESTING API
@node API
@subsection API
GNUNET_PROGRAM_run (argc, argv,
"NAME-OF-TEST",
- "nohelp", options, &run, cls);
+ "nohelp",
+ options,
+ &run,
+ cls);
@end example
If you wish to use Gauger for your own project, you can grab a copy of the
latest stable release or check out Gauger's Subversion repository.
-@c ***********************************************************************
+@cindex TESTBED Subsystem
@node GNUnet's TESTBED Subsystem
@section GNUnet's TESTBED Subsystem
@end itemize
Note that the substitution placemark is replaced only when the
-corresponding field is available and only once. Specifying @code{%u@@%h}
-doesn't work either. If you want to user username substitutions for SSH
+corresponding field is available and only once. Specifying
+@example
+%u@atchar{}%h
+@end example
+doesn't work either.
+If you want to user username substitutions for SSH
use the argument @code{-l} before the username substitution.
-Ex: @code{ssh -l %u -p %p %h}
+For exmaple:
+@example
+ssh -l %u -p %p %h
+@end example
The testbed API and the helper communicate through the helpers stdin and
stdout. As the helper is started through a remote shell on remote hosts
shell, certain scripts like .bashrc, .profiler may not be executed. If
this is the case testbed API can be forced to execute an interactive
shell by setting up the environmental variable
-`GNUNET_TESTBED_RSH_CMD_SUFFIX' to a shell program.
+@code{GNUNET_TESTBED_RSH_CMD_SUFFIX} to a shell program.
+
An example could be:
@example
* Hosts file format::
* Topology file format::
* Testbed Barriers::
-* Automatic large-scale deployment of GNUnet in the PlanetLab testbed::
+* Automatic large-scale deployment in the PlanetLab testbed::
* TESTBED Caveats::
@end menu
topology where peer connectivity follows power law - new peers are
connected with high probabililty to well connected peers.
@footnote{See Emergence of Scaling in Random Networks. Science 286,
-509-512, 1999.}
+509-512, 1999
+(@uref{https://gnunet.org/git/bibliography.git/plain/docs/emergence_of_scaling_in_random_networks__barabasi_albert_science_286__1999.pdf, pdf})}
@item @code{GNUNET_TESTBED_TOPOLOGY_FROM_FILE}: The topology information
-is loaded from a file. The path to the file has to be given. See Topology
-file format for the format of this file.
+is loaded from a file. The path to the file has to be given.
+@xref{Topology file format} for the format of this file.
@item @code{GNUNET_TESTBED_TOPOLOGY_NONE}: No topology
@end itemize
configuration passed to Testbed API functions
@code{GNUNET_TESTBED_test_run()} and
@code{GNUNET_TESTBED_run()}:
+
@itemize @bullet
@item @code{CLIQUE}
@item @code{RING}
Similarly, the topology @code{FROM_FILE} requires the option
@code{OVERLAY_TOPOLOGY_FILE} to contain the path of the file containing
the topology information. This option is ignored for the rest of the
-topologies. See Topology file format for the format of this file.
+topologies. @xref{Topology file format} for the format of this file.
@c ***********************************************************************
@node Hosts file format
host, the hostname of the host and the port number to use for the remote
shell program. All thee values should be given.
@item These details should be given in the following format:
-@code{<username>@@<hostname>:<port>}
+@example
+<username>@@<hostname>:<port>
+@end example
@end itemize
Note that having canonical hostnames may cause problems while resolving
origin peer to the target peer.
For example, the following file will result in 5 overlay connections:
-[2->1], [3->1],[4->3], [0->3], [2->0]@ @code{@ 1:2|3@ 3:4| 0@ 0: 2@ }
+[2->1], [3->1],[4->3], [0->3], [2->0]@
+@code{@ 1:2|3@ 3:4| 0@ 0: 2@ }
@c ***********************************************************************
@node Testbed Barriers
for ensuring that the barrier is reached by all the controllers and the
downward propagation is for triggering that the barrier is crossed.
-@c ***********************************************************************
-@node Automatic large-scale deployment of GNUnet in the PlanetLab testbed
-@subsection Automatic large-scale deployment of GNUnet in the PlanetLab testbed
+@cindex PlanetLab testbed
+@node Automatic large-scale deployment in the PlanetLab testbed
+@subsection Automatic large-scale deployment in the PlanetLab testbed
PlanetLab is as a testbed for computer networking and distributed systems
research. It was established in 2002 and as of June 2010 was composed of
@c FIXME: Is there an official, safer way instead of blind-piping a
@c script?
@c FIXME: Use newer pypi URLs below.
-Install Distribute for python:@ @code{@ curl
-http://python-distribute.org/distribute_setup.py | sudo python@ }
+Install Distribute for python:
+
+@example
+curl http://python-distribute.org/distribute_setup.py | sudo python
+@end example
Install Distribute for zope.interface <= 3.8.0 (4.0 and 4.0.1 will not
work):
@example
-export PYPI="https://pypi.python.org/packages/source"
+export PYPI=@value{PYPI-URL}
wget $PYPI/z/zope.interface/zope.interface-3.8.0.tar.gz
tar zvfz zope.interface-3.8.0.tar.gz
cd zope.interface-3.8.0
If you were not asked for a password on either login,
then you should be good to go.
-@c ***********************************************************************
+@cindex TESTBED Caveats
@node TESTBED Caveats
@subsection TESTBED Caveats
"GNUNET_LOG" and "GNUNET_FORCE_LOG" variables must contain a specially
formatted @strong{logging definition} string, which looks like this:@
+@c FIXME: Can we close this with [/component] instead?
@example
[component];[file];[function];[from_line[-to_line]];loglevel[/component...]
@end example
The dual to the service/server API is the client API, which can be used to
access services.
-The most common way to start a service is to use the GNUNET_SERVICE_run
-function from the program's main function. GNUNET_SERVICE_run will then
-parse the command line and configuration files and, based on the options
-found there, start the server. It will then give back control to the main
+The most common way to start a service is to use the
+@code{GNUNET_SERVICE_run} function from the program's main function.
+@code{GNUNET_SERVICE_run} will then parse the command line and
+configuration files and, based on the options found there,
+start the server. It will then give back control to the main
program, passing the server and the configuration to the
-GNUNET_SERVICE_Main callback. GNUNET_SERVICE_run will also take care of
-starting the scheduler loop. If this is inappropriate (for example,
-because the scheduler loop is already running), GNUNET_SERVICE_start and
-related functions provide an alternative to GNUNET_SERVICE_run.
+@code{GNUNET_SERVICE_Main} callback. @code{GNUNET_SERVICE_run}
+will also take care of starting the scheduler loop.
+If this is inappropriate (for example, because the scheduler loop
+is already running), @code{GNUNET_SERVICE_start} and
+related functions provide an alternative to @code{GNUNET_SERVICE_run}.
When starting a service, the service_name option is used to determine
which sections in the configuration file should be used to configure the
-service. A typical value here is the name of the src/ sub-directory, for
-example "statistics". The same string would also be given to
-GNUNET_CLIENT_connect to access the service.
+service. A typical value here is the name of the @file{src/}
+sub-directory, for example "@file{statistics}".
+The same string would also be given to
+@code{GNUNET_CLIENT_connect} to access the service.
Once a service has been initialized, the program should use the
-GNUNET_SERVICE_Main callback to register message handlers using
-GNUNET_SERVER_add_handlers. The service will already have registered a
-handler for the "TEST" message.
+@code{GNUNET_SERVICE_Main} callback to register message handlers
+using @code{GNUNET_SERVER_add_handlers}.
+The service will already have registered a handler for the
+"TEST" message.
-The option bitfield (enum GNUNET_SERVICE_Options) determines how a service
-should behave during shutdown. There are three key strategies:
+@fnindex GNUNET_SERVICE_Options
+The option bitfield (@code{enum GNUNET_SERVICE_Options})
+determines how a service should behave during shutdown.
+There are three key strategies:
@table @asis
-@item instant (GNUNET_SERVICE_OPTION_NONE) Upon receiving the shutdown
+@item instant (@code{GNUNET_SERVICE_OPTION_NONE})
+Upon receiving the shutdown
signal from the scheduler, the service immediately terminates the server,
closing all existing connections with clients.
-@item manual
-(GNUNET_SERVICE_OPTION_MANUAL_SHUTDOWN) The service does nothing by itself
+@item manual (@code{GNUNET_SERVICE_OPTION_MANUAL_SHUTDOWN})
+The service does nothing by itself
during shutdown. The main program will need to take the appropriate
action by calling GNUNET_SERVER_destroy or GNUNET_SERVICE_stop (depending
on how the service was initialized) to terminate the service. This method
is used by gnunet-service-arm and rather uncommon.
-@item soft
-(GNUNET_SERVICE_OPTION_SOFT_SHUTDOWN) Upon receiving the shutdown signal
-from the scheduler, the service immediately tells the server to stop
+@item soft (@code{GNUNET_SERVICE_OPTION_SOFT_SHUTDOWN})
+Upon receiving the shutdown signal from the scheduler,
+the service immediately tells the server to stop
listening for incoming clients. Requests from normal existing clients are
still processed and the server/service terminates once all normal clients
have disconnected. Clients that are not expected to ever disconnect (such
significant number of messages.
@multitable @columnfractions .20 .15 .15 .15 .15 .15
-@headitem Transport @tab UDP @tab TCP @tab SMTP (Purdue sendmail) @tab SMTP (RH 8.0) @tab SMTP (SGL qmail)
+@headitem Transport @tab UDP @tab TCP @tab SMTP (Purdue sendmail)
+@tab SMTP (RH 8.0) @tab SMTP (SGL qmail)
@item 11 bytes @tab 31 ms @tab 55 ms @tab 781 s @tab 77 s @tab 24 s
@item 407 bytes @tab 37 ms @tab 62 ms @tab 789 s @tab 78 s @tab 25 s
@item 1,221 bytes @tab 46 ms @tab 73 ms @tab 804 s @tab 78 s @tab 25 s
@itemize @bullet
@item confidentiality with so-called perfect forward secrecy; we use
-ECDHE@footnote{@uref{http://en.wikipedia.org/wiki/Elliptic_curve_
-Diffie%E2%80%93Hellman, Elliptic-curve Diffie---Hellman}}
+ECDHE@footnote{@uref{http://en.wikipedia.org/wiki/Elliptic_curve_Diffie%E2%80%93Hellman, Elliptic-curve Diffie---Hellman}}
powered by Curve25519
@footnote{@uref{http://cr.yp.to/ecdh.html, Curve25519}} for the key
exchange and then use symmetric encryption, encrypting with both AES-256
@item integrity protection (using SHA-512
@footnote{@uref{http://en.wikipedia.org/wiki/SHA-2, SHA-512}} to do
encrypt-then-MAC
-@footnote{@uref{http://en.wikipedia.org/wiki/Authenticated_encryption,
-encrypt-then-MAC}})
+@footnote{@uref{http://en.wikipedia.org/wiki/Authenticated_encryption, encrypt-then-MAC}})
@item Replay
@footnote{@uref{http://en.wikipedia.org/wiki/Replay_attack, replay}}
protection (using nonces, timestamps, challenge-response,
@code{EphemeralKeyMessage} with its long-term key (which we usually call
the peer's identity; the hash of the public long term key is what results
in a @code{struct GNUNET_PeerIdentity} in all GNUnet APIs. The ephemeral
-key is ONLY used for an ECDHE@footnote{@uref{http://en.wikipedia.org/wiki/
-Elliptic_curve_Diffie%E2%80%93Hellman, Elliptic-curve Diffie---Hellman}}
+key is ONLY used for an ECDHE@footnote{@uref{http://en.wikipedia.org/wiki/Elliptic_curve_Diffie%E2%80%93Hellman, Elliptic-curve Diffie---Hellman}}
exchange by the CORE service to establish symmetric session keys. A peer
will use the same @code{EphemeralKeyMessage} for all peers for
@code{REKEY_FREQUENCY}, which is usually 12 hours. After that time, it
when to discard ephemeral keys; it is not a protocol violation to discard
keys more often. Ephemeral keys are also never stored to disk; restarting
a peer will thus always create a fresh ephemeral key. The use of ephemeral
-keys is what provides @uref{http://en.wikipedia.org/wiki/Forward_secrecy,
-forward secrecy}.
+keys is what provides @uref{http://en.wikipedia.org/wiki/Forward_secrecy, forward secrecy}.
Just before transmission, the @code{EphemeralKeyMessage} is patched to
reflect the current sender_status, which specifies the current state of
messages can be found in @file{gnunet-service-core_kx.c} (except for the
cryptographic primitives, which are in @file{util/crypto*.c}).
Given the key material from ECDHE, a Key derivation function
-@footnote{@uref{https://en.wikipedia.org/wiki/Key_derivation_function, Key
-derivation function}} is used to derive two pairs of encryption and
-decryption keys for AES-256 and TwoFish, as well as initialization vectors
-and authentication keys (for HMAC@footnote{@uref{https://en.wikipedia.org/
-wiki/HMAC, HMAC}}). The HMAC is computed over the encrypted payload.
+@footnote{@uref{https://en.wikipedia.org/wiki/Key_derivation_function, Key derivation function}}
+is used to derive two pairs of encryption and decryption keys for AES-256
+and TwoFish, as well as initialization vectors and authentication keys
+(for HMAC@footnote{@uref{https://en.wikipedia.org/wiki/HMAC, HMAC}}).
+The HMAC is computed over the encrypted payload.
Encrypted messages include an iv_seed and the HMAC in the header.
Each encrypted message in the CORE service includes a sequence number and
The NSE subsystem is designed to be resilient against these attacks.
-It uses @uref{http://en.wikipedia.org/wiki/Proof-of-work_system, proofs
-of work} to prevent one peer from impersonating a large number of
-participants, which would otherwise allow an adversary to artifically
-inflate the estimate.
+It uses @uref{http://en.wikipedia.org/wiki/Proof-of-work_system, proofs of work}
+to prevent one peer from impersonating a large number of participants,
+which would otherwise allow an adversary to artifically inflate the
+estimate.
The DoS protection comes from the time-based nature of the protocol:
the estimates are calculated periodically and out-of-time traffic is
either ignored or stored for later retransmission by benign peers.
@noindent
You can create regular expressions and search strings for every AS in the
Internet using the attached scripts. You need one of the
-@uref{http://data.caida.org/datasets/routing/routeviews-prefix2as/, CAIDA
-routeviews prefix2as} data files for this. Run
+@uref{http://data.caida.org/datasets/routing/routeviews-prefix2as/, CAIDA routeviews prefix2as}
+data files for this. Run
@example
create_regex.py <filename> <output path>
nettle. Thus it should be compiled against nettle 2.7
and, in case you get some error on the reference to `rpl_strerror' being
undefined, follow the instructions on
-@uref{http://lists.gnupg.org/pipermail/gnutls-devel/2013-November/00
-6588.html, this}
+@uref{http://lists.gnupg.org/pipermail/gnutls-devel/2013-November/006588.html, this}
post (and the link inside it)).}
@item @uref{https://gnunet.org/gnurl, gnURL} libgnurl @geq{} 7.34.0
@footnote{must be compiled after @code{GnuTLS}}
is that these updates are propagated through GNUnet's peer-to-peer
network. More information about gnunet-update can be found at
@c FIXME: Use correct cgit URL
-@uref{https://gnunet.org/git/gnunet-update/README}.
+@uref{https://gnunet.org/git/gnunet-update.git/tree/plain/README}.
While the project is still under development, we have implemented the
following features which we believe may be helpful for users and we
@item
-Save @uref{ftp://sources.redhat.com/pub/pthreads-win32/dll-latest/lib/x86
-/libpthreadGC2.a, libpthreadGC2.a} (x86) or @uref{ftp://sources.redhat.c
-om/pub/pthreads-win32/dll-latest/lib/x64/libpthreadGC2.a, libpthreadGC2.
-a} (x64) as libpthread.a into the lib directory (c:\mingw\mingw\lib\libpt
-hread.a)
+Save
+@uref{ftp://sources.redhat.com/pub/pthreads-win32/dll-latest/lib/x86/libpthreadGC2.a, libpthreadGC2.a}
+(x86) or
+@uref{ftp://sources.redhat.com/pub/pthreads-win32/dll-latest/lib/x64/libpthreadGC2.a, libpthreadGC2.a}
+(x64) as libpthread.a into the @file{lib}
+directory (@file{c:\mingw\mingw\lib\libpthread.a}).
@item
-Save @uref{ftp://sources.redhat.com/pub/pthreads-win32/dll-latest/lib/x86
-/pthreadGC2.dll, pthreadGC2.dll} (x86) or @uref{ftp://sources.redhat.c
-om/pub/pthreads-win32/dll-latest/lib/x64/pthreadGC2.dll, libpthreadGC2.a}
-(x64) into the MinGW bin directory (c:\mingw\mingw\bin)
+Save
+@uref{ftp://sources.redhat.com/pub/pthreads-win32/dll-latest/lib/x86/pthreadGC2.dll, pthreadGC2.dll}
+(x86) or
+@uref{ftp://sources.redhat.com/pub/pthreads-win32/dll-latest/lib/x64/pthreadGC2.dll, libpthreadGC2.a}
+(x64) into the MinGW @file{bin} directory (@file{c:\mingw\mingw\bin}).
@item
-Download all header files from @uref{ftp://sources.redhat.com/pub/pthread
-s-win32/dll-latest/include/, include/} to the @file{include} directory
-(c:\mingw\mingw\include)
+Download all header files from
+@uref{ftp://sources.redhat.com/pub/pthreads-win32/dll-latest/include/, include/}
+to the @file{include} directory (@file{c:\mingw\mingw\include}).
@end itemize
and unpack them to the MinGW directory (c:\mingw\mingw)@
@
Here is an all-in-one package for
-@uref{http://ftp.gnome.org/pub/gnome/binaries/win32/gtk+/2.24/gtk+-bu
-ndle_2.24.10-20120208_win32.zip, gtk+dependencies}.
-Do not overwrite any existing files!
+@uref{http://ftp.gnome.org/pub/gnome/binaries/win32/gtk+/2.24/gtk+-bundle_2.24.10-20120208_win32.zip, gtk+dependencies}
+. Do not overwrite any existing files!
@item
@strong{Glade}@
OGG Vorbis is used to extract meta-data from .ogg files@
@
Get the packages
-@uref{http://www.gnunet.org/libextractor/download/win/libogg-1.1.4.zip,
-libogg}
+@uref{http://www.gnunet.org/libextractor/download/win/libogg-1.1.4.zip, libogg}
and
-@uref{http://www.gnunet.org/libextractor/download/win/libvorbis-1.2.3.zip,
-libvorbis}
+@uref{http://www.gnunet.org/libextractor/download/win/libvorbis-1.2.3.zip, libvorbis}
from the
-@uref{http://ftp.gnu.org/gnu/libextractor/libextractor-w32-1.0.0.zip,
-libextractor win32 build}
+@uref{http://ftp.gnu.org/gnu/libextractor/libextractor-w32-1.0.0.zip, libextractor win32 build}
and unpack them to the MinGW directory (c:\mingw\mingw)
@item
(lib)Exiv2 is used to extract meta-data from files with Exiv2 meta-data@
@
Download
-@uref{http://www.gnunet.org/libextractor/download/win/exiv2-0.18.2.zip,
-Exiv2}
+@uref{http://www.gnunet.org/libextractor/download/win/exiv2-0.18.2.zip, Exiv2}
and unpack it to the MSYS directory (c:\mingw)
@end itemize
@noindent
More information about the apache mod_proxy configuration can be found
-at @uref{http://httpd.apache.org/docs/2.2/mod/mod_proxy.html#proxypass,
-http://httpd.apache.org/docs/2.2/mod/mod_proxy.html#proxypass}
+here: @uref{http://httpd.apache.org/docs/2.2/mod/mod_proxy.html#proxypass}
+.
@strong{Configure your nginx HTTPS webserver}
Since nginx does not support chunked encoding, you first of all have to
-install @code{chunkin}:@
-@uref{http://wiki.nginx.org/HttpChunkinModule,
-http://wiki.nginx.org/HttpChunkinModule}
+install @code{chunkin}: @uref{http://wiki.nginx.org/HttpChunkinModule}.
To enable chunkin add: