From 2e055483ff84c95be89ecb205692843961b7f36f Mon Sep 17 00:00:00 2001 From: Olivier Houchard Date: Mon, 27 May 2019 19:50:12 +0200 Subject: [PATCH] MINOR: connections: Add a new xprt method, add_xprt(). 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 | 1 + src/ssl_sock.c | 17 +++++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/include/types/connection.h b/include/types/connection.h index e51399485..74060b086 100644 --- a/include/types/connection.h +++ b/include/types/connection.h @@ -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 diff --git a/src/ssl_sock.c b/src/ssl_sock.c index 1d018aa02..fed53d5b0 100644 --- a/src/ssl_sock.c +++ b/src/ssl_sock.c @@ -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,