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