Пример #1
0
static int list_output(void)
{
	int ret, output_seen = 0;
	struct lttng_snapshot_output *s_iter;
	struct lttng_snapshot_output_list *list;

	ret = lttng_snapshot_list_output(current_session_name, &list);
	if (ret < 0) {
		goto error;
	}

	MSG("Snapshot output list for session %s", current_session_name);

	while ((s_iter = lttng_snapshot_output_list_get_next(list)) != NULL) {
		MSG("%s[%" PRIu32 "] %s: %s (max-size: %" PRId64 ")", indent4,
				lttng_snapshot_output_get_id(s_iter),
				lttng_snapshot_output_get_name(s_iter),
				lttng_snapshot_output_get_ctrl_url(s_iter),
				lttng_snapshot_output_get_maxsize(s_iter));
		output_seen = 1;
	}

	lttng_snapshot_output_list_destroy(list);

	if (!output_seen) {
		MSG("%sNone", indent4);
	}

error:
	return ret;
}
Пример #2
0
static int mi_list_output(void)
{
	int ret;
	struct lttng_snapshot_output *s_iter;
	struct lttng_snapshot_output_list *list;

	assert(writer);

	ret = lttng_snapshot_list_output(current_session_name, &list);
	if (ret < 0) {
		goto error;
	}

	ret = mi_lttng_snapshot_output_session_name(writer, current_session_name);
	if (ret) {
		ret = CMD_ERROR;
		goto end;
	}

	while ((s_iter = lttng_snapshot_output_list_get_next(list)) != NULL) {
		ret = mi_lttng_snapshot_list_output(writer, s_iter);
		if (ret) {
			ret = CMD_ERROR;
			goto end;
		}
	}


	/* Close snapshot snapshots element */
	ret = mi_lttng_writer_close_element(writer);
	if (ret) {
		ret = CMD_ERROR;
		goto end;
	}

	/* Close snapshot session element */
	ret = mi_lttng_writer_close_element(writer);
	if (ret) {
		ret = CMD_ERROR;
	}
end:
	lttng_snapshot_output_list_destroy(list);
error:
	return ret;
}
Пример #3
0
/*
 *  Create a tracing session.
 *  If no name is specified, a default name is generated.
 *
 *  Returns one of the CMD_* result constants.
 */
static int create_session(void)
{
	int ret, i;
	char shm_path[LTTNG_PATH_MAX] = {};
	struct lttng_session_descriptor *session_descriptor = NULL;
	enum lttng_session_descriptor_status descriptor_status;
	enum lttng_error_code ret_code;
	struct lttng_session *sessions = NULL;
	const struct lttng_session *created_session = NULL;
	const char *created_session_name;

	/* Validate options. */
	if (opt_session_name) {
		if (strlen(opt_session_name) > NAME_MAX) {
			ERR("Session name too long. Length must be lower or equal to %d",
					NAME_MAX);
			ret = CMD_ERROR;
			goto error;
		}
		/*
		 * Check if the session name begins with "auto-" or is exactly "auto".
		 * Both are reserved for the default session name. See bug #449 to
		 * understand why we need to check both here.
		 */
		if ((strncmp(opt_session_name, DEFAULT_SESSION_NAME "-",
					strlen(DEFAULT_SESSION_NAME) + 1) == 0) ||
				(strncmp(opt_session_name, DEFAULT_SESSION_NAME,
					strlen(DEFAULT_SESSION_NAME)) == 0 &&
				strlen(opt_session_name) == strlen(DEFAULT_SESSION_NAME))) {
			ERR("%s is a reserved keyword for default session(s)",
					DEFAULT_SESSION_NAME);
			ret = CMD_ERROR;
			goto error;
		}
	}

	if (opt_snapshot && opt_live_timer) {
		ERR("Snapshot and live modes are mutually exclusive.");
		ret = CMD_ERROR;
		goto error;
	}

	if ((!opt_ctrl_url && opt_data_url) || (opt_ctrl_url && !opt_data_url)) {
		ERR("Both control and data URLs must be specified.");
		ret = CMD_ERROR;
		goto error;
	}

	session_descriptor = create_session_descriptor();
	if (!session_descriptor) {
		ret = CMD_ERROR;
		goto error;
	}
	ret_code = lttng_create_session_ext(session_descriptor);
	if (ret_code != LTTNG_OK) {
		ERR("%s", lttng_strerror(-ret_code));
		ret = CMD_ERROR;
		goto error;
	}

	descriptor_status = lttng_session_descriptor_get_session_name(
		session_descriptor, &created_session_name);
	if (descriptor_status != LTTNG_SESSION_DESCRIPTOR_STATUS_OK) {
		ERR("Failed to obtain created session name");
		ret = CMD_ERROR;
		goto error;
	}

	ret = lttng_list_sessions(&sessions);
	if (ret < 0) {
		ERR("Failed to fetch properties of created session: %s",
				lttng_strerror(ret));
		ret = CMD_ERROR;
		goto error;
	}
	for (i = 0; i < ret; i++) {
		if (!strcmp(created_session_name, sessions[i].name)) {
			created_session = &sessions[i];
			break;
		}
	}
	if (!created_session) {
		ERR("Failed to fetch properties of created session");
		ret = CMD_ERROR;
		goto error;
	}

	if (opt_shm_path) {
		char datetime_suffix[17] = {};

		/*
		 * An auto-generated session name already includes the creation
		 * timestamp.
		 */
		if (opt_session_name) {
			uint64_t creation_time;
			struct tm *timeinfo;
			time_t creation_time_t;
			size_t strftime_ret;

			ret_code = lttng_session_get_creation_time(
					created_session,
					&creation_time);
			if (ret_code != LTTNG_OK) {
				ERR("%s", lttng_strerror(-ret_code));
				ret = CMD_ERROR;
				goto error;
			}
			creation_time_t = (time_t) creation_time;
			timeinfo = localtime(&creation_time_t);
			if (!timeinfo) {
				PERROR("Failed to interpret session creation time");
				ret = CMD_ERROR;
				goto error;
			}
			strftime_ret = strftime(datetime_suffix,
					sizeof(datetime_suffix),
					"-%Y%m%d-%H%M%S", timeinfo);
			if (strftime_ret == 0) {
				ERR("Failed to format session creation time.");
				ret = CMD_ERROR;
				goto error;
			}
		}

		ret = snprintf(shm_path, sizeof(shm_path),
				"%s/%s%s", opt_shm_path, created_session_name,
				datetime_suffix);
		if (ret < 0 || ret >= sizeof(shm_path)) {
			ERR("Failed to format the shared memory path.");
			ret = CMD_ERROR;
			goto error;
		}
		ret = lttng_set_session_shm_path(created_session_name,
				shm_path);
		if (ret < 0) {
			lttng_destroy_session(created_session_name);
			ret = CMD_ERROR;
			goto error;
		}
	}

	if (opt_snapshot) {
		MSG("Snapshot session %s created.", created_session_name);
	} else if (opt_live_timer) {
		MSG("Live session %s created.", created_session_name);
	} else {
		MSG("Session %s created.", created_session_name);
	}

	if (*created_session->path && !opt_snapshot) {
		MSG("Traces will be output to %s", created_session->path);

		if (opt_live_timer) {
			MSG("Live timer interval set to %u %s", opt_live_timer,
					USEC_UNIT);
		}
	} else if (opt_snapshot) {
		struct lttng_snapshot_output_list *list;
		struct lttng_snapshot_output *iter;
		char snapshot_url[LTTNG_PATH_MAX] = {};

		ret = lttng_snapshot_list_output(created_session_name, &list);
		if (ret < 0) {
			ERR("Failed to list snapshot outputs.");
			ret = CMD_ERROR;
			goto error;
		}

		while ((iter = lttng_snapshot_output_list_get_next(list))) {
			const char *url = NULL;

			url = lttng_snapshot_output_get_ctrl_url(
					iter);
			ret = lttng_strncpy(snapshot_url, url,
					sizeof(snapshot_url));
			if (ret) {
				snapshot_url[0] = '\0';
				ERR("Failed to retrieve snapshot output destination");
			}
			break;
		}
		lttng_snapshot_output_list_destroy(list);

		if (*snapshot_url) {
			MSG("Default snapshot output set to %s",
					snapshot_url);
		}
		MSG("Every channel enabled for this session will be set to mmap output and default to overwrite mode.");
	}
	if (opt_shm_path) {
		MSG("Shared memory path set to %s", shm_path);
	}

	/* Mi output */
	if (lttng_opt_mi) {
		ret = mi_created_session(created_session_name);
		if (ret) {
			ret = CMD_ERROR;
			goto error;
		}
	}

	/* Init lttng session config */
	ret = config_init(created_session_name);
	if (ret < 0) {
		ret = CMD_ERROR;
		goto error;
	}

	ret = CMD_SUCCESS;
error:
	lttng_session_descriptor_destroy(session_descriptor);
	free(sessions);
	return ret;
}