0
0
mirror of https://github.com/OpenVPN/openvpn3.git synced 2024-09-19 19:52:15 +02:00

README: colorize C++ code.

Signed-off-by: James Yonan <james@openvpn.net>
This commit is contained in:
James Yonan 2017-03-20 03:38:20 -06:00
parent 2bc561857c
commit 15b356e315

View File

@ -110,7 +110,7 @@ version of the library than listed here, you can edit this file.
For dependencies that are typically cloned from github vs. For dependencies that are typically cloned from github vs.
provided as a .tar.gz file, tools are provided to convert provided as a .tar.gz file, tools are provided to convert
the github to a .tar.gz file. See "snapshot" scripts under the github to a .tar.gz file. See "snapshot" scripts under
$O3/core/deps ``$O3/core/deps``
Note that while OpenSSL is listed in lib-versions, it is Note that while OpenSSL is listed in lib-versions, it is
not required for Mac builds. not required for Mac builds.
@ -216,7 +216,9 @@ testing the API. See `<test/ovpncli/cli.cpp>`_.
The basic approach to building an OpenVPN 3 client is The basic approach to building an OpenVPN 3 client is
to define a client class that derives from to define a client class that derives from
``ClientAPI::OpenVPNClient``, then provide implementations ``ClientAPI::OpenVPNClient``, then provide implementations
for callbacks including event and logging notifications:: for callbacks including event and logging notifications:
.. code:: c++
class Client : public ClientAPI::OpenVPNClient class Client : public ClientAPI::OpenVPNClient
{ {
@ -232,20 +234,26 @@ for callbacks including event and logging notifications::
}; };
To start the client, first create a ``ClientAPI::Config`` object To start the client, first create a ``ClientAPI::Config`` object
and initialize it with the OpenVPN config file and other options:: and initialize it with the OpenVPN config file and other options:
.. code:: c++
ClientAPI::Config config; ClientAPI::Config config;
config.content = <config_file_content_as_multiline_string>; config.content = <config_file_content_as_multiline_string>;
... ...
Next, create a client object and evaluate the configuration:: Next, create a client object and evaluate the configuration:
.. code:: c++
Client client; Client client;
ClientAPI::EvalConfig eval = client.eval_config(config); ClientAPI::EvalConfig eval = client.eval_config(config);
if (eval.error) if (eval.error)
throw ...; throw ...;
Finally, in a new worker thread, start the connection:: Finally, in a new worker thread, start the connection:
.. code:: c++
ClientAPI::Status connect_status = client.connect(); ClientAPI::Status connect_status = client.connect();
@ -388,7 +396,9 @@ Here is a brief set of guidelines:
* Never use ``malloc`` or ``free``. When allocating objects, * Never use ``malloc`` or ``free``. When allocating objects,
use the C++ ``new`` operator and then immediately construct use the C++ ``new`` operator and then immediately construct
a smart pointer to reference the object:: a smart pointer to reference the object:
.. code:: c++
std::unique_ptr<MyObject> ptr = new MyObject(); std::unique_ptr<MyObject> ptr = new MyObject();
ptr->method(); ptr->method();
@ -410,7 +420,9 @@ Here is a brief set of guidelines:
for cryptographic purposes (i.e. for keys, tokens, etc.), for cryptographic purposes (i.e. for keys, tokens, etc.),
always ensure that the RNG is crypto-grade by calling always ensure that the RNG is crypto-grade by calling
``assert_crypto()`` on the RNG. This will throw ``assert_crypto()`` on the RNG. This will throw
an exception if the RNG is not crypto-grade:: an exception if the RNG is not crypto-grade:
.. code:: c++
void set_rng(RandomAPI::Ptr rng_arg) { void set_rng(RandomAPI::Ptr rng_arg) {
rng_arg->assert_crypto(); rng_arg->assert_crypto();
@ -425,13 +437,17 @@ Here is a brief set of guidelines:
* When formatting strings, don't use ``snprintf``. Instead, use * When formatting strings, don't use ``snprintf``. Instead, use
``std::ostringstream`` or build the string using the '+' ``std::string`` ``std::ostringstream`` or build the string using the '+' ``std::string``
operator:: operator:
.. code:: c++
std::string format_reconnecting(const int n_seconds) { std::string format_reconnecting(const int n_seconds) {
return "Reconnecting in " + openvpn::to_string(n_seconds) + " seconds."; return "Reconnecting in " + openvpn::to_string(n_seconds) + " seconds.";
} }
or:: or:
.. code:: c++
std::string format_reconnecting(const int n_seconds) { std::string format_reconnecting(const int n_seconds) {
std::ostringstream os; std::ostringstream os;
@ -496,7 +512,9 @@ Conventions
use ``Cleanup`` in `<openvpn/common/cleanup.hpp>`_ when use ``Cleanup`` in `<openvpn/common/cleanup.hpp>`_ when
you need to specify a code block to execute prior to scope you need to specify a code block to execute prior to scope
exit. For example, ensure that the file ``pid_fn`` is exit. For example, ensure that the file ``pid_fn`` is
deleted before scope exit:: deleted before scope exit:
.. code:: c++
auto clean = Cleanup([pid_fn]() { auto clean = Cleanup([pid_fn]() {
if (pid_fn) if (pid_fn)
@ -504,7 +522,9 @@ Conventions
}); });
* When calling global methods (such as libc ``fork``), * When calling global methods (such as libc ``fork``),
prepend "::" to the symbol name, e.g.:: prepend "::" to the symbol name, e.g.:
.. code:: c++
struct dirent *e; struct dirent *e;
while ((e = ::readdir(dir.get())) != nullptr) { while ((e = ::readdir(dir.get())) != nullptr) {