X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;f=liblttng-ust-ctl%2Fustctl.c;h=d078af5cf2d1115b3ea4aa6f6cc6740b94732fe1;hb=064220d4dfca7c4dee6c839702ab57aa60336937;hp=5a025f2a682fd3b1c89a7b9bdf4cd69d5de28496;hpb=9bfc503d5a3e2b1a75fa00a32b5d9bd7ac4f4dc3;p=lttng-ust.git diff --git a/liblttng-ust-ctl/ustctl.c b/liblttng-ust-ctl/ustctl.c index 5a025f2a..d078af5c 100644 --- a/liblttng-ust-ctl/ustctl.c +++ b/liblttng-ust-ctl/ustctl.c @@ -2,19 +2,18 @@ * Copyright (C) 2011 - Julien Desfossez * Mathieu Desnoyers * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; only version 2 - * of the License. + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License only. * * This program 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 General Public License for more details. * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #define _GNU_SOURCE @@ -391,6 +390,40 @@ int ustctl_add_context(int sock, struct lttng_ust_context *ctx, return ret; } +int ustctl_set_filter(int sock, struct lttng_ust_filter_bytecode *bytecode, + struct lttng_ust_object_data *obj_data) +{ + struct ustcomm_ust_msg lum; + struct ustcomm_ust_reply lur; + int ret; + + if (!obj_data) + return -EINVAL; + + memset(&lum, 0, sizeof(lum)); + lum.handle = obj_data->handle; + lum.cmd = LTTNG_UST_FILTER; + lum.u.filter.data_size = bytecode->len; + lum.u.filter.reloc_offset = bytecode->reloc_offset; + + ret = ustcomm_send_app_msg(sock, &lum); + if (ret) + return ret; + if (ret) { + return ret; + } + /* send var len bytecode */ + ret = ustcomm_send_unix_sock(sock, bytecode->data, + bytecode->len); + if (ret < 0) { + return ret; + } + ret = ustcomm_recv_app_reply(sock, &lur, lum.handle, lum.cmd); + if (ret) + return ret; + return ret; +} + /* Enable event, channel and session ioctl */ int ustctl_enable(int sock, struct lttng_ust_object_data *object) { @@ -487,6 +520,56 @@ int ustctl_tracepoint_list_get(int sock, int tp_list_handle, return 0; } +int ustctl_tracepoint_field_list(int sock) +{ + struct ustcomm_ust_msg lum; + struct ustcomm_ust_reply lur; + int ret, tp_field_list_handle; + + memset(&lum, 0, sizeof(lum)); + lum.handle = LTTNG_UST_ROOT_HANDLE; + lum.cmd = LTTNG_UST_TRACEPOINT_FIELD_LIST; + ret = ustcomm_send_app_cmd(sock, &lum, &lur); + if (ret) + return ret; + tp_field_list_handle = lur.ret_val; + DBG("received tracepoint field list handle %u", tp_field_list_handle); + return tp_field_list_handle; +} + +int ustctl_tracepoint_field_list_get(int sock, int tp_field_list_handle, + struct lttng_ust_field_iter *iter) +{ + struct ustcomm_ust_msg lum; + struct ustcomm_ust_reply lur; + int ret; + ssize_t len; + + if (!iter) + return -EINVAL; + + memset(&lum, 0, sizeof(lum)); + lum.handle = tp_field_list_handle; + lum.cmd = LTTNG_UST_TRACEPOINT_FIELD_LIST_GET; + ret = ustcomm_send_app_cmd(sock, &lum, &lur); + if (ret) + return ret; + if (lur.ret_code != USTCOMM_OK) { + DBG("Return code: %s", ustcomm_get_readable_code(lur.ret_code)); + return -EINVAL; + } + len = ustcomm_recv_unix_sock(sock, iter, sizeof(*iter)); + if (len != sizeof(*iter)) { + return -EINVAL; + } + DBG("received tracepoint field list entry event_name %s event_loglevel %d field_name %s field_type %d", + iter->event_name, + iter->loglevel, + iter->field_name, + iter->type); + return 0; +} + int ustctl_tracer_version(int sock, struct lttng_ust_tracer_version *v) { struct ustcomm_ust_msg lum; @@ -683,7 +766,7 @@ void ustctl_unmap_channel(struct lttng_ust_shm_handle *handle) struct lttng_ust_lib_ring_buffer *ustctl_open_stream_read(struct lttng_ust_shm_handle *handle, int cpu) { - struct channel *chan = handle->shadow_chan; + struct channel *chan; int *shm_fd, *wait_fd; uint64_t *memory_map_size; struct lttng_ust_lib_ring_buffer *buf; @@ -692,6 +775,7 @@ struct lttng_ust_lib_ring_buffer *ustctl_open_stream_read(struct lttng_ust_shm_h if (!handle) return NULL; + chan = handle->shadow_chan; buf = channel_get_ring_buffer(&chan->backend.config, chan, cpu, handle, &shm_fd, &wait_fd, &memory_map_size); if (!buf) @@ -735,11 +819,12 @@ int ustctl_get_mmap_len(struct lttng_ust_shm_handle *handle, unsigned long *len) { unsigned long mmap_buf_len; - struct channel *chan = handle->shadow_chan; + struct channel *chan; if (!handle || !buf || !len) return -EINVAL; + chan = handle->shadow_chan; if (chan->backend.config.output != RING_BUFFER_MMAP) return -EINVAL; mmap_buf_len = chan->backend.buf_size; @@ -756,11 +841,12 @@ int ustctl_get_max_subbuf_size(struct lttng_ust_shm_handle *handle, struct lttng_ust_lib_ring_buffer *buf, unsigned long *len) { - struct channel *chan = handle->shadow_chan; + struct channel *chan; if (!handle || !buf || !len) return -EINVAL; + chan = handle->shadow_chan; *len = chan->backend.subbuf_size; return 0; } @@ -774,12 +860,13 @@ int ustctl_get_max_subbuf_size(struct lttng_ust_shm_handle *handle, int ustctl_get_mmap_read_offset(struct lttng_ust_shm_handle *handle, struct lttng_ust_lib_ring_buffer *buf, unsigned long *off) { - struct channel *chan = handle->shadow_chan; + struct channel *chan; unsigned long sb_bindex; if (!handle || !buf || !off) return -EINVAL; + chan = handle->shadow_chan; if (chan->backend.config.output != RING_BUFFER_MMAP) return -EINVAL; sb_bindex = subbuffer_id_get_index(&chan->backend.config, @@ -792,11 +879,12 @@ int ustctl_get_mmap_read_offset(struct lttng_ust_shm_handle *handle, int ustctl_get_subbuf_size(struct lttng_ust_shm_handle *handle, struct lttng_ust_lib_ring_buffer *buf, unsigned long *len) { - struct channel *chan = handle->shadow_chan; + struct channel *chan; if (!handle || !buf || !len) return -EINVAL; + chan = handle->shadow_chan; *len = lib_ring_buffer_get_read_data_size(&chan->backend.config, buf, handle); return 0; @@ -806,11 +894,12 @@ int ustctl_get_subbuf_size(struct lttng_ust_shm_handle *handle, int ustctl_get_padded_subbuf_size(struct lttng_ust_shm_handle *handle, struct lttng_ust_lib_ring_buffer *buf, unsigned long *len) { - struct channel *chan = handle->shadow_chan; + struct channel *chan; if (!handle || !buf || !len) return -EINVAL; + chan = handle->shadow_chan; *len = lib_ring_buffer_get_read_data_size(&chan->backend.config, buf, handle); *len = PAGE_ALIGN(*len);