From: Willy Tarreau Date: Mon, 20 Aug 2012 12:02:10 +0000 (+0200) Subject: MEDIUM: stream-interface: add a snd_buf() callback to sock_ops X-Git-Tag: v1.5-dev12~87 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=fae4499e36377e825977cd74d3bd319014e0c7f7;p=thirdparty%2Fhaproxy.git MEDIUM: stream-interface: add a snd_buf() callback to sock_ops This callback is used to send data from the buffer to the socket. It is the old write_loop() call of the data layer which is used both by the ->write() callback and the ->chk_snd() function. The reason for having it as a pointer is that it's the only remaining part which causes the write and chk_snd() functions to be different between raw and ssl. --- diff --git a/include/proto/connection.h b/include/proto/connection.h index 2ecdfd3c5a..07568aaefa 100644 --- a/include/proto/connection.h +++ b/include/proto/connection.h @@ -37,6 +37,16 @@ static inline void conn_data_close(struct connection *conn) conn->data->close(conn); } +/* Calls the snd_buf() function of the data layer if any, otherwise + * returns 0. + */ +static inline int conn_data_snd_buf(struct connection *conn) +{ + if (!conn->data->snd_buf) + return 0; + return conn->data->snd_buf(conn); +} + /* set polling depending on the change between the CURR part of the * flags and the new flags in connection C. The connection flags are * updated with the new flags at the end of the operation. Only the bits diff --git a/include/types/stream_interface.h b/include/types/stream_interface.h index 6fbf94d04f..e181d570c4 100644 --- a/include/types/stream_interface.h +++ b/include/types/stream_interface.h @@ -117,7 +117,7 @@ struct sock_ops { void (*read)(struct connection *conn); /* read callback after poll() */ void (*write)(struct connection *conn); /* write callback after poll() */ void (*close)(struct connection *); /* close the data channel on the connection */ - + int (*snd_buf)(struct connection *conn); /* callback used to send a buffer contents */ }; /* A stream interface has 3 parts : diff --git a/src/sock_raw.c b/src/sock_raw.c index c426e995b5..f5aadcd18b 100644 --- a/src/sock_raw.c +++ b/src/sock_raw.c @@ -452,8 +452,10 @@ static void sock_raw_read(struct connection *conn) * This function is called to send buffer data to a stream socket. * It returns -1 in case of unrecoverable error, otherwise zero. */ -static int sock_raw_write_loop(struct stream_interface *si, struct buffer *b) +static int sock_raw_write_loop(struct connection *conn) { + struct stream_interface *si = container_of(conn, struct stream_interface, conn); + struct buffer *b = si->ob; int write_poll = MAX_WRITE_POLL_LOOPS; int ret, max; @@ -610,7 +612,7 @@ static void sock_raw_write(struct connection *conn) if (b->flags & BF_SHUTW) return; - if (sock_raw_write_loop(si, b) < 0) + if (conn_data_snd_buf(conn) < 0) goto out_error; /* OK all done */ @@ -700,7 +702,7 @@ static void sock_raw_chk_snd(struct stream_interface *si) (fdtab[si_fd(si)].ev & FD_POLL_OUT))) /* we'll be called anyway */ return; - if (sock_raw_write_loop(si, ob) < 0) { + if (conn_data_snd_buf(&si->conn) < 0) { /* Write error on the file descriptor. We mark the FD as STERROR so * that we don't use it anymore and we notify the task. */ @@ -780,6 +782,7 @@ struct sock_ops sock_raw = { .chk_snd = sock_raw_chk_snd, .read = sock_raw_read, .write = sock_raw_write, + .snd_buf = sock_raw_write_loop, .close = NULL, };