+ if (name) {
+ ret = lttng_strncpy(new_session->name, name, sizeof(new_session->name));
+ if (ret) {
+ ret_code = LTTNG_ERR_SESSION_INVALID_CHAR;
+ goto error;
+ }
+ ret = validate_name(name);
+ if (ret < 0) {
+ ret_code = LTTNG_ERR_SESSION_INVALID_CHAR;
+ goto error;
+ }
+ } else {
+ int i = 0;
+ bool found_name = false;
+ char datetime[16];
+ struct tm *timeinfo;
+
+ timeinfo = localtime(&new_session->creation_time);
+ if (!timeinfo) {
+ ret_code = LTTNG_ERR_SESSION_FAIL;
+ goto error;
+ }
+ strftime(datetime, sizeof(datetime), "%Y%m%d-%H%M%S", timeinfo);
+ for (i = 0; i < INT_MAX; i++) {
+ struct ltt_session *clashing_session;
+
+ if (i == 0) {
+ ret = snprintf(new_session->name,
+ sizeof(new_session->name),
+ "%s-%s",
+ DEFAULT_SESSION_NAME,
+ datetime);
+ } else {
+ ret = snprintf(new_session->name,
+ sizeof(new_session->name),
+ "%s%d-%s",
+ DEFAULT_SESSION_NAME, i,
+ datetime);
+ }
+ if (ret == -1 || ret >= sizeof(new_session->name)) {
+ /*
+ * Null-terminate in case the name is used
+ * in logging statements.
+ */
+ new_session->name[sizeof(new_session->name) - 1] = '\0';
+ ret_code = LTTNG_ERR_SESSION_FAIL;
+ goto error;
+ }
+
+ clashing_session =
+ session_find_by_name(new_session->name);
+ session_put(clashing_session);
+ if (!clashing_session) {
+ found_name = true;
+ break;
+ }
+ }
+ if (found_name) {
+ DBG("Generated session name \"%s\"", new_session->name);
+ new_session->has_auto_generated_name = true;
+ } else {
+ ERR("Failed to auto-generate a session name");
+ ret_code = LTTNG_ERR_SESSION_FAIL;
+ goto error;
+ }
+ }
+