MINOR: conn_stream: add cs_send() as a default snd_buf() function
This function is generic and is able to automatically transfer data from a
buffer to the conn_stream's tx buffer. It does this automatically if the mux
doesn't define another snd_buf() function.
It cannot yet be used as-is with the conn_stream's txbuf without risking to
lose data on close since conn_streams need to be orphaned for this.
diff --git a/include/proto/connection.h b/include/proto/connection.h
index 2111f67..580ae9a 100644
--- a/include/proto/connection.h
+++ b/include/proto/connection.h
@@ -46,6 +46,7 @@
/* conn_stream functions */
size_t __cs_recv(struct conn_stream *cs, struct buffer *buf, size_t count, int flags);
+size_t __cs_send(struct conn_stream *cs, struct buffer *buf, size_t count, int flags);
/* receive a PROXY protocol header over a connection */
int conn_recv_proxy(struct connection *conn, int flag);
@@ -314,6 +315,17 @@
return __cs_recv(cs, buf, count, flags);
}
+/* conn_stream send function. Uses mux->snd_buf() if defined, otherwise
+ * falls back to __cs_send().
+ */
+static inline size_t cs_send(struct conn_stream *cs, struct buffer *buf, size_t count, int flags)
+{
+ if (cs->conn->mux->snd_buf)
+ return cs->conn->mux->snd_buf(cs, buf, count, flags);
+ else
+ return __cs_send(cs, buf, count, flags);
+}
+
/***** Event manipulation primitives for use by DATA I/O callbacks *****/
/* The __conn_* versions do not propagate to lower layers and are only meant
* to be used by handlers called by the connection handler. The other ones
diff --git a/src/checks.c b/src/checks.c
index 31a3939..fc9c567 100644
--- a/src/checks.c
+++ b/src/checks.c
@@ -771,7 +771,7 @@
goto out;
if (b_data(&check->bo)) {
- conn->mux->snd_buf(cs, &check->bo, b_data(&check->bo), 0);
+ cs_send(cs, &check->bo, b_data(&check->bo), 0);
b_realign_if_empty(&check->bo);
if (conn->flags & CO_FL_ERROR || cs->flags & CS_FL_ERROR) {
chk_report_conn_err(check, errno, 0);
@@ -2699,7 +2699,7 @@
int ret;
__cs_want_send(cs);
- ret = conn->mux->snd_buf(cs, &check->bo, b_data(&check->bo), 0);
+ ret = cs_send(cs, &check->bo, b_data(&check->bo), 0);
b_realign_if_empty(&check->bo);
if (ret <= 0) {
diff --git a/src/connection.c b/src/connection.c
index 8826706..5d7f788 100644
--- a/src/connection.c
+++ b/src/connection.c
@@ -411,6 +411,17 @@
}
/*
+ * default cs send() : this one is used when mux->snd_buf == NULL. It puts up to
+ * <count> bytes from <buf> into cs->txbuf. The number of bytes transferred is
+ * returned. Here we don't care if cs->txbuf is allocated or not. If not, it
+ * will be swapped with <buf>.
+ */
+size_t __cs_send(struct conn_stream *cs, struct buffer *buf, size_t count, int flags)
+{
+ return b_xfer(&cs->txbuf, buf, count);
+}
+
+/*
* Get data length from tlv
*/
static int get_tlv_length(const struct tlv *src)
diff --git a/src/stream_interface.c b/src/stream_interface.c
index 024c2f5..1d67c31 100644
--- a/src/stream_interface.c
+++ b/src/stream_interface.c
@@ -721,7 +721,7 @@
if (oc->flags & CF_STREAMER)
send_flag |= CO_SFL_STREAMER;
- ret = conn->mux->snd_buf(cs, &oc->buf, co_data(oc), send_flag);
+ ret = cs_send(cs, &oc->buf, co_data(oc), send_flag);
if (ret > 0) {
did_send = 1;
oc->flags |= CF_WRITE_PARTIAL | CF_WROTE_DATA | CF_WRITE_EVENT;