X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=src%2Fcommon%2Fuuid.cpp;h=4c64c08acedafe03de2e3d32b168146b97271134;hb=0f4aa1a88a318046475c7caa0f72438db044d9c0;hp=558110fc0e9e7e46b6d75f44978dfad0944c7454;hpb=c9e313bc594f40a86eed237dce222c0fc99c957f;p=lttng-tools.git diff --git a/src/common/uuid.cpp b/src/common/uuid.cpp index 558110fc0..4c64c08ac 100644 --- a/src/common/uuid.cpp +++ b/src/common/uuid.cpp @@ -6,7 +6,13 @@ * */ +#include "uuid.hpp" + #include +#include +#include +#include + #include #include #include @@ -14,22 +20,34 @@ #include #include -#include "uuid.hpp" +namespace { +const lttng_uuid nil_uuid = {}; +bool lttng_uuid_is_init; +} /* namespace */ -static const lttng_uuid nil_uuid = { 0 }; -static bool lttng_uuid_is_init; +void lttng_uuid_to_str(const lttng_uuid& uuid, char *uuid_str) +{ + snprintf(uuid_str, LTTNG_UUID_STR_LEN, LTTNG_UUID_FMT, LTTNG_UUID_FMT_VALUES(uuid)); +} -void lttng_uuid_to_str(const lttng_uuid uuid, char *uuid_str) +std::string lttng::utils::uuid_to_str(const lttng_uuid& uuid) { - sprintf(uuid_str, LTTNG_UUID_FMT, LTTNG_UUID_FMT_VALUES(uuid)); + std::string uuid_str(LTTNG_UUID_STR_LEN, '\0'); + + ::lttng_uuid_to_str(uuid, &uuid_str[0]); + + /* Don't include '\0' in the C++ string. */ + uuid_str.resize(uuid_str.size() - 1); + + return uuid_str; } -int lttng_uuid_from_str(const char *str_in, lttng_uuid uuid_out) +int lttng_uuid_from_str(const char *str_in, lttng_uuid& uuid_out) { int ret = 0; - lttng_uuid uuid_scan; + lttng_uuid uuid_scan = {}; - if ((str_in == NULL) || (uuid_out == NULL)) { + if (str_in == nullptr) { ret = -1; goto end; } @@ -40,55 +58,37 @@ int lttng_uuid_from_str(const char *str_in, lttng_uuid uuid_out) } /* Scan to a temporary location in case of a partial match. */ - if (sscanf(str_in, LTTNG_UUID_FMT, LTTNG_UUID_SCAN_VALUES(uuid_scan)) != - LTTNG_UUID_LEN) { + if (sscanf(str_in, LTTNG_UUID_FMT, LTTNG_UUID_SCAN_VALUES(uuid_scan)) != LTTNG_UUID_LEN) { ret = -1; + goto end; } - lttng_uuid_copy(uuid_out, uuid_scan); + uuid_out = uuid_scan; end: return ret; } -bool lttng_uuid_is_equal(const lttng_uuid a, const lttng_uuid b) +bool lttng_uuid_is_nil(const lttng_uuid& uuid) { - return memcmp(a, b, LTTNG_UUID_LEN) == 0; -} - -bool lttng_uuid_is_nil(const lttng_uuid uuid) -{ - return memcmp(nil_uuid, uuid, sizeof(lttng_uuid)) == 0; -} - -void lttng_uuid_copy(lttng_uuid dst, const lttng_uuid src) -{ - memcpy(dst, src, LTTNG_UUID_LEN); + return uuid == nil_uuid; } /* * Generate a random UUID according to RFC4122, section 4.4. */ -int lttng_uuid_generate(lttng_uuid uuid_out) +int lttng_uuid_generate(lttng_uuid& uuid_out) { int i, ret = 0; - if (uuid_out == NULL) { - ret = -1; - goto end; - } - if (!lttng_uuid_is_init) { - /* - * We don't need cryptographic quality randomness to - * generate UUIDs, seed rand with the epoch. - */ - const time_t epoch = time(NULL); - - if (epoch == (time_t) -1) { + try { + srand(lttng::random::produce_best_effort_random_seed()); + } catch (const std::exception& e) { + ERR("Failed to initialize random seed during generation of UUID: %s", + e.what()); ret = -1; goto end; } - srand(epoch); lttng_uuid_is_init = true; }