X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=src%2Fcommon%2Fcontext.cpp;fp=src%2Fcommon%2Fcontext.cpp;h=ab61a8133386b026bf27972a168030c74d9c401f;hb=a6bc4ca9d659caf016ef932fcd944029737ac57c;hp=0000000000000000000000000000000000000000;hpb=97535efaa975ca52bf02c2d5e76351bfd2e3defa;p=lttng-tools.git diff --git a/src/common/context.cpp b/src/common/context.cpp new file mode 100644 index 000000000..ab61a8133 --- /dev/null +++ b/src/common/context.cpp @@ -0,0 +1,79 @@ +/* + * Copyright (C) 2016 Jérémie Galarneau + * + * SPDX-License-Identifier: LGPL-2.1-only + * + */ + +#include "context.h" +#include +#include +#include +#include + +int parse_application_context(const char *str, char **out_provider_name, + char **out_ctx_name) +{ + const char app_ctx_prefix[] = "$app."; + char *provider_name = NULL, *ctx_name = NULL; + size_t i, len, colon_pos = 0, provider_name_len, ctx_name_len; + + if (!str || !out_provider_name || !out_ctx_name) { + goto not_found; + } + + len = strlen(str); + if (len <= sizeof(app_ctx_prefix) - 1) { + goto not_found; + } + + /* String starts with $app. */ + if (strncmp(str, app_ctx_prefix, sizeof(app_ctx_prefix) - 1)) { + goto not_found; + } + + /* Validate that the ':' separator is present. */ + for (i = sizeof(app_ctx_prefix); i < len; i++) { + const char c = str[i]; + + if (c == ':') { + colon_pos = i; + break; + } + } + + /* + * No colon found or no ctx name ("$app.provider:") or no provider name + * given ("$app.:..."), which is invalid. + */ + if (!colon_pos || colon_pos == len || + colon_pos == sizeof(app_ctx_prefix)) { + goto not_found; + } + + provider_name_len = colon_pos - sizeof(app_ctx_prefix) + 2; + provider_name = (char *) zmalloc(provider_name_len); + if (!provider_name) { + PERROR("malloc provider_name"); + goto not_found; + } + strncpy(provider_name, str + sizeof(app_ctx_prefix) - 1, + provider_name_len - 1); + + ctx_name_len = len - colon_pos; + ctx_name = (char *) zmalloc(ctx_name_len); + if (!ctx_name) { + PERROR("malloc ctx_name"); + goto not_found; + } + strncpy(ctx_name, str + colon_pos + 1, ctx_name_len - 1); + + *out_provider_name = provider_name; + *out_ctx_name = ctx_name; + return 0; +not_found: + free(provider_name); + free(ctx_name); + return -1; +} +