-static void set_default_url_attr(struct lttng_uri *uri,
- enum lttng_stream_type stype)
-{
- uri->stype = stype;
- if (uri->dtype != LTTNG_DST_PATH && uri->port == 0) {
- uri->port = (stype == LTTNG_STREAM_CONTROL) ?
- DEFAULT_NETWORK_CONTROL_PORT : DEFAULT_NETWORK_DATA_PORT;
- }
-}
-
-/*
- * Parse a string URL and creates URI(s) returning the size of the populated
- * array.
- */
-static ssize_t parse_str_urls_to_uri(const char *ctrl_url, const char *data_url,
- struct lttng_uri **uris)
-{
- unsigned int equal = 1, idx = 0;
- /* Add the "file://" size to the URL maximum size */
- char url[PATH_MAX + 7];
- ssize_t size_ctrl = 0, size_data = 0, size;
- struct lttng_uri *ctrl_uris = NULL, *data_uris = NULL;
- struct lttng_uri *tmp_uris = NULL;
-
- /* No URL(s) is allowed. This means that the consumer will be disabled. */
- if (ctrl_url == NULL && data_url == NULL) {
- return 0;
- }
-
- /* Check if URLs are equal and if so, only use the control URL */
- if (ctrl_url && data_url) {
- equal = !strcmp(ctrl_url, data_url);
- }
-
- /*
- * Since we allow the str_url to be a full local filesystem path, we are
- * going to create a valid file:// URL if it's the case.
- *
- * 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");
- goto parse_error;
- }
- ctrl_url = url;
- }
-
- /* Parse the control URL if there is one */
- if (ctrl_url) {
- size_ctrl = uri_parse(ctrl_url, &ctrl_uris);
- if (size_ctrl < 1) {
- ERR("Unable to parse the URL %s", ctrl_url);
- goto parse_error;
- }
-
- /* At this point, we know there is at least one URI in the array */
- set_default_url_attr(&ctrl_uris[0], LTTNG_STREAM_CONTROL);
-
- if (ctrl_uris[0].dtype == LTTNG_DST_PATH && data_url) {
- ERR("Can not have a data URL when destination is file://");
- goto error;
- }
-
- /* URL are not equal but the control URL uses a net:// protocol */
- if (size_ctrl == 2) {
- if (!equal) {
- ERR("Control URL uses the net:// protocol and the data URL is "
- "different. Not allowed.");
- goto error;
- } else {
- set_default_url_attr(&ctrl_uris[1], LTTNG_STREAM_DATA);
- /*
- * The data_url and ctrl_url are equal and the ctrl_url
- * contains a net:// protocol so we just skip the data part.
- */
- data_url = NULL;
- }
- }
- }
-
- if (data_url) {
- /* We have to parse the data URL in this case */
- size_data = uri_parse(data_url, &data_uris);
- if (size_data < 1) {
- ERR("Unable to parse the URL %s", data_url);
- goto error;
- } else if (size_data == 2) {
- ERR("Data URL can not be set with the net[4|6]:// protocol");
- goto error;
- }
-
- set_default_url_attr(&data_uris[0], LTTNG_STREAM_DATA);
- }
-
- /* Compute total size */
- size = size_ctrl + size_data;
-
- tmp_uris = zmalloc(sizeof(struct lttng_uri) * size);
- if (tmp_uris == NULL) {
- PERROR("zmalloc uris");
- goto error;
- }
-
- if (ctrl_uris) {
- /* 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;
-
- return size;
-
-error:
- free(ctrl_uris);
- free(data_uris);
- free(tmp_uris);
-parse_error:
- return -1;
-}
-