use signal safe ust_safe_snprintf()
[ust.git] / libust / tracectl.c
index 9a996d3449b8e87cb934dbcb3cdf286735144bbf..e84d28904d0db3286a68c8e92db88f4312eb767e 100644 (file)
@@ -34,7 +34,7 @@
 #include "tracer.h"
 #include "usterr.h"
 #include "ustcomm.h"
-#include "buffers.h" /* FIXME: remove */
+#include "buffers.h"
 #include "marker-control.h"
 
 //#define USE_CLONE
@@ -88,7 +88,7 @@ struct blocked_consumer {
        struct ustcomm_server server;
        struct ustcomm_source src;
 
-       /* args to ust_buffers_do_get_subbuf */
+       /* args to ust_buffers_get_subbuf */
        struct ust_buffer *buf;
 
        struct list_head list;
@@ -166,7 +166,7 @@ void notif_cb(void)
 static void inform_consumer_daemon(const char *trace_name)
 {
        int i,j;
-       struct ltt_trace_struct *trace;
+       struct ust_trace *trace;
        pid_t pid = getpid();
        int result;
 
@@ -256,13 +256,13 @@ void process_blocked_consumers(void)
                                continue;
                        }
 
-                       result = ust_buffers_do_get_subbuf(bc->buf, &consumed_old);
+                       result = ust_buffers_get_subbuf(bc->buf, &consumed_old);
                        if(result == -EAGAIN) {
                                WARN("missed buffer?");
                                continue;
                        }
                        else if(result < 0) {
-                               DBG("ust_buffers_do_get_subbuf: error: %s", strerror(-result));
+                               DBG("ust_buffers_get_subbuf: error: %s", strerror(-result));
                        }
                        asprintf(&reply, "%s %ld", "OK", consumed_old);
                        result = ustcomm_send_reply(&bc->server, reply, &bc->src);
@@ -298,7 +298,7 @@ void seperate_channel_cpu(const char *channel_and_cpu, char **channel, int *cpu)
 static int do_cmd_get_shmid(const char *recvbuf, struct ustcomm_source *src)
 {
        int retval = 0;
-       struct ltt_trace_struct *trace;
+       struct ust_trace *trace;
        char trace_name[] = "auto";
        int i;
        char *channel_and_cpu;
@@ -311,13 +311,13 @@ static int do_cmd_get_shmid(const char *recvbuf, struct ustcomm_source *src)
 
        channel_and_cpu = nth_token(recvbuf, 1);
        if(channel_and_cpu == NULL) {
-               ERR("get_shmid: cannot parse channel");
+               ERR("cannot parse channel");
                goto end;
        }
 
        seperate_channel_cpu(channel_and_cpu, &ch_name, &ch_cpu);
        if(ch_cpu == -1) {
-               ERR("Problem parsing channel name");
+               ERR("problem parsing channel name");
                goto free_short_chan_name;
        }
 
@@ -344,7 +344,7 @@ static int do_cmd_get_shmid(const char *recvbuf, struct ustcomm_source *src)
 
                        result = ustcomm_send_reply(&ustcomm_app.server, reply, src);
                        if(result) {
-                               ERR("listener: get_shmid: ustcomm_send_reply failed");
+                               ERR("ustcomm_send_reply failed");
                                free(reply);
                                retval = -1;
                                goto free_short_chan_name;
@@ -361,7 +361,7 @@ static int do_cmd_get_shmid(const char *recvbuf, struct ustcomm_source *src)
                buffers_to_export--;
        }
        else {
-               ERR("get_shmid: channel not found (%s)", channel_and_cpu);
+               ERR("channel not found (%s)", channel_and_cpu);
        }
 
        free_short_chan_name:
@@ -374,7 +374,7 @@ static int do_cmd_get_shmid(const char *recvbuf, struct ustcomm_source *src)
 static int do_cmd_get_n_subbufs(const char *recvbuf, struct ustcomm_source *src)
 {
        int retval = 0;
-       struct ltt_trace_struct *trace;
+       struct ust_trace *trace;
        char trace_name[] = "auto";
        int i;
        char *channel_and_cpu;
@@ -387,13 +387,13 @@ static int do_cmd_get_n_subbufs(const char *recvbuf, struct ustcomm_source *src)
 
        channel_and_cpu = nth_token(recvbuf, 1);
        if(channel_and_cpu == NULL) {
-               ERR("get_n_subbufs: cannot parse channel");
+               ERR("cannot parse channel");
                goto end;
        }
 
        seperate_channel_cpu(channel_and_cpu, &ch_name, &ch_cpu);
        if(ch_cpu == -1) {
-               ERR("Problem parsing channel name");
+               ERR("problem parsing channel name");
                goto free_short_chan_name;
        }
 
@@ -418,7 +418,7 @@ static int do_cmd_get_n_subbufs(const char *recvbuf, struct ustcomm_source *src)
 
                        result = ustcomm_send_reply(&ustcomm_app.server, reply, src);
                        if(result) {
-                               ERR("listener: get_n_subbufs: ustcomm_send_reply failed");
+                               ERR("ustcomm_send_reply failed");
                                free(reply);
                                retval = -1;
                                goto free_short_chan_name;
@@ -430,7 +430,7 @@ static int do_cmd_get_n_subbufs(const char *recvbuf, struct ustcomm_source *src)
                }
        }
        if(found == 0) {
-               ERR("get_n_subbufs: unable to find channel");
+               ERR("unable to find channel");
        }
 
        free_short_chan_name:
@@ -443,7 +443,7 @@ static int do_cmd_get_n_subbufs(const char *recvbuf, struct ustcomm_source *src)
 static int do_cmd_get_subbuf_size(const char *recvbuf, struct ustcomm_source *src)
 {
        int retval = 0;
-       struct ltt_trace_struct *trace;
+       struct ust_trace *trace;
        char trace_name[] = "auto";
        int i;
        char *channel_and_cpu;
@@ -456,13 +456,13 @@ static int do_cmd_get_subbuf_size(const char *recvbuf, struct ustcomm_source *sr
 
        channel_and_cpu = nth_token(recvbuf, 1);
        if(channel_and_cpu == NULL) {
-               ERR("get_subbuf_size: cannot parse channel");
+               ERR("cannot parse channel");
                goto end;
        }
 
        seperate_channel_cpu(channel_and_cpu, &ch_name, &ch_cpu);
        if(ch_cpu == -1) {
-               ERR("Problem parsing channel name");
+               ERR("problem parsing channel name");
                goto free_short_chan_name;
        }
 
@@ -487,7 +487,7 @@ static int do_cmd_get_subbuf_size(const char *recvbuf, struct ustcomm_source *sr
 
                        result = ustcomm_send_reply(&ustcomm_app.server, reply, src);
                        if(result) {
-                               ERR("listener: get_subbuf_size: ustcomm_send_reply failed");
+                               ERR("ustcomm_send_reply failed");
                                free(reply);
                                retval = -1;
                                goto free_short_chan_name;
@@ -499,7 +499,7 @@ static int do_cmd_get_subbuf_size(const char *recvbuf, struct ustcomm_source *sr
                }
        }
        if(found == 0) {
-               ERR("get_subbuf_size: unable to find channel");
+               ERR("unable to find channel");
        }
 
        free_short_chan_name:
@@ -512,7 +512,7 @@ static int do_cmd_get_subbuf_size(const char *recvbuf, struct ustcomm_source *sr
 static int do_cmd_get_subbuffer(const char *recvbuf, struct ustcomm_source *src)
 {
        int retval = 0;
-       struct ltt_trace_struct *trace;
+       struct ust_trace *trace;
        char trace_name[] = "auto";
        int i;
        char *channel_and_cpu;
@@ -524,13 +524,13 @@ static int do_cmd_get_subbuffer(const char *recvbuf, struct ustcomm_source *src)
 
        channel_and_cpu = nth_token(recvbuf, 1);
        if(channel_and_cpu == NULL) {
-               ERR("get_subbuf: cannot parse channel");
+               ERR("cannot parse channel");
                goto end;
        }
 
        seperate_channel_cpu(channel_and_cpu, &ch_name, &ch_cpu);
        if(ch_cpu == -1) {
-               ERR("Problem parsing channel name");
+               ERR("problem parsing channel name");
                goto free_short_chan_name;
        }
 
@@ -539,8 +539,20 @@ static int do_cmd_get_subbuffer(const char *recvbuf, struct ustcomm_source *src)
        ltt_unlock_traces();
 
        if(trace == NULL) {
-               ERR("cannot find trace!");
-               retval = -1;
+               char *reply;
+               int result;
+
+               WARN("Cannot find trace. It was likely destroyed by the user.");
+               asprintf(&reply, "%s", "NOTFOUND");
+               result = ustcomm_send_reply(&ustcomm_app.server, reply, src);
+               if(result) {
+                       ERR("ustcomm_send_reply failed");
+                       free(reply);
+                       retval = -1;
+                       goto free_short_chan_name;
+               }
+
+               free(reply);
                goto free_short_chan_name;
        }
 
@@ -570,7 +582,7 @@ static int do_cmd_get_subbuffer(const char *recvbuf, struct ustcomm_source *src)
                }
        }
        if(found == 0) {
-               ERR("get_subbuf: unable to find channel");
+               ERR("unable to find channel");
        }
 
        free_short_chan_name:
@@ -583,7 +595,7 @@ static int do_cmd_get_subbuffer(const char *recvbuf, struct ustcomm_source *src)
 static int do_cmd_put_subbuffer(const char *recvbuf, struct ustcomm_source *src)
 {
        int retval = 0;
-       struct ltt_trace_struct *trace;
+       struct ust_trace *trace;
        char trace_name[] = "auto";
        int i;
        char *channel_and_cpu;
@@ -594,32 +606,33 @@ static int do_cmd_put_subbuffer(const char *recvbuf, struct ustcomm_source *src)
        long consumed_old;
        char *consumed_old_str;
        char *endptr;
+       char *reply = NULL;
 
        DBG("put_subbuf");
 
        channel_and_cpu = strdup_malloc(nth_token(recvbuf, 1));
        if(channel_and_cpu == NULL) {
-               ERR("put_subbuf_size: cannot parse channel");
+               ERR("cannot parse channel");
                retval = -1;
                goto end;
        }
 
        consumed_old_str = strdup_malloc(nth_token(recvbuf, 2));
        if(consumed_old_str == NULL) {
-               ERR("put_subbuf: cannot parse consumed_old");
+               ERR("cannot parse consumed_old");
                retval = -1;
                goto free_channel_and_cpu;
        }
        consumed_old = strtol(consumed_old_str, &endptr, 10);
        if(*endptr != '\0') {
-               ERR("put_subbuf: invalid value for consumed_old");
+               ERR("invalid value for consumed_old");
                retval = -1;
                goto free_consumed_old_str;
        }
 
        seperate_channel_cpu(channel_and_cpu, &ch_name, &ch_cpu);
        if(ch_cpu == -1) {
-               ERR("Problem parsing channel name");
+               ERR("problem parsing channel name");
                retval = -1;
                goto free_short_chan_name;
        }
@@ -629,8 +642,17 @@ static int do_cmd_put_subbuffer(const char *recvbuf, struct ustcomm_source *src)
        ltt_unlock_traces();
 
        if(trace == NULL) {
-               ERR("cannot find trace!");
-               retval = -1;
+               WARN("Cannot find trace. It was likely destroyed by the user.");
+               asprintf(&reply, "%s", "NOTFOUND");
+               result = ustcomm_send_reply(&ustcomm_app.server, reply, src);
+               if(result) {
+                       ERR("ustcomm_send_reply failed");
+                       free(reply);
+                       retval = -1;
+                       goto free_short_chan_name;
+               }
+
+               free(reply);
                goto free_short_chan_name;
        }
 
@@ -639,24 +661,22 @@ static int do_cmd_put_subbuffer(const char *recvbuf, struct ustcomm_source *src)
 
                if(!strcmp(trace->channels[i].channel_name, ch_name)) {
                        struct ust_buffer *buf = channel->buf[ch_cpu];
-                       char *reply;
-                       long consumed_old=0;
 
                        found = 1;
 
-                       result = ust_buffers_do_put_subbuf(buf, consumed_old);
+                       result = ust_buffers_put_subbuf(buf, consumed_old);
                        if(result < 0) {
-                               WARN("ust_buffers_do_put_subbuf: error (subbuf=%s)", channel_and_cpu);
+                               WARN("ust_buffers_put_subbuf: error (subbuf=%s)", channel_and_cpu);
                                asprintf(&reply, "%s", "ERROR");
                        }
                        else {
-                               DBG("ust_buffers_do_put_subbuf: success (subbuf=%s)", channel_and_cpu);
+                               DBG("ust_buffers_put_subbuf: success (subbuf=%s)", channel_and_cpu);
                                asprintf(&reply, "%s", "OK");
                        }
 
                        result = ustcomm_send_reply(&ustcomm_app.server, reply, src);
                        if(result) {
-                               ERR("listener: put_subbuf: ustcomm_send_reply failed");
+                               ERR("ustcomm_send_reply failed");
                                free(reply);
                                retval = -1;
                                goto free_channel_and_cpu;
@@ -667,15 +687,15 @@ static int do_cmd_put_subbuffer(const char *recvbuf, struct ustcomm_source *src)
                }
        }
        if(found == 0) {
-               ERR("get_subbuf_size: unable to find channel");
+               ERR("unable to find channel");
        }
 
-       free_channel_and_cpu:
-       free(channel_and_cpu);
-       free_consumed_old_str:
-       free(consumed_old_str);
        free_short_chan_name:
        free(ch_name);
+       free_consumed_old_str:
+       free(consumed_old_str);
+       free_channel_and_cpu:
+       free(channel_and_cpu);
 
        end:
        return retval;
@@ -900,7 +920,7 @@ void *listener_main(void *p)
                        free(reply);
                }
 //             else if(nth_token_is(recvbuf, "get_notifications", 0) == 1) {
-//                     struct ltt_trace_struct *trace;
+//                     struct ust_trace *trace;
 //                     char trace_name[] = "auto";
 //                     int i;
 //                     char *channel_name;
@@ -1041,7 +1061,7 @@ static void __attribute__((constructor)) init()
        pidunique = make_pidunique();
 
        /* Initialize RCU in case the constructor order is not good. */
-       urcu_init();
+       rcu_init();
 
        /* It is important to do this before events start to be generated. */
        ust_register_thread();
@@ -1114,12 +1134,14 @@ static void __attribute__((constructor)) init()
                /* Ensure marker control is initialized */
                init_marker_control();
 
-               /* Ensure relay is initialized */
-               init_ustrelay_transport();
-
                /* Ensure markers are initialized */
                init_markers();
 
+               /* Ensure buffers are initialized, for the transport to be available.
+                * We are about to set a trace type and it will fail without this.
+                */
+               init_ustrelay_transport();
+
                /* FIXME: When starting early tracing (here), depending on the
                 * order of constructors, it is very well possible some marker
                 * sections are not yet registered. Because of this, some
@@ -1209,7 +1231,7 @@ static void destroy_traces(void)
 static int trace_recording(void)
 {
        int retval = 0;
-       struct ltt_trace_struct *trace;
+       struct ust_trace *trace;
 
        ltt_lock_traces();
 
This page took 0.029304 seconds and 4 git commands to generate.