From 30aba6ceca0161946e2564025799f083c563e0fe Mon Sep 17 00:00:00 2001 From: brenozd Date: Sat, 13 Jul 2024 14:06:43 -0300 Subject: [PATCH] basic documentation --- .cmake-format.yaml | 245 ++++++++++++++++++ CMakeLists.txt | 5 +- .../network/connection/connect_packet.hpp | 107 ++++++-- src/mqttd.cpp | 3 - src/version.hpp | 4 +- 5 files changed, 330 insertions(+), 34 deletions(-) create mode 100644 .cmake-format.yaml diff --git a/.cmake-format.yaml b/.cmake-format.yaml new file mode 100644 index 0000000..036c382 --- /dev/null +++ b/.cmake-format.yaml @@ -0,0 +1,245 @@ +_help_parse: Options affecting listfile parsing +parse: + _help_additional_commands: + - Specify structure for custom cmake functions + additional_commands: + foo: + flags: + - BAR + - BAZ + kwargs: + HEADERS: "*" + SOURCES: "*" + DEPENDS: "*" + _help_override_spec: + - Override configurations per-command where available + override_spec: {} + _help_vartags: + - Specify variable tags. + vartags: [] + _help_proptags: + - Specify property tags. + proptags: [] +_help_format: Options affecting formatting. +format: + _help_disable: + - Disable formatting entirely, making cmake-format a no-op + disable: false + _help_line_width: + - How wide to allow formatted cmake files + line_width: 128 + _help_tab_size: + - How many spaces to tab for indent + tab_size: 2 + _help_use_tabchars: + - If true, lines are indented using tab characters (utf-8 + - 0x09) instead of space characters (utf-8 0x20). + - In cases where the layout would require a fractional tab + - character, the behavior of the fractional indentation is + - governed by + use_tabchars: false + _help_fractional_tab_policy: + - If is True, then the value of this variable + - indicates how fractional indentions are handled during + - whitespace replacement. If set to 'use-space', fractional + - indentation is left as spaces (utf-8 0x20). If set to + - "`round-up` fractional indentation is replaced with a single" + - tab character (utf-8 0x09) effectively shifting the column + - to the next tabstop + fractional_tab_policy: use-space + _help_max_subgroups_hwrap: + - If an argument group contains more than this many sub-groups + - (parg or kwarg groups) then force it to a vertical layout. + max_subgroups_hwrap: 2 + _help_max_pargs_hwrap: + - If a positional argument group contains more than this many + - arguments, then force it to a vertical layout. + max_pargs_hwrap: 6 + _help_max_rows_cmdline: + - If a cmdline positional group consumes more than this many + - lines without nesting, then invalidate the layout (and nest) + max_rows_cmdline: 2 + _help_separate_ctrl_name_with_space: + - If true, separate flow control names from their parentheses + - with a space + separate_ctrl_name_with_space: false + _help_separate_fn_name_with_space: + - If true, separate function names from parentheses with a + - space + separate_fn_name_with_space: false + _help_dangle_parens: + - If a statement is wrapped to more than one line, than dangle + - the closing parenthesis on its own line. + dangle_parens: false + _help_dangle_align: + - If the trailing parenthesis must be 'dangled' on its on + - "line, then align it to this reference: `prefix`: the start" + - "of the statement, `prefix-indent`: the start of the" + - "statement, plus one indentation level, `child`: align to" + - the column of the arguments + dangle_align: prefix + _help_min_prefix_chars: + - If the statement spelling length (including space and + - parenthesis) is smaller than this amount, then force reject + - nested layouts. + min_prefix_chars: 4 + _help_max_prefix_chars: + - If the statement spelling length (including space and + - parenthesis) is larger than the tab width by more than this + - amount, then force reject un-nested layouts. + max_prefix_chars: 10 + _help_max_lines_hwrap: + - If a candidate layout is wrapped horizontally but it exceeds + - this many lines, then reject the layout. + max_lines_hwrap: 2 + _help_line_ending: + - What style line endings to use in the output. + line_ending: unix + _help_command_case: + - Format command names consistently as 'lower' or 'upper' case + command_case: canonical + _help_keyword_case: + - Format keywords consistently as 'lower' or 'upper' case + keyword_case: unchanged + _help_always_wrap: + - A list of command names which should always be wrapped + always_wrap: [] + _help_enable_sort: + - If true, the argument lists which are known to be sortable + - will be sorted lexicographicall + enable_sort: true + _help_autosort: + - If true, the parsers may infer whether or not an argument + - list is sortable (without annotation). + autosort: false + _help_require_valid_layout: + - By default, if cmake-format cannot successfully fit + - everything into the desired linewidth it will apply the + - last, most aggressive attempt that it made. If this flag is + - True, however, cmake-format will print error, exit with non- + - zero status code, and write-out nothing + require_valid_layout: false + _help_layout_passes: + - A dictionary mapping layout nodes to a list of wrap + - decisions. See the documentation for more information. + layout_passes: {} +_help_markup: Options affecting comment reflow and formatting. +markup: + _help_bullet_char: + - What character to use for bulleted lists + bullet_char: "*" + _help_enum_char: + - What character to use as punctuation after numerals in an + - enumerated list + enum_char: . + _help_first_comment_is_literal: + - If comment markup is enabled, don't reflow the first comment + - block in each listfile. Use this to preserve formatting of + - your copyright/license statements. + first_comment_is_literal: false + _help_literal_comment_pattern: + - If comment markup is enabled, don't reflow any comment block + - which matches this (regex) pattern. Default is `None` + - (disabled). + literal_comment_pattern: null + _help_fence_pattern: + - Regular expression to match preformat fences in comments + - default= ``r'^\s*([`~]{3}[`~]*)(.*)$'`` + fence_pattern: ^\s*([`~]{3}[`~]*)(.*)$ + _help_ruler_pattern: + - Regular expression to match rulers in comments default= + - '``r''^\s*[^\w\s]{3}.*[^\w\s]{3}$''``' + ruler_pattern: ^\s*[^\w\s]{3}.*[^\w\s]{3}$ + _help_explicit_trailing_pattern: + - If a comment line matches starts with this pattern then it + - is explicitly a trailing comment for the preceeding + - argument. Default is '#<' + explicit_trailing_pattern: "#<" + _help_hashruler_min_length: + - If a comment line starts with at least this many consecutive + - hash characters, then don't lstrip() them off. This allows + - for lazy hash rulers where the first hash char is not + - separated by space + hashruler_min_length: 10 + _help_canonicalize_hashrulers: + - If true, then insert a space between the first hash char and + - remaining hash chars in a hash ruler, and normalize its + - length to fill the column + canonicalize_hashrulers: true + _help_enable_markup: + - enable comment markup parsing and reflow + enable_markup: true +_help_lint: Options affecting the linter +lint: + _help_disabled_codes: + - a list of lint codes to disable + disabled_codes: [] + _help_function_pattern: + - regular expression pattern describing valid function names + function_pattern: "[0-9a-z_]+" + _help_macro_pattern: + - regular expression pattern describing valid macro names + macro_pattern: "[0-9A-Z_]+" + _help_global_var_pattern: + - regular expression pattern describing valid names for + - variables with global (cache) scope + global_var_pattern: "[A-Z][0-9A-Z_]+" + _help_internal_var_pattern: + - regular expression pattern describing valid names for + - variables with global scope (but internal semantic) + internal_var_pattern: _[A-Z][0-9A-Z_]+ + _help_local_var_pattern: + - regular expression pattern describing valid names for + - variables with local scope + local_var_pattern: "[a-z][a-z0-9_]+" + _help_private_var_pattern: + - regular expression pattern describing valid names for + - privatedirectory variables + private_var_pattern: _[0-9a-z_]+ + _help_public_var_pattern: + - regular expression pattern describing valid names for public + - directory variables + public_var_pattern: "[A-Z][0-9A-Z_]+" + _help_argument_var_pattern: + - regular expression pattern describing valid names for + - function/macro arguments and loop variables. + argument_var_pattern: "[a-z][a-z0-9_]+" + _help_keyword_pattern: + - regular expression pattern describing valid names for + - keywords used in functions or macros + keyword_pattern: "[A-Z][0-9A-Z_]+" + _help_max_conditionals_custom_parser: + - In the heuristic for C0201, how many conditionals to match + - within a loop in before considering the loop a parser. + max_conditionals_custom_parser: 2 + _help_min_statement_spacing: + - Require at least this many newlines between statements + min_statement_spacing: 1 + _help_max_statement_spacing: + - Require no more than this many newlines between statements + max_statement_spacing: 2 + max_returns: 6 + max_branches: 12 + max_arguments: 5 + max_localvars: 15 + max_statements: 50 +_help_encode: Options affecting file encoding +encode: + _help_emit_byteorder_mark: + - If true, emit the unicode byte-order mark (BOM) at the start + - of the file + emit_byteorder_mark: false + _help_input_encoding: + - Specify the encoding of the input file. Defaults to utf-8 + input_encoding: utf-8 + _help_output_encoding: + - Specify the encoding of the output file. Defaults to utf-8. + - Note that cmake only claims to support utf-8 so be careful + - when using anything else + output_encoding: utf-8 +_help_misc: Miscellaneous configurations options. +misc: + _help_per_command: + - A dictionary containing any per-command configuration + - overrides. Currently only `command_case` is supported. + per_command: {} diff --git a/CMakeLists.txt b/CMakeLists.txt index bd5ccab..2428ba2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,9 +3,7 @@ set(CMAKE_CXX_STANDARD 17) set(CMAKE_EXPORT_COMPILE_COMMANDS ON) set(ENV{TARGET} "x86_64-linux-gnu") -set(CMAKE_CXX_FLAGS - "-Wall -fvisibility=hidden -fvisibility-inlines-hidden -Wformat -Wformat-security -rdynamic" -) +set(CMAKE_CXX_FLAGS "-Wall -fvisibility=hidden -fvisibility-inlines-hidden -Wformat -Wformat-security -rdynamic") set(CMAKE_CXX_FLAGS_DEBUG "-g2 -O0") set(CMAKE_CXX_FLAGS_RELEASE "-fstack-protector-all -Wl,-z,relro,-z,now -Wl,-z,noexecstack -s -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1 -O3 -g2 -march=native -pipe -flto=auto" @@ -27,4 +25,3 @@ project( add_subdirectory(src) add_subdirectory(tests) add_subdirectory(docs) - diff --git a/src/libmqttd/network/connection/connect_packet.hpp b/src/libmqttd/network/connection/connect_packet.hpp index b8487d0..84f2168 100644 --- a/src/libmqttd/network/connection/connect_packet.hpp +++ b/src/libmqttd/network/connection/connect_packet.hpp @@ -3,57 +3,114 @@ #include "exceptions.hpp" #include "utf8_string.hpp" -#include +#include #include #include -#include +#include #include +#include #include +/** + * @brief Enum class representing the flags for MQTT Connect packets. + * + * These flags are used to control the behavior of the connection attempt. + */ enum ConnectFlags : uint16_t { - RESERVERD = 0, - CLEAN_START = 1, - WILL_FLAG = 2, - WILL_QOS = 3, - WILL_RETAIN = 5, - PASSWORD_FLAG = 6, - USERNAME_FLAG = 7, + RESERVERD = 0, /**< Reserved flag. */ + CLEAN_START = 1, /**< Clean start flag. */ + WILL_FLAG = 2, /**< Will flag. */ + WILL_QOS = 3, /**< Will QoS flag. */ + WILL_RETAIN = 5, /**< Will retain flag.*/ + PASSWORD_FLAG = 6, /**< Password flag. If set to 0, password MUST not be present in the payload*/ + USERNAME_FLAG = 7, /**< Username flag. If set to 0, username MUST not be present in the payload*/ }; using ConnectionFlagValue = std::variant; +/** + * @brief Connect Packet according to MQTT Version 5.0 specification. + * + * This class represents a Connect packet as defined in the MQTT Version 5.0 specification. + */ class ConnectPacket : public IPacket { public: - ConnectPacket(IPacket &); - ConnectPacket(std::vector); + /** + * @brief Constructs a new Connect Packet from an existing packet. + * + * @param packet The packet from which to construct the Connect Packet. + */ + ConnectPacket(IPacket &packet); + + /** + * @brief Constructs a new Connect Packet from a vector of bytes. + * + * @param bytes The bytes from which to construct the Connect Packet. + */ + ConnectPacket(std::vector bytes); + + /** + * @brief Destructs the Connect Packet. + */ ~ConnectPacket(); + /** + * @brief Gets the value of a connection flag. + * + * @param flag The flag for which to get the value. + * @return The value of the flag. + */ ConnectionFlagValue get_connection_flag(ConnectFlags flag) const; + /** + * @brief Converts the packet to a string for display purposes. + * + * @return A string representing the packet. + */ std::string as_string() const final; + + /** + * @brief Converts the packet to bytes for transmission over a socket to the client. + * + * This function is not implemented for ConnectPacket. + * + * @return A vector of bytes representing the packet. + */ std::vector as_bytes() final { throw NotImplemented(); }; - inline std::string get_client_id() const { return this->client_id.as_string(); }; + /** + * @brief Gets the client ID from the packet. + * + * @return The client ID as a string. + */ + inline std::string get_client_id() const { return this->client_id.as_string(); }; private: + /** + * @brief Parses the variable header of the packet. + */ void parse_variable_header() final; + + /** + * @brief Parses the payload of the packet. + */ void parse_payload() final; // Variable Header - utf8_str protocol_name; - std::uint8_t protocol_version; - std::byte connection_flags; - std::uint16_t keepalive; - std::vector::const_iterator payload_start_byte; - uint16_t packet_identifier = 0; - MQTTProperties properties; - uint size_in_bytes = 0; - + utf8_str protocol_name; /**< The protocol name. */ + std::uint8_t protocol_version; /**< The protocol version. */ + std::byte connection_flags; /**< The connection flags. */ + std::uint16_t keepalive; /**< The keepalive value. */ + std::vector::const_iterator payload_start_byte; /**< Iterator to the start byte of the payload. */ + uint16_t packet_identifier = 0; /**< The packet identifier. */ + MQTTProperties properties; /**< The MQTT properties associated with the packet. */ + uint size_in_bytes = 0; /**< The size of the packet in bytes. */ + // Payload - utf8_str client_id; - LastWill lastwill; - utf8_str username; - binary_data password; + utf8_str client_id; /**< The client ID. */ + LastWill lastwill; /**< The last will message. */ + utf8_str username; /**< The username. */ + binary_data password; /**< The password. */ }; #endif // INCLUDE_CONNECTION_CONNECT_PACKET_HPP_ diff --git a/src/mqttd.cpp b/src/mqttd.cpp index 28b2b30..4ae9621 100644 --- a/src/mqttd.cpp +++ b/src/mqttd.cpp @@ -95,9 +95,6 @@ int main() { cpptrace::enable_inlined_call_resolution(true); warmup_cpptrace(); set_signal_handlers(); - raise(SIGSEGV); - - // spdlog::set_level(spdlog::level::debug); clistener.start(); clistener.join(); diff --git a/src/version.hpp b/src/version.hpp index 4103854..a70b7f4 100644 --- a/src/version.hpp +++ b/src/version.hpp @@ -1,5 +1,5 @@ #define MQTTD_VERSION_MAJOR 0 #define MQTTD_VERSION_MINOR 0 #define MQTTD_VERSION_PATCH 1 -#define MQTTD_COMMIT_HASH ccd31f1802fa0052819a18599c9932e1c74e8a1a -#define MQTTD_BUILD_TIMESTAMP 1713729654 +#define MQTTD_COMMIT_HASH 2b70078e9ce0694833dfb760747bbb7bf7f0621a +#define MQTTD_BUILD_TIMESTAMP 1720889932