X-Git-Url: https://git.lttng.org/?p=lttngtop.git;a=blobdiff_plain;f=src%2Flttng-session.c;h=8b0f6414539eb5b20f52d4c0b0af18f004736e06;hp=29676f31dca8fbaf98bf79add6496f7f9f291327;hb=6a1b139cec6513cb5d423d27a1a61c4424886bf1;hpb=f248b7d81143c5ff7b51a616e0c7394e26bac831 diff --git a/src/lttng-session.c b/src/lttng-session.c index 29676f3..8b0f641 100644 --- a/src/lttng-session.c +++ b/src/lttng-session.c @@ -5,6 +5,7 @@ #include #include #include +#include #define event_list "lttng_statedump_start,lttng_statedump_end," \ "lttng_statedump_process_state,lttng_statedump_file_descriptor," \ @@ -32,6 +33,13 @@ int check_or_start_sessiond() ret = -1; goto end; } + ret = system("sudo -l lttng >/dev/null"); + if (ret < 0) { + fprintf(stderr, "[error] You are not root and not " + "allowed by sudo to use lttng\n"); + ret = -1; + goto end; + } sudo = 1; } @@ -236,7 +244,30 @@ end: } static -int enable_event(char *name, int sudo) +int live_local_session(char *name, int sudo) +{ + int ret; + char cmd[1024]; + + ret = sprintf(cmd, "%s lttng create %s --live 1000000 -U net://localhost >/dev/null", + (sudo) ? "sudo" : " ", name); + if (ret < 0) { + fprintf(stderr, "Allocating cmd\n"); + goto end; + } + ret = (system(cmd)); + if (ret != 0) { + fprintf(stderr, "Error: creating the session\n"); + ret = -1; + goto end; + } + +end: + return ret; +} + +static +int enable_events(char *name, int sudo) { int ret; char cmd[1024]; @@ -284,7 +315,7 @@ end: } static -int start(char *name, int sudo) +int start(char *name, int sudo, int local, int print) { int ret; char cmd[1024]; @@ -303,13 +334,22 @@ int start(char *name, int sudo) goto end; } - ret = sprintf(cmd, "%s lttng list|grep %s|cut -d'(' -f2|cut -d ')' -f1", - (sudo) ? "sudo" : " ", name); + if (!print) + goto end; + + if (local) { + ret = sprintf(cmd, "%s lttng list|grep %s|cut -d'(' -f2|cut -d ')' -f1", + (sudo) ? "sudo" : " ", name); + } else { + ret = sprintf(cmd, "babeltrace -i lttng-live net://localhost|grep %s|cut -d' ' -f1", + name); + } if (ret < 0) { fprintf(stderr, "allocating cmd\n"); goto end; } - fprintf(stderr, "Local session started in "); + fprintf(stderr, "%s session started : ", + (local) ? "Local" : "Live"); ret = (system(cmd)); if (ret != 0) { fprintf(stderr, "error: listing the sessions\n"); @@ -322,11 +362,57 @@ end: } static -int destroy(char *name, int sudo) +char *live_path(char *name) +{ + FILE *fp; + int ret; + char path[1035]; + char cmd[1024]; + char *out = NULL; + + ret = sprintf(cmd, "lttngtop -r net://localhost|grep %s|cut -d' ' -f1", + name); + if (ret < 0) { + fprintf(stderr, "allocating cmd\n"); + goto end; + } + + fp = popen(cmd, "r"); + if (fp == NULL) { + printf("Failed to run command\n" ); + goto end; + } + + /* Read the output a line at a time - output it. */ + out = fgets(path, sizeof(path)-1, fp); + if (out) + out = strdup(path); + + /* close */ + pclose(fp); + +end: + return out; +} + +static +int destroy(char *name) { int ret; + int sudo = 0; char cmd[1024]; + if (getuid() != 0) { + ret = system("sudo -l lttng >/dev/null"); + if (ret < 0) { + fprintf(stderr, "[error] You are not root and not " + "allowed by sudo to use lttng\n"); + ret = -1; + goto end; + } + sudo = 1; + } + ret = sprintf(cmd, "%s lttng destroy %s >/dev/null", (sudo) ? "sudo" : " ", name); if (ret < 0) { @@ -369,7 +455,7 @@ int create_local_session() goto end_free; } - ret = enable_event(name, sudo); + ret = enable_events(name, sudo); if (ret < 0) { goto end_free; } @@ -379,7 +465,7 @@ int create_local_session() goto end_free; } - ret = start(name, sudo); + ret = start(name, sudo, 1, 1); if (ret < 0) { goto end_free; } @@ -390,12 +476,59 @@ end: return ret; } -int destroy_local_session(char *name, int sudo) +int destroy_live_local_session(char *name) { - return destroy(name, sudo); + return destroy(name); } -/* -int create_live_local_session(); -int destroy_live_local_session(); -*/ +int create_live_local_session(char **session_path, char **session_name, int print) +{ + int ret; + char *name; + int sudo = 0; + + ret = check_requirements(&sudo); + + name = random_session_name(); + if (!name) { + ret = -1; + goto end; + } + + ret = check_session_name(name, sudo); + if (ret < 0) { + goto end_free; + } + + ret = live_local_session(name, sudo); + if (ret < 0) { + goto end_free; + } + + ret = enable_events(name, sudo); + if (ret < 0) { + goto end_free; + } + + ret = add_contexts(name, sudo); + if (ret < 0) { + goto end_free; + } + + ret = start(name, sudo, 0, print); + if (ret < 0) { + goto end_free; + } + + if (session_path) + *session_path = live_path(name); + if (session_name) { + *session_name = name; + goto end; + } + +end_free: + free(name); +end: + return ret; +}