/* * Create a brand new session using name and url for destination. * * Returns LTTNG_OK on success or a negative error 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; if (name == NULL) { return -LTTNG_ERR_INVALID; } memset(&lsm, 0, sizeof(lsm)); lsm.cmd_type = LTTNG_CREATE_SESSION; copy_string(lsm.session.name, name, sizeof(lsm.session.name)); /* There should never be a data URL */ size = parse_str_urls_to_uri(url, NULL, &uris); if (size < 0) { return -LTTNG_ERR_INVALID; } lsm.u.uri.size = size; ret = ask_sessiond_varlen(&lsm, uris, sizeof(struct lttng_uri) * size, NULL); free(uris); return ret; }
/* * Set URL for a consumer for a session and domain. * * Return 0 on success, else a negative value. */ 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; if (handle == NULL || (control_url == NULL && data_url == NULL)) { return -LTTNG_ERR_INVALID; } memset(&lsm, 0, sizeof(lsm)); lsm.cmd_type = LTTNG_SET_CONSUMER_URI; copy_string(lsm.session.name, handle->session_name, sizeof(lsm.session.name)); copy_lttng_domain(&lsm.domain, &handle->domain); size = parse_str_urls_to_uri(control_url, data_url, &uris); if (size < 0) { return -LTTNG_ERR_INVALID; } lsm.u.uri.size = size; ret = ask_sessiond_varlen(&lsm, uris, sizeof(struct lttng_uri) * size, NULL); free(uris); return ret; }
/* * This is an extension of create session that is ONLY and SHOULD only be used * by the lttng command line program. It exists to avoid using URI parsing in * the lttng client. * * We need the date and time for the trace path subdirectory for the case where * the user does NOT define one using either -o or -U. Using the normal * lttng_create_session API call, we have no clue on the session daemon side if * the URL was generated automatically by the client or define by the user. * * So this function "wrapper" is hidden from the public API, takes the datetime * string and appends it if necessary to the URI subdirectory before sending it * to the session daemon. * * With this extra function, the lttng_create_session call behavior is not * changed and the timestamp is appended to the URI on the session daemon side * if necessary. */ int _lttng_create_session_ext(const char *name, const char *url, const char *datetime) { int ret; ssize_t size; struct lttcomm_session_msg lsm; struct lttng_uri *uris = NULL; if (name == NULL || datetime == NULL || url == NULL) { return -LTTNG_ERR_INVALID; } memset(&lsm, 0, sizeof(lsm)); lsm.cmd_type = LTTNG_CREATE_SESSION; copy_string(lsm.session.name, name, sizeof(lsm.session.name)); /* There should never be a data URL */ size = parse_str_urls_to_uri(url, NULL, &uris); if (size < 0) { ret = -LTTNG_ERR_INVALID; goto error; } lsm.u.uri.size = size; if (size > 0 && uris[0].dtype != LTTNG_DST_PATH && strlen(uris[0].subdir) == 0) { /* Don't append datetime if the name was automatically created. */ if (strncmp(name, DEFAULT_SESSION_NAME "-", strlen(DEFAULT_SESSION_NAME) + 1)) { ret = snprintf(uris[0].subdir, sizeof(uris[0].subdir), "%s-%s", name, datetime); } else { ret = snprintf(uris[0].subdir, sizeof(uris[0].subdir), "%s", name); } if (ret < 0) { PERROR("snprintf uri subdir"); ret = -LTTNG_ERR_FATAL; goto error; } } ret = ask_sessiond_varlen(&lsm, uris, sizeof(struct lttng_uri) * size, NULL); error: free(uris); return ret; }