From: Jérémie Galarneau Date: Wed, 1 Mar 2017 03:04:26 +0000 (-0500) Subject: Add deserialization of condition class X-Git-Url: http://git.efficios.com/?p=lttng-tools.git;a=commitdiff_plain;h=a365f2d0cf10fad063176af841e359f517efa5a4 Add deserialization of condition class Signed-off-by: Jérémie Galarneau --- diff --git a/include/lttng/condition/condition-internal.h b/include/lttng/condition/condition-internal.h index 62df6c1e8..1c8f100e9 100644 --- a/include/lttng/condition/condition-internal.h +++ b/include/lttng/condition/condition-internal.h @@ -35,12 +35,17 @@ struct lttng_condition { }; struct lttng_condition_comm { + /* enum lttng_condition_type */ int8_t condition_type; }; LTTNG_HIDDEN bool lttng_condition_validate(struct lttng_condition *condition); +LTTNG_HIDDEN +ssize_t lttng_condition_create_from_buffer(const char *buf, + struct lttng_condition **condition); + LTTNG_HIDDEN ssize_t lttng_condition_serialize(struct lttng_condition *action, char *buf); diff --git a/src/lib/lttng-ctl/condition.c b/src/lib/lttng-ctl/condition.c index b3091576a..9f9795d55 100644 --- a/src/lib/lttng-ctl/condition.c +++ b/src/lib/lttng-ctl/condition.c @@ -16,6 +16,7 @@ */ #include +#include #include #include #include @@ -84,3 +85,45 @@ ssize_t lttng_condition_serialize(struct lttng_condition *condition, char *buf) end: return ret; } + +LTTNG_HIDDEN +ssize_t lttng_condition_create_from_buffer(const char *buf, + struct lttng_condition **condition) +{ + ssize_t ret, condition_size = 0; + struct lttng_condition_comm *condition_comm = + (struct lttng_condition_comm *) buf; + + if (!buf || !condition) { + ret = -1; + goto end; + } + + condition_size += sizeof(*condition_comm); + buf += condition_size; + + switch (condition_comm->condition_type) { + case LTTNG_CONDITION_TYPE_BUFFER_USAGE_LOW: + ret = lttng_condition_buffer_usage_low_create_from_buffer(buf, + condition); + if (ret < 0) { + goto end; + } + condition_size += ret; + break; + case LTTNG_CONDITION_TYPE_BUFFER_USAGE_HIGH: + ret = lttng_condition_buffer_usage_high_create_from_buffer(buf, + condition); + if (ret < 0) { + goto end; + } + condition_size += ret; + break; + default: + ret = -1; + goto end; + } + ret = condition_size; +end: + return ret; +}