summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWilly Tarreau <w@1wt.eu>2020-09-25 19:00:01 +0200
committerWilly Tarreau <w@1wt.eu>2020-10-07 19:34:52 +0200
commitf4eb62954be9c3a3dcb79a94558968065dd96ada (patch)
tree028864496ce3aecab4e16276f1eeb87848894567
parent9b516d2f2ad813c05c6c47eeda49945cf05dd651 (diff)
downloadhaproxy-f4eb62954be9c3a3dcb79a94558968065dd96ada.tar.gz
MINOR: sock: provide a set of generic enable/disable functions
These will be used on receivers, to enable or disable receiving on a listener, which most of the time just consists in enabling/disabling the file descriptor. We have to take care of the existence of fd_updt to know if we may or not call fd_{want,stop}_recv() since it's not permitted in very early boot.
-rw-r--r--include/haproxy/sock.h2
-rw-r--r--src/sock.c18
2 files changed, 20 insertions, 0 deletions
diff --git a/include/haproxy/sock.h b/include/haproxy/sock.h
index 90dbc07ca..700023292 100644
--- a/include/haproxy/sock.h
+++ b/include/haproxy/sock.h
@@ -33,6 +33,8 @@
extern struct xfer_sock_list *xfer_sock_list;
int sock_create_server_socket(struct connection *conn);
+void sock_enable(struct receiver *rx);
+void sock_disable(struct receiver *rx);
int sock_get_src(int fd, struct sockaddr *sa, socklen_t salen, int dir);
int sock_get_dst(int fd, struct sockaddr *sa, socklen_t salen, int dir);
int sock_get_old_sockets(const char *unixsocket);
diff --git a/src/sock.c b/src/sock.c
index 3e414a8b9..c06a28149 100644
--- a/src/sock.c
+++ b/src/sock.c
@@ -55,6 +55,24 @@ int sock_create_server_socket(struct connection *conn)
return my_socketat(ns, conn->dst->ss_family, SOCK_STREAM, 0);
}
+/* Enables receiving on receiver <rx> once already bound. Does nothing in early
+ * boot (needs fd_updt).
+ */
+void sock_enable(struct receiver *rx)
+{
+ if (rx->flags & RX_F_BOUND && fd_updt)
+ fd_want_recv(rx->fd);
+}
+
+/* Disables receiving on receiver <rx> once already bound. Does nothing in early
+ * boot (needs fd_updt).
+ */
+void sock_disable(struct receiver *rx)
+{
+ if (rx->flags & RX_F_BOUND && fd_updt)
+ fd_stop_recv(rx->fd);
+}
+
/*
* Retrieves the source address for the socket <fd>, with <dir> indicating
* if we're a listener (=0) or an initiator (!=0). It returns 0 in case of