1*0a6a1f1dSLionel Sambuc /* $NetBSD: t_bind.c,v 1.3 2015/04/05 23:28:10 rtr Exp $ */
2*0a6a1f1dSLionel Sambuc /*
3*0a6a1f1dSLionel Sambuc * Copyright (c) 2015 The NetBSD Foundation, Inc.
4*0a6a1f1dSLionel Sambuc * All rights reserved.
5*0a6a1f1dSLionel Sambuc *
6*0a6a1f1dSLionel Sambuc * Redistribution and use in source and binary forms, with or without
7*0a6a1f1dSLionel Sambuc * modification, are permitted provided that the following conditions
8*0a6a1f1dSLionel Sambuc * are met:
9*0a6a1f1dSLionel Sambuc * 1. Redistributions of source code must retain the above copyright
10*0a6a1f1dSLionel Sambuc * notice, this list of conditions and the following disclaimer.
11*0a6a1f1dSLionel Sambuc * 2. Redistributions in binary form must reproduce the above copyright
12*0a6a1f1dSLionel Sambuc * notice, this list of conditions and the following disclaimer in the
13*0a6a1f1dSLionel Sambuc * documentation and/or other materials provided with the distribution.
14*0a6a1f1dSLionel Sambuc *
15*0a6a1f1dSLionel Sambuc * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND
16*0a6a1f1dSLionel Sambuc * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
17*0a6a1f1dSLionel Sambuc * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18*0a6a1f1dSLionel Sambuc * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19*0a6a1f1dSLionel Sambuc * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY
20*0a6a1f1dSLionel Sambuc * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21*0a6a1f1dSLionel Sambuc * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
22*0a6a1f1dSLionel Sambuc * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23*0a6a1f1dSLionel Sambuc * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
24*0a6a1f1dSLionel Sambuc * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
25*0a6a1f1dSLionel Sambuc * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
26*0a6a1f1dSLionel Sambuc * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27*0a6a1f1dSLionel Sambuc */
28*0a6a1f1dSLionel Sambuc
29*0a6a1f1dSLionel Sambuc #include <errno.h>
30*0a6a1f1dSLionel Sambuc #include <stdlib.h>
31*0a6a1f1dSLionel Sambuc #include <string.h>
32*0a6a1f1dSLionel Sambuc
33*0a6a1f1dSLionel Sambuc #include <unistd.h>
34*0a6a1f1dSLionel Sambuc
35*0a6a1f1dSLionel Sambuc #include <sys/socket.h>
36*0a6a1f1dSLionel Sambuc #include <arpa/inet.h>
37*0a6a1f1dSLionel Sambuc #include <netinet/in.h>
38*0a6a1f1dSLionel Sambuc
39*0a6a1f1dSLionel Sambuc #include <atf-c.h>
40*0a6a1f1dSLionel Sambuc
41*0a6a1f1dSLionel Sambuc ATF_TC(bind_foreign_family);
42*0a6a1f1dSLionel Sambuc
ATF_TC_HEAD(bind_foreign_family,tc)43*0a6a1f1dSLionel Sambuc ATF_TC_HEAD(bind_foreign_family, tc)
44*0a6a1f1dSLionel Sambuc {
45*0a6a1f1dSLionel Sambuc atf_tc_set_md_var(tc, "descr", "Checks that binding a socket "
46*0a6a1f1dSLionel Sambuc "with a different address family fails");
47*0a6a1f1dSLionel Sambuc }
48*0a6a1f1dSLionel Sambuc
ATF_TC_BODY(bind_foreign_family,tc)49*0a6a1f1dSLionel Sambuc ATF_TC_BODY(bind_foreign_family, tc)
50*0a6a1f1dSLionel Sambuc {
51*0a6a1f1dSLionel Sambuc struct sockaddr_in addr;
52*0a6a1f1dSLionel Sambuc
53*0a6a1f1dSLionel Sambuc /* addr.sin_family = AF_UNSPEC = 0 */
54*0a6a1f1dSLionel Sambuc memset(&addr, 0, sizeof(addr));
55*0a6a1f1dSLionel Sambuc
56*0a6a1f1dSLionel Sambuc /*
57*0a6a1f1dSLionel Sambuc * it is not necessary to initialize sin_{addr,port} since
58*0a6a1f1dSLionel Sambuc * those structure members shall not be accessed if bind
59*0a6a1f1dSLionel Sambuc * fails correctly.
60*0a6a1f1dSLionel Sambuc */
61*0a6a1f1dSLionel Sambuc
62*0a6a1f1dSLionel Sambuc int sock = socket(AF_LOCAL, SOCK_STREAM, 0);
63*0a6a1f1dSLionel Sambuc ATF_REQUIRE(sock != -1);
64*0a6a1f1dSLionel Sambuc
65*0a6a1f1dSLionel Sambuc /* should fail but currently doesn't */
66*0a6a1f1dSLionel Sambuc ATF_REQUIRE(-1 == bind(sock, (struct sockaddr *)&addr, sizeof(addr)));
67*0a6a1f1dSLionel Sambuc ATF_REQUIRE(EAFNOSUPPORT == errno);
68*0a6a1f1dSLionel Sambuc
69*0a6a1f1dSLionel Sambuc close(sock);
70*0a6a1f1dSLionel Sambuc }
71*0a6a1f1dSLionel Sambuc
ATF_TP_ADD_TCS(tp)72*0a6a1f1dSLionel Sambuc ATF_TP_ADD_TCS(tp)
73*0a6a1f1dSLionel Sambuc {
74*0a6a1f1dSLionel Sambuc
75*0a6a1f1dSLionel Sambuc ATF_TP_ADD_TC(tp, bind_foreign_family);
76*0a6a1f1dSLionel Sambuc
77*0a6a1f1dSLionel Sambuc return atf_no_error();
78*0a6a1f1dSLionel Sambuc }
79