From aaf975194bf54e911e7464b3723b2f247dbeb78b Mon Sep 17 00:00:00 2001 From: David Goulet Date: Tue, 26 Apr 2011 15:02:17 -0400 Subject: [PATCH] Add create session feature Add create session command to liblttngctl, lttng and session daemon. Fix a major bug with send data buffer having the wrong pointer arithmetic and thus failing with memcpy. Add -fno-strict-aliasing to the global CFLAGS. Signed-off-by: David Goulet --- configure.ac | 2 +- include/lttng/liblttngctl.h | 2 +- liblttngctl/liblttngctl.c | 30 ++++++++- liblttsessiondcomm/liblttsessiondcomm.h | 4 +- ltt-sessiond/ltt-sessiond.c | 83 ++++++++++++++++--------- lttng/lttng.c | 31 +++++++++ lttng/lttng.h | 1 + lttng/options.c | 27 ++++---- 8 files changed, 134 insertions(+), 46 deletions(-) diff --git a/configure.ac b/configure.ac index bbd591445..acf80176b 100644 --- a/configure.ac +++ b/configure.ac @@ -38,7 +38,7 @@ AC_CHECK_DECL([cds_list_add], [], [AC_MSG_ERROR([liburcu 0.5.4 or newer is needed])], [[#include ]] ) -CFLAGS="-Wall $CFLAGS -g" +CFLAGS="-Wall $CFLAGS -g -fno-strict-aliasing" AC_PROG_CC AC_PROG_LIBTOOL diff --git a/include/lttng/liblttngctl.h b/include/lttng/liblttngctl.h index 7d2bb8862..3c084de32 100644 --- a/include/lttng/liblttngctl.h +++ b/include/lttng/liblttngctl.h @@ -41,7 +41,7 @@ struct lttng_session { char uuid[UUID_STR_LEN]; }; -extern int lttng_create_session(const char *name, char *session_id); +extern int lttng_create_session(char *name, char **session_id); extern int lttng_connect_sessiond(void); extern int lttng_set_tracing_group(const char *name); extern int lttng_check_session_daemon(void); diff --git a/liblttngctl/liblttngctl.c b/liblttngctl/liblttngctl.c index fda45ae10..bd7dcb0c5 100644 --- a/liblttngctl/liblttngctl.c +++ b/liblttngctl/liblttngctl.c @@ -35,6 +35,7 @@ static char sessiond_sock_path[PATH_MAX]; /* Communication structure to ltt-sessiond */ static struct lttcomm_session_msg lsm; +static struct lttcomm_lttng_msg llm; /* Prototypes */ static int check_tracing_group(const char *grp_name); @@ -109,7 +110,6 @@ static int ask_sessiond(enum lttcomm_command_type lct, void **buf) int ret; size_t size; void *data = NULL; - struct lttcomm_lttng_msg llm; lsm.cmd_type = lct; @@ -188,6 +188,34 @@ int lttng_ust_list_apps(pid_t **pids) return ret / sizeof(pid_t); } +/* + * lttng_create_session + * + * Create a brand new session using name. Allocate + * the session_id param pointing to the UUID. + */ +int lttng_create_session(char *name, char **session_id) +{ + int ret; + char *uuid; + + strncpy(lsm.session_name, name, sizeof(lsm.session_name)); + + ret = ask_sessiond(LTTNG_CREATE_SESSION, NULL); + if (ret < 0) { + goto end; + } + + /* Allocate UUID string length */ + uuid = malloc(UUID_STR_LEN); + + strncpy(uuid, llm.session_id, UUID_STR_LEN); + *session_id = uuid; + +end: + return ret; +} + /* * lttng_list_sessions * diff --git a/liblttsessiondcomm/liblttsessiondcomm.h b/liblttsessiondcomm/liblttsessiondcomm.h index 6d6290d0a..56414063c 100644 --- a/liblttsessiondcomm/liblttsessiondcomm.h +++ b/liblttsessiondcomm/liblttsessiondcomm.h @@ -85,7 +85,7 @@ enum lttcomm_return_code { struct lttcomm_session_msg { /* Common data to almost all command */ enum lttcomm_command_type cmd_type; - uuid_t session_id; + char session_id[37]; char trace_name[NAME_MAX]; char session_name[NAME_MAX]; pid_t pid; @@ -125,7 +125,7 @@ struct lttcomm_session_msg { struct lttcomm_lttng_msg { enum lttcomm_command_type cmd_type; enum lttcomm_return_code ret_code; - uuid_t session_id; + char session_id[37]; pid_t pid; char trace_name[NAME_MAX]; unsigned int size_payload; diff --git a/ltt-sessiond/ltt-sessiond.c b/ltt-sessiond/ltt-sessiond.c index fb197d43b..5a6c5dc97 100644 --- a/ltt-sessiond/ltt-sessiond.c +++ b/ltt-sessiond/ltt-sessiond.c @@ -59,15 +59,16 @@ static int connect_app(pid_t); static int init_daemon_socket(void); static int process_client_msg(int sock, struct lttcomm_session_msg*); static int send_unix_sock(int sock, void *buf, size_t len); +static int setup_data_buffer(char **buf, size_t size, struct lttcomm_lttng_msg *llm); /* Command function */ -static void get_list_apps(void *buf); -static void get_list_sessions(void *buf); +static void get_list_apps(pid_t *pids); +static void get_list_sessions(struct lttng_session *lt); static void *thread_manage_clients(void *); static void *thread_manage_apps(void *); -static int create_session(const char*, uuid_t *); +static int create_session(char *name, uuid_t *session_id); static void destroy_session(uuid_t); static struct ltt_session *find_session(uuid_t); @@ -350,9 +351,10 @@ static void destroy_session(uuid_t session_id) /* * create_session * - * Create a brand new session, + * Create a brand new session and add it to the + * global session list. */ -static int create_session(const char *name, uuid_t *session_id) +static int create_session(char *name, uuid_t *session_id) { struct ltt_session *new_session; @@ -405,16 +407,15 @@ error: * List traceable user-space application and fill an * array of pids. */ -static void get_list_apps(void *buf) +static void get_list_apps(pid_t *pids) { - size_t index = 0; - struct ltt_traceable_app *iter = NULL; - pid_t *pids = (pid_t *) buf; + int i = 0; + struct ltt_traceable_app *iter; /* TODO: Mutex needed to access this list */ cds_list_for_each_entry(iter, <t_traceable_app_list.head, list) { - pids[index] = iter->pid; - index++; + pids[i] = iter->pid; + i++; } } @@ -423,20 +424,21 @@ static void get_list_apps(void *buf) * * List sessions and fill the data buffer. */ -static void get_list_sessions(void *buf) +static void get_list_sessions(struct lttng_session *lt) { int i = 0; - struct ltt_session *iter = NULL; + struct ltt_session *iter; struct lttng_session lsess; - struct lttng_session *data = (struct lttng_session *) buf; /* Iterate over session list and append data after * the control struct in the buffer. */ cds_list_for_each_entry(iter, <t_session_list.head, list) { + /* Copy name and uuid */ uuid_unparse(iter->uuid, lsess.uuid); strncpy(lsess.name, iter->name, sizeof(lsess.name)); - memcpy(data + (i * sizeof(struct lttng_session)), &lsess, sizeof(lsess)); + lsess.name[sizeof(lsess.name) - 1] = '\0'; + memcpy(<[i], &lsess, sizeof(lsess)); i++; /* Reset struct for next pass */ memset(&lsess, 0, sizeof(lsess)); @@ -452,10 +454,13 @@ static void copy_common_data(struct lttcomm_lttng_msg *llm, struct lttcomm_sessi { llm->cmd_type = lsm->cmd_type; llm->pid = lsm->pid; - if (!uuid_is_null(lsm->session_id)) { - uuid_copy(llm->session_id, lsm->session_id); + + /* Manage uuid */ + if (lsm->session_id != NULL) { + strncpy(llm->session_id, lsm->session_id, UUID_STR_LEN); } - strncpy(llm->trace_name, lsm->trace_name, sizeof(llm->trace_name)); + + strncpy(llm->trace_name, lsm->trace_name, strlen(llm->trace_name)); } /* @@ -466,15 +471,14 @@ static void copy_common_data(struct lttcomm_lttng_msg *llm, struct lttcomm_sessi * * Return total size of the buffer pointed by buf. */ -static int setup_data_buffer(void **buf, size_t s_data, struct lttcomm_lttng_msg *llm) +static int setup_data_buffer(char **buf, size_t s_data, struct lttcomm_lttng_msg *llm) { int ret = 0; - void *new_buf; size_t buf_size; buf_size = sizeof(struct lttcomm_lttng_msg) + s_data; - new_buf = malloc(buf_size); - if (new_buf == NULL) { + *buf = malloc(buf_size); + if (*buf == NULL) { perror("malloc"); ret = -1; goto error; @@ -484,9 +488,7 @@ static int setup_data_buffer(void **buf, size_t s_data, struct lttcomm_lttng_msg * it to the newly allocated buffer. */ llm->size_payload = s_data; - memcpy(new_buf, llm, sizeof(struct lttcomm_lttng_msg)); - - *buf = new_buf; + memcpy(*buf, llm, sizeof(struct lttcomm_lttng_msg)); return buf_size; @@ -506,9 +508,9 @@ error: static int process_client_msg(int sock, struct lttcomm_session_msg *lsm) { int ret; - struct lttcomm_lttng_msg llm; - void *send_buf = NULL; int buf_size; + char *send_buf = NULL; + struct lttcomm_lttng_msg llm; /* Copy common data to identify the response * on the lttng client side. @@ -522,6 +524,29 @@ static int process_client_msg(int sock, struct lttcomm_session_msg *lsm) /* Process by command type */ switch (lsm->cmd_type) { + case LTTNG_CREATE_SESSION: + { + uuid_t uuid; + ret = create_session(lsm->session_name, &uuid); + if (ret < 0) { + goto error; + } + + uuid_unparse(uuid, llm.session_id); + + buf_size = setup_data_buffer(&send_buf, 0, &llm); + if (buf_size < 0) { + ret = LTTCOMM_FATAL; + goto error; + } + + ret = send_unix_sock(sock, send_buf, buf_size); + if (ret < 0) { + goto send_error; + } + + break; + } case UST_LIST_APPS: { /* Stop right now if no apps */ @@ -538,7 +563,7 @@ static int process_client_msg(int sock, struct lttcomm_session_msg *lsm) goto error; } - get_list_apps(send_buf + sizeof(struct lttcomm_lttng_msg)); + get_list_apps((pid_t *)(send_buf + sizeof(struct lttcomm_lttng_msg))); ret = send_unix_sock(sock, send_buf, buf_size); if (ret < 0) { @@ -563,7 +588,7 @@ static int process_client_msg(int sock, struct lttcomm_session_msg *lsm) goto error; } - get_list_sessions(send_buf + sizeof(struct lttcomm_lttng_msg)); + get_list_sessions((struct lttng_session *)(send_buf + sizeof(struct lttcomm_lttng_msg))); ret = send_unix_sock(sock, send_buf, buf_size); if (ret < 0) { diff --git a/lttng/lttng.c b/lttng/lttng.c index c7ff4edde..b08ecfed8 100644 --- a/lttng/lttng.c +++ b/lttng/lttng.c @@ -42,6 +42,7 @@ static char *progname; static int process_client_opt(void); static int process_opt_list_apps(void); static int process_opt_list_sessions(void); +static int process_opt_create_session(void); static void sighandler(int sig); static int set_signal_handler(void); @@ -76,6 +77,13 @@ static int process_client_opt(void) } } + if (opt_create_session != NULL) { + ret = process_opt_create_session(); + if (ret < 0) { + goto end; + } + } + return 0; end: @@ -83,6 +91,29 @@ end: return ret; } +/* + * process_opt_create_session + * + * Create a new session using the name pass + * to the command line. + */ +static int process_opt_create_session(void) +{ + int ret; + char *session_id; + + ret = lttng_create_session(opt_create_session, &session_id); + if (ret < 0) { + goto error; + } + + MSG("Session created:"); + MSG(" %s (%s)", opt_create_session, session_id); + +error: + return ret; +} + /* * process_opt_list_sessions * diff --git a/lttng/lttng.h b/lttng/lttng.h index be32bf7ef..1faa29d79 100644 --- a/lttng/lttng.h +++ b/lttng/lttng.h @@ -28,6 +28,7 @@ extern int opt_verbose; extern int opt_quiet; extern char *opt_tracing_group; extern char *opt_session_name; +extern char *opt_create_session; extern char *opt_sessiond_path; extern int opt_list_apps; extern int opt_no_sessiond; diff --git a/lttng/options.c b/lttng/options.c index 78e1764f9..eb31108c4 100644 --- a/lttng/options.c +++ b/lttng/options.c @@ -24,6 +24,7 @@ /* Option variables */ char *opt_tracing_group; char *opt_session_name; +char *opt_create_session; char *opt_sessiond_path; int opt_trace_kernel = 0; int opt_quiet = 0; @@ -43,6 +44,7 @@ static struct poptOption long_options[] = { {"kernel", 0, POPT_ARG_VAL, &opt_trace_kernel, 1, 0, 0}, {"no-kernel", 0, POPT_ARG_VAL, &opt_trace_kernel, 0, 0, 0}, {"session", 0, POPT_ARG_STRING | POPT_ARGFLAG_OPTIONAL, &opt_session_name, 0, 0}, + {"create-session", 'c', POPT_ARG_STRING, &opt_create_session, 0, 0}, {"quiet", 'q', POPT_ARG_VAL, &opt_quiet, 1, 0}, {"verbose", 'v', POPT_ARG_VAL, &opt_verbose, 1, 0}, {"list-apps", 'l', POPT_ARG_VAL, &opt_list_apps, 1, 0}, @@ -62,22 +64,23 @@ static void usage(FILE *ofp) fprintf(ofp, "usage : lttng [OPTION]\n"); fprintf(ofp, "\n"); fprintf(ofp, "Options:\n"); - fprintf(ofp, " -v, --verbose Verbose mode\n"); - fprintf(ofp, " -q, --quiet Quiet mode\n"); - fprintf(ofp, " --help Show help\n"); - fprintf(ofp, " --group NAME Unix tracing group name. (default: tracing)\n"); - fprintf(ofp, " --no-sessiond Don't spawn a session daemon.\n"); - fprintf(ofp, " --sessiond-path Session daemon full path\n"); + fprintf(ofp, " -v, --verbose Verbose mode\n"); + fprintf(ofp, " -q, --quiet Quiet mode\n"); + fprintf(ofp, " --help Show help\n"); + fprintf(ofp, " --group NAME Unix tracing group name. (default: tracing)\n"); + fprintf(ofp, " --no-sessiond Don't spawn a session daemon.\n"); + fprintf(ofp, " --sessiond-path Session daemon full path\n"); fprintf(ofp, "\n"); fprintf(ofp, "Session options:\n"); - fprintf(ofp, " --list-session List all available sessions\n"); + fprintf(ofp, " -c, --create-session NAME Create a new session\n"); + fprintf(ofp, " --list-session List all available sessions\n"); + //fprintf(ofp, " --session [NAME] Specify tracing session. If no NAME is given\n"); + //fprintf(ofp, " or option is ommited, a session will be created\n"); fprintf(ofp, "\n"); fprintf(ofp, "Tracing options:\n"); - //fprintf(ofp, " --session [NAME] Specify tracing session. If no NAME is given\n"); - //fprintf(ofp, " or option is ommited, a session will be created\n"); - //fprintf(ofp, " --kernel Enable kernel tracing\n"); - //fprintf(ofp, " --no-kernel Disable kernel tracing\n"); - fprintf(ofp, " -l, --list-apps List traceable UST applications\n"); + //fprintf(ofp, " --kernel Enable kernel tracing\n"); + //fprintf(ofp, " --no-kernel Disable kernel tracing\n"); + fprintf(ofp, " -l, --list-apps List traceable UST applications\n"); } /* -- 2.34.1