1251881Speter/* $NetBSD: t_sockaddr_snprintf.c,v 1.1 2010/07/16 13:56:32 jmmv Exp $ */ 2251881Speter 3251881Speter/* 4251881Speter * Copyright (c) 2002, 2004, 2008, 2010 The NetBSD Foundation, Inc. 5251881Speter * All rights reserved. 6251881Speter * 7251881Speter * This code was contributed to The NetBSD Foundation by Christos Zoulas. 8251881Speter * 9251881Speter * Redistribution and use in source and binary forms, with or without 10251881Speter * modification, are permitted provided that the following conditions 11251881Speter * are met: 12251881Speter * 1. Redistributions of source code must retain the above copyright 13251881Speter * notice, this list of conditions and the following disclaimer. 14251881Speter * 2. Redistributions in binary form must reproduce the above copyright 15251881Speter * notice, this list of conditions and the following disclaimer in the 16251881Speter * documentation and/or other materials provided with the distribution. 17251881Speter * 18251881Speter * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 19251881Speter * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 20251881Speter * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 21251881Speter * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 22251881Speter * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 23251881Speter * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 24251881Speter * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 25251881Speter * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 26251881Speter * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 27251881Speter * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 28251881Speter * POSSIBILITY OF SUCH DAMAGE. 29251881Speter */ 30251881Speter 31251881Speter#include <sys/cdefs.h> 32251881Speter__COPYRIGHT("@(#) Copyright (c) 2008, 2010\ 33251881Speter The NetBSD Foundation, inc. All rights reserved."); 34251881Speter__RCSID("$NetBSD: t_sockaddr_snprintf.c,v 1.1 2010/07/16 13:56:32 jmmv Exp $"); 35251881Speter 36251881Speter#include <sys/socket.h> /* AF_ */ 37251881Speter#include <sys/un.h> /* sun */ 38251881Speter 39251881Speter#include <net/if_dl.h> /* sdl */ 40251881Speter#include <netatalk/at.h> /* sat */ 41251881Speter#include <netinet/in.h> /* sin/sin6 */ 42251881Speter 43251881Speter#include <string.h> 44251881Speter#include <util.h> 45251881Speter 46251881Speter#include <atf-c.h> 47251881Speter 48251881SpeterATF_TC(sockaddr_snprintf_in); 49251881SpeterATF_TC_HEAD(sockaddr_snprintf_in, tc) 50251881Speter{ 51251881Speter atf_tc_set_md_var(tc, "descr", 52251881Speter "Checks sockaddr_snprintf(3) with sockaddr_in"); 53251881Speter} 54251881SpeterATF_TC_BODY(sockaddr_snprintf_in, tc) 55251881Speter{ 56251881Speter char buf[1024]; 57251881Speter struct sockaddr_in sin4; 58251881Speter int i; 59251881Speter 60251881Speter memset(&sin4, 0, sizeof(sin4)); 61251881Speter sin4.sin_len = sizeof(sin4); 62251881Speter sin4.sin_family = AF_INET; 63251881Speter sin4.sin_port = ntohs(80); 64251881Speter sin4.sin_addr.s_addr = ntohl(INADDR_LOOPBACK); 65251881Speter i = sockaddr_snprintf(buf, sizeof(buf), "%f %l %p %a", 66251881Speter (struct sockaddr *)&sin4); 67251881Speter 68251881Speter ATF_REQUIRE_EQ_MSG(i, 17, "bad length for sin4"); 69251881Speter ATF_REQUIRE_STREQ(buf, "2 16 80 127.0.0.1"); 70251881Speter} 71251881Speter 72251881SpeterATF_TC(sockaddr_snprintf_in6); 73251881SpeterATF_TC_HEAD(sockaddr_snprintf_in6, tc) 74251881Speter{ 75251881Speter atf_tc_set_md_var(tc, "descr", 76251881Speter "Checks sockaddr_snprintf(3) with sockaddr_in6"); 77251881Speter} 78251881SpeterATF_TC_BODY(sockaddr_snprintf_in6, tc) 79251881Speter{ 80251881Speter#ifdef INET6 81251881Speter char buf[1024]; 82251881Speter struct sockaddr_in6 sin6; 83251881Speter int i; 84251881Speter 85251881Speter memset(&sin6, 0, sizeof(sin6)); 86251881Speter sin6.sin6_len = sizeof(sin6); 87251881Speter sin6.sin6_family = AF_INET6; 88251881Speter sin6.sin6_port = ntohs(80); 89251881Speter sin6.sin6_addr = in6addr_nodelocal_allnodes; 90251881Speter i = sockaddr_snprintf(buf, sizeof(buf), "%f %l %p %a", 91251881Speter (struct sockaddr *)&sin6); 92251881Speter 93251881Speter ATF_REQUIRE_EQ_MSG(i, 16, "bad length for sin6"); 94251881Speter ATF_REQUIRE_STREQ(buf, "24 28 80 ff01::1"); 95251881Speter#else 96251881Speter atf_tc_skip("Tests built with USE_INET6=no"); 97251881Speter#endif /* INET6 */ 98251881Speter} 99251881Speter 100251881SpeterATF_TC(sockaddr_snprintf_un); 101251881SpeterATF_TC_HEAD(sockaddr_snprintf_un, tc) 102251881Speter{ 103251881Speter atf_tc_set_md_var(tc, "descr", 104251881Speter "Checks sockaddr_snprintf(3) with sockaddr_un"); 105251881Speter} 106251881SpeterATF_TC_BODY(sockaddr_snprintf_un, tc) 107251881Speter{ 108251881Speter char buf[1024]; 109251881Speter struct sockaddr_un sun; 110251881Speter int i; 111251881Speter 112251881Speter memset(&sun, 0, sizeof(sun)); 113251881Speter sun.sun_len = sizeof(sun); 114251881Speter sun.sun_family = AF_UNIX; 115251881Speter strncpy(sun.sun_path, "/tmp/sock", sizeof(sun.sun_path)); 116251881Speter i = sockaddr_snprintf(buf, sizeof(buf), "%f %l %a", 117251881Speter (struct sockaddr *)&sun); 118251881Speter 119251881Speter ATF_REQUIRE_EQ_MSG(i, 15, "bad length for sun"); 120251881Speter ATF_REQUIRE_STREQ(buf, "1 106 /tmp/sock"); 121251881Speter} 122251881Speter 123251881SpeterATF_TC(sockaddr_snprintf_at); 124251881SpeterATF_TC_HEAD(sockaddr_snprintf_at, tc) 125251881Speter{ 126251881Speter atf_tc_set_md_var(tc, "descr", 127251881Speter "Checks sockaddr_snprintf(3) with sockaddr_at"); 128251881Speter} 129251881SpeterATF_TC_BODY(sockaddr_snprintf_at, tc) 130251881Speter{ 131251881Speter char buf[1024]; 132251881Speter struct sockaddr_at sat; 133251881Speter int i; 134251881Speter 135251881Speter memset(&sat, 0, sizeof(sat)); 136251881Speter sat.sat_len = sizeof(sat); 137251881Speter sat.sat_family = AF_APPLETALK; 138251881Speter sat.sat_addr.s_net = ntohs(101); 139251881Speter sat.sat_addr.s_node = 3; 140251881Speter i = sockaddr_snprintf(buf, sizeof(buf), "%f %l %a", 141251881Speter (struct sockaddr *)&sat); 142251881Speter 143251881Speter ATF_REQUIRE_EQ_MSG(i, 11, "bad length for sat"); 144251881Speter ATF_REQUIRE_STREQ(buf, "16 16 101.3"); 145251881Speter} 146251881Speter 147251881SpeterATF_TC(sockaddr_snprintf_dl); 148251881SpeterATF_TC_HEAD(sockaddr_snprintf_dl, tc) 149251881Speter{ 150251881Speter atf_tc_set_md_var(tc, "descr", 151251881Speter "Checks sockaddr_snprintf(3) with sockaddr_dl"); 152251881Speter} 153251881SpeterATF_TC_BODY(sockaddr_snprintf_dl, tc) 154251881Speter{ 155251881Speter char buf[1024]; 156251881Speter struct sockaddr_dl sdl; 157251881Speter int i; 158251881Speter 159251881Speter memset(&sdl, 0, sizeof(sdl)); 160251881Speter sdl.sdl_len = sizeof(sdl); 161251881Speter sdl.sdl_family = AF_LINK; 162251881Speter sdl.sdl_index = 0; 163251881Speter sdl.sdl_type = 0; 164251881Speter sdl.sdl_nlen = 0; 165251881Speter sdl.sdl_alen = 6; 166251881Speter sdl.sdl_slen = 0; 167251881Speter memcpy(sdl.sdl_data, "\01\02\03\04\05\06", 6); 168251881Speter i = sockaddr_snprintf(buf, sizeof(buf), "%f %l %a", 169251881Speter (struct sockaddr *)&sdl); 170251881Speter 171251881Speter ATF_REQUIRE_EQ_MSG(i, 17, "bad length for sdl"); 172251881Speter ATF_REQUIRE_STREQ(buf, "18 20 1.2.3.4.5.6"); 173251881Speter} 174251881Speter 175251881SpeterATF_TP_ADD_TCS(tp) 176251881Speter{ 177251881Speter 178251881Speter ATF_TP_ADD_TC(tp, sockaddr_snprintf_in); 179251881Speter ATF_TP_ADD_TC(tp, sockaddr_snprintf_in6); 180251881Speter ATF_TP_ADD_TC(tp, sockaddr_snprintf_un); 181251881Speter ATF_TP_ADD_TC(tp, sockaddr_snprintf_at); 182251881Speter ATF_TP_ADD_TC(tp, sockaddr_snprintf_dl); 183251881Speter 184251881Speter return atf_no_error(); 185251881Speter} 186251881Speter