1*175c89d2Smsaitoh /* $NetBSD: t_sockaddr_snprintf.c,v 1.4 2022/11/07 08:34:30 msaitoh Exp $ */
2c505c442Sjmmv
3c505c442Sjmmv /*
4c505c442Sjmmv * Copyright (c) 2002, 2004, 2008, 2010 The NetBSD Foundation, Inc.
5c505c442Sjmmv * All rights reserved.
6c505c442Sjmmv *
7c505c442Sjmmv * This code was contributed to The NetBSD Foundation by Christos Zoulas.
8c505c442Sjmmv *
9c505c442Sjmmv * Redistribution and use in source and binary forms, with or without
10c505c442Sjmmv * modification, are permitted provided that the following conditions
11c505c442Sjmmv * are met:
12c505c442Sjmmv * 1. Redistributions of source code must retain the above copyright
13c505c442Sjmmv * notice, this list of conditions and the following disclaimer.
14c505c442Sjmmv * 2. Redistributions in binary form must reproduce the above copyright
15c505c442Sjmmv * notice, this list of conditions and the following disclaimer in the
16c505c442Sjmmv * documentation and/or other materials provided with the distribution.
17c505c442Sjmmv *
18c505c442Sjmmv * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
19c505c442Sjmmv * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
20c505c442Sjmmv * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
21c505c442Sjmmv * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
22c505c442Sjmmv * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23c505c442Sjmmv * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24c505c442Sjmmv * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25c505c442Sjmmv * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26c505c442Sjmmv * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27c505c442Sjmmv * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28c505c442Sjmmv * POSSIBILITY OF SUCH DAMAGE.
29c505c442Sjmmv */
30c505c442Sjmmv
31c505c442Sjmmv #include <sys/cdefs.h>
32c505c442Sjmmv __COPYRIGHT("@(#) Copyright (c) 2008, 2010\
33c505c442Sjmmv The NetBSD Foundation, inc. All rights reserved.");
34*175c89d2Smsaitoh __RCSID("$NetBSD: t_sockaddr_snprintf.c,v 1.4 2022/11/07 08:34:30 msaitoh Exp $");
35c505c442Sjmmv
36c505c442Sjmmv #include <sys/socket.h> /* AF_ */
37c505c442Sjmmv #include <sys/un.h> /* sun */
38c505c442Sjmmv
39c505c442Sjmmv #include <net/if_dl.h> /* sdl */
40c505c442Sjmmv #include <netatalk/at.h> /* sat */
41c505c442Sjmmv #include <netinet/in.h> /* sin/sin6 */
42c505c442Sjmmv
43c505c442Sjmmv #include <string.h>
44c505c442Sjmmv #include <util.h>
45c505c442Sjmmv
46c505c442Sjmmv #include <atf-c.h>
47c505c442Sjmmv
48c505c442Sjmmv ATF_TC(sockaddr_snprintf_in);
ATF_TC_HEAD(sockaddr_snprintf_in,tc)49c505c442Sjmmv ATF_TC_HEAD(sockaddr_snprintf_in, tc)
50c505c442Sjmmv {
51c505c442Sjmmv atf_tc_set_md_var(tc, "descr",
52c505c442Sjmmv "Checks sockaddr_snprintf(3) with sockaddr_in");
53c505c442Sjmmv }
ATF_TC_BODY(sockaddr_snprintf_in,tc)54c505c442Sjmmv ATF_TC_BODY(sockaddr_snprintf_in, tc)
55c505c442Sjmmv {
56c505c442Sjmmv char buf[1024];
57c505c442Sjmmv struct sockaddr_in sin4;
58c505c442Sjmmv int i;
59c505c442Sjmmv
60c505c442Sjmmv memset(&sin4, 0, sizeof(sin4));
61c505c442Sjmmv sin4.sin_len = sizeof(sin4);
62c505c442Sjmmv sin4.sin_family = AF_INET;
63c505c442Sjmmv sin4.sin_port = ntohs(80);
64c505c442Sjmmv sin4.sin_addr.s_addr = ntohl(INADDR_LOOPBACK);
65c505c442Sjmmv i = sockaddr_snprintf(buf, sizeof(buf), "%f %l %p %a",
66c505c442Sjmmv (struct sockaddr *)&sin4);
67c505c442Sjmmv
68c505c442Sjmmv ATF_REQUIRE_EQ_MSG(i, 17, "bad length for sin4");
69c505c442Sjmmv ATF_REQUIRE_STREQ(buf, "2 16 80 127.0.0.1");
70c505c442Sjmmv }
71c505c442Sjmmv
72c505c442Sjmmv ATF_TC(sockaddr_snprintf_in6);
ATF_TC_HEAD(sockaddr_snprintf_in6,tc)73c505c442Sjmmv ATF_TC_HEAD(sockaddr_snprintf_in6, tc)
74c505c442Sjmmv {
75c505c442Sjmmv atf_tc_set_md_var(tc, "descr",
76c505c442Sjmmv "Checks sockaddr_snprintf(3) with sockaddr_in6");
77c505c442Sjmmv }
ATF_TC_BODY(sockaddr_snprintf_in6,tc)78c505c442Sjmmv ATF_TC_BODY(sockaddr_snprintf_in6, tc)
79c505c442Sjmmv {
80c505c442Sjmmv #ifdef INET6
81c505c442Sjmmv char buf[1024];
82c505c442Sjmmv struct sockaddr_in6 sin6;
83c505c442Sjmmv int i;
84c505c442Sjmmv
85c505c442Sjmmv memset(&sin6, 0, sizeof(sin6));
86c505c442Sjmmv sin6.sin6_len = sizeof(sin6);
87c505c442Sjmmv sin6.sin6_family = AF_INET6;
88c505c442Sjmmv sin6.sin6_port = ntohs(80);
89c505c442Sjmmv sin6.sin6_addr = in6addr_nodelocal_allnodes;
90c505c442Sjmmv i = sockaddr_snprintf(buf, sizeof(buf), "%f %l %p %a",
91c505c442Sjmmv (struct sockaddr *)&sin6);
92c505c442Sjmmv
93c505c442Sjmmv ATF_REQUIRE_EQ_MSG(i, 16, "bad length for sin6");
94c505c442Sjmmv ATF_REQUIRE_STREQ(buf, "24 28 80 ff01::1");
95c505c442Sjmmv #else
96c505c442Sjmmv atf_tc_skip("Tests built with USE_INET6=no");
97c505c442Sjmmv #endif /* INET6 */
98c505c442Sjmmv }
99c505c442Sjmmv
100c505c442Sjmmv ATF_TC(sockaddr_snprintf_un);
ATF_TC_HEAD(sockaddr_snprintf_un,tc)101c505c442Sjmmv ATF_TC_HEAD(sockaddr_snprintf_un, tc)
102c505c442Sjmmv {
103c505c442Sjmmv atf_tc_set_md_var(tc, "descr",
104c505c442Sjmmv "Checks sockaddr_snprintf(3) with sockaddr_un");
105c505c442Sjmmv }
ATF_TC_BODY(sockaddr_snprintf_un,tc)106c505c442Sjmmv ATF_TC_BODY(sockaddr_snprintf_un, tc)
107c505c442Sjmmv {
108c505c442Sjmmv char buf[1024];
109c505c442Sjmmv struct sockaddr_un sun;
110c505c442Sjmmv int i;
111c505c442Sjmmv
112c505c442Sjmmv memset(&sun, 0, sizeof(sun));
113c505c442Sjmmv sun.sun_len = sizeof(sun);
114c505c442Sjmmv sun.sun_family = AF_UNIX;
115c505c442Sjmmv strncpy(sun.sun_path, "/tmp/sock", sizeof(sun.sun_path));
116c505c442Sjmmv i = sockaddr_snprintf(buf, sizeof(buf), "%f %l %a",
117c505c442Sjmmv (struct sockaddr *)&sun);
118c505c442Sjmmv
119c505c442Sjmmv ATF_REQUIRE_EQ_MSG(i, 15, "bad length for sun");
120c505c442Sjmmv ATF_REQUIRE_STREQ(buf, "1 106 /tmp/sock");
121c505c442Sjmmv }
122c505c442Sjmmv
123c505c442Sjmmv ATF_TC(sockaddr_snprintf_at);
ATF_TC_HEAD(sockaddr_snprintf_at,tc)124c505c442Sjmmv ATF_TC_HEAD(sockaddr_snprintf_at, tc)
125c505c442Sjmmv {
126c505c442Sjmmv atf_tc_set_md_var(tc, "descr",
127c505c442Sjmmv "Checks sockaddr_snprintf(3) with sockaddr_at");
128c505c442Sjmmv }
ATF_TC_BODY(sockaddr_snprintf_at,tc)129c505c442Sjmmv ATF_TC_BODY(sockaddr_snprintf_at, tc)
130c505c442Sjmmv {
131c505c442Sjmmv char buf[1024];
132c505c442Sjmmv struct sockaddr_at sat;
133c505c442Sjmmv int i;
134c505c442Sjmmv
135c505c442Sjmmv memset(&sat, 0, sizeof(sat));
136c505c442Sjmmv sat.sat_len = sizeof(sat);
137c505c442Sjmmv sat.sat_family = AF_APPLETALK;
138c505c442Sjmmv sat.sat_addr.s_net = ntohs(101);
139c505c442Sjmmv sat.sat_addr.s_node = 3;
140c505c442Sjmmv i = sockaddr_snprintf(buf, sizeof(buf), "%f %l %a",
141c505c442Sjmmv (struct sockaddr *)&sat);
142c505c442Sjmmv
143c505c442Sjmmv ATF_REQUIRE_EQ_MSG(i, 11, "bad length for sat");
144c505c442Sjmmv ATF_REQUIRE_STREQ(buf, "16 16 101.3");
145c505c442Sjmmv }
146c505c442Sjmmv
147c505c442Sjmmv ATF_TC(sockaddr_snprintf_dl);
ATF_TC_HEAD(sockaddr_snprintf_dl,tc)148c505c442Sjmmv ATF_TC_HEAD(sockaddr_snprintf_dl, tc)
149c505c442Sjmmv {
150c505c442Sjmmv atf_tc_set_md_var(tc, "descr",
151c505c442Sjmmv "Checks sockaddr_snprintf(3) with sockaddr_dl");
152c505c442Sjmmv }
ATF_TC_BODY(sockaddr_snprintf_dl,tc)153c505c442Sjmmv ATF_TC_BODY(sockaddr_snprintf_dl, tc)
154c505c442Sjmmv {
155c505c442Sjmmv char buf[1024];
156c505c442Sjmmv struct sockaddr_dl sdl;
157c505c442Sjmmv int i;
158c505c442Sjmmv
159c505c442Sjmmv memset(&sdl, 0, sizeof(sdl));
160c505c442Sjmmv sdl.sdl_len = sizeof(sdl);
161c505c442Sjmmv sdl.sdl_family = AF_LINK;
162c505c442Sjmmv sdl.sdl_index = 0;
163c505c442Sjmmv sdl.sdl_type = 0;
164c505c442Sjmmv sdl.sdl_nlen = 0;
165c505c442Sjmmv sdl.sdl_alen = 6;
166c505c442Sjmmv sdl.sdl_slen = 0;
167c505c442Sjmmv memcpy(sdl.sdl_data, "\01\02\03\04\05\06", 6);
168c505c442Sjmmv i = sockaddr_snprintf(buf, sizeof(buf), "%f %l %a",
169c505c442Sjmmv (struct sockaddr *)&sdl);
170c505c442Sjmmv
171c505c442Sjmmv ATF_REQUIRE_EQ_MSG(i, 17, "bad length for sdl");
172*175c89d2Smsaitoh ATF_REQUIRE_STREQ(buf, "18 32 1.2.3.4.5.6");
173c505c442Sjmmv }
174c505c442Sjmmv
ATF_TP_ADD_TCS(tp)175c505c442Sjmmv ATF_TP_ADD_TCS(tp)
176c505c442Sjmmv {
177c505c442Sjmmv
178c505c442Sjmmv ATF_TP_ADD_TC(tp, sockaddr_snprintf_in);
179c505c442Sjmmv ATF_TP_ADD_TC(tp, sockaddr_snprintf_in6);
180c505c442Sjmmv ATF_TP_ADD_TC(tp, sockaddr_snprintf_un);
181c505c442Sjmmv ATF_TP_ADD_TC(tp, sockaddr_snprintf_at);
182c505c442Sjmmv ATF_TP_ADD_TC(tp, sockaddr_snprintf_dl);
183c505c442Sjmmv
184c505c442Sjmmv return atf_no_error();
185c505c442Sjmmv }
186