diff --git a/include/proto/proto_uxst.h b/include/proto/proto_uxst.h index 9422ea7c2..8e796ecd1 100644 --- a/include/proto/proto_uxst.h +++ b/include/proto/proto_uxst.h @@ -27,6 +27,7 @@ #include void uxst_add_listener(struct listener *listener); +int uxst_pause_listener(struct listener *l); int uxst_get_src(int fd, struct sockaddr *sa, socklen_t salen, int dir); int uxst_get_dst(int fd, struct sockaddr *sa, socklen_t salen, int dir); diff --git a/src/proto_uxst.c b/src/proto_uxst.c index 409c65906..adc1b4660 100644 --- a/src/proto_uxst.c +++ b/src/proto_uxst.c @@ -68,6 +68,7 @@ static struct protocol proto_unix = { .disable_all = disable_all_listeners, .get_src = uxst_get_src, .get_dst = uxst_get_dst, + .pause = uxst_pause_listener, .listeners = LIST_HEAD_INIT(proto_unix.listeners), .nb_listeners = 0, }; @@ -373,6 +374,20 @@ void uxst_add_listener(struct listener *listener) proto_unix.nb_listeners++; } +/* Pause a listener. Returns < 0 in case of failure, 0 if the listener + * was totally stopped, or > 0 if correctly paused. Nothing is done for + * plain unix sockets since currently it's the new process which handles + * the renaming. Abstract sockets are completely unbound. + */ +int uxst_pause_listener(struct listener *l) +{ + if (((struct sockaddr_un *)&l->addr)->sun_path[0]) + return 1; + + unbind_listener(l); + return 0; +} + /* * This function initiates a UNIX connection establishment to the target assigned