X-Git-Url: http://dolda2000.com/gitweb/?a=blobdiff_plain;f=daemon%2Fnet.c;h=2a8fdefe304015411ad4d5982a569e90dee59bda;hb=c26de38e9fc0ceb4f51af1085da37db42f4c4411;hp=dd630ccf246e034eb6a232ee3c0993df04b95c80;hpb=eaa35963176b3c0706ff6ed7c21ec680cc072a3a;p=doldaconnect.git diff --git a/daemon/net.c b/daemon/net.c index dd630cc..2a8fdef 100644 --- a/daemon/net.c +++ b/daemon/net.c @@ -253,12 +253,14 @@ void putsock(struct socket *sk) { sk->outbuf.d.f = buf->next; free(buf->data); + free(buf->addr); free(buf); } while((buf = sk->inbuf.d.f) != NULL) { sk->inbuf.d.f = buf->next; free(buf->data); + free(buf->addr); free(buf); } break; @@ -1112,6 +1114,29 @@ int sockgetremotename(struct socket *sk, struct sockaddr **namebuf, socklen_t *l } } +int sockgetremotename2(struct socket *sk, struct socket *sk2, struct sockaddr **namebuf, socklen_t *lenbuf) +{ + struct sockaddr *name1, *name2; + socklen_t len1, len2; + + if(sk->family != sk2->family) + { + flog(LOG_ERR, "using sockgetremotename2 with sockets of differing family: %i %i", sk->family, sk2->family); + return(-1); + } + if(sockgetremotename(sk, &name1, &len1)) + return(-1); + if(sockgetremotename(sk2, &name2, &len2)) { + free(name1); + return(-1); + } + sethostaddr(name1, name2); + free(name2); + *namebuf = name1; + *lenbuf = len1; + return(0); +} + int addreq(struct sockaddr *x, struct sockaddr *y) { struct sockaddr_un *u1, *u2; @@ -1135,6 +1160,7 @@ int addreq(struct sockaddr *x, struct sockaddr *y) if(n1->sin_addr.s_addr != n2->sin_addr.s_addr) return(0); break; +#ifdef HAVE_IPV6 case AF_INET6: s1 = (struct sockaddr_in6 *)x; s2 = (struct sockaddr_in6 *)y; if(s1->sin6_port != s2->sin6_port) @@ -1142,6 +1168,7 @@ int addreq(struct sockaddr *x, struct sockaddr *y) if(memcmp(s1->sin6_addr.s6_addr, s2->sin6_addr.s6_addr, sizeof(s1->sin6_addr.s6_addr))) return(0); break; +#endif } return(1); }