int recv_fd_uxst(int sock);
int send_fd_uxst(int fd, int send_fd);
-int sockpair_bind_receiver(struct receiver *rx, void (*handler)(int fd), char **errmsg);
+int sockpair_bind_receiver(struct receiver *rx, char **errmsg);
#endif /* _HAPROXY_PROTO_SOCKPAIR_H */
socklen_t sock_addrlen; /* socket address length, used by bind() */
int l3_addrlen; /* layer3 address length, used by hashes */
int (*addrcmp)(const struct sockaddr_storage *, const struct sockaddr_storage *); /* compare addresses (like memcmp) */
- int (*bind)(struct receiver *rx, void (*handler)(int fd), char **errmsg); /* bind a receiver */
+ int (*bind)(struct receiver *rx, char **errmsg); /* bind a receiver */
int (*get_src)(int fd, struct sockaddr *, socklen_t, int dir); /* syscall used to retrieve src addr */
int (*get_dst)(int fd, struct sockaddr *, socklen_t, int dir); /* syscall used to retrieve dst addr */
};
int sock_inet_is_foreign(int fd, sa_family_t family);
int sock_inet4_make_foreign(int fd);
int sock_inet6_make_foreign(int fd);
-int sock_inet_bind_receiver(struct receiver *rx, void (*handler)(int fd), char **errmsg);
+int sock_inet_bind_receiver(struct receiver *rx, char **errmsg);
#endif /* _HAPROXY_SOCK_INET_H */
extern struct proto_fam proto_fam_unix;
int sock_unix_addrcmp(const struct sockaddr_storage *a, const struct sockaddr_storage *b);
-int sock_unix_bind_receiver(struct receiver *rx, void (*handler)(int fd), char **errmsg);
+int sock_unix_bind_receiver(struct receiver *rx, char **errmsg);
#endif /* _HAPROXY_SOCK_UNIX_H */
fd_stop_recv(l->rx.fd);
}
-/* Binds receiver <rx>, and assigns <handler> and rx->owner as the callback and
- * context, respectively, with <tm> as the thread mask. Returns and error code
- * made of ERR_* bits on failure or ERR_NONE on success. On failure, an error
- * message may be passed into <errmsg>. Note that the binding address is only
- * an FD to receive the incoming FDs on. Thus by definition there is no real
- * "bind" operation, this only completes the receiver. Such FDs are not
+/* Binds receiver <rx>, and assigns rx->iocb and rx->owner as the callback
+ * and context, respectively, with ->bind_thread as the thread mask. Returns an
+ * error code made of ERR_* bits on failure or ERR_NONE on success. On failure,
+ * an error message may be passed into <errmsg>. Note that the binding address
+ * is only an FD to receive the incoming FDs on. Thus by definition there is no
+ * real "bind" operation, this only completes the receiver. Such FDs are not
* inherited upon reload.
*/
-int sockpair_bind_receiver(struct receiver *rx, void (*handler)(int fd), char **errmsg)
+int sockpair_bind_receiver(struct receiver *rx, char **errmsg)
{
int err;
rx->flags |= RX_F_BOUND;
- fd_insert(rx->fd, rx->owner, handler, thread_mask(rx->settings->bind_thread) & all_threads_mask);
+ fd_insert(rx->fd, rx->owner, rx->iocb, thread_mask(rx->settings->bind_thread) & all_threads_mask);
return err;
bind_return:
struct receiver *receiver;
char msg[100];
char *errmsg;
- void *handler;
int err, lerr;
err = 0;
list_for_each_entry(receiver, &proto->receivers, proto_list) {
listener = LIST_ELEM(receiver, struct listener *, rx);
- /* FIXME: horrible hack, we don't have a way to register
- * a handler when creating the receiver yet, so we still
- * have to take care of special cases here.
- */
- handler = listener->rx.iocb;
- lerr = proto->fam->bind(receiver, handler, &errmsg);
+ lerr = proto->fam->bind(receiver, &errmsg);
err |= lerr;
/* errors are reported if <verbose> is set or if they are fatal */
0;
}
-/* Binds receiver <rx>, and assigns <handler> and rx->owner as the callback and
+/* Binds receiver <rx>, and assigns rx->iocb and rx->owner as the callback and
* context, respectively. Returns and error code made of ERR_* bits on failure
* or ERR_NONE on success. On failure, an error message may be passed into
* <errmsg>.
*/
-int sock_inet_bind_receiver(struct receiver *rx, void (*handler)(int fd), char **errmsg)
+int sock_inet_bind_receiver(struct receiver *rx, char **errmsg)
{
int fd, err, ext;
/* copy listener addr because sometimes we need to switch family */
rx->fd = fd;
rx->flags |= RX_F_BOUND;
- fd_insert(fd, rx->owner, handler, thread_mask(rx->settings->bind_thread) & all_threads_mask);
+ fd_insert(fd, rx->owner, rx->iocb, thread_mask(rx->settings->bind_thread) & all_threads_mask);
/* for now, all regularly bound TCP listeners are exportable */
if (!(rx->flags & RX_F_INHERITED))
return 0;
}
-/* Binds receiver <rx>, and assigns <handler> and rx-> as the callback and
- * context, respectively, with <tm> as the thread mask. Returns and error code
- * made of ERR_* bits on failure or ERR_NONE on success. On failure, an error
- * message may be passed into <errmsg>.
+/* Binds receiver <rx>, and assigns rx->iocb and rx->owner as the callback and
+ * context, respectively, with ->bind_thread as the thread mask. Returns an
+ * error code made of ERR_* bits on failure or ERR_NONE on success. On failure,
+ * an error message may be passed into <errmsg>.
*/
-int sock_unix_bind_receiver(struct receiver *rx, void (*handler)(int fd), char **errmsg)
+int sock_unix_bind_receiver(struct receiver *rx, char **errmsg)
{
char tempname[MAXPATHLEN];
char backname[MAXPATHLEN];
rx->fd = fd;
rx->flags |= RX_F_BOUND;
- fd_insert(fd, rx->owner, handler, thread_mask(rx->settings->bind_thread) & all_threads_mask);
+ fd_insert(fd, rx->owner, rx->iocb, thread_mask(rx->settings->bind_thread) & all_threads_mask);
/* for now, all regularly bound TCP listeners are exportable */
if (!(rx->flags & RX_F_INHERITED))