Please feel free to contribute patches; here are the basic guidelines to hack
along with us!

Please work from a git tree by cloning the repo:

  git clone https://github.com/ioerror/tlsdate.git

Please file bugs on the tlsdate issue tracker:

  https://github.com/ioerror/tlsdate/issues

Please use the github pull request feature when possible.

White Space:

  Spaces only, no tabs; all tabs must die
  No stray spaces at the end of lines
  Generally try not to add excessive empty white space

Documentation:

  Document all functions with doxygen style comments

Ensuring Correctness:

  Test your patches and ensure:

    No compiler warnings or errors
    No linker warnings or errors

  Test your improved copy of tlsdate extensively

Security:

  tlsdate is security sensitive - please consider where you add code and in
  what context it will run. When possible, run with the least privilege as is
  possible.

Proactively find bugs:

 Run your copy of tlsdate under valgrind

Weird but meaningful conventions are prefered in tlsdate. We prefer attention
to detail:

  if ( NULL == foo (void) )
  {
    bar (void);
  }

Over quick, hard to read and potentilly incorrect:

  if (foo(void)==NULL))
    bar();

Define magic numbers and explain their origin:

  // As taken from RFC 3.14
  #define MAGIC_NUMBER 23 // This goes in foo.h
  ptr = malloc (MAGIC_NUMBER);

Rather than just throwing them about in code:

  ptr = malloc (23);

It is almost always prefered to use dynamically allocated memory:

  widget_ptr = malloc (WIDGET_SIZE);

Try to avoid static allocations like the following:

  char widget[WIDGET_SIZE];

Try to use unsigned values unless an API requires signed values:

  uint32_t server_time_s;

Please provide relevant CHANGELOG entries for all changes.
Please remove items from the TODO file as they are completed.
Please provide unittest cases.

When submitting patches via email, please use `git format-patch` to format
patches:

  git format-patch 9a61fcba9bebc3fa2d91c9f79306bf316c59cbcc

Email patches with a GnuPG signature whenever possible.

When applying patches, please use `git am` to apply patches:

  git am -i 0001-add-TODO-item.patch

If `git format-patch` is not possible, please send a unified diff.

When in doubt, please consult the Tor HACKING guide:

  https://gitweb.torproject.org/tor.git/blob/HEAD:/doc/HACKING

