summaryrefslogtreecommitdiff
path: root/doc/README.CODING_STYLE
blob: fd8a017408a6ac5f60f9bd80b7430de66c1c7d96 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
Some things are mentioned here to help any potential gnutls coder.
The rules here are not always used, although we try to stick to them.


*** File names:
  Files are split to directories according to the subsystem
 they belong to. Examples are x509/, minitasn1/, openpgp/,
 opencdk/ etc. The files in the root directory are of concern
 to the main TLS protocol implementation.


*** Indentation style:
  In general, use the Linux coding style.  You may indent the source
  using GNU indent, e.g. "indent -linux *.c".


*** Git commits:
  The original author of the changes should be the author of the commit.
The "Signed-off-by" git flag is used to indicate a commit according to
the project's DCO.


*** Function names:
  All the function names use underscore "_", to separate words,
 functions like gnutlsDoThat are not used. The exported function names
 usually start with "gnutls_" prefix, and the words that follow
 specify the exact part of gnutls that this function refers to.
 E.g. "gnutls_x509_crt_get_dn", refers to the X.509
 certificate parsing part of gnutls. Currently used prefixes are:
 "gnutls_x509_crt_" for the X.509 certificate part
 "gnutls_openpgp_key_" for the openpgp key part
 "gnutls_session_" for the TLS session part (but this may be omited)
 "gnutls_handshake_" for the TLS handshake part
 "gnutls_record_" for the TLS record protocol part
 "gnutls_alert_" for the TLS alert protocol part
 "gnutls_credentials_" for the credentials structures
 "gnutls_global_" for the global structures handling
 and probably more.

 Internal functions -- that are not exported in the API -- should
 be prefixed with an underscore. E.g. _gnutls_handshake_begin()

 Internal structures should not be exported. Especially pointers to
 internal data. Doing so harms future reorganization/rewrite of subsystems.

 All exported functions must be listed in libgnutls.map and libgnutls-extra.map
 in order to be exported.


*** Constructed types:
  The constructed types in gnutls always have the "gnutls_" prefix.
 Definitions, value defaults and enumerated values should be in
 capitals. E.g. GNUTLS_CIPHER_3DES_CBC

 Structures should have the '_st' suffix in their name even
 if they are a typedef. One can use the sizeof() on types with 
 '_st' as suffix.

 Other constructed types should have the '_t' suffix. A pointer
 to a structure also has the '_t' suffix.


*** Function parameters:
  The gnutls functions accept parameters in the order:
  1. Input parameters
  2. Output parameters

  When data and size is expected, a gnutls_datum structure should be
  used (or more precisely a pointer to the structure).

*** Callback function parameters:
  Callback functions should be avoided, if this is possible. 
 Callbacks that refer to a TLS session should include the
 current session as a parameter, in order for the called function to
 be able to retrieve the data associated with the session.
 This is not always done though -- see the push/pull callbacks.

*** Return values:
  Functions in gnutls return an int type, when possible. In that
 case 0 should be returned in case of success, or maybe a positive
 value, if some other indication is needed.
 
 A negative value always indicates failure. All the available
 error codes are defined in gnutls.h and a description
 is available in gnutls_errors.c


*** Guile bindings:

 Parts of the Guile bindings, such as types (aka. "SMOBs"), enum values,
 constants, are automatically generated.  This is handled by the modules
 under `guile/modules/gnutls/build/'; these modules are only used at
 build-time and are not installed.

 The Scheme variables they generate (e.g., constants, type predicates,
 etc.) are exported to user programs through `gnutls.scm' and
 `gnutls/extra.scm', both of which are installed.

 For instance, when adding/removing/renaming enumerates or constants,
 two things must be done:

  1. Update the enum list in `build/enums.scm' (currently dependencies
     are not tracked, so you have to run "make clean all" in `guile/'
     after).

  2. Update the export list of `gnutls.scm' (or `extra.scm').

 Note that, for constants and enums, "schemefied" names are used, as
 noted under the "Guile API Conventions" node of the manual.