X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=src%2Flib%2Flttng-ctl%2Flttng-ctl.c;h=3b67923b9cae45ce088b02853c19d7b0e31799bc;hb=4f50c803f026f217d37588c46265b5c2fb9a1195;hp=6238d9a00749865e23e390c2ac87b9e8799a09af;hpb=025faf73cdb6942ebf437dc4c4f6631f0134b128;p=lttng-tools.git diff --git a/src/lib/lttng-ctl/lttng-ctl.c b/src/lib/lttng-ctl/lttng-ctl.c index 6238d9a00..3b67923b9 100644 --- a/src/lib/lttng-ctl/lttng-ctl.c +++ b/src/lib/lttng-ctl/lttng-ctl.c @@ -73,6 +73,33 @@ static int connected; int lttng_opt_quiet; int lttng_opt_verbose; +/* + * Compare two URL destination. + * + * Return 0 is equal else is not equal. + */ +static int compare_destination(struct lttng_uri *ctrl, struct lttng_uri *data) +{ + int ret; + + assert(ctrl); + assert(data); + + switch (ctrl->dtype) { + case LTTNG_DST_IPV4: + ret = strncmp(ctrl->dst.ipv4, data->dst.ipv4, sizeof(ctrl->dst.ipv4)); + break; + case LTTNG_DST_IPV6: + ret = strncmp(ctrl->dst.ipv6, data->dst.ipv6, sizeof(ctrl->dst.ipv6)); + break; + default: + ret = -1; + break; + } + + return ret; +} + static void set_default_url_attr(struct lttng_uri *uri, enum lttng_stream_type stype) { @@ -90,7 +117,6 @@ static void set_default_url_attr(struct lttng_uri *uri, static ssize_t parse_str_urls_to_uri(const char *ctrl_url, const char *data_url, struct lttng_uri **uris) { - int ret; unsigned int equal = 1, idx = 0; /* Add the "file://" size to the URL maximum size */ char url[PATH_MAX + 7]; @@ -115,6 +141,8 @@ static ssize_t parse_str_urls_to_uri(const char *ctrl_url, const char *data_url, * Check if first character is a '/' or else reject the URL. */ if (ctrl_url && ctrl_url[0] == '/') { + int ret; + ret = snprintf(url, sizeof(url), "file://%s", ctrl_url); if (ret < 0) { PERROR("snprintf file url"); @@ -157,6 +185,8 @@ static ssize_t parse_str_urls_to_uri(const char *ctrl_url, const char *data_url, } if (data_url) { + int ret; + /* We have to parse the data URL in this case */ size_data = uri_parse(data_url, &data_uris); if (size_data < 1) { @@ -168,6 +198,12 @@ static ssize_t parse_str_urls_to_uri(const char *ctrl_url, const char *data_url, } set_default_url_attr(&data_uris[0], LTTNG_STREAM_DATA); + + ret = compare_destination(&ctrl_uris[0], &data_uris[0]); + if (ret != 0) { + ERR("Control and data destination mismatch"); + goto error; + } } /* Compute total size */ @@ -183,10 +219,12 @@ static ssize_t parse_str_urls_to_uri(const char *ctrl_url, const char *data_url, /* It's possible the control URIs array contains more than one URI */ memcpy(tmp_uris, ctrl_uris, sizeof(struct lttng_uri) * size_ctrl); ++idx; + free(ctrl_uris); } if (data_uris) { memcpy(&tmp_uris[idx], data_uris, sizeof(struct lttng_uri)); + free(data_uris); } *uris = tmp_uris; @@ -414,7 +452,6 @@ error: */ static int set_session_daemon_path(void) { - int ret; int in_tgroup = 0; /* In tracing group */ uid_t uid; @@ -431,6 +468,8 @@ static int set_session_daemon_path(void) } if (uid != 0) { + int ret; + if (in_tgroup) { /* Tracing group */ ret = try_connect_sessiond(sessiond_sock_path); @@ -632,9 +671,7 @@ end: */ void lttng_destroy_handle(struct lttng_handle *handle) { - if (handle) { - free(handle); - } + free(handle); } /* @@ -841,8 +878,20 @@ int lttng_enable_event_with_filter(struct lttng_handle *handle, FILE *fmem; int ret = 0; - /* Safety check. */ - if (handle == NULL || !filter_expression) { + if (!filter_expression) { + /* + * Fall back to normal event enabling if no filter + * specified. + */ + return lttng_enable_event(handle, event, channel_name); + } + + /* + * Empty filter string will always be rejected by the parser + * anyway, so treat this corner-case early to eliminate + * lttng_fmemopen error for 0-byte allocation. + */ + if (handle == NULL || filter_expression[0] == '\0') { return -LTTNG_ERR_INVALID; } @@ -1125,6 +1174,7 @@ const char *lttng_strerror(int code) */ int lttng_create_session(const char *name, const char *url) { + int ret; ssize_t size; struct lttcomm_session_msg lsm; struct lttng_uri *uris = NULL; @@ -1146,8 +1196,11 @@ int lttng_create_session(const char *name, const char *url) lsm.u.uri.size = size; - return ask_sessiond_varlen(&lsm, uris, sizeof(struct lttng_uri) * size, + ret = ask_sessiond_varlen(&lsm, uris, sizeof(struct lttng_uri) * size, NULL); + + free(uris); + return ret; } /* @@ -1342,6 +1395,8 @@ void lttng_channel_set_default_attr(struct lttng_domain *domain, attr->subbuf_size = default_get_kernel_channel_subbuf_size(); attr->num_subbuf = DEFAULT_KERNEL_CHANNEL_SUBBUF_NUM; attr->output = DEFAULT_KERNEL_CHANNEL_OUTPUT; + attr->tracefile_size = DEFAULT_KERNEL_CHANNEL_TRACEFILE_SIZE; + attr->tracefile_count = DEFAULT_KERNEL_CHANNEL_TRACEFILE_COUNT; break; case LTTNG_DOMAIN_UST: #if 0 @@ -1356,6 +1411,8 @@ void lttng_channel_set_default_attr(struct lttng_domain *domain, attr->subbuf_size = default_get_ust_channel_subbuf_size(); attr->num_subbuf = DEFAULT_UST_CHANNEL_SUBBUF_NUM; attr->output = DEFAULT_UST_CHANNEL_OUTPUT; + attr->tracefile_size = DEFAULT_UST_CHANNEL_TRACEFILE_SIZE; + attr->tracefile_count = DEFAULT_UST_CHANNEL_TRACEFILE_COUNT; break; default: /* Default behavior: leave set to 0. */ @@ -1379,7 +1436,7 @@ int lttng_session_daemon_alive(void) return ret; } - if (strlen(sessiond_sock_path) == 0) { + if (*sessiond_sock_path == '\0') { /* * No socket path set. Weird error which means the constructor was not * called. @@ -1405,6 +1462,7 @@ int lttng_session_daemon_alive(void) int lttng_set_consumer_url(struct lttng_handle *handle, const char *control_url, const char *data_url) { + int ret; ssize_t size; struct lttcomm_session_msg lsm; struct lttng_uri *uris = NULL; @@ -1428,52 +1486,27 @@ int lttng_set_consumer_url(struct lttng_handle *handle, lsm.u.uri.size = size; - return ask_sessiond_varlen(&lsm, uris, sizeof(struct lttng_uri) * size, + ret = ask_sessiond_varlen(&lsm, uris, sizeof(struct lttng_uri) * size, NULL); + + free(uris); + return ret; } /* - * Enable consumer for a session and domain. - * - * Return 0 on success, else a negative value. + * [OBSELETE] */ int lttng_enable_consumer(struct lttng_handle *handle) { - struct lttcomm_session_msg lsm; - - if (handle == NULL) { - return -LTTNG_ERR_INVALID; - } - - lsm.cmd_type = LTTNG_ENABLE_CONSUMER; - - copy_string(lsm.session.name, handle->session_name, - sizeof(lsm.session.name)); - copy_lttng_domain(&lsm.domain, &handle->domain); - - return ask_sessiond(&lsm, NULL); + return -ENOSYS; } /* - * Disable consumer for a session and domain. - * - * Return 0 on success, else a negative value. + * [OBSELETE] */ int lttng_disable_consumer(struct lttng_handle *handle) { - struct lttcomm_session_msg lsm; - - if (handle == NULL) { - return -LTTNG_ERR_INVALID; - } - - lsm.cmd_type = LTTNG_DISABLE_CONSUMER; - - copy_string(lsm.session.name, handle->session_name, - sizeof(lsm.session.name)); - copy_lttng_domain(&lsm.domain, &handle->domain); - - return ask_sessiond(&lsm, NULL); + return -ENOSYS; } /* @@ -1484,7 +1517,6 @@ int lttng_disable_consumer(struct lttng_handle *handle) */ static int set_health_socket_path(void) { - int ret; int in_tgroup = 0; /* In tracing group */ uid_t uid; const char *home; @@ -1502,6 +1534,8 @@ static int set_health_socket_path(void) } if (uid != 0) { + int ret; + /* * With GNU C < 2.1, snprintf returns -1 if the target buffer is too small; * With GNU C >= 2.1, snprintf returns the required size (excluding closing null) @@ -1594,7 +1628,7 @@ int _lttng_create_session_ext(const char *name, const char *url, struct lttcomm_session_msg lsm; struct lttng_uri *uris = NULL; - if (name == NULL || datetime == NULL) { + if (name == NULL || datetime == NULL || url == NULL) { return -LTTNG_ERR_INVALID; } @@ -1606,7 +1640,8 @@ int _lttng_create_session_ext(const char *name, const char *url, /* There should never be a data URL */ size = parse_str_urls_to_uri(url, NULL, &uris); if (size < 0) { - return -LTTNG_ERR_INVALID; + ret = -LTTNG_ERR_INVALID; + goto error; } lsm.u.uri.size = size; @@ -1616,12 +1651,17 @@ int _lttng_create_session_ext(const char *name, const char *url, datetime); if (ret < 0) { PERROR("snprintf uri subdir"); - return -LTTNG_ERR_FATAL; + ret = -LTTNG_ERR_FATAL; + goto error; } } - return ask_sessiond_varlen(&lsm, uris, sizeof(struct lttng_uri) * size, + ret = ask_sessiond_varlen(&lsm, uris, sizeof(struct lttng_uri) * size, NULL); + +error: + free(uris); + return ret; } /*