static void do_read( struct event_info *ei, void *d ) { struct ctl_sock *cs = (struct ctl_sock *)d; unsigned char c, output[2048]; if( read( cs->fd, &c, 1 ) < 1 ) { drop_sock( cs ); return; } switch( c ) { case 'a': write( cs->fd, output, print_session_list( output, sizeof( output ) ) ); break; case 'l': send_log_buffer( cs->fd ); break; default: write( cs->fd, "unknown command\n", 16 ); break; } write( cs->fd, ".\n", 2 ); }
int lttng_live_list_sessions(struct lttng_live_ctx *ctx, const char *path) { struct lttng_viewer_cmd cmd; struct lttng_viewer_list_sessions list; struct lttng_viewer_session lsession; int i, ret, sessions_count, print_list = 0; ssize_t ret_len; uint64_t session_id; GPtrArray *session_list = NULL; if (lttng_live_should_quit()) { ret = -1; goto end; } if (strlen(ctx->session_name) == 0) { print_list = 1; session_list = g_ptr_array_new(); } cmd.cmd = htobe32(LTTNG_VIEWER_LIST_SESSIONS); cmd.data_size = htobe64((uint64_t) 0); cmd.cmd_version = htobe32(0); ret_len = lttng_live_send(ctx->control_sock, &cmd, sizeof(cmd)); if (ret_len < 0) { perror("[error] Error sending cmd"); goto error; } assert(ret_len == sizeof(cmd)); ret_len = lttng_live_recv(ctx->control_sock, &list, sizeof(list)); if (ret_len == 0) { fprintf(stderr, "[error] Remote side has closed connection\n"); goto error; } if (ret_len < 0) { perror("[error] Error receiving session list"); goto error; } assert(ret_len == sizeof(list)); sessions_count = be32toh(list.sessions_count); for (i = 0; i < sessions_count; i++) { ret_len = lttng_live_recv(ctx->control_sock, &lsession, sizeof(lsession)); if (ret_len == 0) { fprintf(stderr, "[error] Remote side has closed connection\n"); goto error; } if (ret_len < 0) { perror("[error] Error receiving session"); goto error; } assert(ret_len == sizeof(lsession)); lsession.hostname[LTTNG_VIEWER_HOST_NAME_MAX - 1] = '\0'; lsession.session_name[LTTNG_VIEWER_NAME_MAX - 1] = '\0'; session_id = be64toh(lsession.id); if (print_list) { update_session_list(session_list, lsession.hostname, lsession.session_name, be32toh(lsession.streams), be32toh(lsession.clients), be32toh(lsession.live_timer)); } else { if ((strncmp(lsession.session_name, ctx->session_name, MAXNAMLEN) == 0) && (strncmp(lsession.hostname, ctx->traced_hostname, MAXNAMLEN) == 0)) { printf_verbose("Reading from session %" PRIu64 "\n", session_id); g_array_append_val(ctx->session_ids, session_id); } } } if (print_list) { print_session_list(session_list, path); free_session_list(session_list); } ret = 0; end: return ret; error: fprintf(stderr, "[error] Unable to list sessions\n"); return -1; }