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=1d92facf05cf866ee757a0acc247b5f0225e8b0c;hb=953192ba6eb2118c22bcfcb4bcd813f141b407e7;hpb=1e46a50ff4c21c973767287bd6e79af04c81c283 diff --git a/src/lib/lttng-ctl/lttng-ctl.c b/src/lib/lttng-ctl/lttng-ctl.c index 1d92facf0..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,18 +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: - 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; } } } @@ -137,11 +149,8 @@ static int check_tracing_group(const char *grp_name) /* Get GID of group 'tracing' */ grp_tracing = getgrnam(grp_name); - if (grp_tracing == NULL) { - /* NULL means not found also. getgrnam(3) */ - if (errno != 0) { - perror("getgrnam"); - } + if (!grp_tracing) { + /* If grp_tracing is NULL, the group does not exist. */ goto end; } @@ -484,6 +493,8 @@ int lttng_add_context(struct lttng_handle *handle, return -1; } + memset(&lsm, 0, sizeof(lsm)); + lsm.cmd_type = LTTNG_ADD_CONTEXT; /* Copy channel name */ @@ -518,6 +529,8 @@ int lttng_enable_event(struct lttng_handle *handle, return -1; } + memset(&lsm, 0, sizeof(lsm)); + /* If no channel name, we put the default name */ if (channel_name == NULL) { copy_string(lsm.u.enable.channel_name, DEFAULT_CHANNEL_NAME, @@ -557,6 +570,8 @@ int lttng_disable_event(struct lttng_handle *handle, const char *name, return -1; } + memset(&lsm, 0, sizeof(lsm)); + if (channel_name) { copy_string(lsm.u.disable.channel_name, channel_name, sizeof(lsm.u.disable.channel_name)); @@ -596,6 +611,8 @@ int lttng_enable_channel(struct lttng_handle *handle, return -1; } + memset(&lsm, 0, sizeof(lsm)); + memcpy(&lsm.u.channel.chan, chan, sizeof(lsm.u.channel.chan)); lsm.cmd_type = LTTNG_ENABLE_CHANNEL; @@ -621,6 +638,8 @@ int lttng_disable_channel(struct lttng_handle *handle, const char *name) return -1; } + memset(&lsm, 0, sizeof(lsm)); + lsm.cmd_type = LTTNG_DISABLE_CHANNEL; copy_string(lsm.u.disable.channel_name, name, @@ -661,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). @@ -690,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. @@ -861,7 +940,7 @@ int lttng_calibrate(struct lttng_handle *handle, /* * Set default channel attributes. - * If either or both of the arguments are null, nothing happens. + * If either or both of the arguments are null, attr content is zeroe'd. */ void lttng_channel_set_default_attr(struct lttng_domain *domain, struct lttng_channel_attr *attr) @@ -871,6 +950,8 @@ void lttng_channel_set_default_attr(struct lttng_domain *domain, return; } + memset(attr, 0, sizeof(struct lttng_channel_attr)); + switch (domain->type) { case LTTNG_DOMAIN_KERNEL: attr->overwrite = DEFAULT_CHANNEL_OVERWRITE; @@ -896,8 +977,7 @@ void lttng_channel_set_default_attr(struct lttng_domain *domain, attr->output = DEFAULT_UST_CHANNEL_OUTPUT; break; default: - /* Default behavior */ - memset(attr, 0, sizeof(struct lttng_channel_attr)); + /* Default behavior: leave set to 0. */ break; } } @@ -933,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 */