xref: /netbsd-src/tests/lib/libc/net/t_getprotoent.c (revision 114f211aa15bbfb3a0f280d5e88277b8bd5e2c40)
1*114f211aSjoerg /* $NetBSD: t_getprotoent.c,v 1.2 2012/04/04 10:03:53 joerg Exp $ */
28a16de8dSjruoho 
38a16de8dSjruoho /*-
48a16de8dSjruoho  * Copyright (c) 2011 The NetBSD Foundation, Inc.
58a16de8dSjruoho  * All rights reserved.
68a16de8dSjruoho  *
78a16de8dSjruoho  * This code is derived from software contributed to The NetBSD Foundation
88a16de8dSjruoho  * by Jukka Ruohonen.
98a16de8dSjruoho  *
108a16de8dSjruoho  * Redistribution and use in source and binary forms, with or without
118a16de8dSjruoho  * modification, are permitted provided that the following conditions
128a16de8dSjruoho  * are met:
138a16de8dSjruoho  * 1. Redistributions of source code must retain the above copyright
148a16de8dSjruoho  *    notice, this list of conditions and the following disclaimer.
158a16de8dSjruoho  * 2. Redistributions in binary form must reproduce the above copyright
168a16de8dSjruoho  *    notice, this list of conditions and the following disclaimer in the
178a16de8dSjruoho  *    documentation and/or other materials provided with the distribution.
188a16de8dSjruoho  *
198a16de8dSjruoho  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
208a16de8dSjruoho  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
218a16de8dSjruoho  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
228a16de8dSjruoho  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
238a16de8dSjruoho  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
248a16de8dSjruoho  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
258a16de8dSjruoho  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
268a16de8dSjruoho  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
278a16de8dSjruoho  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
288a16de8dSjruoho  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
298a16de8dSjruoho  * POSSIBILITY OF SUCH DAMAGE.
308a16de8dSjruoho  */
318a16de8dSjruoho #include <sys/cdefs.h>
32*114f211aSjoerg __RCSID("$NetBSD: t_getprotoent.c,v 1.2 2012/04/04 10:03:53 joerg Exp $");
338a16de8dSjruoho 
348a16de8dSjruoho #include <atf-c.h>
358a16de8dSjruoho #include <netdb.h>
368a16de8dSjruoho #include <limits.h>
378a16de8dSjruoho #include <stdio.h>
388a16de8dSjruoho #include <string.h>
398a16de8dSjruoho 
408a16de8dSjruoho static const struct {
418a16de8dSjruoho 	const char *name;
428a16de8dSjruoho 	int	    number;
438a16de8dSjruoho } protos[] = {
448a16de8dSjruoho 
458a16de8dSjruoho 	{ "icmp", 1 },	{ "tcp", 6 },	{ "udp", 17 },	{ "gre", 47 },
468a16de8dSjruoho 	{ "esp", 50 },	{ "ah", 51 },	{ "sctp", 132},	{ "ipv6-icmp", 58 }
478a16de8dSjruoho };
488a16de8dSjruoho 
498a16de8dSjruoho ATF_TC(endprotoent_rewind);
ATF_TC_HEAD(endprotoent_rewind,tc)508a16de8dSjruoho ATF_TC_HEAD(endprotoent_rewind, tc)
518a16de8dSjruoho {
528a16de8dSjruoho 	atf_tc_set_md_var(tc, "descr", "Check that endprotoent(3) rewinds");
538a16de8dSjruoho }
548a16de8dSjruoho 
ATF_TC_BODY(endprotoent_rewind,tc)558a16de8dSjruoho ATF_TC_BODY(endprotoent_rewind, tc)
568a16de8dSjruoho {
578a16de8dSjruoho 	struct protoent *p;
588a16de8dSjruoho 	int i = 0;
598a16de8dSjruoho 
608a16de8dSjruoho 	setprotoent(0);
618a16de8dSjruoho 
628a16de8dSjruoho 	while ((p = getprotoent()) != NULL && i <= 10) {
638a16de8dSjruoho 		ATF_REQUIRE(p->p_proto == i);
648a16de8dSjruoho 		i++;
658a16de8dSjruoho 	}
668a16de8dSjruoho 
678a16de8dSjruoho 	i = 0;
688a16de8dSjruoho 	endprotoent();
698a16de8dSjruoho 
708a16de8dSjruoho 	while ((p = getprotoent()) != NULL && i <= 10) {
718a16de8dSjruoho 		ATF_REQUIRE(p->p_proto == i);
728a16de8dSjruoho 		i++;
738a16de8dSjruoho 	}
748a16de8dSjruoho 
758a16de8dSjruoho 	endprotoent();
768a16de8dSjruoho }
778a16de8dSjruoho 
788a16de8dSjruoho ATF_TC(getprotobyname_basic);
ATF_TC_HEAD(getprotobyname_basic,tc)798a16de8dSjruoho ATF_TC_HEAD(getprotobyname_basic, tc)
808a16de8dSjruoho {
818a16de8dSjruoho 	atf_tc_set_md_var(tc, "descr", "A naive test of getprotobyname(3)");
828a16de8dSjruoho }
838a16de8dSjruoho 
ATF_TC_BODY(getprotobyname_basic,tc)848a16de8dSjruoho ATF_TC_BODY(getprotobyname_basic, tc)
858a16de8dSjruoho {
868a16de8dSjruoho 	struct protoent *p;
878a16de8dSjruoho 	size_t i;
888a16de8dSjruoho 
898a16de8dSjruoho 	for (i = 0; i < __arraycount(protos); i++) {
908a16de8dSjruoho 
918a16de8dSjruoho 		p = getprotobyname(protos[i].name);
928a16de8dSjruoho 
938a16de8dSjruoho 		ATF_REQUIRE(p != NULL);
948a16de8dSjruoho 		ATF_REQUIRE(p->p_proto == protos[i].number);
958a16de8dSjruoho 		ATF_REQUIRE(strcmp(p->p_name, protos[i].name) == 0);
968a16de8dSjruoho 	}
978a16de8dSjruoho 
988a16de8dSjruoho 	endprotoent();
998a16de8dSjruoho }
1008a16de8dSjruoho 
1018a16de8dSjruoho ATF_TC(getprotobyname_err);
ATF_TC_HEAD(getprotobyname_err,tc)1028a16de8dSjruoho ATF_TC_HEAD(getprotobyname_err, tc)
1038a16de8dSjruoho {
1048a16de8dSjruoho 	atf_tc_set_md_var(tc, "descr", "Test EOF from getprotobyname(3)");
1058a16de8dSjruoho }
1068a16de8dSjruoho 
ATF_TC_BODY(getprotobyname_err,tc)1078a16de8dSjruoho ATF_TC_BODY(getprotobyname_err, tc)
1088a16de8dSjruoho {
1098a16de8dSjruoho 	static const char * name[] =
110*114f211aSjoerg 	    { "xxx", "yyy", "xyz", ".as.d}9x.._?!!#\xa4,\xa8^//&%%,",
1118a16de8dSjruoho 	      "0", "", "tCp", "uDp", "t c p", "tcp ", " tcp" };
1128a16de8dSjruoho 
1138a16de8dSjruoho 	size_t i;
1148a16de8dSjruoho 
1158a16de8dSjruoho 	for (i = 0; i < __arraycount(name); i++)
1168a16de8dSjruoho 		ATF_REQUIRE(getprotobyname(name[i]) == NULL);
1178a16de8dSjruoho 
1188a16de8dSjruoho 	endprotoent();
1198a16de8dSjruoho }
1208a16de8dSjruoho 
1218a16de8dSjruoho ATF_TC(getprotobynumber_basic);
ATF_TC_HEAD(getprotobynumber_basic,tc)1228a16de8dSjruoho ATF_TC_HEAD(getprotobynumber_basic, tc)
1238a16de8dSjruoho {
1248a16de8dSjruoho 	atf_tc_set_md_var(tc, "descr", "A naive test of getprotobynumber(3)");
1258a16de8dSjruoho }
1268a16de8dSjruoho 
ATF_TC_BODY(getprotobynumber_basic,tc)1278a16de8dSjruoho ATF_TC_BODY(getprotobynumber_basic, tc)
1288a16de8dSjruoho {
1298a16de8dSjruoho 	struct protoent *p;
1308a16de8dSjruoho 	size_t i;
1318a16de8dSjruoho 
1328a16de8dSjruoho 	/*
1338a16de8dSjruoho 	 * No ATF_CHECK() due static storage.
1348a16de8dSjruoho 	 */
1358a16de8dSjruoho 	for (i = 0; i < __arraycount(protos); i++) {
1368a16de8dSjruoho 
1378a16de8dSjruoho 		p = getprotobynumber(protos[i].number);
1388a16de8dSjruoho 
1398a16de8dSjruoho 		ATF_REQUIRE(p != NULL);
1408a16de8dSjruoho 		ATF_REQUIRE(p->p_proto == protos[i].number);
1418a16de8dSjruoho 		ATF_REQUIRE(strcmp(p->p_name, protos[i].name) == 0);
1428a16de8dSjruoho 	}
1438a16de8dSjruoho 
1448a16de8dSjruoho 	endprotoent();
1458a16de8dSjruoho }
1468a16de8dSjruoho 
1478a16de8dSjruoho ATF_TC(getprotobynumber_err);
ATF_TC_HEAD(getprotobynumber_err,tc)1488a16de8dSjruoho ATF_TC_HEAD(getprotobynumber_err, tc)
1498a16de8dSjruoho {
1508a16de8dSjruoho 	atf_tc_set_md_var(tc, "descr", "Test EOF from getprotobynumber(3)");
1518a16de8dSjruoho }
1528a16de8dSjruoho 
ATF_TC_BODY(getprotobynumber_err,tc)1538a16de8dSjruoho ATF_TC_BODY(getprotobynumber_err, tc)
1548a16de8dSjruoho {
1558a16de8dSjruoho 	static const int number[] = { -1, -99999, INT_MAX, 1000000000 };
1568a16de8dSjruoho 	size_t i;
1578a16de8dSjruoho 
1588a16de8dSjruoho 	for (i = 0; i < __arraycount(number); i++)
1598a16de8dSjruoho 		ATF_REQUIRE(getprotobynumber(number[i]) == NULL);
1608a16de8dSjruoho 
1618a16de8dSjruoho 	endprotoent();
1628a16de8dSjruoho }
1638a16de8dSjruoho 
1648a16de8dSjruoho ATF_TC(getprotoent_next);
ATF_TC_HEAD(getprotoent_next,tc)1658a16de8dSjruoho ATF_TC_HEAD(getprotoent_next, tc)
1668a16de8dSjruoho {
1678a16de8dSjruoho 	atf_tc_set_md_var(tc, "descr", "getprotoent(3) returns next line?");
1688a16de8dSjruoho }
1698a16de8dSjruoho 
ATF_TC_BODY(getprotoent_next,tc)1708a16de8dSjruoho ATF_TC_BODY(getprotoent_next, tc)
1718a16de8dSjruoho {
1728a16de8dSjruoho 	struct protoent *p;
1738a16de8dSjruoho 	int i = 0;
1748a16de8dSjruoho 
1758a16de8dSjruoho 	/*
1768a16de8dSjruoho 	 * The range [0, 60] is already reserved by IANA.
1778a16de8dSjruoho 	 */
1788a16de8dSjruoho 	while ((p = getprotoent()) != NULL && i <= 60) {
1798a16de8dSjruoho 		ATF_CHECK(p->p_proto == i);
1808a16de8dSjruoho 		i++;
1818a16de8dSjruoho 	}
1828a16de8dSjruoho 
1838a16de8dSjruoho 	endprotoent();
1848a16de8dSjruoho }
1858a16de8dSjruoho 
1868a16de8dSjruoho ATF_TC(setprotoent_rewind);
ATF_TC_HEAD(setprotoent_rewind,tc)1878a16de8dSjruoho ATF_TC_HEAD(setprotoent_rewind, tc)
1888a16de8dSjruoho {
1898a16de8dSjruoho 	atf_tc_set_md_var(tc, "descr", "Check that setprotoent(3) rewinds");
1908a16de8dSjruoho }
1918a16de8dSjruoho 
ATF_TC_BODY(setprotoent_rewind,tc)1928a16de8dSjruoho ATF_TC_BODY(setprotoent_rewind, tc)
1938a16de8dSjruoho {
1948a16de8dSjruoho 	struct protoent *p;
1958a16de8dSjruoho 
1968a16de8dSjruoho 	setprotoent(0);
1978a16de8dSjruoho 
1988a16de8dSjruoho 	p = getprotoent();
1998a16de8dSjruoho 	ATF_REQUIRE(p->p_proto == 0);
2008a16de8dSjruoho 
2018a16de8dSjruoho 	p = getprotoent();
2028a16de8dSjruoho 	ATF_REQUIRE(p->p_proto == 1);
2038a16de8dSjruoho 
2048a16de8dSjruoho 	p = getprotoent();
2058a16de8dSjruoho 	ATF_REQUIRE(p->p_proto == 2);
2068a16de8dSjruoho 
2078a16de8dSjruoho 	setprotoent(0);
2088a16de8dSjruoho 
2098a16de8dSjruoho 	p = getprotoent();
2108a16de8dSjruoho 	ATF_REQUIRE(p->p_proto == 0);
2118a16de8dSjruoho 
2128a16de8dSjruoho 	p = getprotoent();
2138a16de8dSjruoho 	ATF_REQUIRE(p->p_proto == 1);
2148a16de8dSjruoho 
2158a16de8dSjruoho 	p = getprotoent();
2168a16de8dSjruoho 	ATF_REQUIRE(p->p_proto == 2);
2178a16de8dSjruoho 
2188a16de8dSjruoho 	endprotoent();
2198a16de8dSjruoho }
2208a16de8dSjruoho 
ATF_TP_ADD_TCS(tp)2218a16de8dSjruoho ATF_TP_ADD_TCS(tp)
2228a16de8dSjruoho {
2238a16de8dSjruoho 
2248a16de8dSjruoho 	ATF_TP_ADD_TC(tp, getprotobyname_basic);
2258a16de8dSjruoho 	ATF_TP_ADD_TC(tp, getprotobyname_err);
2268a16de8dSjruoho 	ATF_TP_ADD_TC(tp, getprotobynumber_basic);
2278a16de8dSjruoho 	ATF_TP_ADD_TC(tp, getprotobynumber_err);
2288a16de8dSjruoho 	ATF_TP_ADD_TC(tp, endprotoent_rewind);
2298a16de8dSjruoho 	ATF_TP_ADD_TC(tp, getprotoent_next);
2308a16de8dSjruoho 	ATF_TP_ADD_TC(tp, setprotoent_rewind);
2318a16de8dSjruoho 
2328a16de8dSjruoho 	return atf_no_error();
2338a16de8dSjruoho }
234