+void seperate_channel_cpu(const char *channel_and_cpu, char **channel, int *cpu)
+{
+ const char *sep;
+
+ sep = rindex(channel_and_cpu, '_');
+ if(sep == NULL) {
+ *cpu = -1;
+ sep = channel_and_cpu + strlen(channel_and_cpu);
+ }
+ else {
+ *cpu = atoi(sep+1);
+ }
+
+ asprintf(channel, "%.*s", (int)(sep-channel_and_cpu), channel_and_cpu);
+}
+
+static int do_cmd_get_shmid(const char *recvbuf, struct ustcomm_source *src)
+{
+ int retval = 0;
+ struct ust_trace *trace;
+ char trace_name[] = "auto";
+ int i;
+ char *channel_and_cpu;
+ int found = 0;
+ int result;
+ char *ch_name;
+ int ch_cpu;
+
+ DBG("get_shmid");
+
+ channel_and_cpu = nth_token(recvbuf, 1);
+ if(channel_and_cpu == NULL) {
+ 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");
+ goto free_short_chan_name;
+ }
+
+ ltt_lock_traces();
+ trace = _ltt_trace_find(trace_name);
+ ltt_unlock_traces();
+
+ if(trace == NULL) {
+ ERR("cannot find trace!");
+ retval = -1;
+ goto free_short_chan_name;
+ }
+
+ for(i=0; i<trace->nr_channels; i++) {
+ struct ust_channel *channel = &trace->channels[i];
+ struct ust_buffer *buf = channel->buf[ch_cpu];
+
+ if(!strcmp(trace->channels[i].channel_name, ch_name)) {
+ char *reply;
+
+// DBG("the shmid for the requested channel is %d", buf->shmid);
+// DBG("the shmid for its buffer structure is %d", channel->buf_struct_shmids);
+ asprintf(&reply, "%d %d", buf->shmid, channel->buf_struct_shmids[ch_cpu]);
+
+ 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);
+
+ found = 1;
+ break;
+ }
+ }
+
+ if(!found) {
+ ERR("channel not found (%s)", channel_and_cpu);
+ }
+
+ free_short_chan_name:
+ free(ch_name);
+
+ end:
+ return retval;
+}
+
+static int do_cmd_get_n_subbufs(const char *recvbuf, struct ustcomm_source *src)
+{
+ int retval = 0;
+ struct ust_trace *trace;
+ char trace_name[] = "auto";
+ int i;
+ char *channel_and_cpu;
+ int found = 0;
+ int result;
+ char *ch_name;
+ int ch_cpu;
+
+ DBG("get_n_subbufs");
+
+ channel_and_cpu = nth_token(recvbuf, 1);
+ if(channel_and_cpu == NULL) {
+ 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");
+ goto free_short_chan_name;
+ }
+
+ ltt_lock_traces();
+ trace = _ltt_trace_find(trace_name);
+ ltt_unlock_traces();
+
+ if(trace == NULL) {
+ ERR("cannot find trace!");
+ retval = -1;
+ goto free_short_chan_name;
+ }
+
+ for(i=0; i<trace->nr_channels; i++) {
+ struct ust_channel *channel = &trace->channels[i];
+
+ if(!strcmp(trace->channels[i].channel_name, ch_name)) {
+ char *reply;
+
+ DBG("the n_subbufs for the requested channel is %d", channel->subbuf_cnt);
+ asprintf(&reply, "%d", channel->subbuf_cnt);
+
+ 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);
+ found = 1;
+ break;
+ }
+ }
+ if(found == 0) {
+ ERR("unable to find channel");
+ }
+
+ free_short_chan_name:
+ free(ch_name);
+
+ end:
+ return retval;
+}
+
+static int do_cmd_get_subbuf_size(const char *recvbuf, struct ustcomm_source *src)
+{
+ int retval = 0;
+ struct ust_trace *trace;
+ char trace_name[] = "auto";
+ int i;
+ char *channel_and_cpu;
+ int found = 0;
+ int result;
+ char *ch_name;
+ int ch_cpu;
+
+ DBG("get_subbuf_size");
+
+ channel_and_cpu = nth_token(recvbuf, 1);
+ if(channel_and_cpu == NULL) {
+ 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");
+ goto free_short_chan_name;
+ }
+
+ ltt_lock_traces();
+ trace = _ltt_trace_find(trace_name);
+ ltt_unlock_traces();
+
+ if(trace == NULL) {
+ ERR("cannot find trace!");
+ retval = -1;
+ goto free_short_chan_name;
+ }
+
+ for(i=0; i<trace->nr_channels; i++) {
+ struct ust_channel *channel = &trace->channels[i];
+
+ if(!strcmp(trace->channels[i].channel_name, ch_name)) {
+ char *reply;
+
+ DBG("the subbuf_size for the requested channel is %zd", channel->subbuf_size);
+ asprintf(&reply, "%zd", channel->subbuf_size);
+
+ 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);
+ found = 1;
+ break;
+ }
+ }
+ if(found == 0) {
+ ERR("unable to find channel");
+ }
+
+ free_short_chan_name:
+ free(ch_name);
+
+ end:
+ return retval;
+}
+
+static unsigned int poweroftwo(unsigned int x)