diff --git a/daemon/Makefile b/daemon/Makefile index 547711297..5c63fe2e0 100644 --- a/daemon/Makefile +++ b/daemon/Makefile @@ -26,7 +26,7 @@ CPPFLAGS+= `dpkg-buildflags --get CPPFLAGS` LDFLAGS+= `dpkg-buildflags --get LDFLAGS` SRCS= main.c kernel.c poller.c aux.c control.c streambuf.c call.c control_udp.c redis.c \ - bencode.c cookie_cache.c + bencode.c cookie_cache.c udp_listener.c OBJS= $(SRCS:.c=.o) diff --git a/daemon/control_udp.c b/daemon/control_udp.c index a4e3482d9..eaecdc9a5 100644 --- a/daemon/control_udp.c +++ b/daemon/control_udp.c @@ -14,12 +14,9 @@ #include "aux.h" #include "log.h" #include "call.h" +#include "udp_listener.h" -static void control_udp_closed(int fd, void *p, uintptr_t x) { - abort(); -} - static void control_udp_incoming(int fd, void *p, uintptr_t x) { struct control_udp *u = p; int ret, len; @@ -154,36 +151,15 @@ out: } struct control_udp *control_udp_new(struct poller *p, struct in6_addr ip, u_int16_t port, struct callmaster *m) { - int fd; struct control_udp *c; - struct poller_item i; - struct sockaddr_in6 sin; const char *errptr; int erroff; if (!p || !m) return NULL; - fd = socket(AF_INET6, SOCK_DGRAM, 0); - if (fd == -1) - return NULL; - - nonblock(fd); - reuseaddr(fd); - ipv6only(fd, 0); - - ZERO(sin); - sin.sin6_family = AF_INET6; - sin.sin6_addr = ip; - sin.sin6_port = htons(port); - if (bind(fd, (struct sockaddr *) &sin, sizeof(sin))) - goto fail; - - c = obj_alloc0("control_udp", sizeof(*c), NULL); - c->fd = fd; - c->poller = p; c->callmaster = m; c->parse_re = pcre_compile( /* cookie cmd flags callid viabranch:5 */ @@ -206,20 +182,13 @@ struct control_udp *control_udp_new(struct poller *p, struct in6_addr ip, u_int1 cookie_cache_init(&c->cookie_cache); - ZERO(i); - i.fd = fd; - i.closed = control_udp_closed; - i.readable = control_udp_incoming; - i.obj = &c->obj; - if (poller_add_item(p, &i)) + if (udp_listener_init(&c->udp_listener, p, ip, port, control_udp_incoming, &c->obj)) goto fail2; return c; fail2: obj_put(c); -fail: - close(fd); return NULL; } diff --git a/daemon/control_udp.h b/daemon/control_udp.h index 92c343a8b..a4cb6a54a 100644 --- a/daemon/control_udp.h +++ b/daemon/control_udp.h @@ -12,6 +12,7 @@ #include "obj.h" #include "aux.h" #include "cookie_cache.h" +#include "udp_listener.h" @@ -46,11 +47,9 @@ struct callmaster; struct control_udp { struct obj obj; - int fd; - - struct poller *poller; struct callmaster *callmaster; struct cookie_cache cookie_cache; + struct udp_listener udp_listener; pcre *parse_re; pcre_extra *parse_ree; diff --git a/daemon/poller.h b/daemon/poller.h index a536df261..906262ca9 100644 --- a/daemon/poller.h +++ b/daemon/poller.h @@ -11,15 +11,17 @@ +typedef void (*poller_func_t)(int, void *, uintptr_t); + struct poller_item { int fd; struct obj *obj; uintptr_t uintp; - void (*readable)(int, void *, uintptr_t); - void (*writeable)(int, void *, uintptr_t); - void (*closed)(int, void *, uintptr_t); - void (*timer)(int, void *, uintptr_t); + poller_func_t readable; + poller_func_t writeable; + poller_func_t closed; + poller_func_t timer; }; struct poller;