X-Git-Url: http://dolda2000.com/gitweb/?a=blobdiff_plain;f=daemon%2Fnet.c;h=4fee86ce9f043c4d399383acf297eea6e49f33e8;hb=dd31fcfae3146c197893a3738da6cecc7bb08003;hp=a017840cbe3304252db2d5abc453eb8c994278ab;hpb=c23acc61eddbe9b1fdc93cdf146c4f73bba77b97;p=doldaconnect.git diff --git a/daemon/net.c b/daemon/net.c index a017840..4fee86c 100644 --- a/daemon/net.c +++ b/daemon/net.c @@ -33,7 +33,6 @@ #include #include #include -#include #ifdef HAVE_LINUX_SOCKIOS_H #include #endif @@ -605,6 +604,35 @@ struct socket *netcslisten(int type, struct sockaddr *name, socklen_t namelen, v return(NULL); } +struct socket *netcstcplisten(int port, int local, void (*func)(struct socket *, struct socket *, void *), void *data) +{ + struct sockaddr_in addr; +#ifdef HAVE_IPV6 + struct sockaddr_in6 addr6; +#endif + struct socket *(*csfunc)(int, struct sockaddr *, socklen_t, void (*)(struct socket *, struct socket *, void *), void *); + struct socket *ret; + + if(local) + csfunc = netcslistenlocal; + else + csfunc = netcslisten; +#ifdef HAVE_IPV6 + memset(&addr6, 0, sizeof(addr6)); + addr6.sin6_family = AF_INET6; + addr6.sin6_port = htons(port); + addr6.sin6_addr = in6addr_any; + if((ret = csfunc(SOCK_STREAM, (struct sockaddr *)&addr6, sizeof(addr6), func, data)) != NULL) + return(ret); + if((ret == NULL) && (errno != EAFNOSUPPORT)) + return(NULL); +#endif + memset(&addr, 0, sizeof(addr)); + addr.sin_family = AF_INET; + addr.sin_port = htons(port); + return(csfunc(SOCK_STREAM, (struct sockaddr *)&addr, sizeof(addr), func, data)); +} + struct socket *netcsdgram(struct sockaddr *name, socklen_t namelen) { struct socket *sk;