X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Flib%2Flttng-ctl%2Flttng-ctl.c;h=a05a8049ec5dd7186fe83fa01ce83478a41f392f;hp=c5887fe65ead21a41f637aafa3adc10d60e0eb45;hb=953192ba6eb2118c22bcfcb4bcd813f141b407e7;hpb=e66c1d2c3e5dd979cab6afb4e5de525c60e18617 diff --git a/src/lib/lttng-ctl/lttng-ctl.c b/src/lib/lttng-ctl/lttng-ctl.c index c5887fe65..a05a8049e 100644 --- a/src/lib/lttng-ctl/lttng-ctl.c +++ b/src/lib/lttng-ctl/lttng-ctl.c @@ -5,19 +5,18 @@ * * Copyright (C) 2011 David Goulet * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; only - * version 2.1 of the License. + * This library is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License, version 2.1 only, + * as published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * You should have received a copy of the GNU Lesser General Public License + * along with this library; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #define _GNU_SOURCE @@ -41,6 +40,18 @@ static char sessiond_sock_path[PATH_MAX]; static char *tracing_group; static int connected; +/* Global */ + +/* + * Those two variables are used by error.h to silent or control the verbosity of + * error message. They are global to the library so application linking with it + * are able to compile correctly and also control verbosity of the library. + * + * Note that it is *not* possible to silent ERR() and PERROR() macros. + */ +int lttng_opt_quiet; +int lttng_opt_verbose; + /* * Copy string from src to dst and enforce null terminated byte. */ @@ -64,19 +75,19 @@ static void copy_lttng_domain(struct lttng_domain *dst, struct lttng_domain *src { if (src && dst) { switch (src->type) { - case LTTNG_DOMAIN_KERNEL: - case LTTNG_DOMAIN_UST: - /* - case LTTNG_DOMAIN_UST_EXEC_NAME: - case LTTNG_DOMAIN_UST_PID: - case LTTNG_DOMAIN_UST_PID_FOLLOW_CHILDREN: - */ - memcpy(dst, src, sizeof(struct lttng_domain)); - break; - default: - memset(dst, 0, sizeof(struct lttng_domain)); - dst->type = LTTNG_DOMAIN_KERNEL; - break; + case LTTNG_DOMAIN_KERNEL: + case LTTNG_DOMAIN_UST: + /* + case LTTNG_DOMAIN_UST_EXEC_NAME: + case LTTNG_DOMAIN_UST_PID: + case LTTNG_DOMAIN_UST_PID_FOLLOW_CHILDREN: + */ + memcpy(dst, src, sizeof(struct lttng_domain)); + break; + default: + memset(dst, 0, sizeof(struct lttng_domain)); + dst->type = LTTNG_DOMAIN_KERNEL; + break; } } } @@ -669,6 +680,33 @@ int lttng_list_tracepoints(struct lttng_handle *handle, return ret / sizeof(struct lttng_event); } +/* + * Lists all available tracepoint fields of domain. + * Sets the contents of the event field array. + * Returns the number of lttng_event_field entries in events; + * on error, returns a negative value. + */ +int lttng_list_tracepoint_fields(struct lttng_handle *handle, + struct lttng_event_field **fields) +{ + int ret; + struct lttcomm_session_msg lsm; + + if (handle == NULL) { + return -1; + } + + lsm.cmd_type = LTTNG_LIST_TRACEPOINT_FIELDS; + copy_lttng_domain(&lsm.domain, &handle->domain); + + ret = ask_sessiond(&lsm, (void **) fields); + if (ret < 0) { + return ret; + } + + return ret / sizeof(struct lttng_event_field); +} + /* * Returns a human readable string describing * the error code (a negative value). @@ -698,6 +736,39 @@ int lttng_create_session(const char *name, const char *path) return ask_sessiond(&lsm, NULL); } +/* + * Create a new tracing session using a name, URIs and a consumer enable flag. + */ +int lttng_create_session_uri(const char *name, struct lttng_uri *ctrl_uri, + struct lttng_uri *data_uri, unsigned int enable_consumer) +{ + struct lttcomm_session_msg lsm; + + /* Name and ctrl_uri are mandatory */ + if (name == NULL || ctrl_uri == NULL) { + return -1; + } + + lsm.cmd_type = LTTNG_CREATE_SESSION_URI; + + copy_string(lsm.session.name, name, sizeof(lsm.session.name)); + /* Anything bigger than zero, the consumer(s) will be enabled */ + lsm.u.create_uri.enable_consumer = enable_consumer; + memcpy(&lsm.u.create_uri.ctrl_uri, ctrl_uri, + sizeof(lsm.u.create_uri.ctrl_uri)); + if (data_uri) { + /* + * The only possible scenario where data_uri is NULL is for a local + * consumer where the output is at a specified path name on the + * filesystem. + */ + memcpy(&lsm.u.create_uri.data_uri, data_uri, + sizeof(lsm.u.create_uri.data_uri)); + } + + return ask_sessiond(&lsm, NULL); +} + /* * Destroy session using name. * Returns size of returned session payload data or a negative error code. @@ -874,13 +945,13 @@ int lttng_calibrate(struct lttng_handle *handle, void lttng_channel_set_default_attr(struct lttng_domain *domain, struct lttng_channel_attr *attr) { - memset(attr, 0, sizeof(struct lttng_channel_attr)); - /* Safety check */ if (attr == NULL || domain == NULL) { return; } + memset(attr, 0, sizeof(struct lttng_channel_attr)); + switch (domain->type) { case LTTNG_DOMAIN_KERNEL: attr->overwrite = DEFAULT_CHANNEL_OVERWRITE; @@ -942,6 +1013,74 @@ int lttng_session_daemon_alive(void) return 1; } +/* + * Set URI for a consumer for a session and domain. + * + * Return 0 on success, else a negative value. + */ +int lttng_set_consumer_uri(struct lttng_handle *handle, struct lttng_uri *uri) +{ + struct lttcomm_session_msg lsm; + + if (handle == NULL || uri == NULL) { + return -1; + } + + lsm.cmd_type = LTTNG_SET_CONSUMER_URI; + + copy_string(lsm.session.name, handle->session_name, + sizeof(lsm.session.name)); + copy_lttng_domain(&lsm.domain, &handle->domain); + + memcpy(&lsm.u.uri, uri, sizeof(lsm.u.uri)); + + return ask_sessiond(&lsm, NULL); +} + +/* + * Enable consumer for a session and domain. + * + * Return 0 on success, else a negative value. + */ +int lttng_enable_consumer(struct lttng_handle *handle) +{ + struct lttcomm_session_msg lsm; + + if (handle == NULL) { + return -1; + } + + lsm.cmd_type = LTTNG_ENABLE_CONSUMER; + + copy_string(lsm.session.name, handle->session_name, + sizeof(lsm.session.name)); + copy_lttng_domain(&lsm.domain, &handle->domain); + + return ask_sessiond(&lsm, NULL); +} + +/* + * Disable consumer for a session and domain. + * + * Return 0 on success, else a negative value. + */ +int lttng_disable_consumer(struct lttng_handle *handle) +{ + struct lttcomm_session_msg lsm; + + if (handle == NULL) { + return -1; + } + + lsm.cmd_type = LTTNG_DISABLE_CONSUMER; + + copy_string(lsm.session.name, handle->session_name, + sizeof(lsm.session.name)); + copy_lttng_domain(&lsm.domain, &handle->domain); + + return ask_sessiond(&lsm, NULL); +} + /* * lib constructor */