Do not install usterr-signal-safe
[lttng-ust.git] / liblttng-ust-ctl / ustctl.c
index 3d510f6e0760f334db9635996e7754e8e3ca78e5..e285a2d24b7debc2159b760981c044e4663b7d24 100644 (file)
 #include <string.h>
 #include <lttng/ust-ctl.h>
 #include <lttng/ust-abi.h>
-#include <lttng/usterr-signal-safe.h>
-#include <lttng/ust-comm.h>
 #include <lttng/ust-events.h>
+#include <sys/mman.h>
+
+#include <usterr-signal-safe.h>
+#include <ust-comm.h>
 
 #include "../libringbuffer/backend.h"
 #include "../libringbuffer/frontend.h"
@@ -38,6 +40,10 @@ void init_object(struct lttng_ust_object_data *data)
        data->memory_map_size = 0;
 }
 
+/*
+ * If sock is negative, it means we don't have to notify the other side
+ * (e.g. application has already vanished).
+ */
 void ustctl_release_object(int sock, struct lttng_ust_object_data *data)
 {
        struct ustcomm_ust_msg lum;
@@ -48,11 +54,13 @@ void ustctl_release_object(int sock, struct lttng_ust_object_data *data)
                close(data->shm_fd);
        if (data->wait_fd >= 0)
                close(data->wait_fd);
-       memset(&lum, 0, sizeof(lum));
-       lum.handle = data->handle;
-       lum.cmd = LTTNG_UST_RELEASE;
-       ret = ustcomm_send_app_cmd(sock, &lum, &lur);
-       assert(!ret);
+       if (sock >= 0) {
+               memset(&lum, 0, sizeof(lum));
+               lum.handle = data->handle;
+               lum.cmd = LTTNG_UST_RELEASE;
+               ret = ustcomm_send_app_cmd(sock, &lum, &lur);
+               assert(!ret);
+       }
        free(data);
 }
 
@@ -369,10 +377,39 @@ int ustctl_stop_session(int sock, int handle)
        return ustctl_disable(sock, &obj);
 }
 
-
 int ustctl_tracepoint_list(int sock)
 {
-       return -ENOSYS; /* not implemented */
+       struct ustcomm_ust_msg lum;
+       struct ustcomm_ust_reply lur;
+       int ret, tp_list_handle;
+
+       memset(&lum, 0, sizeof(lum));
+       lum.handle = LTTNG_UST_ROOT_HANDLE;
+       lum.cmd = LTTNG_UST_TRACEPOINT_LIST;
+       ret = ustcomm_send_app_cmd(sock, &lum, &lur);
+       if (ret)
+               return ret;
+       tp_list_handle = lur.ret_val;
+       DBG("received tracepoint list handle %u", tp_list_handle);
+       return tp_list_handle;
+}
+
+int ustctl_tracepoint_list_get(int sock, int tp_list_handle,
+               char iter[LTTNG_UST_SYM_NAME_LEN])
+{
+       struct ustcomm_ust_msg lum;
+       struct ustcomm_ust_reply lur;
+       int ret;
+
+       memset(&lum, 0, sizeof(lum));
+       lum.handle = tp_list_handle;
+       lum.cmd = LTTNG_UST_TRACEPOINT_LIST_GET;
+       ret = ustcomm_send_app_cmd(sock, &lum, &lur);
+       if (ret)
+               return ret;
+       DBG("received tracepoint list entry %s", lur.u.tracepoint_list_entry);
+       memcpy(iter, lur.u.tracepoint_list_entry, LTTNG_UST_SYM_NAME_LEN);
+       return 0;
 }
 
 int ustctl_tracer_version(int sock, struct lttng_ust_tracer_version *v)
@@ -422,6 +459,7 @@ struct lttng_ust_shm_handle *ustctl_map_channel(struct lttng_ust_object_data *ch
        struct channel *chan;
        size_t chan_size;
        struct lttng_ust_lib_ring_buffer_config *config;
+       int ret;
 
        handle = channel_handle_create(chan_data->shm_fd,
                chan_data->wait_fd,
@@ -474,6 +512,15 @@ struct lttng_ust_shm_handle *ustctl_map_channel(struct lttng_ust_object_data *ch
                channel_destroy(chan, handle, 1);
                return NULL;
        }
+       /* Replace the object table pointer. */
+       ret = munmap(handle->table->objects[0].memory_map,
+               handle->table->objects[0].memory_map_size);
+       if (ret) {
+               perror("munmap");
+               assert(0);
+       }
+       handle->table->objects[0].memory_map = (char *) handle->shadow_chan;
+       handle->table->objects[0].is_shadow = 1;
        return handle;
 }
 
This page took 0.025586 seconds and 4 git commands to generate.