#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>
+#include <string.h>
#define event_list "lttng_statedump_start,lttng_statedump_end," \
"lttng_statedump_process_state,lttng_statedump_file_descriptor," \
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;
}
}
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];
- ret = sprintf(cmd, "%s lttng enable-event -s %s -k %s >/dev/null",
- (sudo) ? "sudo" : " ", name, event_list);
+ ret = sprintf(cmd, "%s lttng enable-event -s %s -k %s >/dev/null;"
+ "lttng enable-event -k --syscall -a -s %s >/dev/null",
+ (sudo) ? "sudo" : " ", name, event_list, name);
if (ret < 0) {
fprintf(stderr, "Allocating cmd\n");
goto end;
}
static
-int start(char *name, int sudo)
+int start(char *name, int sudo, int local, int print)
{
int ret;
char cmd[1024];
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");
}
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];
+ ret = system("groups|grep tracing >/dev/null");
+ if (ret != 0 && 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) {
goto end_free;
}
- ret = enable_event(name, sudo);
+ ret = enable_events(name, sudo);
if (ret < 0) {
goto end_free;
}
goto end_free;
}
- ret = start(name, sudo);
+ ret = start(name, sudo, 1, 1);
if (ret < 0) {
goto end_free;
}
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;
+}