X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fcommon%2Fbuffer-view.cpp;fp=src%2Fcommon%2Fbuffer-view.cpp;h=ebe6869852f90a2bec8e7f1283e24cd130e2f04e;hp=0000000000000000000000000000000000000000;hb=a6bc4ca9d659caf016ef932fcd944029737ac57c;hpb=97535efaa975ca52bf02c2d5e76351bfd2e3defa diff --git a/src/common/buffer-view.cpp b/src/common/buffer-view.cpp new file mode 100644 index 000000000..ebe686985 --- /dev/null +++ b/src/common/buffer-view.cpp @@ -0,0 +1,115 @@ +/* + * Copyright (C) 2017 Jérémie Galarneau + * + * SPDX-License-Identifier: LGPL-2.1-only + * + */ + +#include +#include +#include + +struct lttng_buffer_view lttng_buffer_view_init( + const char *src, size_t offset, ptrdiff_t len) +{ + struct lttng_buffer_view view = { .data = src + offset, .size = (size_t) len }; + return view; +} + +bool lttng_buffer_view_is_valid(const struct lttng_buffer_view *view) +{ + return view && view->data && view->size > 0; +} + +struct lttng_buffer_view lttng_buffer_view_from_view( + const struct lttng_buffer_view *src, size_t offset, + ptrdiff_t len) +{ + struct lttng_buffer_view view = { .data = NULL, .size = 0 }; + + LTTNG_ASSERT(src); + + if (offset > src->size) { + ERR("Attempt to create buffer view from another view with invalid offset (offset > source size): source size = %zu, offset in source = %zu, length = %zd", + src->size, offset, len); + goto end; + } + + if (len != -1 && len > (src->size - offset)) { + ERR("Attempt to create buffer view from another view with invalid length (length > space left after offset in source): source size = %zu, offset in source = %zu, length = %zd", + src->size, offset, len); + goto end; + } + + view.data = src->data + offset; + view.size = len == -1 ? (src->size - offset) : len; +end: + return view; +} + +struct lttng_buffer_view lttng_buffer_view_from_dynamic_buffer( + const struct lttng_dynamic_buffer *src, size_t offset, + ptrdiff_t len) +{ + struct lttng_buffer_view view = { .data = NULL, .size = 0 }; + + LTTNG_ASSERT(src); + + if (offset > src->size) { + ERR("Attempt to create buffer view from a dynamic buffer with invalid offset (offset > source size): source size = %zu, offset in source = %zu, length = %zd", + src->size, offset, len); + goto end; + } + + if (len != -1 && len > (src->size - offset)) { + ERR("Attempt to create buffer view from a dynamic buffer with invalid length (length > space left after offset in source): source size = %zu, offset in source = %zu, length = %zd", + src->size, offset, len); + goto end; + } + + view.data = src->data + offset; + view.size = len == -1 ? (src->size - offset) : len; +end: + return view; +} + +bool lttng_buffer_view_contains_string(const struct lttng_buffer_view *buf, + const char *str, + size_t len_with_null_terminator) +{ + const char *past_buf_end; + size_t max_str_len_with_null_terminator; + size_t str_len; + bool ret; + + past_buf_end = buf->data + buf->size; + + /* Is the start of the string in the buffer view? */ + if (str < buf->data || str >= past_buf_end) { + ret = false; + goto end; + } + + /* + * Max length the string could have to fit in the buffer, including + * NULL terminator. + */ + max_str_len_with_null_terminator = past_buf_end - str; + + /* Could the string even fit in the buffer? */ + if (len_with_null_terminator > max_str_len_with_null_terminator) { + ret = false; + goto end; + } + + str_len = lttng_strnlen(str, max_str_len_with_null_terminator); + if (str_len != (len_with_null_terminator - 1)) { + ret = false; + goto end; + } + + ret = true; + +end: + return ret; +}