* Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
-#define _GNU_SOURCE
+#define _LGPL_SOURCE
#include <assert.h>
#include <inttypes.h>
#include <string.h>
#include <common/defaults.h>
#include "snapshot.h"
+#include "utils.h"
/*
* Return the atomically incremented value of next_output_id.
{
int ret = 0, i;
- assert(output);
+ memset(output, 0, sizeof(struct snapshot_output));
+ /*
+ * max_size of -1ULL means unset. Set to default (unlimited).
+ */
if (max_size == (uint64_t) -1ULL) {
max_size = 0;
}
lttng_ht_node_init_ulong(&output->node, (unsigned long) output->id);
if (name && name[0] != '\0') {
- strncpy(output->name, name, sizeof(output->name));
+ if (lttng_strncpy(output->name, name, sizeof(output->name))) {
+ ret = -LTTNG_ERR_INVALID;
+ goto error;
+ }
} else {
/* Set default name. */
ret = snprintf(output->name, sizeof(output->name), "%s-%" PRIu32,
ret = -ENOMEM;
goto error;
}
+ output->consumer->snapshot = 1;
/* No URL given. */
if (nb_uri == 0) {
if (uris[0].dtype == LTTNG_DST_PATH) {
memset(output->consumer->dst.trace_path, 0,
sizeof(output->consumer->dst.trace_path));
- strncpy(output->consumer->dst.trace_path, uris[0].dst.path,
- sizeof(output->consumer->dst.trace_path));
+ if (lttng_strncpy(output->consumer->dst.trace_path,
+ uris[0].dst.path,
+ sizeof(output->consumer->dst.trace_path))) {
+ ret = -LTTNG_ERR_INVALID;
+ goto error;
+ }
output->consumer->type = CONSUMER_DST_LOCAL;
ret = 0;
goto end;
if (obj->consumer) {
consumer_output_send_destroy_relayd(obj->consumer);
- consumer_destroy_output(obj->consumer);
+ consumer_output_put(obj->consumer);
}
free(obj);
}
snapshot_output_destroy(output);
}
rcu_read_unlock();
+ ht_cleanup_push(obj->output_ht);
}