return true;
}
+static bool try_bind(int nfd, const sockaddr_t *sa, const char *type) {
+ if(!bind(nfd, &sa->sa, SALEN(sa->sa))) {
+ return true;
+ }
+
+ closesocket(nfd);
+ char *addrstr = sockaddr2hostname(sa);
+ logger(DEBUG_ALWAYS, LOG_ERR, "Can't bind to %s/%s: %s", addrstr, type, sockstrerror(sockerrno));
+ free(addrstr);
+ return false;
+}
+
int setup_listen_socket(const sockaddr_t *sa) {
int nfd;
- char *addrstr;
int option;
char *iface;
#endif
}
- if(bind(nfd, &sa->sa, SALEN(sa->sa))) {
- closesocket(nfd);
- addrstr = sockaddr2hostname(sa);
- logger(DEBUG_ALWAYS, LOG_ERR, "Can't bind to %s/tcp: %s", addrstr, sockstrerror(sockerrno));
- free(addrstr);
+ if(!try_bind(nfd, sa, "tcp")) {
return -1;
}
}
}
-
int setup_vpn_in_socket(const sockaddr_t *sa) {
int nfd;
- char *addrstr;
int option;
nfd = socket(sa->sa.sa_family, SOCK_DGRAM, IPPROTO_UDP);
return -1;
}
- if(bind(nfd, &sa->sa, SALEN(sa->sa))) {
- closesocket(nfd);
- addrstr = sockaddr2hostname(sa);
- logger(DEBUG_ALWAYS, LOG_ERR, "Can't bind to %s/udp: %s", addrstr, sockstrerror(sockerrno));
- free(addrstr);
+ if(!try_bind(nfd, sa, "udp")) {
return -1;
}