1 <chapter id="CodingSuggestions">
4 <firstname>Steve</firstname><surname>French</surname>
7 <firstname>Simo</firstname><surname>Sorce</surname>
10 <firstname>Andrew</firstname><surname>Bartlett</surname>
13 <firstname>Tim</firstname><surname>Potter</surname>
16 <firstname>Martin</firstname><surname>Pool</surname>
20 <title>Coding Suggestions</title>
23 So you want to add code to Samba ...
27 One of the daunting tasks facing a programmer attempting to write code for
28 Samba is understanding the various coding conventions used by those most
29 active in the project. These conventions were mostly unwritten and helped
30 improve either the portability, stability or consistency of the code. This
31 document will attempt to document a few of the more important coding
32 practices used at this time on the Samba project. The coding practices are
33 expected to change slightly over time, and even to grow as more is learned
34 about obscure portability considerations. Two existing documents
35 <filename>samba/source/internals.doc</filename> and
36 <filename>samba/source/architecture.doc</filename> provide
37 additional information.
41 The loosely related question of coding style is very personal and this
42 document does not attempt to address that subject, except to say that I
43 have observed that eight character tabs seem to be preferred in Samba
44 source. If you are interested in the topic of coding style, two oft-quoted
49 <ulink url="http://lxr.linux.no/source/Documentation/CodingStyle">http://lxr.linux.no/source/Documentation/CodingStyle</ulink>
53 <ulink url="http://www.fsf.org/prep/standards_toc.html">http://www.fsf.org/prep/standards_toc.html</ulink>
57 But note that coding style in Samba varies due to the many different
58 programmers who have contributed.
62 Following are some considerations you should use when adding new code to
63 Samba. First and foremost remember that:
67 Portability is a primary consideration in adding function, as is network
68 compatability with de facto, existing, real world CIFS/SMB implementations.
69 There are lots of platforms that Samba builds on so use caution when adding
70 a call to a library function that is not invoked in existing Samba code.
71 Also note that there are many quite different SMB/CIFS clients that Samba
72 tries to support, not all of which follow the SNIA CIFS Technical Reference
73 (or the earlier Microsoft reference documents or the X/Open book on the SMB
78 Here are some other suggestions:
84 use d_printf instead of printf for display text
85 reason: enable auto-substitution of translated language text
89 use SAFE_FREE instead of free
90 reason: reduce traps due to null pointers
94 don't use bzero use memset, or ZERO_STRUCT and ZERO_STRUCTP macros
99 don't use strcpy and strlen (use safe_* equivalents)
100 reason: to avoid traps due to buffer overruns
104 don't use getopt_long, use popt functions instead
109 explicitly add const qualifiers on parm passing in functions where parm
110 is input only (somewhat controversial but const can be #defined away)
114 when passing a va_list as an arg, or assigning one to another
115 please use the VA_COPY() macro
116 reason: on some platforms, va_list is a struct that must be
117 initialized in each function...can SEGV if you don't.
121 discourage use of threads
122 reason: portability (also see architecture.doc)
126 don't explicitly include new header files in C files - new h files
127 should be included by adding them once to includes.h
132 don't explicitly extern functions (they are autogenerated by
133 "make proto" into proto.h)
138 use endian safe macros when unpacking SMBs (see byteorder.h and
140 reason: not everyone uses Intel
144 Note Unicode implications of charset handling (see internals.doc). See
145 pull_* and push_* and convert_string functions.
146 reason: Internationalization
150 Don't assume English only
155 Try to avoid using in/out parameters (functions that return data which
156 overwrites input parameters)
157 reason: Can cause stability problems
161 Ensure copyright notices are correct, don't append Tridge's name to code
162 that he didn't write. If you did not write the code, make sure that it
163 can coexist with the rest of the Samba GPLed code.
167 Consider usage of DATA_BLOBs for length specified byte-data.
172 Take advantage of tdbs for database like function
177 Don't access the SAM_ACCOUNT structure directly, they should be accessed
178 via pdb_get...() and pdb_set...() functions.
179 reason: stability, consistency
183 Don't check a password directly against the passdb, always use the
184 check_password() interface.
185 reason: long term pluggability
189 Try to use asprintf rather than pstrings and fstrings where possible
193 Use normal C comments / * instead of C++ comments // like
194 this. Although the C++ comment format is part of the C99
195 standard, some older vendor C compilers do not accept it.
199 Try to write documentation for API functions and structures
200 explaining the point of the code, the way it should be used, and
201 any special conditions or results. Mark these with a double-star
202 comment start / ** so that they can be picked up by Doxygen, as in
207 Keep the scope narrow. This means making functions/variables
208 static whenever possible. We don't want our namespace
209 polluted. Each module should have a minimal number of externally
210 visible functions or variables.
214 Use function pointers to keep knowledge about particular pieces of
215 code isolated in one place. We don't want a particular piece of
216 functionality to be spread out across lots of places - that makes
217 for fragile, hand to maintain code. Instead, design an interface
218 and use tables containing function pointers to implement specific
219 functionality. This is particularly important for command
224 Think carefully about what it will be like for someone else to add
225 to and maintain your code. If it would be hard for someone else to
226 maintain then do it another way.
232 The suggestions above are simply that, suggestions, but the information may
233 help in reducing the routine rework done on new code. The preceeding list
234 is expected to change routinely as new support routines and macros are