+ DBG("LISTENER");
+
+ for(;;) {
+ uint32_t size;
+ struct sockaddr_un addr;
+ socklen_t addrlen = sizeof(addr);
+ char trace_name[] = "auto";
+ char trace_type[] = "ustrelay";
+ char *recvbuf;
+ int len;
+ struct ustcomm_source src;
+
+ result = ustcomm_app_recv_message(&ustcomm_app, &recvbuf, &src, -1);
+ if(result <= 0) {
+ WARN("error in ustcomm_app_recv_message");
+ continue;
+ }
+
+ DBG("received a message! it's: %s\n", recvbuf);
+ len = strlen(recvbuf);
+
+ if(!strcmp(recvbuf, "print_markers")) {
+ print_markers();
+ }
+ else if(!strcmp(recvbuf, "trace_setup")) {
+ DBG("trace setup");
+
+ result = ltt_trace_setup(trace_name);
+ if(result < 0) {
+ ERR("ltt_trace_setup failed");
+ return;
+ }
+
+ result = ltt_trace_set_type(trace_name, trace_type);
+ if(result < 0) {
+ ERR("ltt_trace_set_type failed");
+ return;
+ }
+ }
+ else if(!strcmp(recvbuf, "trace_alloc")) {
+ DBG("trace alloc");
+
+ result = ltt_trace_alloc(trace_name);
+ if(result < 0) {
+ ERR("ltt_trace_alloc failed");
+ return;
+ }
+ }
+ else if(!strcmp(recvbuf, "trace_start")) {
+ DBG("trace start");
+
+ result = ltt_trace_start(trace_name);
+ if(result < 0) {
+ ERR("ltt_trace_start failed");
+ continue;
+ }
+ }
+ else if(!strcmp(recvbuf, "trace_stop")) {
+ DBG("trace stop");
+
+ result = ltt_trace_stop(trace_name);
+ if(result < 0) {
+ ERR("ltt_trace_stop failed");
+ return;
+ }
+ }
+ else if(!strcmp(recvbuf, "trace_destroy")) {
+
+ DBG("trace destroy");
+
+ result = ltt_trace_destroy(trace_name);
+ if(result < 0) {
+ ERR("ltt_trace_destroy failed");
+ return;
+ }
+ }
+ 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();
+
+ 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;
+ struct rchan_buf *rbuf = rchan->buf;
+
+ 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);
+ }
+ else if(nth_token_is(recvbuf, "get_subbuffer", 0) == 1) {
+ struct ltt_trace_struct *trace;
+ char trace_name[] = "auto";
+ int i;
+ char *channel_name;
+
+ DBG("get_subbuf");
+
+ channel_name = nth_token(recvbuf, 1);
+ if(channel_name == NULL) {
+ ERR("get_subbuf: 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)) {
+ struct rchan_buf *rbuf = rchan->buf;
+ struct ltt_channel_buf_struct *lttbuf = trace->channels[i].buf;
+ char *reply;
+ long consumed_old=0;
+
+ result = ltt_do_get_subbuf(rbuf, lttbuf, &consumed_old);
+ if(result < 0) {
+ DBG("ltt_do_get_subbuf: error: %s", strerror(-result));
+ asprintf(&reply, "%s %ld", "UNAVAIL", 0);
+ }
+ else {
+ DBG("ltt_do_get_subbuf: success");
+ asprintf(&reply, "%s %ld", "OK", consumed_old);
+ }
+
+ result = ustcomm_send_reply(&ustcomm_app.server, reply, &src);
+ if(result) {
+ ERR("listener: get_subbuf: ustcomm_send_reply failed");
+ goto next_cmd;
+ }
+
+ free(reply);
+
+ break;
+ }
+ }
+ }
+ else if(nth_token_is(recvbuf, "put_subbuffer", 0) == 1) {
+ struct ltt_trace_struct *trace;
+ char trace_name[] = "auto";
+ int i;
+ char *channel_name;
+ long consumed_old;
+ char *consumed_old_str;
+ char *endptr;
+
+ DBG("put_subbuf");
+
+ channel_name = strdup_malloc(nth_token(recvbuf, 1));
+ if(channel_name == NULL) {
+ ERR("put_subbuf_size: cannot parse channel");
+ goto next_cmd;
+ }
+
+ consumed_old_str = strdup_malloc(nth_token(recvbuf, 2));
+ if(consumed_old_str == NULL) {
+ ERR("put_subbuf: cannot parse consumed_old");
+ goto next_cmd;
+ }
+ consumed_old = strtol(consumed_old_str, &endptr, 10);
+ if(*endptr != '\0') {
+ ERR("put_subbuf: invalid value for consumed_old");
+ 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)) {
+ struct rchan_buf *rbuf = rchan->buf;
+ struct ltt_channel_buf_struct *lttbuf = trace->channels[i].buf;
+ char *reply;
+ long consumed_old=0;
+
+ result = ltt_do_put_subbuf(rbuf, lttbuf, consumed_old);
+ if(result < 0) {
+ WARN("ltt_do_put_subbuf: error");
+ }
+ else {
+ DBG("ltt_do_put_subbuf: success");
+ }
+ asprintf(&reply, "%s", "OK", consumed_old);
+
+ result = ustcomm_send_reply(&ustcomm_app.server, reply, &src);
+ if(result) {
+ ERR("listener: put_subbuf: ustcomm_send_reply failed");
+ goto next_cmd;
+ }
+
+ free(reply);
+
+ break;
+ }
+ }
+
+ free(channel_name);
+ free(consumed_old_str);
+ }
+ else if(nth_token_is(recvbuf, "get_notifications", 0) == 1) {
+ struct ltt_trace_struct *trace;
+ char trace_name[] = "auto";
+ int i;
+ char *channel_name;
+
+ DBG("get_notifications");
+
+ channel_name = strdup_malloc(nth_token(recvbuf, 1));
+ if(channel_name == NULL) {
+ ERR("put_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;
+ int fd;
+
+ if(!strcmp(trace->channels[i].channel_name, channel_name)) {
+ struct rchan_buf *rbuf = rchan->buf;
+ struct ltt_channel_buf_struct *lttbuf = trace->channels[i].buf;
+
+ result = fd = ustcomm_app_detach_client(&ustcomm_app, &src);
+ if(result == -1) {
+ ERR("ustcomm_app_detach_client failed");
+ goto next_cmd;
+ }
+
+ lttbuf->wake_consumer_arg = (void *) fd;
+
+ smp_wmb();
+
+ lttbuf->call_wake_consumer = 1;
+
+ break;
+ }
+ }
+
+ free(channel_name);
+ }
+ else {
+ ERR("unable to parse message: %s", recvbuf);
+ }
+
+ next_cmd:
+ free(recvbuf);