extern struct data_cb sess_conn_cb;
struct stream *stream_new(struct session *sess, enum obj_type *origin);
+int stream_create_from_conn(struct connection *conn);
/* perform minimal intializations, report 0 in case of error, 1 if OK. */
int init_stream();
struct connection *cli_conn;
struct proxy *p = l->bind_conf->frontend;
struct session *sess;
- struct stream *strm;
int ret;
goto out_free_sess;
session_count_new(sess);
- if ((strm = stream_new(sess, &cli_conn->obj_type)) == NULL)
+ if (stream_create_from_conn(cli_conn) < 0)
goto out_free_sess;
- task_wakeup(strm->task, TASK_WOKEN_INIT);
return 1;
out_free_sess:
static int conn_complete_session(struct connection *conn)
{
struct session *sess = conn->owner;
- struct stream *strm;
conn_clear_xprt_done_cb(conn);
goto fail;
session_count_new(sess);
- if ((strm = stream_new(sess, &conn->obj_type)) == NULL)
+ if (stream_create_from_conn(conn) < 0)
goto fail;
- task_wakeup(strm->task, TASK_WOKEN_INIT);
-
/* the embryonic session's task is not needed anymore */
task_delete(sess->task);
task_free(sess->task);
/* List of all use-service keywords. */
static struct list service_keywords = LIST_HEAD_INIT(service_keywords);
+
+/* Create a new stream for connection <conn>. Return < 0 on error. This is only
+ * valid right after the handshake, before the connection's data layer is
+ * initialized, because it relies on the session to be in conn->owner.
+ */
+int stream_create_from_conn(struct connection *conn)
+{
+ struct stream *strm;
+
+ strm = stream_new(conn->owner, &conn->obj_type);
+ if (strm == NULL)
+ return -1;
+
+ task_wakeup(strm->task, TASK_WOKEN_INIT);
+ return 0;
+}
+
/* This function is called from the session handler which detects the end of
* handshake, in order to complete initialization of a valid stream. It must be
* called with a completley initialized session. It returns the pointer to