]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: connections: Add a new xprt method, add_xprt().
authorOlivier Houchard <ohouchard@haproxy.com>
Mon, 27 May 2019 17:50:12 +0000 (19:50 +0200)
committerOlivier Houchard <cognet@ci0.org>
Wed, 5 Jun 2019 16:03:38 +0000 (18:03 +0200)
Add a new method to xprt_ops, add_xprt(), that changes the underlying
xprt to the one provided, and optionally provide the old one.

include/types/connection.h
src/ssl_sock.c

index e5139948559b7765b31449a5fb041ecc8bc0cb9d..74060b086e113392a5aa2cc9ba74aecfd172b7f1 100644 (file)
@@ -334,6 +334,7 @@ struct xprt_ops {
        int (*subscribe)(struct connection *conn, void *xprt_ctx, int event_type, void *param); /* Subscribe to events, such as "being able to send" */
        int (*unsubscribe)(struct connection *conn, void *xprt_ctx, int event_type, void *param); /* Unsubscribe to events */
        int (*remove_xprt)(struct connection *conn, void *xprt_ctx, void *toremove_ctx, const struct xprt_ops *newops, void *newctx); /* Remove an xprt from the connection, used by temporary xprt such as the handshake one */
+       int (*add_xprt)(struct connection *conn, void *xprt_ctx, void *toadd_ctx, const struct xprt_ops *toadd_ops, void **oldxprt_ctx, const struct xprt_ops **oldxprt_ops); /* Add a new XPRT as the new xprt, and return the old one */
 };
 
 /* mux_ops describes the mux operations, which are to be performed at the
index 1d018aa02089840450a9a6abaf797729c157f976..fed53d5b0610c3b0a7a6b72be4beefad2a592a26 100644 (file)
@@ -5630,6 +5630,22 @@ static int ssl_unsubscribe(struct connection *conn, void *xprt_ctx, int event_ty
        return 0;
 }
 
+/* Use the provided XPRT as an underlying XPRT, and provide the old one.
+ * Returns 0 on success, and non-zero on failure.
+ */
+static int ssl_add_xprt(struct connection *conn, void *xprt_ctx, void *toadd_ctx, const struct xprt_ops *toadd_ops, void **oldxprt_ctx, const struct xprt_ops **oldxprt_ops)
+{
+       struct ssl_sock_ctx *ctx = xprt_ctx;
+
+       if (oldxprt_ops != NULL)
+               *oldxprt_ops = ctx->xprt;
+       if (oldxprt_ctx != NULL)
+               *oldxprt_ctx = ctx->xprt_ctx;
+       ctx->xprt = toadd_ops;
+       ctx->xprt_ctx = toadd_ctx;
+       return 0;
+}
+
 /* Remove the specified xprt. If if it our underlying XPRT, remove it and
  * return 0, otherwise just call the remove_xprt method from the underlying
  * XPRT.
@@ -9842,6 +9858,7 @@ static struct xprt_ops ssl_sock = {
        .subscribe = ssl_subscribe,
        .unsubscribe = ssl_unsubscribe,
        .remove_xprt = ssl_remove_xprt,
+       .add_xprt = ssl_add_xprt,
        .rcv_pipe = NULL,
        .snd_pipe = NULL,
        .shutr    = NULL,