X-Git-Url: http://git.dolda2000.com/gitweb/?a=blobdiff_plain;f=daemon%2Fnet.c;h=640da3beab3c8c6e832d40de4d91cec09ab89c52;hb=c7185019854aa79630ff944e191f59582c675d8b;hp=a017840cbe3304252db2d5abc453eb8c994278ab;hpb=c23acc61eddbe9b1fdc93cdf146c4f73bba77b97;p=doldaconnect.git diff --git a/daemon/net.c b/daemon/net.c index a017840..640da3b 100644 --- a/daemon/net.c +++ b/daemon/net.c @@ -33,7 +33,6 @@ #include #include #include -#include #ifdef HAVE_LINUX_SOCKIOS_H #include #endif @@ -593,18 +592,41 @@ struct socket *netcslisten(int type, struct sockaddr *name, socklen_t namelen, v errno = EOPNOTSUPP; return(NULL); } - /* I don't know if this is actually correct (it probably isn't), - * but since, at on least Linux systems, PF_* are specifically - * #define'd to their AF_* counterparts, it allows for a severely - * smoother implementation. If it breaks something on your - * platform, please tell me so. - */ if(confgetint("net", "mode") == 0) return(netcslistenlocal(type, name, namelen, func, data)); errno = EOPNOTSUPP; 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;