mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-12-22 17:34:18 +03:00
docs: Prepare hacking.html.in to generate HACKING from it
Tweak pre tags to achieve proper indentation of their plaintext representation. Also use more b/i/code tags.
This commit is contained in:
parent
4302b3f8f0
commit
d39620e367
@ -5,20 +5,21 @@
|
|||||||
<ul id="toc"></ul>
|
<ul id="toc"></ul>
|
||||||
|
|
||||||
<h2><a name="patches">General tips for contributing patches</a></h2>
|
<h2><a name="patches">General tips for contributing patches</a></h2>
|
||||||
|
|
||||||
<ol>
|
<ol>
|
||||||
<li>Discuss any large changes on the mailing list first. Post patches
|
<li>Discuss any large changes on the mailing list first. Post patches
|
||||||
early and listen to feedback.</li>
|
early and listen to feedback.</li>
|
||||||
|
|
||||||
<li><p>Post patches in unified diff format. A command similar to this
|
<li><p>Post patches in unified diff format. A command similar to this
|
||||||
should work:</p>
|
should work:</p>
|
||||||
<pre>
|
<pre>
|
||||||
diff -urp libvirt.orig/ libvirt.modified/ > libvirt-myfeature.patch</pre>
|
diff -urp libvirt.orig/ libvirt.modified/ > libvirt-myfeature.patch
|
||||||
|
</pre>
|
||||||
<p>
|
<p>
|
||||||
or:
|
or:
|
||||||
</p>
|
</p>
|
||||||
<pre>
|
<pre>
|
||||||
git diff > libvirt-myfeature.patch</pre>
|
git diff > libvirt-myfeature.patch
|
||||||
|
</pre>
|
||||||
</li>
|
</li>
|
||||||
<li>Split large changes into a series of smaller patches, self-contained
|
<li>Split large changes into a series of smaller patches, self-contained
|
||||||
if possible, with an explanation of each patch and an explanation of how
|
if possible, with an explanation of each patch and an explanation of how
|
||||||
@ -27,35 +28,39 @@
|
|||||||
only follow GIT and don't care much about released versions.</li>
|
only follow GIT and don't care much about released versions.</li>
|
||||||
<li><p>Run the automated tests on your code before submitting any changes.
|
<li><p>Run the automated tests on your code before submitting any changes.
|
||||||
In particular, configure with compile warnings set to -Werror:</p>
|
In particular, configure with compile warnings set to -Werror:</p>
|
||||||
<pre>
|
<pre>
|
||||||
./configure --enable-compile-warnings=error</pre>
|
./configure --enable-compile-warnings=error
|
||||||
|
</pre>
|
||||||
<p>
|
<p>
|
||||||
and run the tests:
|
and run the tests:
|
||||||
</p>
|
</p>
|
||||||
<pre>
|
<pre>
|
||||||
make check
|
make check
|
||||||
make syntax-check
|
make syntax-check
|
||||||
make -C tests valgrind</pre>
|
make -C tests valgrind
|
||||||
|
</pre>
|
||||||
<p>
|
<p>
|
||||||
The latter test checks for memory leaks.
|
The latter test checks for memory leaks.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
If you encounter any failing tests, the VIR_TEST_DEBUG
|
If you encounter any failing tests, the VIR_TEST_DEBUG
|
||||||
environment variable may provide extra information to debug
|
environment variable may provide extra information to debug
|
||||||
the failures. Larger values of VIR_TEST_DEBUG may provide
|
the failures. Larger values of VIR_TEST_DEBUG may provide
|
||||||
larger amounts of information:
|
larger amounts of information:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<pre>
|
<pre>
|
||||||
VIR_TEST_DEBUG=1 make check (or)
|
VIR_TEST_DEBUG=1 make check (or)
|
||||||
VIR_TEST_DEBUG=2 make check</pre>
|
VIR_TEST_DEBUG=2 make check
|
||||||
<p>
|
</pre>
|
||||||
Also, individual tests can be run from inside the 'tests/'
|
<p>
|
||||||
directory, like:
|
Also, individual tests can be run from inside the <code>tests/</code>
|
||||||
</p>
|
directory, like:
|
||||||
<pre>
|
</p>
|
||||||
./qemuxml2xmltest</pre>
|
<pre>
|
||||||
|
./qemuxml2xmltest
|
||||||
|
</pre>
|
||||||
|
|
||||||
</li>
|
</li>
|
||||||
<li>Update tests and/or documentation, particularly if you are adding
|
<li>Update tests and/or documentation, particularly if you are adding
|
||||||
@ -82,7 +87,7 @@
|
|||||||
If you use Emacs, add the following to one of one of your start-up files
|
If you use Emacs, add the following to one of one of your start-up files
|
||||||
(e.g., ~/.emacs), to help ensure that you get indentation right:
|
(e.g., ~/.emacs), to help ensure that you get indentation right:
|
||||||
</p>
|
</p>
|
||||||
<pre>
|
<pre>
|
||||||
;;; When editing C sources in libvirt, use this style.
|
;;; When editing C sources in libvirt, use this style.
|
||||||
(defun libvirt-c-mode ()
|
(defun libvirt-c-mode ()
|
||||||
"C mode with adjusted defaults for use with libvirt."
|
"C mode with adjusted defaults for use with libvirt."
|
||||||
@ -105,7 +110,7 @@
|
|||||||
around operators and keywords:
|
around operators and keywords:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<pre>
|
<pre>
|
||||||
indent-libvirt()
|
indent-libvirt()
|
||||||
{
|
{
|
||||||
indent -bad -bap -bbb -bli4 -br -ce -brs -cs -i4 -l75 -lc75 \
|
indent -bad -bap -bbb -bli4 -br -ce -brs -cs -i4 -l75 -lc75 \
|
||||||
@ -116,7 +121,7 @@
|
|||||||
|
|
||||||
<p>
|
<p>
|
||||||
Note that sometimes you'll have to post-process that output further, by
|
Note that sometimes you'll have to post-process that output further, by
|
||||||
piping it through "expand -i", since some leading TABs can get through.
|
piping it through <code>expand -i</code>, since some leading TABs can get through.
|
||||||
Usually they're in macro definitions or strings, and should be converted
|
Usually they're in macro definitions or strings, and should be converted
|
||||||
anyhow.
|
anyhow.
|
||||||
</p>
|
</p>
|
||||||
@ -125,18 +130,20 @@
|
|||||||
<h2><a name="curly_braces">Curly braces</a></h2>
|
<h2><a name="curly_braces">Curly braces</a></h2>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
Omit the curly braces around an "if", "while", "for" etc. body only
|
Omit the curly braces around an <code>if</code>, <code>while</code>,
|
||||||
|
<code>for</code> etc. body only
|
||||||
when that body occupies a single line. In every other case we require
|
when that body occupies a single line. In every other case we require
|
||||||
the braces. This ensures that it is trivially easy to identify a
|
the braces. This ensures that it is trivially easy to identify a
|
||||||
single-*statement* loop: each has only one *line* in its body.
|
single-<i>statement</i> loop: each has only one <i>line</i> in its body.
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
Omitting braces with a single-line body is fine:
|
Omitting braces with a single-line body is fine:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<pre>
|
<pre>
|
||||||
while (expr) // one-line body -> omitting curly braces is ok
|
while (expr) // one-line body -> omitting curly braces is ok
|
||||||
single_line_stmt ();</pre>
|
single_line_stmt();
|
||||||
|
</pre>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
However, the moment your loop/if/else body extends onto a second
|
However, the moment your loop/if/else body extends onto a second
|
||||||
@ -146,26 +153,29 @@
|
|||||||
it is already a multi-statement loop:
|
it is already a multi-statement loop:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<pre>
|
<pre>
|
||||||
while (true) // BAD! multi-line body with no braces
|
while (true) // BAD! multi-line body with no braces
|
||||||
/* comment... */
|
/* comment... */
|
||||||
single_line_stmt ();</pre>
|
single_line_stmt();
|
||||||
|
</pre>
|
||||||
<p>
|
<p>
|
||||||
Do this instead:
|
Do this instead:
|
||||||
</p>
|
</p>
|
||||||
<pre>
|
<pre>
|
||||||
while (true) { // Always put braces around a multi-line body.
|
while (true) { // Always put braces around a multi-line body.
|
||||||
/* comment... */
|
/* comment... */
|
||||||
single_line_stmt ();
|
single_line_stmt();
|
||||||
}</pre>
|
}
|
||||||
|
</pre>
|
||||||
<p>
|
<p>
|
||||||
There is one exception: when the second body line is not at the same
|
There is one exception: when the second body line is not at the same
|
||||||
indentation level as the first body line:
|
indentation level as the first body line:
|
||||||
</p>
|
</p>
|
||||||
<pre>
|
<pre>
|
||||||
if (expr)
|
if (expr)
|
||||||
die ("a diagnostic that would make this line"
|
die("a diagnostic that would make this line"
|
||||||
" extend past the 80-column limit"));</pre>
|
" extend past the 80-column limit"));
|
||||||
|
</pre>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
It is safe to omit the braces in the code above, since the
|
It is safe to omit the braces in the code above, since the
|
||||||
@ -177,40 +187,44 @@
|
|||||||
To reiterate, don't do this:
|
To reiterate, don't do this:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<pre>
|
<pre>
|
||||||
if (expr) // BAD: no braces around...
|
if (expr) // BAD: no braces around...
|
||||||
while (expr_2) { // ... a multi-line body
|
while (expr_2) { // ... a multi-line body
|
||||||
...
|
...
|
||||||
}</pre>
|
}
|
||||||
|
</pre>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
Do this, instead:
|
Do this, instead:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<pre>
|
<pre>
|
||||||
if (expr) {
|
if (expr) {
|
||||||
while (expr_2) {
|
while (expr_2) {
|
||||||
...
|
...
|
||||||
}
|
}
|
||||||
}</pre>
|
}
|
||||||
|
</pre>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
However, there is one exception in the other direction, when even a
|
However, there is one exception in the other direction, when even a
|
||||||
one-line block should have braces. That occurs when that one-line,
|
one-line block should have braces. That occurs when that one-line,
|
||||||
brace-less block is an "else" block, and the corresponding "then" block
|
brace-less block is an <code>else</code> block, and the corresponding
|
||||||
*does* use braces. In that case, either put braces around the "else"
|
<code>then</code> block <b>does</b> use braces. In that case, either
|
||||||
block, or negate the "if"-condition and swap the bodies, putting the
|
put braces around the <code>else</code> block, or negate the
|
||||||
|
<code>if</code>-condition and swap the bodies, putting the
|
||||||
one-line block first and making the longer, multi-line block be the
|
one-line block first and making the longer, multi-line block be the
|
||||||
"else" block.
|
<code>else</code> block.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<pre>
|
<pre>
|
||||||
if (expr) {
|
if (expr) {
|
||||||
...
|
...
|
||||||
...
|
...
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
x = y; // BAD: braceless "else" with braced "then"</pre>
|
x = y; // BAD: braceless "else" with braced "then"
|
||||||
|
</pre>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
This is preferred, especially when the multi-line body is more than a
|
This is preferred, especially when the multi-line body is more than a
|
||||||
@ -219,43 +233,45 @@
|
|||||||
after the more involved block:
|
after the more involved block:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<pre>
|
<pre>
|
||||||
if (!expr)
|
if (!expr)
|
||||||
x = y; // putting the smaller block first is more readable
|
x = y; // putting the smaller block first is more readable
|
||||||
else {
|
else {
|
||||||
...
|
...
|
||||||
...
|
...
|
||||||
}</pre>
|
}
|
||||||
|
</pre>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
If you'd rather not negate the condition, then at least add braces:
|
If you'd rather not negate the condition, then at least add braces:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<pre>
|
<pre>
|
||||||
if (expr) {
|
if (expr) {
|
||||||
...
|
...
|
||||||
...
|
...
|
||||||
} else {
|
} else {
|
||||||
x = y;
|
x = y;
|
||||||
}</pre>
|
}
|
||||||
|
</pre>
|
||||||
|
|
||||||
<h2><a href="types">Preprocessor</a></h2>
|
<h2><a href="types">Preprocessor</a></h2>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
For variadic macros, stick with C99 syntax:
|
For variadic macros, stick with C99 syntax:
|
||||||
</p>
|
</p>
|
||||||
<pre>
|
<pre>
|
||||||
#define vshPrint(_ctl, ...) fprintf(stdout, __VA_ARGS__)
|
#define vshPrint(_ctl, ...) fprintf(stdout, __VA_ARGS__)
|
||||||
</pre>
|
</pre>
|
||||||
|
|
||||||
<p>Use parenthesis when checking if a macro is defined, and use
|
<p>Use parenthesis when checking if a macro is defined, and use
|
||||||
indentation to track nesting:
|
indentation to track nesting:
|
||||||
</p>
|
</p>
|
||||||
<pre>
|
<pre>
|
||||||
#if defined(HAVE_POSIX_FALLOCATE) && !defined(HAVE_FALLOCATE)
|
#if defined(HAVE_POSIX_FALLOCATE) && !defined(HAVE_FALLOCATE)
|
||||||
# define fallocate(a,ignored,b,c) posix_fallocate(a,b,c)
|
# define fallocate(a,ignored,b,c) posix_fallocate(a,b,c)
|
||||||
#endif
|
#endif
|
||||||
</pre>
|
</pre>
|
||||||
|
|
||||||
<h2><a href="types">C types</a></h2>
|
<h2><a href="types">C types</a></h2>
|
||||||
|
|
||||||
@ -266,45 +282,51 @@
|
|||||||
<h3>Scalars</h3>
|
<h3>Scalars</h3>
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>If you're using "int" or "long", odds are good that there's a better type.</li>
|
<li>If you're using <code>int</code> or <code>long</code>, odds are
|
||||||
|
good that there's a better type.</li>
|
||||||
<li>If a variable is counting something, be sure to declare it with an
|
<li>If a variable is counting something, be sure to declare it with an
|
||||||
unsigned type.</li>
|
unsigned type.</li>
|
||||||
<li>If it's memory-size-related, use size_t (use ssize_t only if required).</li>
|
<li>If it's memory-size-related, use <code>size_t</code> (use
|
||||||
<li>If it's file-size related, use uintmax_t, or maybe off_t.</li>
|
<code>ssize_t</code> only if required).</li>
|
||||||
<li>If it's file-offset related (i.e., signed), use off_t.</li>
|
<li>If it's file-size related, use uintmax_t, or maybe <code>off_t</code>.</li>
|
||||||
<li>If it's just counting small numbers use "unsigned int";
|
<li>If it's file-offset related (i.e., signed), use <code>off_t</code>.</li>
|
||||||
|
<li>If it's just counting small numbers use <code>unsigned int</code>;
|
||||||
(on all but oddball embedded systems, you can assume that that
|
(on all but oddball embedded systems, you can assume that that
|
||||||
type is at least four bytes wide).</li>
|
type is at least four bytes wide).</li>
|
||||||
<li>If a variable has boolean semantics, give it the "bool" type
|
<li>If a variable has boolean semantics, give it the <code>bool</code> type
|
||||||
and use the corresponding "true" and "false" macros. It's ok
|
and use the corresponding <code>true</code> and <code>false</code> macros.
|
||||||
to include <stdbool.h>, since libvirt's use of gnulib ensures
|
It's ok to include <stdbool.h>, since libvirt's use of gnulib ensures
|
||||||
that it exists and is usable.</li>
|
that it exists and is usable.</li>
|
||||||
<li>In the unusual event that you require a specific width, use a
|
<li>In the unusual event that you require a specific width, use a
|
||||||
standard type like int32_t, uint32_t, uint64_t, etc.</li>
|
standard type like <code>int32_t</code>, <code>uint32_t</code>,
|
||||||
<li>While using "bool" is good for readability, it comes with minor caveats:
|
<code>uint64_t</code>, etc.</li>
|
||||||
|
<li>While using <code>bool</code> is good for readability, it comes with
|
||||||
|
minor caveats:
|
||||||
<ul>
|
<ul>
|
||||||
<li>Don't use "bool" in places where the type size must be constant across
|
<li>Don't use <code>bool</code> in places where the type size must be constant across
|
||||||
all systems, like public interfaces and on-the-wire protocols. Note
|
all systems, like public interfaces and on-the-wire protocols. Note
|
||||||
that it would be possible (albeit wasteful) to use "bool" in libvirt's
|
that it would be possible (albeit wasteful) to use <code>bool</code> in libvirt's
|
||||||
logical wire protocol, since XDR maps that to its lower-level bool_t
|
logical wire protocol, since XDR maps that to its lower-level <code>bool_t</code>
|
||||||
type, which *is* fixed-size.</li>
|
type, which <b>is</b> fixed-size.</li>
|
||||||
<li>Don't compare a bool variable against the literal, "true",
|
<li>Don't compare a bool variable against the literal, <code>true</code>,
|
||||||
since a value with a logical non-false value need not be "1".
|
since a value with a logical non-false value need not be <code>1</code>.
|
||||||
I.e., don't write "if (seen == true) ...". Rather, write "if (seen)...".</li>
|
I.e., don't write <code>if (seen == true) ...</code>. Rather,
|
||||||
|
write <code>if (seen)...</code>.</li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
Of course, take all of the above with a grain of salt. If you're about
|
Of course, take all of the above with a grain of salt. If you're about
|
||||||
to use some system interface that requires a type like size_t, pid_t or
|
to use some system interface that requires a type like <code>size_t</code>,
|
||||||
off_t, use matching types for any corresponding variables.
|
<code>pid_t</code> or <code>off_t</code>, use matching types for any
|
||||||
|
corresponding variables.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
Also, if you try to use e.g., "unsigned int" as a type, and that
|
Also, if you try to use e.g., <code>unsigned int</code> as a type, and that
|
||||||
conflicts with the signedness of a related variable, sometimes
|
conflicts with the signedness of a related variable, sometimes
|
||||||
it's best just to use the *wrong* type, if "pulling the thread"
|
it's best just to use the <b>wrong</b> type, if <i>pulling the thread</i>
|
||||||
and fixing all related variables would be too invasive.
|
and fixing all related variables would be too invasive.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
@ -317,9 +339,9 @@
|
|||||||
<h3>Pointers</h3>
|
<h3>Pointers</h3>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
Ensure that all of your pointers are "const-correct".
|
Ensure that all of your pointers are <i>const-correct</i>.
|
||||||
Unless a pointer is used to modify the pointed-to storage,
|
Unless a pointer is used to modify the pointed-to storage,
|
||||||
give it the "const" attribute. That way, the reader knows
|
give it the <code>const</code> attribute. That way, the reader knows
|
||||||
up-front that this is a read-only pointer. Perhaps more
|
up-front that this is a read-only pointer. Perhaps more
|
||||||
importantly, if we're diligent about this, when you see a non-const
|
importantly, if we're diligent about this, when you see a non-const
|
||||||
pointer, you're guaranteed that it is used to modify the storage
|
pointer, you're guaranteed that it is used to modify the storage
|
||||||
@ -336,57 +358,57 @@
|
|||||||
</p>
|
</p>
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li><p>eg to allocate a single object:</p>
|
<li><p>e.g. to allocate a single object:</p>
|
||||||
|
|
||||||
<pre>
|
<pre>
|
||||||
virDomainPtr domain;
|
virDomainPtr domain;
|
||||||
|
|
||||||
if (VIR_ALLOC(domain) < 0) {
|
if (VIR_ALLOC(domain) < 0) {
|
||||||
virReportOOMError();
|
virReportOOMError();
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
</pre></li>
|
</pre>
|
||||||
|
</li>
|
||||||
<li><p>eg to allocate an array of objects</p>
|
|
||||||
|
|
||||||
|
<li><p>e.g. to allocate an array of objects</p>
|
||||||
<pre>
|
<pre>
|
||||||
virDomainPtr domains;
|
virDomainPtr domains;
|
||||||
int ndomains = 10;
|
int ndomains = 10;
|
||||||
|
|
||||||
if (VIR_ALLOC_N(domains, ndomains) < 0) {
|
if (VIR_ALLOC_N(domains, ndomains) < 0) {
|
||||||
virReportOOMError();
|
virReportOOMError();
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
</pre></li>
|
</pre>
|
||||||
|
</li>
|
||||||
<li><p>eg to allocate an array of object pointers</p>
|
|
||||||
|
|
||||||
|
<li><p>e.g. to allocate an array of object pointers</p>
|
||||||
<pre>
|
<pre>
|
||||||
virDomainPtr *domains;
|
virDomainPtr *domains;
|
||||||
int ndomains = 10;
|
int ndomains = 10;
|
||||||
|
|
||||||
if (VIR_ALLOC_N(domains, ndomains) < 0) {
|
if (VIR_ALLOC_N(domains, ndomains) < 0) {
|
||||||
virReportOOMError();
|
virReportOOMError();
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
</pre></li>
|
</pre>
|
||||||
|
</li>
|
||||||
<li><p>eg to re-allocate the array of domains to be longer</p>
|
|
||||||
|
|
||||||
|
<li><p>e.g. to re-allocate the array of domains to be longer</p>
|
||||||
<pre>
|
<pre>
|
||||||
ndomains = 20
|
ndomains = 20
|
||||||
|
|
||||||
if (VIR_REALLOC_N(domains, ndomains) < 0) {
|
if (VIR_REALLOC_N(domains, ndomains) < 0) {
|
||||||
virReportOOMError();
|
virReportOOMError();
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
</pre></li>
|
</pre>
|
||||||
|
</li>
|
||||||
<li><p>eg to free the domain</p>
|
|
||||||
|
|
||||||
|
<li><p>e.g. to free the domain</p>
|
||||||
<pre>
|
<pre>
|
||||||
VIR_FREE(domain);
|
VIR_FREE(domain);
|
||||||
</pre></li>
|
</pre>
|
||||||
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<h2><a name="file_handling">File handling</a></h2>
|
<h2><a name="file_handling">File handling</a></h2>
|
||||||
@ -398,20 +420,21 @@
|
|||||||
</p>
|
</p>
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li><p>eg close a file descriptor</p>
|
<li><p>e.g. close a file descriptor</p>
|
||||||
|
|
||||||
<pre>
|
<pre>
|
||||||
if (VIR_CLOSE(fd) < 0) {
|
if (VIR_CLOSE(fd) < 0) {
|
||||||
virReportSystemError(errno, _("failed to close file"));
|
virReportSystemError(errno, _("failed to close file"));
|
||||||
}
|
}
|
||||||
</pre></li>
|
</pre>
|
||||||
|
</li>
|
||||||
|
|
||||||
<li><p>eg close a file descriptor in an error path, without losing
|
<li><p>eg close a file descriptor in an error path, without losing
|
||||||
the previous errno value</p>
|
the previous <code>errno</code> value</p>
|
||||||
|
|
||||||
<pre>
|
<pre>
|
||||||
VIR_FORCE_CLOSE(fd);
|
VIR_FORCE_CLOSE(fd);
|
||||||
</pre></li>
|
</pre>
|
||||||
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<h2><a name="string_comparision">String comparisons</a></h2>
|
<h2><a name="string_comparision">String comparisons</a></h2>
|
||||||
@ -423,39 +446,36 @@
|
|||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li><p>For strict equality:</p>
|
<li><p>For strict equality:</p>
|
||||||
<pre>
|
<pre>
|
||||||
STREQ(a,b)
|
STREQ(a,b)
|
||||||
STRNEQ(a,b)
|
STRNEQ(a,b)
|
||||||
</pre>
|
</pre>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
<li><p>For case insensitive equality:</p>
|
<li><p>For case insensitive equality:</p>
|
||||||
<pre>
|
<pre>
|
||||||
STRCASEEQ(a,b)
|
STRCASEEQ(a,b)
|
||||||
STRCASENEQ(a,b)
|
STRCASENEQ(a,b)
|
||||||
</pre>
|
</pre>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
<li><p>For strict equality of a substring:</p>
|
<li><p>For strict equality of a substring:</p>
|
||||||
|
<pre>
|
||||||
<pre>
|
STREQLEN(a,b,n)
|
||||||
STREQLEN(a,b,n)
|
STRNEQLEN(a,b,n)
|
||||||
STRNEQLEN(a,b,n)
|
|
||||||
</pre>
|
</pre>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
<li><p>For case insensitive equality of a substring:</p>
|
<li><p>For case insensitive equality of a substring:</p>
|
||||||
|
<pre>
|
||||||
<pre>
|
STRCASEEQLEN(a,b,n)
|
||||||
STRCASEEQLEN(a,b,n)
|
STRCASENEQLEN(a,b,n)
|
||||||
STRCASENEQLEN(a,b,n)
|
|
||||||
</pre>
|
</pre>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
<li><p>For strict equality of a prefix:</p>
|
<li><p>For strict equality of a prefix:</p>
|
||||||
|
<pre>
|
||||||
<pre>
|
STRPREFIX(a,b)
|
||||||
STRPREFIX(a,b)
|
|
||||||
</pre>
|
</pre>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
@ -469,7 +489,10 @@
|
|||||||
it extremely dangerous to use. Instead, use one of the
|
it extremely dangerous to use. Instead, use one of the
|
||||||
functionally equivalent functions:
|
functionally equivalent functions:
|
||||||
</p>
|
</p>
|
||||||
<pre>virStrncpy(char *dest, const char *src, size_t n, size_t destbytes)</pre>
|
|
||||||
|
<pre>
|
||||||
|
virStrncpy(char *dest, const char *src, size_t n, size_t destbytes)
|
||||||
|
</pre>
|
||||||
<p>
|
<p>
|
||||||
The first three arguments have the same meaning as for strncpy;
|
The first three arguments have the same meaning as for strncpy;
|
||||||
namely the destination, source, and number of bytes to copy,
|
namely the destination, source, and number of bytes to copy,
|
||||||
@ -481,8 +504,9 @@
|
|||||||
trailing \0 is appended.
|
trailing \0 is appended.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<pre>virStrcpy(char *dest, const char *src, size_t destbytes)</pre>
|
<pre>
|
||||||
|
virStrcpy(char *dest, const char *src, size_t destbytes)
|
||||||
|
</pre>
|
||||||
<p>
|
<p>
|
||||||
Use this variant if you know you want to copy the entire src
|
Use this variant if you know you want to copy the entire src
|
||||||
string into dest. Note that this is a macro, so arguments could
|
string into dest. Note that this is a macro, so arguments could
|
||||||
@ -490,11 +514,12 @@
|
|||||||
virStrncpy(dest, src, strlen(src), destbytes)
|
virStrncpy(dest, src, strlen(src), destbytes)
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<pre>virStrcpyStatic(char *dest, const char *src)</pre>
|
<pre>
|
||||||
|
virStrcpyStatic(char *dest, const char *src)
|
||||||
|
</pre>
|
||||||
<p>
|
<p>
|
||||||
Use this variant if you know you want to copy the entire src
|
Use this variant if you know you want to copy the entire src
|
||||||
string into dest *and* you know that your destination string is
|
string into dest <b>and</b> you know that your destination string is
|
||||||
a static string (i.e. that sizeof(dest) returns something
|
a static string (i.e. that sizeof(dest) returns something
|
||||||
meaningful). Note that this is a macro, so arguments could be
|
meaningful). Note that this is a macro, so arguments could be
|
||||||
evaluated more than once. This is equivalent to
|
evaluated more than once. This is equivalent to
|
||||||
@ -511,9 +536,10 @@
|
|||||||
|
|
||||||
<p>eg typical usage is as follows:</p>
|
<p>eg typical usage is as follows:</p>
|
||||||
|
|
||||||
<pre>
|
<pre>
|
||||||
char *
|
char *
|
||||||
somefunction(...) {
|
somefunction(...)
|
||||||
|
{
|
||||||
virBuffer buf = VIR_BUFFER_INITIALIZER;
|
virBuffer buf = VIR_BUFFER_INITIALIZER;
|
||||||
|
|
||||||
...
|
...
|
||||||
@ -545,7 +571,7 @@
|
|||||||
*.c source files:
|
*.c source files:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<pre>
|
<pre>
|
||||||
/*
|
/*
|
||||||
* Copyright notice
|
* Copyright notice
|
||||||
* ....
|
* ....
|
||||||
@ -561,7 +587,7 @@
|
|||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
|
|
||||||
#if HAVE_NUMACTL Some system includes aren't supported
|
#if HAVE_NUMACTL Some system includes aren't supported
|
||||||
# include <numa.h> everywhere so need these #if guards.
|
# include <numa.h> everywhere so need these #if guards.
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "internal.h" Include this first, after system includes.
|
#include "internal.h" Include this first, after system includes.
|
||||||
@ -569,13 +595,14 @@
|
|||||||
#include "util.h" Any libvirt internal header files.
|
#include "util.h" Any libvirt internal header files.
|
||||||
#include "buf.h"
|
#include "buf.h"
|
||||||
|
|
||||||
static myInternalFunc () The actual code.
|
static int
|
||||||
|
myInternalFunc() The actual code.
|
||||||
{
|
{
|
||||||
...
|
...
|
||||||
</pre>
|
</pre>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
Of particular note: *DO NOT* include libvirt/libvirt.h or
|
Of particular note: <b>Do not</b> include libvirt/libvirt.h or
|
||||||
libvirt/virterror.h. It is included by "internal.h" already and there
|
libvirt/virterror.h. It is included by "internal.h" already and there
|
||||||
are some special reasons why you cannot include these files
|
are some special reasons why you cannot include these files
|
||||||
explicitly.
|
explicitly.
|
||||||
@ -591,9 +618,9 @@
|
|||||||
the one for virAsprintf, in util.h:
|
the one for virAsprintf, in util.h:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<pre>
|
<pre>
|
||||||
int virAsprintf(char **strp, const char *fmt, ...)
|
int virAsprintf(char **strp, const char *fmt, ...)
|
||||||
ATTRIBUTE_FORMAT(printf, 2, 3);
|
ATTRIBUTE_FORMAT(printf, 2, 3);
|
||||||
</pre>
|
</pre>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
@ -654,7 +681,7 @@
|
|||||||
Although libvirt does not encourage the Linux kernel wind/unwind
|
Although libvirt does not encourage the Linux kernel wind/unwind
|
||||||
style of multiple labels, there's a good general discussion of
|
style of multiple labels, there's a good general discussion of
|
||||||
the issue archived at
|
the issue archived at
|
||||||
<a href=http://kerneltrap.org/node/553/2131>KernelTrap</a>
|
<a href="http://kerneltrap.org/node/553/2131">KernelTrap</a>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
@ -662,11 +689,12 @@
|
|||||||
makes sense:
|
makes sense:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<pre>
|
<pre>
|
||||||
error: A path only taken upon return with an error code
|
error: A path only taken upon return with an error code
|
||||||
cleanup: A path taken upon return with success code + optional error
|
cleanup: A path taken upon return with success code + optional error
|
||||||
no_memory: A path only taken upon return with an OOM error code
|
no_memory: A path only taken upon return with an OOM error code
|
||||||
retry: If needing to jump upwards (eg retry on EINTR)</pre>
|
retry: If needing to jump upwards (eg retry on EINTR)
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -691,7 +719,7 @@
|
|||||||
configure with
|
configure with
|
||||||
</p>
|
</p>
|
||||||
<pre>
|
<pre>
|
||||||
--enable-compile-warnings=error
|
--enable-compile-warnings=error
|
||||||
</pre>
|
</pre>
|
||||||
<p>
|
<p>
|
||||||
which adds -Werror to compile flags, so no warnings get missed
|
which adds -Werror to compile flags, so no warnings get missed
|
||||||
|
Loading…
Reference in New Issue
Block a user