diff --git a/src/xpdev/multisock.c b/src/xpdev/multisock.c index 3ca1b24d06b09ffe5b01648f89ad52399334e729..8586eb9f56eefd52a7fa4383a509fdfa86765128 100644 --- a/src/xpdev/multisock.c +++ b/src/xpdev/multisock.c @@ -42,7 +42,7 @@ void xpms_destroy(struct xpms_set *xpms_set) BOOL xpms_add(struct xpms_set *xpms_set, int domain, int type, int protocol, const char *addr, uint16_t port, const char *prot, - void *cbdata) + void (*sock_init)(SOCKET, void *), void(*bind_init)(BOOL), void *cbdata) { struct xpms_sockdef *new_socks; struct addrinfo hints; @@ -92,13 +92,27 @@ BOOL xpms_add(struct xpms_set *xpms_set, int domain, int type, FREE_AND_NULL(xpms_set->socks[xpms_set->sock_count].prot); continue; } + if(sock_init) + sock_init(cb_data); + if(bind_init) { + if(port < IPPORT_RESERVED && port > 0) + bind_init(FALSE); + } if(retry_bind(xpms_set->socks[xpms_set->sock_count].sock, cur->ai_addr, cur->ai_addrlen, xpms_set->retries, xpms_set->wait_secs, prot, xpms_set->lprintf)==-1) { closesocket(xpms_set->socks[xpms_set->sock_count].sock); FREE_AND_NULL(xpms_set->socks[xpms_set->sock_count].address); FREE_AND_NULL(xpms_set->socks[xpms_set->sock_count].prot); + if(bind_init) { + if(startup->telnet_port < IPPORT_RESERVED) + bind_init(TRUE); + } continue; } + if(bind_init) { + if(port < IPPORT_RESERVED && && port > 0) + bind_init(TRUE); + } if(!listen(xpms_set->socks[xpms_set->sock_count].sock, SOMAXCONN)) { if(xpms_set->lprintf) diff --git a/src/xpdev/multisock.h b/src/xpdev/multisock.h index 2441b979b1fcaebb599dd6edb7cbc5bb613b2f4a..b836b5d50afc264e619b93f6dda589b06b5592a5 100644 --- a/src/xpdev/multisock.h +++ b/src/xpdev/multisock.h @@ -30,7 +30,7 @@ struct xpms_set *xpms_create(unsigned int retries, unsigned int wait_secs, void xpms_destroy(struct xpms_set *xpms_set); BOOL xpms_add(struct xpms_set *xpms_set, int domain, int type, int protocol, const char *addr, uint16_t port, const char *prot, - void *cbdata); + void (*sock_init)(SOCKET, void *), void(*bind_init)(BOOL), void *cbdata); SOCKET xpms_accept(struct xpms_set *, struct sockaddr * addr, socklen_t * addrlen, unsigned int timeout, void **cb_data);