예제 #1
0
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 );
}
예제 #2
0
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;
}