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