Module Name:    src
Committed By:   christos
Date:           Sun Oct 12 13:48:26 UTC 2014

Modified Files:
        src/tests/net/mcast: t_mcast.c

Log Message:
Add the simple unconnected tests too.


To generate a diff of this commit:
cvs rdiff -u -r1.1 -r1.2 src/tests/net/mcast/t_mcast.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/tests/net/mcast/t_mcast.c
diff -u src/tests/net/mcast/t_mcast.c:1.1 src/tests/net/mcast/t_mcast.c:1.2
--- src/tests/net/mcast/t_mcast.c:1.1	Sat Oct 11 19:04:42 2014
+++ src/tests/net/mcast/t_mcast.c	Sun Oct 12 09:48:25 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: t_mcast.c,v 1.1 2014/10/11 23:04:42 christos Exp $	*/
+/*	$NetBSD: t_mcast.c,v 1.2 2014/10/12 13:48:25 christos Exp $	*/
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -29,7 +29,7 @@
  * POSSIBILITY OF SUCH DAMAGE.
  */
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: t_mcast.c,v 1.1 2014/10/11 23:04:42 christos Exp $");
+__RCSID("$NetBSD: t_mcast.c,v 1.2 2014/10/12 13:48:25 christos Exp $");
 
 #include <sys/types.h>
 #include <sys/socket.h>
@@ -45,6 +45,7 @@ __RCSID("$NetBSD: t_mcast.c,v 1.1 2014/1
 #include <err.h>
 #include <errno.h>
 #include <poll.h>
+#include <stdbool.h>
 
 #ifndef TEST
 #include <atf-c.h>
@@ -125,6 +126,15 @@ allowv4mapped(int s, struct addrinfo *ai
 	return setsockopt(s, IPPROTO_IPV6, IPV6_V6ONLY, &zero, sizeof(zero));
 }
 
+static struct sockaddr_storage ss;
+static int
+connector(int fd, const struct sockaddr *sa, socklen_t slen)
+{
+	assert(sizeof(ss) > slen);
+	memcpy(&ss, sa, slen);
+	return 0;
+}
+
 static int
 getsocket(const char *host, const char *port,
     int (*f)(int, const struct sockaddr *, socklen_t))
@@ -156,7 +166,7 @@ getsocket(const char *host, const char *
 			cause = f == bind ? "bind" : "connect";
 			goto out;
 		}
-		if (f == bind && addmc(s, ai) == -1) {
+		if ((f == bind || f == connector) && addmc(s, ai) == -1) {
 			cause = "join group";
 			goto out;
 		}
@@ -173,20 +183,21 @@ out:
 }
 
 static void
-sender(const char *host, const char *port, size_t n)
+sender(const char *host, const char *port, size_t n, bool conn)
 {
 	int s;
 	ssize_t l;
 	size_t seq;
 	char buf[64];
 
-	s = getsocket(host, port, connect);
+	s = getsocket(host, port, conn ? connect : connector);
 	for (seq = 0; seq < n; seq++) {
 		time_t t = time(&t);
 		snprintf(buf, sizeof(buf), "%zu: %-24.24s", seq, ctime(&t));
 		if (debug)
 			printf("sending: %s\n", buf);
-		l = send(s, buf, sizeof(buf), 0);
+		l = conn ? send(s, buf, sizeof(buf), 0) :
+		    sendto(s, buf, sizeof(buf), 0, (void *)&ss, ss.ss_len);
 		if (l == -1)
 			ERRX(EXIT_FAILURE, "send (%s)", strerror(errno));
 		usleep(100);
@@ -194,21 +205,24 @@ sender(const char *host, const char *por
 }
 
 static void
-receiver(const char *host, const char *port, size_t n)
+receiver(const char *host, const char *port, size_t n, bool conn)
 {
 	int s;
 	ssize_t l;
 	size_t seq;
 	char buf[64];
 	struct pollfd pfd;
+	socklen_t slen;
 
-	s = getsocket(host, port, bind);
+	s = getsocket(host, port, conn ? bind : connector);
 	pfd.fd = s;
 	pfd.events = POLLIN;
 	for (seq = 0; seq < n; seq++) {
 		if (poll(&pfd, 1, 1000) == -1)
 			ERRX(EXIT_FAILURE, "poll (%s)", strerror(errno));
-		l = recv(s, buf, sizeof(buf), 0);
+		slen = ss.ss_len;
+		l = conn ? recv(s, buf, sizeof(buf), 0) :
+		    recvfrom(s, buf, sizeof(buf), 0, (void *)&ss, &slen);
 		if (l == -1)
 			ERRX(EXIT_FAILURE, "recv (%s)", strerror(errno));
 		if (debug)
@@ -217,17 +231,17 @@ receiver(const char *host, const char *p
 }
 
 static void
-run(const char *host, const char *port, size_t n)
+run(const char *host, const char *port, size_t n, bool conn)
 {
 	switch (fork()) {
 	case 0:
-		receiver(host, port, n);
+		receiver(host, port, n, conn);
 		return;
 	case -1:
 		ERRX(EXIT_FAILURE, "fork (%s)", strerror(errno));
 	default:
 		usleep(100);
-		sender(host, port, n);
+		sender(host, port, n, conn);
 		return;
 	}
 }
@@ -239,12 +253,14 @@ main(int argc, char *argv[])
 	const char *host, *port;
 	int c;
 	size_t n;
+	bool conn;
 
 	host = HOST_V4;
 	port = PORT_V4;
 	n = TOTAL;
+	conn = false;
 
-	while ((c = getopt(argc, argv, "46dmn:")) != -1)
+	while ((c = getopt(argc, argv, "46cdmn:")) != -1)
 		switch (c) {
 		case '4':
 			host = HOST_V4;
@@ -254,6 +270,9 @@ main(int argc, char *argv[])
 			host = HOST_V6;
 			port = PORT_V6;
 			break;
+		case 'c':
+			conn = true;
+			break;
 		case 'd':
 			debug++;
 			break;
@@ -265,54 +284,90 @@ main(int argc, char *argv[])
 			n = atoi(optarg);
 			break;
 		default:
-			fprintf(stderr, "Usage: %s [-dm46] [-n <tot>]",
+			fprintf(stderr, "Usage: %s [-cdm46] [-n <tot>]",
 			    getprogname());
 			return 1;
 		}
 
-	run(host, port, n);
+	run(host, port, n, conn);
 	return 0;
 }
 #else
 
-ATF_TC(inet4);
-ATF_TC_HEAD(inet4, tc)
+ATF_TC(conninet4);
+ATF_TC_HEAD(conninet4, tc)
+{
+	atf_tc_set_md_var(tc, "descr", "Checks connected multicast for ipv4");
+}
+
+ATF_TC_BODY(conninet4, tc)
+{
+	run(HOST_V4, PORT_V4, TOTAL, true);
+}
+
+ATF_TC(connmappedinet4);
+ATF_TC_HEAD(connmappedinet4, tc)
+{
+	atf_tc_set_md_var(tc, "descr", "Checks connected multicast for mapped ipv4");
+}
+
+ATF_TC_BODY(connmappedinet4, tc)
+{
+	run(HOST_V4MAPPED, PORT_V4MAPPED, TOTAL, true);
+}
+
+ATF_TC(conninet6);
+ATF_TC_HEAD(conninet6, tc)
+{
+	atf_tc_set_md_var(tc, "descr", "Checks connected multicast for ipv6");
+}
+
+ATF_TC_BODY(conninet6, tc)
+{
+	run(HOST_V6, PORT_V6, TOTAL, true);
+}
+
+ATF_TC(unconninet4);
+ATF_TC_HEAD(unconninet4, tc)
 {
-	atf_tc_set_md_var(tc, "descr", "Checks multicast for ipv4");
+	atf_tc_set_md_var(tc, "descr", "Checks unconnected multicast for ipv4");
 }
 
-ATF_TC_BODY(inet4, tc)
+ATF_TC_BODY(unconninet4, tc)
 {
-	run(HOST_V4, PORT_V4, TOTAL);
+	run(HOST_V4, PORT_V4, TOTAL, false);
 }
 
-ATF_TC(mappedinet4);
-ATF_TC_HEAD(mappedinet4, tc)
+ATF_TC(unconnmappedinet4);
+ATF_TC_HEAD(unconnmappedinet4, tc)
 {
-	atf_tc_set_md_var(tc, "descr", "Checks multicast for mapped ipv4");
+	atf_tc_set_md_var(tc, "descr", "Checks unconnected multicast for mapped ipv4");
 }
 
-ATF_TC_BODY(mappedinet4, tc)
+ATF_TC_BODY(unconnmappedinet4, tc)
 {
-	run(HOST_V4MAPPED, PORT_V4MAPPED, TOTAL);
+	run(HOST_V4MAPPED, PORT_V4MAPPED, TOTAL, false);
 }
 
-ATF_TC(inet6);
-ATF_TC_HEAD(inet6, tc)
+ATF_TC(unconninet6);
+ATF_TC_HEAD(unconninet6, tc)
 {
-	atf_tc_set_md_var(tc, "descr", "Checks multicast for ipv6");
+	atf_tc_set_md_var(tc, "descr", "Checks unconnected multicast for ipv6");
 }
 
-ATF_TC_BODY(inet6, tc)
+ATF_TC_BODY(unconninet6, tc)
 {
-	run(HOST_V6, PORT_V6, TOTAL);
+	run(HOST_V6, PORT_V6, TOTAL, false);
 }
 
 ATF_TP_ADD_TCS(tp)
 {
-        ATF_TP_ADD_TC(tp, inet4);
-        ATF_TP_ADD_TC(tp, mappedinet4);
-        ATF_TP_ADD_TC(tp, inet6);
+        ATF_TP_ADD_TC(tp, conninet4);
+        ATF_TP_ADD_TC(tp, connmappedinet4);
+        ATF_TP_ADD_TC(tp, conninet6);
+        ATF_TP_ADD_TC(tp, unconninet4);
+        ATF_TP_ADD_TC(tp, unconnmappedinet4);
+        ATF_TP_ADD_TC(tp, unconninet6);
 
 	return atf_no_error();
 }

Reply via email to