/* * Machine interface * List all availables session */ static int mi_list_sessions(struct lttng_session *sessions, int count) { int ret, i; /* Opening sessions element */ ret = mi_lttng_sessions_open(writer); if (ret) { goto end; } /* Listing sessions */ for (i = 0; i < count; i++) { ret = mi_lttng_session(writer, &sessions[i], 0); if (ret) { goto end; } } /* Closing sessions element */ ret = mi_lttng_writer_close_element(writer); if (ret) { goto end; } end: return ret; }
/* * Machine interface * Find the session with session_name as name * and print his informations. */ static int mi_list_session(const char *session_name, struct lttng_session *sessions, int count) { int ret, i; unsigned int session_found = 0; if (session_name == NULL) { ret = -LTTNG_ERR_SESS_NOT_FOUND; goto end; } for (i = 0; i < count; i++) { if (strncmp(sessions[i].name, session_name, NAME_MAX) == 0) { /* We need to leave it open to append other informations * like domain, channel, events etc.*/ session_found = 1; ret = mi_lttng_session(writer, &sessions[i], 1); if (ret) { goto end; } break; } } if (!session_found) { ERR("Session '%s' not found", session_name); ret = -LTTNG_ERR_SESS_NOT_FOUND; goto end; } end: return ret; }
/* * destroy_session * * Unregister the provided session to the session daemon. On success, removes * the default configuration. */ static int destroy_session(struct lttng_session *session) { int ret; ret = lttng_destroy_session(session->name); if (ret < 0) { switch (-ret) { case LTTNG_ERR_SESS_NOT_FOUND: WARN("Session name %s not found", session->name); break; default: ERR("%s", lttng_strerror(ret)); break; } goto error; } MSG("Session %s destroyed", session->name); config_destroy_default(); if (lttng_opt_mi) { ret = mi_lttng_session(writer, session, 0); if (ret) { ret = CMD_ERROR; goto error; } } ret = CMD_SUCCESS; error: return ret; }
/* * Retrieve the created session and mi output it based on provided argument * This is currently a summary of what was pretty printed and is subject to * enhancements. */ static int mi_created_session(const char *session_name) { int ret, i, count, found; struct lttng_session *sessions; /* session_name should not be null */ assert(session_name); assert(writer); count = lttng_list_sessions(&sessions); if (count < 0) { ret = count; ERR("%s", lttng_strerror(ret)); goto error; } if (count == 0) { ERR("Error session creation failed: session %s not found", session_name); ret = -LTTNG_ERR_SESS_NOT_FOUND; goto end; } found = 0; for (i = 0; i < count; i++) { if (strncmp(sessions[i].name, session_name, NAME_MAX) == 0) { found = 1; ret = mi_lttng_session(writer, &sessions[i], 0); if (ret) { goto error; } break; } } if (!found) { ret = -LTTNG_ERR_SESS_NOT_FOUND; } else { ret = CMD_SUCCESS; } error: free(sessions); end: return ret; }
/* * destroy_session * * Unregister the provided session to the session daemon. On success, removes * the default configuration. */ static int destroy_session(struct lttng_session *session) { int ret; char *session_name = NULL; bool session_was_stopped; ret = lttng_stop_tracing_no_wait(session->name); if (ret < 0 && ret != -LTTNG_ERR_TRACE_ALREADY_STOPPED) { ERR("%s", lttng_strerror(ret)); } session_was_stopped = ret == -LTTNG_ERR_TRACE_ALREADY_STOPPED; if (!opt_no_wait) { bool printed_wait_msg = false; do { ret = lttng_data_pending(session->name); if (ret < 0) { /* Return the data available call error. */ goto error; } /* * Data sleep time before retrying (in usec). Don't sleep if the call * returned value indicates availability. */ if (ret) { if (!printed_wait_msg) { _MSG("Waiting for data availability"); fflush(stdout); } printed_wait_msg = true; usleep(DEFAULT_DATA_AVAILABILITY_WAIT_TIME); _MSG("."); fflush(stdout); } } while (ret != 0); if (printed_wait_msg) { MSG(""); } } if (!session_was_stopped) { /* * Don't print the event and packet loss warnings since the user * already saw them when stopping the trace. */ print_session_stats(session->name); } ret = lttng_destroy_session_no_wait(session->name); if (ret < 0) { goto error; } MSG("Session %s destroyed", session->name); session_name = get_session_name_quiet(); if (session_name && !strncmp(session->name, session_name, NAME_MAX)) { config_destroy_default(); } if (lttng_opt_mi) { ret = mi_lttng_session(writer, session, 0); if (ret) { ret = CMD_ERROR; goto error; } } ret = CMD_SUCCESS; error: free(session_name); return ret; }