PERFORCE change 123560 for review
Fredrik Lindberg
fli at FreeBSD.org
Mon Jul 16 00:41:10 UTC 2007
http://perforce.freebsd.org/chv.cgi?CH=123560
Change 123560 by fli at fli_nexus on 2007/07/16 00:40:38
Locking and style fixes.
Affected files ...
.. //depot/projects/soc2007/fli-mdns_sd/mdnsd/stack_mdns.c#6 edit
Differences ...
==== //depot/projects/soc2007/fli-mdns_sd/mdnsd/stack_mdns.c#6 (text+ko) ====
@@ -132,7 +132,7 @@
mdns_bufpool_setsize(bp, md->md_maxpkgsz);
TAILQ_INIT(&md->md_pkglist);
-
+ RW_INIT(md, md_lock, NULL);
MDNS_INIT_SET(md, md_magic);
return (0);
error:
@@ -146,8 +146,6 @@
mdns_destroy(struct mdns *md)
{
- if (md == NULL)
- return;
MDNS_INIT_ASSERT(md, md_magic);
mdns_udp_close(md, PF_INET);
@@ -158,6 +156,7 @@
#endif
MDNS_INIT_UNSET(md, md_magic);
+ RW_DESTROY(md, md_lock);
}
/*
@@ -246,6 +245,8 @@
sock = socket(family, SOCK_DGRAM, 0);
if (sock < 0)
return (-1);
+
+ RW_WLOCK(md, md_lock);
error = fcntl(sock, F_SETFL, O_NONBLOCK);
if (error != 0)
goto out;
@@ -265,7 +266,8 @@
setsockopt(sock, IPPROTO_IP, IP_TTL, &so, sizeof(so));
so = 1;
- error = setsockopt(sock, IPPROTO_IP, IP_RECVIF, &so, sizeof(so));
+ error =
+ setsockopt(sock, IPPROTO_IP, IP_RECVIF, &so, sizeof(so));
if (error != 0)
goto out;
/* Ignore our own multicast packets */
@@ -281,8 +283,8 @@
if (error != 0)
goto out;
sinptr = (struct sockaddr_in *)&ifreq.ifr_addr;
- setsockopt(sock, IPPROTO_IP, IP_MULTICAST_IF, &sinptr->sin_addr.s_addr,
- sizeof(sinptr->sin_addr.s_addr));
+ setsockopt(sock, IPPROTO_IP, IP_MULTICAST_IF,
+ &sinptr->sin_addr.s_addr, sizeof(sinptr->sin_addr.s_addr));
if (error != 0)
goto out;
@@ -349,8 +351,10 @@
goto out;
}
+ RW_UNLOCK(md, md_lock);
return (0);
out:
+ RW_UNLOCK(md, md_lock);
close(sock);
return (-1);
}
@@ -366,12 +370,13 @@
int sock;
MDNS_INIT_ASSERT(md, md_magic);
+ RW_RLOCK(md, md_lock);
switch (family) {
case PF_INET:
if (!(md->md_flags & MDNS_UDP4)) {
errno = ENOTCONN;
- return (-1);
+ goto out;
}
sock = md->md_udp4;
md->md_flags &= ~MDNS_UDP4;
@@ -380,7 +385,7 @@
case PF_INET6:
if (!(md->md_flags & MDNS_UDP6)) {
errno = ENOTCONN;
- return (-1);
+ goto out;
}
sock = md->md_udp6;
md->md_flags &= ~MDNS_UDP6;
@@ -388,12 +393,16 @@
break;
default:
errno = EPROTONOSUPPORT;
- return (-1);
+ goto out;
}
mcast_leave(sock, md->md_ifindex, family);
close(sock);
+ RW_UNLOCK(md, md_lock);
return (0);
+out:
+ RW_UNLOCK(md, md_lock);
+ return (-1);
}
@@ -434,6 +443,7 @@
addrs++;
}
+ RW_WLOCK(md, md_lock);
sockp = malloc(sizeof(int) * addrs);
if (sockp == NULL)
goto out;
@@ -448,17 +458,17 @@
md->md_tcp4_sz = addrs;
i = 0;
for (ifa = ifap; ifa != NULL; ifa = ifa->ifa_next) {
- if (strncmp(ifa->ifa_name, md->md_ifnam, IFNAMSIZ) == 0)
- if (ifa->ifa_addr->sa_family == family) {
- sinptr = (struct sockaddr_in *)ifa->ifa_addr;
- sock = socket(PF_INET, SOCK_STREAM, 0);
-
- sin.sin_addr.s_addr = sinptr->sin_addr.s_addr;
- error = bind(sock, (const struct sockaddr *)&sin,
- sizeof(struct sockaddr_in));
- listen(sock, 10);
- md->md_tcp4[i++] = sock;
- }
+ if (ifa->ifa_addr->sa_family != family)
+ continue;
+ if (strncmp(ifa->ifa_name, md->md_ifnam, IFNAMSIZ) != 0)
+ continue;
+ sinptr = (struct sockaddr_in *)ifa->ifa_addr;
+ sock = socket(PF_INET, SOCK_STREAM, 0);
+ sin.sin_addr.s_addr = sinptr->sin_addr.s_addr;
+ error = bind(sock, (const struct sockaddr *)&sin,
+ sizeof(struct sockaddr_in));
+ listen(sock, 10);
+ md->md_tcp4[i++] = sock;
}
md->md_flags |= MDNS_TCP4;
break;
@@ -472,19 +482,18 @@
md->md_tcp6_sz = addrs;
i = 0;
for (ifa = ifap; ifa != NULL; ifa = ifa->ifa_next) {
- if (strncmp(ifa->ifa_name, md->md_ifnam, IFNAMSIZ) == 0)
- if (ifa->ifa_addr->sa_family == family) {
- sin6ptr = (struct sockaddr_in6 *)ifa->ifa_addr;
- sock = socket(PF_INET6, SOCK_STREAM, 0);
-
- memcpy(&sin6.sin6_addr, &sin6ptr->sin6_addr,
- sizeof(struct in6_addr));
-
- error = bind(sock, (const struct sockaddr *)&sin6,
- sizeof(struct sockaddr_in6));
- listen(sock, 10);
- md->md_tcp6[i++] = sock;
- }
+ if (ifa->ifa_addr->sa_family != family)
+ continue;
+ if (strncmp(ifa->ifa_name, md->md_ifnam, IFNAMSIZ) != 0)
+ continue;
+ sin6ptr = (struct sockaddr_in6 *)ifa->ifa_addr;
+ sock = socket(PF_INET6, SOCK_STREAM, 0);
+ memcpy(&sin6.sin6_addr, &sin6ptr->sin6_addr,
+ sizeof(struct in6_addr));
+ error = bind(sock, (const struct sockaddr *)&sin6,
+ sizeof(struct sockaddr_in6));
+ listen(sock, 10);
+ md->md_tcp6[i++] = sock;
}
md->md_flags |= MDNS_TCP6;
break;
@@ -494,9 +503,11 @@
goto out;
}
+ RW_UNLOCK(md, md_lock);
freeifaddrs(ifap);
return (0);
out:
+ RW_UNLOCK(md, md_lock);
freeifaddrs(ifap);
return (-1);
}
@@ -512,12 +523,13 @@
int i;
MDNS_INIT_ASSERT(md, md_magic);
+ RW_WLOCK(md, md_lock);
switch (family) {
case PF_INET:
if (!(md->md_flags & MDNS_TCP4)) {
errno = ENOTCONN;
- return (-1);
+ goto out;
}
for (i = 0; i < md->md_tcp4_sz; i++)
close(md->md_tcp4[i]);
@@ -529,7 +541,7 @@
case PF_INET6:
if (!(md->md_flags & MDNS_TCP6)) {
errno = ENOTCONN;
- return (-1);
+ goto out;
}
for (i = 0; i < md->md_tcp6_sz; i++)
close(md->md_tcp6[i]);
@@ -540,9 +552,13 @@
#endif
default:
errno = EPROTONOSUPPORT;
- return (-1);
+ goto out;
}
+ RW_UNLOCK(md, md_lock);
return (0);
+out:
+ RW_UNLOCK(md, md_lock);
+ return (-1);
}
/*
@@ -559,6 +575,7 @@
int *ret = NULL;
MDNS_INIT_ASSERT(md, md_magic);
+ RW_RLOCK(md, md_lock);
*len = 0;
switch (family) {
@@ -587,6 +604,7 @@
default:
errno = EPROTONOSUPPORT;
}
+ RW_UNLOCK(md, md_lock);
return (ret);
}
@@ -613,7 +631,8 @@
msg.msg_controllen = 0;
TAILQ_FOREACH(pkg, &pc->pc_head, p_list) {
- iov = malloc(sizeof(struct iovec) * MDNS_BUFHSZ(&pkg->p_buflist));
+ iov = malloc(sizeof(struct iovec) *
+ MDNS_BUFHSZ(&pkg->p_buflist));
i = 0;
TAILQ_FOREACH(buf, &MDNS_BUFHEAD(&pkg->p_buflist), b_next) {
iov[i].iov_base = MDNS_BUF(buf);
@@ -643,9 +662,10 @@
{
struct sockaddr *sa;
socklen_t salen;
- int sock;
+ int sock, error;
MDNS_INIT_ASSERT(md, md_magic);
+ RW_WLOCK(md, md_lock);
switch (family) {
case PF_INET:
@@ -662,10 +682,13 @@
#endif
default:
errno = EPROTONOSUPPORT;
- return (-1);
+ goto out;
}
- return (write_pkgchain(sock, pc, sa, salen));
+ error = write_pkgchain(sock, pc, sa, salen);
+ RW_UNLOCK(md, md_lock);
+out:
+ return (error);
}
@@ -680,9 +703,10 @@
mdns_send_unicast(struct mdns *md, struct mdns_pkgchain *pc,
struct sockaddr *sa, socklen_t salen)
{
- int sock;
+ int sock, error;
MDNS_INIT_ASSERT(md, md_magic);
+ RW_RLOCK(md, md_lock);
switch (sa->sa_family) {
case AF_INET:
@@ -695,10 +719,14 @@
#endif
default:
errno = EPROTONOSUPPORT;
- return (-1);
+ goto out;
}
- return (write_pkgchain(sock, pc, sa, salen));
+ error = write_pkgchain(sock, pc, sa, salen);
+ RW_UNLOCK(md, md_lock);
+ return (error);
+out:
+ return (-1);
}
/*
@@ -735,6 +763,7 @@
MDNS_INIT_ASSERT(md, md_magic);
MDNS_INIT_ASSERT(pc, pc_magic);
+ RW_RLOCK(md, md_lock);
switch (family) {
case PF_INET:
@@ -751,17 +780,17 @@
#endif
default:
errno = EPROTONOSUPPORT;
- return (-1);
+ goto error2;
}
pkg = pc->pc_pkg != NULL ? pc->pc_pkg : pkg_alloc(pc);
if (pkg == NULL)
- return (-1);
+ goto error2;
buf = MDNS_BUFH(&pkg->p_buflist) != NULL ? MDNS_BUFH(&pkg->p_buflist) :
mdns_buf_alloc(md->md_bp, &pkg->p_buflist, 0, MDNS_BP_HUGE);
if (buf == NULL)
- return (-1);
+ goto error2;
iov[0].iov_base = MDNS_BUF(buf);
iov[0].iov_len = MDNS_BUFSZ(buf);
@@ -793,9 +822,12 @@
}
#endif
+ RW_UNLOCK(md, md_lock);
return (pkg->p_len);
error:
mdns_buf_free(md->md_bp, &pkg->p_buflist, buf, 0);
+error2:
+ RW_UNLOCK(md, md_lock);
return (-1);
}
@@ -864,7 +896,8 @@
MDNS_INIT_ASSERT(pc, pc_magic);
TAILQ_FOREACH(pkg, &pc->pc_head, p_list) {
- iov = malloc(sizeof(struct iovec) * MDNS_BUFHSZ(&pkg->p_buflist));
+ iov = malloc(sizeof(struct iovec) *
+ MDNS_BUFHSZ(&pkg->p_buflist));
i = 0;
TAILQ_FOREACH(buf, &MDNS_BUFHEAD(&pkg->p_buflist), b_next) {
iov[i].iov_base = MDNS_BUF(buf);
@@ -894,15 +927,16 @@
MDNS_INIT_ASSERT(md, md_magic);
MDNS_INIT_ASSERT(pc, pc_magic);
+ RW_RLOCK(md, md_lock);
pkg = pc->pc_pkg != NULL ? pc->pc_pkg : pkg_alloc(pc);
if (pkg == NULL)
- return (-1);
+ goto error;
buf = MDNS_BUFH(&pkg->p_buflist) != NULL ? MDNS_BUFH(&pkg->p_buflist) :
mdns_buf_alloc(md->md_bp, &pkg->p_buflist, 0, MDNS_BP_HUGE);
if (buf == NULL)
- return (-1);
+ goto error;
for (;;) {
n = read(sock, MDNS_BUF(buf), MDNS_BUFSZ(buf));
@@ -910,12 +944,13 @@
break;
pkg->p_len += n;
MDNS_BUFLEN(buf) = n;
- if ((size_t)n < MDNS_BUFSZ(buf) || pkg->p_len >= MDNS_PKG_MAX_LEN)
+ if ((size_t)n < MDNS_BUFSZ(buf) ||
+ pkg->p_len >= MDNS_PKG_MAX_LEN)
break;
buf = mdns_buf_alloc(md->md_bp, &pkg->p_buflist, 0, 0);
if (buf == NULL)
- return (-1);
+ goto error;
}
/*
@@ -926,9 +961,13 @@
*/
buf = mdns_buf_merge(md->md_bp, &pkg->p_buflist, 0);
if (buf == NULL)
- return (-1);
-
+ goto error;
+
+ RW_UNLOCK(md, md_lock);
return (pkg->p_len);
+error:
+ RW_UNLOCK(md, md_lock);
+ return (-1);
}
/*
@@ -954,37 +993,38 @@
switch (family) {
case PF_INET: {
- struct ip_mreq mreq;
- struct ifreq ifreq;
+ struct ip_mreq mreq;
+ struct ifreq ifreq;
- error = inet_pton(family, MDNS_MCAST_INET, &mreq.imr_multiaddr);
- if (error != 1)
- goto error;
- if (if_indextoname(ifidx, ifreq.ifr_name) == NULL)
- goto error;
- error = ioctl(sock, SIOCGIFADDR, &ifreq);
- if (error < 0)
- goto error;
- memcpy(&mreq.imr_interface,
- &((struct sockaddr_in *)&ifreq.ifr_addr)->sin_addr,
- sizeof(struct in_addr));
- error = setsockopt(sock, IPPROTO_IP,
- (what ? IP_ADD_MEMBERSHIP : IP_DROP_MEMBERSHIP),
- &mreq, sizeof(struct ip_mreq));
+ error = inet_pton(family, MDNS_MCAST_INET,
+ &mreq.imr_multiaddr);
+ if (error != 1)
+ goto error;
+ if (if_indextoname(ifidx, ifreq.ifr_name) == NULL)
+ goto error;
+ error = ioctl(sock, SIOCGIFADDR, &ifreq);
+ if (error < 0)
+ goto error;
+ memcpy(&mreq.imr_interface,
+ &((struct sockaddr_in *)&ifreq.ifr_addr)->sin_addr,
+ sizeof(struct in_addr));
+ error = setsockopt(sock, IPPROTO_IP,
+ (what ? IP_ADD_MEMBERSHIP : IP_DROP_MEMBERSHIP),
+ &mreq, sizeof(struct ip_mreq));
}
break;
#ifdef INET6
case PF_INET6: {
- struct ipv6_mreq mreq6;
+ struct ipv6_mreq mreq6;
- error = inet_pton(family, MDNS_MCAST_INET6,
- &mreq6.ipv6mr_multiaddr);
- if (error != 1)
- goto error;
- mreq6.ipv6mr_interface = ifidx;
- error = setsockopt(sock, IPPROTO_IPV6,
- (what ? IPV6_JOIN_GROUP : IPV6_LEAVE_GROUP),
- &mreq6, sizeof(struct ipv6_mreq));
+ error = inet_pton(family, MDNS_MCAST_INET6,
+ &mreq6.ipv6mr_multiaddr);
+ if (error != 1)
+ goto error;
+ mreq6.ipv6mr_interface = ifidx;
+ error = setsockopt(sock, IPPROTO_IPV6,
+ (what ? IPV6_JOIN_GROUP : IPV6_LEAVE_GROUP),
+ &mreq6, sizeof(struct ipv6_mreq));
}
break;
#endif
More information about the p4-projects
mailing list