diff --git a/include/proto/stream_interface.h b/include/proto/stream_interface.h index 632300a9e..efdb1c48b 100644 --- a/include/proto/stream_interface.h +++ b/include/proto/stream_interface.h @@ -189,6 +189,13 @@ static inline int si_connect(struct stream_interface *si) return si_ctrl(si)->connect(si); } +/* Calls the close() function of the data layer if any */ +static inline void si_data_close(struct stream_interface *si) +{ + if (si->conn.data->close) + si->conn.data->close(&si->conn); +} + #endif /* _PROTO_STREAM_INTERFACE_H */ /* diff --git a/include/types/stream_interface.h b/include/types/stream_interface.h index 2afefb5eb..8e9e64b11 100644 --- a/include/types/stream_interface.h +++ b/include/types/stream_interface.h @@ -132,7 +132,9 @@ struct sock_ops { void (*chk_rcv)(struct stream_interface *); /* chk_rcv function */ void (*chk_snd)(struct stream_interface *); /* chk_snd function */ int (*read)(int fd); /* read callback after poll() */ - int (*write)(int fd); /* wrtie callback after poll() */ + int (*write)(int fd); /* write callback after poll() */ + void (*close)(struct connection *); /* close the data channel on the connection */ + }; /* A stream interface has 3 parts : diff --git a/src/sock_raw.c b/src/sock_raw.c index 1205b2e49..213d46972 100644 --- a/src/sock_raw.c +++ b/src/sock_raw.c @@ -1088,6 +1088,7 @@ struct sock_ops sock_raw = { .chk_snd = sock_raw_chk_snd, .read = sock_raw_read, .write = sock_raw_write, + .close = NULL, }; /* diff --git a/src/stream_interface.c b/src/stream_interface.c index 1005eafa1..c2f7b94f4 100644 --- a/src/stream_interface.c +++ b/src/stream_interface.c @@ -49,6 +49,7 @@ struct sock_ops stream_int_embedded = { .chk_snd = stream_int_chk_snd, .read = NULL, .write = NULL, + .close = NULL, }; /* socket operations for external tasks */ @@ -60,6 +61,7 @@ struct sock_ops stream_int_task = { .chk_snd = stream_int_chk_snd, .read = NULL, .write = NULL, + .close = NULL, }; /*