ust: add info exchange between app and ustd
[ust.git] / libtracectl / tracectl.c
index d041e6bb0ce3caef7ac72bea86fe677c8349df60..176ee6a92bace99333becc45c65d6a117eabc3ad 100644 (file)
@@ -12,7 +12,7 @@
 #include "localerr.h"
 #include "ustcomm.h"
 
-#define USE_CLONE
+//#define USE_CLONE
 
 #define UNIX_PATH_MAX 108
 
@@ -244,8 +244,9 @@ int listener_main(void *p)
                char trace_type[] = "ustrelay";
                char *recvbuf;
                int len;
+               struct ustcomm_source src;
 
-               result = ustcomm_app_recv_message(&ustcomm_app, &recvbuf);
+               result = ustcomm_app_recv_message(&ustcomm_app, &recvbuf, &src);
                DBG("HERE");
                if(result) {
                        WARN("error in ustcomm_app_recv_message");
@@ -313,13 +314,20 @@ int listener_main(void *p)
                                return;
                        }
                }
-               else if(!strncmp(recvbuf, "get_shmid ", 10)) {
+               else if(nth_token_is(recvbuf, "get_shmid", 0) == 1) {
                        struct ltt_trace_struct *trace;
                        char trace_name[] = "auto";
                        int i;
+                       char *channel_name;
 
                        DBG("get_shmid");
 
+                       channel_name = nth_token(recvbuf, 1);
+                       if(channel_name == NULL) {
+                               ERR("get_shmid: cannot parse channel");
+                               goto next_cmd;
+                       }
+
                        ltt_lock_traces();
                        trace = _ltt_trace_find(trace_name);
                        ltt_unlock_traces();
@@ -333,11 +341,121 @@ int listener_main(void *p)
                                struct rchan *rchan = trace->channels[i].trans_channel_data;
                                struct rchan_buf *rbuf = rchan->buf;
 
-                               DBG("the shmid is %d", rbuf->shmid);
+                               if(!strcmp(trace->channels[i].channel_name, channel_name)) {
+                                       char *reply;
+
+                                       DBG("the shmid for the requested channel is %d", rbuf->shmid);
+                                       asprintf(&reply, "%d", rbuf->shmid);
+
+                                       result = ustcomm_send_reply(&ustcomm_app.server, reply, &src);
+                                       if(result) {
+                                               ERR("listener: get_shmid: ustcomm_send_reply failed");
+                                               goto next_cmd;
+                                       }
+
+                                       free(reply);
+
+                                       break;
+                               }
+                       }
+               }
+               else if(nth_token_is(recvbuf, "get_n_subbufs", 0) == 1) {
+                       struct ltt_trace_struct *trace;
+                       char trace_name[] = "auto";
+                       int i;
+                       char *channel_name;
+
+                       DBG("get_n_subbufs");
+
+                       channel_name = nth_token(recvbuf, 1);
+                       if(channel_name == NULL) {
+                               ERR("get_n_subbufs: cannot parse channel");
+                               goto next_cmd;
+                       }
+
+                       ltt_lock_traces();
+                       trace = _ltt_trace_find(trace_name);
+                       ltt_unlock_traces();
+
+                       if(trace == NULL) {
+                               CPRINTF("cannot find trace!");
+                               return 1;
+                       }
+
+                       for(i=0; i<trace->nr_channels; i++) {
+                               struct rchan *rchan = trace->channels[i].trans_channel_data;
+
+                               if(!strcmp(trace->channels[i].channel_name, channel_name)) {
+                                       char *reply;
+
+                                       DBG("the n_subbufs for the requested channel is %d", rchan->n_subbufs);
+                                       asprintf(&reply, "%d", rchan->n_subbufs);
+
+                                       result = ustcomm_send_reply(&ustcomm_app.server, reply, &src);
+                                       if(result) {
+                                               ERR("listener: get_n_subbufs: ustcomm_send_reply failed");
+                                               goto next_cmd;
+                                       }
 
+                                       free(reply);
+
+                                       break;
+                               }
+                       }
+               }
+               else if(nth_token_is(recvbuf, "get_subbuf_size", 0) == 1) {
+                       struct ltt_trace_struct *trace;
+                       char trace_name[] = "auto";
+                       int i;
+                       char *channel_name;
+
+                       DBG("get_subbuf_size");
+
+                       channel_name = nth_token(recvbuf, 1);
+                       if(channel_name == NULL) {
+                               ERR("get_subbuf_size: cannot parse channel");
+                               goto next_cmd;
                        }
+
+                       ltt_lock_traces();
+                       trace = _ltt_trace_find(trace_name);
+                       ltt_unlock_traces();
+
+                       if(trace == NULL) {
+                               CPRINTF("cannot find trace!");
+                               return 1;
+                       }
+
+                       for(i=0; i<trace->nr_channels; i++) {
+                               struct rchan *rchan = trace->channels[i].trans_channel_data;
+
+                               if(!strcmp(trace->channels[i].channel_name, channel_name)) {
+                                       char *reply;
+
+                                       DBG("the subbuf_size for the requested channel is %d", rchan->subbuf_size);
+                                       asprintf(&reply, "%d", rchan->subbuf_size);
+
+                                       result = ustcomm_send_reply(&ustcomm_app.server, reply, &src);
+                                       if(result) {
+                                               ERR("listener: get_subbuf_size: ustcomm_send_reply failed");
+                                               goto next_cmd;
+                                       }
+
+                                       free(reply);
+
+                                       break;
+                               }
+                       }
+               }
+               else if(nth_token_is(recvbuf, "load_probe_lib", 0) == 1) {
+                       char *libfile;
+
+                       libfile = nth_token(recvbuf, 1);
+
+                       DBG("load_probe_lib loading %s", libfile);
                }
 
+       next_cmd:
                free(recvbuf);
        }
 }
This page took 0.024859 seconds and 4 git commands to generate.