1*cf84ac9aSAndroid Build Coastguard Worker /*
2*cf84ac9aSAndroid Build Coastguard Worker * Check decoding of sockaddr structures
3*cf84ac9aSAndroid Build Coastguard Worker *
4*cf84ac9aSAndroid Build Coastguard Worker * Copyright (c) 2016 Dmitry V. Levin <[email protected]>
5*cf84ac9aSAndroid Build Coastguard Worker * Copyright (c) 2016-2018 The strace developers.
6*cf84ac9aSAndroid Build Coastguard Worker * All rights reserved.
7*cf84ac9aSAndroid Build Coastguard Worker *
8*cf84ac9aSAndroid Build Coastguard Worker * Redistribution and use in source and binary forms, with or without
9*cf84ac9aSAndroid Build Coastguard Worker * modification, are permitted provided that the following conditions
10*cf84ac9aSAndroid Build Coastguard Worker * are met:
11*cf84ac9aSAndroid Build Coastguard Worker * 1. Redistributions of source code must retain the above copyright
12*cf84ac9aSAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer.
13*cf84ac9aSAndroid Build Coastguard Worker * 2. Redistributions in binary form must reproduce the above copyright
14*cf84ac9aSAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer in the
15*cf84ac9aSAndroid Build Coastguard Worker * documentation and/or other materials provided with the distribution.
16*cf84ac9aSAndroid Build Coastguard Worker * 3. The name of the author may not be used to endorse or promote products
17*cf84ac9aSAndroid Build Coastguard Worker * derived from this software without specific prior written permission.
18*cf84ac9aSAndroid Build Coastguard Worker *
19*cf84ac9aSAndroid Build Coastguard Worker * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
20*cf84ac9aSAndroid Build Coastguard Worker * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
21*cf84ac9aSAndroid Build Coastguard Worker * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
22*cf84ac9aSAndroid Build Coastguard Worker * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
23*cf84ac9aSAndroid Build Coastguard Worker * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
24*cf84ac9aSAndroid Build Coastguard Worker * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25*cf84ac9aSAndroid Build Coastguard Worker * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26*cf84ac9aSAndroid Build Coastguard Worker * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27*cf84ac9aSAndroid Build Coastguard Worker * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
28*cf84ac9aSAndroid Build Coastguard Worker * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29*cf84ac9aSAndroid Build Coastguard Worker */
30*cf84ac9aSAndroid Build Coastguard Worker
31*cf84ac9aSAndroid Build Coastguard Worker #include "tests.h"
32*cf84ac9aSAndroid Build Coastguard Worker #include <stddef.h>
33*cf84ac9aSAndroid Build Coastguard Worker #include <stdio.h>
34*cf84ac9aSAndroid Build Coastguard Worker #include <string.h>
35*cf84ac9aSAndroid Build Coastguard Worker #include <unistd.h>
36*cf84ac9aSAndroid Build Coastguard Worker #include <sys/socket.h>
37*cf84ac9aSAndroid Build Coastguard Worker #include <sys/un.h>
38*cf84ac9aSAndroid Build Coastguard Worker #include <arpa/inet.h>
39*cf84ac9aSAndroid Build Coastguard Worker #include <netinet/in.h>
40*cf84ac9aSAndroid Build Coastguard Worker #include "netlink.h"
41*cf84ac9aSAndroid Build Coastguard Worker #include <linux/ax25.h>
42*cf84ac9aSAndroid Build Coastguard Worker #include <linux/if_arp.h>
43*cf84ac9aSAndroid Build Coastguard Worker #include <linux/if_ether.h>
44*cf84ac9aSAndroid Build Coastguard Worker #include <linux/if_packet.h>
45*cf84ac9aSAndroid Build Coastguard Worker #include <linux/x25.h>
46*cf84ac9aSAndroid Build Coastguard Worker #include <linux/ipx.h>
47*cf84ac9aSAndroid Build Coastguard Worker #ifdef HAVE_BLUETOOTH_BLUETOOTH_H
48*cf84ac9aSAndroid Build Coastguard Worker # include <bluetooth/bluetooth.h>
49*cf84ac9aSAndroid Build Coastguard Worker # include <bluetooth/hci.h>
50*cf84ac9aSAndroid Build Coastguard Worker # include <bluetooth/l2cap.h>
51*cf84ac9aSAndroid Build Coastguard Worker # include <bluetooth/rfcomm.h>
52*cf84ac9aSAndroid Build Coastguard Worker # include <bluetooth/sco.h>
53*cf84ac9aSAndroid Build Coastguard Worker #endif
54*cf84ac9aSAndroid Build Coastguard Worker
55*cf84ac9aSAndroid Build Coastguard Worker static void
check_un(void)56*cf84ac9aSAndroid Build Coastguard Worker check_un(void)
57*cf84ac9aSAndroid Build Coastguard Worker {
58*cf84ac9aSAndroid Build Coastguard Worker TAIL_ALLOC_OBJECT_VAR_PTR(struct sockaddr_un, un);
59*cf84ac9aSAndroid Build Coastguard Worker un->sun_family = AF_UNIX;
60*cf84ac9aSAndroid Build Coastguard Worker memset(un->sun_path, '0', sizeof(un->sun_path));
61*cf84ac9aSAndroid Build Coastguard Worker unsigned int len = sizeof(*un);
62*cf84ac9aSAndroid Build Coastguard Worker int ret = connect(-1, (void *) un, len);
63*cf84ac9aSAndroid Build Coastguard Worker printf("connect(-1, {sa_family=AF_UNIX, sun_path=\"%.*u\"}"
64*cf84ac9aSAndroid Build Coastguard Worker ", %u) = %d EBADF (%m)\n",
65*cf84ac9aSAndroid Build Coastguard Worker (int) sizeof(un->sun_path), 0, len, ret);
66*cf84ac9aSAndroid Build Coastguard Worker
67*cf84ac9aSAndroid Build Coastguard Worker un->sun_path[1] = 0;
68*cf84ac9aSAndroid Build Coastguard Worker ret = connect(-1, (void *) un, len);
69*cf84ac9aSAndroid Build Coastguard Worker printf("connect(-1, {sa_family=AF_UNIX, sun_path=\"%u\"}, %u)"
70*cf84ac9aSAndroid Build Coastguard Worker " = %d EBADF (%m)\n", 0, len, ret);
71*cf84ac9aSAndroid Build Coastguard Worker
72*cf84ac9aSAndroid Build Coastguard Worker un->sun_path[0] = 0;
73*cf84ac9aSAndroid Build Coastguard Worker un->sun_path[2] = 1;
74*cf84ac9aSAndroid Build Coastguard Worker ret = connect(-1, (void *) un, len);
75*cf84ac9aSAndroid Build Coastguard Worker printf("connect(-1, {sa_family=AF_UNIX, sun_path=@\"\\0\\001%.*u\"}"
76*cf84ac9aSAndroid Build Coastguard Worker ", %u) = %d EBADF (%m)\n",
77*cf84ac9aSAndroid Build Coastguard Worker (int) sizeof(un->sun_path) - 3, 0, len, ret);
78*cf84ac9aSAndroid Build Coastguard Worker
79*cf84ac9aSAndroid Build Coastguard Worker un = ((void *) un) - 2;
80*cf84ac9aSAndroid Build Coastguard Worker un->sun_family = AF_UNIX;
81*cf84ac9aSAndroid Build Coastguard Worker memset(un->sun_path, '0', sizeof(un->sun_path));
82*cf84ac9aSAndroid Build Coastguard Worker len = sizeof(*un) + 2;
83*cf84ac9aSAndroid Build Coastguard Worker ret = connect(-1, (void *) un, len);
84*cf84ac9aSAndroid Build Coastguard Worker printf("connect(-1, {sa_family=AF_UNIX, sun_path=\"%.*u\"}"
85*cf84ac9aSAndroid Build Coastguard Worker ", %u) = %d EBADF (%m)\n",
86*cf84ac9aSAndroid Build Coastguard Worker (int) sizeof(un->sun_path), 0, len, ret);
87*cf84ac9aSAndroid Build Coastguard Worker
88*cf84ac9aSAndroid Build Coastguard Worker un->sun_path[0] = 0;
89*cf84ac9aSAndroid Build Coastguard Worker ret = connect(-1, (void *) un, len);
90*cf84ac9aSAndroid Build Coastguard Worker printf("connect(-1, {sa_family=AF_UNIX, sun_path=@\"%.*u\"}"
91*cf84ac9aSAndroid Build Coastguard Worker ", %u) = %d EBADF (%m)\n",
92*cf84ac9aSAndroid Build Coastguard Worker (int) sizeof(un->sun_path) - 1, 0, len, ret);
93*cf84ac9aSAndroid Build Coastguard Worker
94*cf84ac9aSAndroid Build Coastguard Worker un = ((void *) un) + 4;
95*cf84ac9aSAndroid Build Coastguard Worker un->sun_family = AF_UNIX;
96*cf84ac9aSAndroid Build Coastguard Worker len = sizeof(*un) - 2;
97*cf84ac9aSAndroid Build Coastguard Worker ret = connect(-1, (void *) un, len);
98*cf84ac9aSAndroid Build Coastguard Worker printf("connect(-1, {sa_family=AF_UNIX, sun_path=\"%.*u\"}"
99*cf84ac9aSAndroid Build Coastguard Worker ", %u) = %d EBADF (%m)\n",
100*cf84ac9aSAndroid Build Coastguard Worker (int) sizeof(un->sun_path) - 2, 0, len, ret);
101*cf84ac9aSAndroid Build Coastguard Worker
102*cf84ac9aSAndroid Build Coastguard Worker un->sun_path[0] = 0;
103*cf84ac9aSAndroid Build Coastguard Worker ret = connect(-1, (void *) un, len);
104*cf84ac9aSAndroid Build Coastguard Worker printf("connect(-1, {sa_family=AF_UNIX, sun_path=@\"%.*u\"}"
105*cf84ac9aSAndroid Build Coastguard Worker ", %u) = %d EBADF (%m)\n",
106*cf84ac9aSAndroid Build Coastguard Worker (int) sizeof(un->sun_path) - 3, 0, len, ret);
107*cf84ac9aSAndroid Build Coastguard Worker
108*cf84ac9aSAndroid Build Coastguard Worker len = sizeof(*un);
109*cf84ac9aSAndroid Build Coastguard Worker ret = connect(-1, (void *) un, len);
110*cf84ac9aSAndroid Build Coastguard Worker printf("connect(-1, %p, %u) = %d EBADF (%m)\n", un, len, ret);
111*cf84ac9aSAndroid Build Coastguard Worker
112*cf84ac9aSAndroid Build Coastguard Worker un = tail_alloc(sizeof(struct sockaddr_storage));
113*cf84ac9aSAndroid Build Coastguard Worker un->sun_family = AF_UNIX;
114*cf84ac9aSAndroid Build Coastguard Worker memset(un->sun_path, '0', sizeof(un->sun_path));
115*cf84ac9aSAndroid Build Coastguard Worker len = sizeof(struct sockaddr_storage) + 1;
116*cf84ac9aSAndroid Build Coastguard Worker ret = connect(-1, (void *) un, len);
117*cf84ac9aSAndroid Build Coastguard Worker printf("connect(-1, {sa_family=AF_UNIX, sun_path=\"%.*u\"}"
118*cf84ac9aSAndroid Build Coastguard Worker ", %u) = %d EBADF (%m)\n",
119*cf84ac9aSAndroid Build Coastguard Worker (int) sizeof(un->sun_path), 0, len, ret);
120*cf84ac9aSAndroid Build Coastguard Worker
121*cf84ac9aSAndroid Build Coastguard Worker un->sun_path[0] = 0;
122*cf84ac9aSAndroid Build Coastguard Worker ret = connect(-1, (void *) un, len);
123*cf84ac9aSAndroid Build Coastguard Worker printf("connect(-1, {sa_family=AF_UNIX, sun_path=@\"%.*u\"}"
124*cf84ac9aSAndroid Build Coastguard Worker ", %u) = %d EBADF (%m)\n",
125*cf84ac9aSAndroid Build Coastguard Worker (int) sizeof(un->sun_path) - 1, 0, len, ret);
126*cf84ac9aSAndroid Build Coastguard Worker }
127*cf84ac9aSAndroid Build Coastguard Worker
128*cf84ac9aSAndroid Build Coastguard Worker static void
check_in(void)129*cf84ac9aSAndroid Build Coastguard Worker check_in(void)
130*cf84ac9aSAndroid Build Coastguard Worker {
131*cf84ac9aSAndroid Build Coastguard Worker const unsigned short h_port = 12345;
132*cf84ac9aSAndroid Build Coastguard Worker static const char h_addr[] = "12.34.56.78";
133*cf84ac9aSAndroid Build Coastguard Worker
134*cf84ac9aSAndroid Build Coastguard Worker TAIL_ALLOC_OBJECT_VAR_PTR(struct sockaddr_in, in);
135*cf84ac9aSAndroid Build Coastguard Worker in->sin_family = AF_INET;
136*cf84ac9aSAndroid Build Coastguard Worker in->sin_port = htons(h_port);
137*cf84ac9aSAndroid Build Coastguard Worker in->sin_addr.s_addr = inet_addr(h_addr);
138*cf84ac9aSAndroid Build Coastguard Worker unsigned int len = sizeof(*in);
139*cf84ac9aSAndroid Build Coastguard Worker int ret = connect(-1, (void *) in, len);
140*cf84ac9aSAndroid Build Coastguard Worker printf("connect(-1, {sa_family=AF_INET, sin_port=htons(%hu)"
141*cf84ac9aSAndroid Build Coastguard Worker ", sin_addr=inet_addr(\"%s\")}, %u) = %d EBADF (%m)\n",
142*cf84ac9aSAndroid Build Coastguard Worker h_port, h_addr, len, ret);
143*cf84ac9aSAndroid Build Coastguard Worker
144*cf84ac9aSAndroid Build Coastguard Worker in = ((void *) in) - 4;
145*cf84ac9aSAndroid Build Coastguard Worker in->sin_family = AF_INET;
146*cf84ac9aSAndroid Build Coastguard Worker in->sin_port = htons(h_port);
147*cf84ac9aSAndroid Build Coastguard Worker in->sin_addr.s_addr = inet_addr(h_addr);
148*cf84ac9aSAndroid Build Coastguard Worker len = sizeof(*in) + 4;
149*cf84ac9aSAndroid Build Coastguard Worker ret = connect(-1, (void *) in, len);
150*cf84ac9aSAndroid Build Coastguard Worker printf("connect(-1, {sa_family=AF_INET, sin_port=htons(%hu)"
151*cf84ac9aSAndroid Build Coastguard Worker ", sin_addr=inet_addr(\"%s\")}, %u) = %d EBADF (%m)\n",
152*cf84ac9aSAndroid Build Coastguard Worker h_port, h_addr, len, ret);
153*cf84ac9aSAndroid Build Coastguard Worker
154*cf84ac9aSAndroid Build Coastguard Worker in = ((void *) in) + 8;
155*cf84ac9aSAndroid Build Coastguard Worker in->sin_family = AF_INET;
156*cf84ac9aSAndroid Build Coastguard Worker in->sin_port = 0;
157*cf84ac9aSAndroid Build Coastguard Worker in->sin_addr.s_addr = 0;
158*cf84ac9aSAndroid Build Coastguard Worker len = sizeof(*in) - 4;
159*cf84ac9aSAndroid Build Coastguard Worker ret = connect(-1, (void *) in, len);
160*cf84ac9aSAndroid Build Coastguard Worker printf("connect(-1, {sa_family=AF_INET, sa_data=\"%s\"}, %u)"
161*cf84ac9aSAndroid Build Coastguard Worker " = %d EBADF (%m)\n",
162*cf84ac9aSAndroid Build Coastguard Worker "\\0\\0\\0\\0\\0\\0\\377\\377\\377\\377",
163*cf84ac9aSAndroid Build Coastguard Worker len, ret);
164*cf84ac9aSAndroid Build Coastguard Worker
165*cf84ac9aSAndroid Build Coastguard Worker len = sizeof(*in);
166*cf84ac9aSAndroid Build Coastguard Worker ret = connect(-1, (void *) in, len);
167*cf84ac9aSAndroid Build Coastguard Worker printf("connect(-1, %p, %u) = %d EBADF (%m)\n", in, len, ret);
168*cf84ac9aSAndroid Build Coastguard Worker }
169*cf84ac9aSAndroid Build Coastguard Worker
170*cf84ac9aSAndroid Build Coastguard Worker static void
check_in6_linklocal(struct sockaddr_in6 * const in6,const char * const h_addr)171*cf84ac9aSAndroid Build Coastguard Worker check_in6_linklocal(struct sockaddr_in6 *const in6, const char *const h_addr)
172*cf84ac9aSAndroid Build Coastguard Worker {
173*cf84ac9aSAndroid Build Coastguard Worker inet_pton(AF_INET6, h_addr, &in6->sin6_addr);
174*cf84ac9aSAndroid Build Coastguard Worker
175*cf84ac9aSAndroid Build Coastguard Worker in6->sin6_scope_id = 0xfacefeed;
176*cf84ac9aSAndroid Build Coastguard Worker unsigned int len = sizeof(*in6);
177*cf84ac9aSAndroid Build Coastguard Worker int ret = connect(-1, (void *) in6, len);
178*cf84ac9aSAndroid Build Coastguard Worker printf("connect(-1, {sa_family=AF_INET6, sin6_port=htons(%hu)"
179*cf84ac9aSAndroid Build Coastguard Worker ", inet_pton(AF_INET6, \"%s\", &sin6_addr)"
180*cf84ac9aSAndroid Build Coastguard Worker ", sin6_flowinfo=htonl(%u)"
181*cf84ac9aSAndroid Build Coastguard Worker ", sin6_scope_id=%u}, %u)"
182*cf84ac9aSAndroid Build Coastguard Worker " = %d EBADF (%m)\n",
183*cf84ac9aSAndroid Build Coastguard Worker ntohs(in6->sin6_port), h_addr,
184*cf84ac9aSAndroid Build Coastguard Worker ntohl(in6->sin6_flowinfo), in6->sin6_scope_id, len, ret);
185*cf84ac9aSAndroid Build Coastguard Worker
186*cf84ac9aSAndroid Build Coastguard Worker in6->sin6_scope_id = ifindex_lo();
187*cf84ac9aSAndroid Build Coastguard Worker if (in6->sin6_scope_id) {
188*cf84ac9aSAndroid Build Coastguard Worker ret = connect(-1, (void *) in6, len);
189*cf84ac9aSAndroid Build Coastguard Worker printf("connect(-1, {sa_family=AF_INET6, sin6_port=htons(%hu)"
190*cf84ac9aSAndroid Build Coastguard Worker ", inet_pton(AF_INET6, \"%s\", &sin6_addr)"
191*cf84ac9aSAndroid Build Coastguard Worker ", sin6_flowinfo=htonl(%u)"
192*cf84ac9aSAndroid Build Coastguard Worker ", sin6_scope_id=%s}, %u)"
193*cf84ac9aSAndroid Build Coastguard Worker " = %d EBADF (%m)\n",
194*cf84ac9aSAndroid Build Coastguard Worker ntohs(in6->sin6_port), h_addr, ntohl(in6->sin6_flowinfo),
195*cf84ac9aSAndroid Build Coastguard Worker IFINDEX_LO_STR, len, ret);
196*cf84ac9aSAndroid Build Coastguard Worker }
197*cf84ac9aSAndroid Build Coastguard Worker }
198*cf84ac9aSAndroid Build Coastguard Worker
199*cf84ac9aSAndroid Build Coastguard Worker static void
check_in6(void)200*cf84ac9aSAndroid Build Coastguard Worker check_in6(void)
201*cf84ac9aSAndroid Build Coastguard Worker {
202*cf84ac9aSAndroid Build Coastguard Worker const unsigned short h_port = 12345;
203*cf84ac9aSAndroid Build Coastguard Worker const unsigned int h_flowinfo = 1234567890;
204*cf84ac9aSAndroid Build Coastguard Worker static const char h_addr[] = "12:34:56:78:90:ab:cd:ef";
205*cf84ac9aSAndroid Build Coastguard Worker
206*cf84ac9aSAndroid Build Coastguard Worker TAIL_ALLOC_OBJECT_VAR_PTR(struct sockaddr_in6, in6);
207*cf84ac9aSAndroid Build Coastguard Worker in6->sin6_family = AF_INET6;
208*cf84ac9aSAndroid Build Coastguard Worker in6->sin6_port = htons(h_port);
209*cf84ac9aSAndroid Build Coastguard Worker in6->sin6_flowinfo = htonl(h_flowinfo);
210*cf84ac9aSAndroid Build Coastguard Worker inet_pton(AF_INET6, h_addr, &in6->sin6_addr);
211*cf84ac9aSAndroid Build Coastguard Worker in6->sin6_scope_id = 0xfacefeed;
212*cf84ac9aSAndroid Build Coastguard Worker unsigned int len = sizeof(*in6);
213*cf84ac9aSAndroid Build Coastguard Worker int ret = connect(-1, (void *) in6, len);
214*cf84ac9aSAndroid Build Coastguard Worker printf("connect(-1, {sa_family=AF_INET6, sin6_port=htons(%hu)"
215*cf84ac9aSAndroid Build Coastguard Worker ", inet_pton(AF_INET6, \"%s\", &sin6_addr)"
216*cf84ac9aSAndroid Build Coastguard Worker ", sin6_flowinfo=htonl(%u), sin6_scope_id=%u}, %u)"
217*cf84ac9aSAndroid Build Coastguard Worker " = %d EBADF (%m)\n",
218*cf84ac9aSAndroid Build Coastguard Worker h_port, h_addr, h_flowinfo, in6->sin6_scope_id, len, ret);
219*cf84ac9aSAndroid Build Coastguard Worker
220*cf84ac9aSAndroid Build Coastguard Worker check_in6_linklocal(in6, "fe80::");
221*cf84ac9aSAndroid Build Coastguard Worker check_in6_linklocal(in6, "ff42::");
222*cf84ac9aSAndroid Build Coastguard Worker
223*cf84ac9aSAndroid Build Coastguard Worker in6 = ((void *) in6) - 4;
224*cf84ac9aSAndroid Build Coastguard Worker in6->sin6_family = AF_INET6;
225*cf84ac9aSAndroid Build Coastguard Worker in6->sin6_port = htons(h_port);
226*cf84ac9aSAndroid Build Coastguard Worker in6->sin6_flowinfo = htonl(h_flowinfo);
227*cf84ac9aSAndroid Build Coastguard Worker inet_pton(AF_INET6, h_addr, &in6->sin6_addr);
228*cf84ac9aSAndroid Build Coastguard Worker in6->sin6_scope_id = 0xfacefeed;
229*cf84ac9aSAndroid Build Coastguard Worker len = sizeof(*in6) + 4;
230*cf84ac9aSAndroid Build Coastguard Worker ret = connect(-1, (void *) in6, len);
231*cf84ac9aSAndroid Build Coastguard Worker printf("connect(-1, {sa_family=AF_INET6, sin6_port=htons(%hu)"
232*cf84ac9aSAndroid Build Coastguard Worker ", inet_pton(AF_INET6, \"%s\", &sin6_addr)"
233*cf84ac9aSAndroid Build Coastguard Worker ", sin6_flowinfo=htonl(%u), sin6_scope_id=%u}, %u)"
234*cf84ac9aSAndroid Build Coastguard Worker " = %d EBADF (%m)\n",
235*cf84ac9aSAndroid Build Coastguard Worker h_port, h_addr, h_flowinfo, in6->sin6_scope_id, len, ret);
236*cf84ac9aSAndroid Build Coastguard Worker
237*cf84ac9aSAndroid Build Coastguard Worker in6 = ((void *) in6) + 4 + sizeof(in6->sin6_scope_id);
238*cf84ac9aSAndroid Build Coastguard Worker in6->sin6_family = AF_INET6;
239*cf84ac9aSAndroid Build Coastguard Worker in6->sin6_port = htons(h_port);
240*cf84ac9aSAndroid Build Coastguard Worker in6->sin6_flowinfo = htonl(h_flowinfo);
241*cf84ac9aSAndroid Build Coastguard Worker inet_pton(AF_INET6, h_addr, &in6->sin6_addr);
242*cf84ac9aSAndroid Build Coastguard Worker len = sizeof(*in6) - sizeof(in6->sin6_scope_id);
243*cf84ac9aSAndroid Build Coastguard Worker ret = connect(-1, (void *) in6, len);
244*cf84ac9aSAndroid Build Coastguard Worker printf("connect(-1, {sa_family=AF_INET6, sin6_port=htons(%hu)"
245*cf84ac9aSAndroid Build Coastguard Worker ", inet_pton(AF_INET6, \"%s\", &sin6_addr)"
246*cf84ac9aSAndroid Build Coastguard Worker ", sin6_flowinfo=htonl(%u)}, %u)"
247*cf84ac9aSAndroid Build Coastguard Worker " = %d EBADF (%m)\n",
248*cf84ac9aSAndroid Build Coastguard Worker h_port, h_addr, h_flowinfo, len, ret);
249*cf84ac9aSAndroid Build Coastguard Worker
250*cf84ac9aSAndroid Build Coastguard Worker in6 = ((void *) in6) + 4;
251*cf84ac9aSAndroid Build Coastguard Worker in6->sin6_family = AF_INET6;
252*cf84ac9aSAndroid Build Coastguard Worker in6->sin6_port = 0;
253*cf84ac9aSAndroid Build Coastguard Worker in6->sin6_flowinfo = 0;
254*cf84ac9aSAndroid Build Coastguard Worker memset(&in6->sin6_addr, '0', sizeof(in6->sin6_addr) - 4);
255*cf84ac9aSAndroid Build Coastguard Worker len = sizeof(*in6) - sizeof(in6->sin6_scope_id) - 4;
256*cf84ac9aSAndroid Build Coastguard Worker ret = connect(-1, (void *) in6, len);
257*cf84ac9aSAndroid Build Coastguard Worker printf("connect(-1, {sa_family=AF_INET6"
258*cf84ac9aSAndroid Build Coastguard Worker ", sa_data=\"\\0\\0\\0\\0\\0\\000%.*u\"}, %u)"
259*cf84ac9aSAndroid Build Coastguard Worker " = %d EBADF (%m)\n",
260*cf84ac9aSAndroid Build Coastguard Worker (int) (len - offsetof(struct sockaddr_in6, sin6_addr)), 0,
261*cf84ac9aSAndroid Build Coastguard Worker len, ret);
262*cf84ac9aSAndroid Build Coastguard Worker
263*cf84ac9aSAndroid Build Coastguard Worker len = sizeof(*in6) - sizeof(in6->sin6_scope_id);
264*cf84ac9aSAndroid Build Coastguard Worker ret = connect(-1, (void *) in6, len);
265*cf84ac9aSAndroid Build Coastguard Worker printf("connect(-1, %p, %u) = %d EBADF (%m)\n", in6, len, ret);
266*cf84ac9aSAndroid Build Coastguard Worker }
267*cf84ac9aSAndroid Build Coastguard Worker
268*cf84ac9aSAndroid Build Coastguard Worker static void
check_ipx(void)269*cf84ac9aSAndroid Build Coastguard Worker check_ipx(void)
270*cf84ac9aSAndroid Build Coastguard Worker {
271*cf84ac9aSAndroid Build Coastguard Worker const unsigned short h_port = 12345;
272*cf84ac9aSAndroid Build Coastguard Worker const unsigned int h_network = 0xfacefeed;
273*cf84ac9aSAndroid Build Coastguard Worker struct sockaddr_ipx c_ipx = {
274*cf84ac9aSAndroid Build Coastguard Worker .sipx_family = AF_IPX,
275*cf84ac9aSAndroid Build Coastguard Worker .sipx_port = htons(h_port),
276*cf84ac9aSAndroid Build Coastguard Worker .sipx_network = htonl(h_network),
277*cf84ac9aSAndroid Build Coastguard Worker .sipx_node = "ABCDEF",
278*cf84ac9aSAndroid Build Coastguard Worker .sipx_type = -1
279*cf84ac9aSAndroid Build Coastguard Worker };
280*cf84ac9aSAndroid Build Coastguard Worker void *ipx = tail_memdup(&c_ipx, sizeof(c_ipx));
281*cf84ac9aSAndroid Build Coastguard Worker unsigned int len = sizeof(c_ipx);
282*cf84ac9aSAndroid Build Coastguard Worker int ret = connect(-1, ipx, len);
283*cf84ac9aSAndroid Build Coastguard Worker printf("connect(-1, {sa_family=AF_IPX, sipx_port=htons(%u)"
284*cf84ac9aSAndroid Build Coastguard Worker ", sipx_network=htonl(%#x)"
285*cf84ac9aSAndroid Build Coastguard Worker ", sipx_node=[%#02x, %#02x, %#02x, %#02x, %#02x, %#02x]"
286*cf84ac9aSAndroid Build Coastguard Worker ", sipx_type=%#02x}, %u) = %d EBADF (%m)\n",
287*cf84ac9aSAndroid Build Coastguard Worker h_port, h_network,
288*cf84ac9aSAndroid Build Coastguard Worker c_ipx.sipx_node[0], c_ipx.sipx_node[1],
289*cf84ac9aSAndroid Build Coastguard Worker c_ipx.sipx_node[2], c_ipx.sipx_node[3],
290*cf84ac9aSAndroid Build Coastguard Worker c_ipx.sipx_node[4], c_ipx.sipx_node[5],
291*cf84ac9aSAndroid Build Coastguard Worker c_ipx.sipx_type, len, ret);
292*cf84ac9aSAndroid Build Coastguard Worker }
293*cf84ac9aSAndroid Build Coastguard Worker
294*cf84ac9aSAndroid Build Coastguard Worker /* for a bit more compact AX.25 address definitions */
295*cf84ac9aSAndroid Build Coastguard Worker #define AX25_ADDR(c_, s_) \
296*cf84ac9aSAndroid Build Coastguard Worker { { (c_)[0] << 1, (c_)[1] << 1, (c_)[2] << 1, \
297*cf84ac9aSAndroid Build Coastguard Worker (c_)[3] << 1, (c_)[4] << 1, (c_)[5] << 1, (s_) << 1 } } \
298*cf84ac9aSAndroid Build Coastguard Worker /* End of AX25_ADDR definition */
299*cf84ac9aSAndroid Build Coastguard Worker
300*cf84ac9aSAndroid Build Coastguard Worker static void
check_ax25(void)301*cf84ac9aSAndroid Build Coastguard Worker check_ax25(void)
302*cf84ac9aSAndroid Build Coastguard Worker {
303*cf84ac9aSAndroid Build Coastguard Worker const struct full_sockaddr_ax25 ax25 = {
304*cf84ac9aSAndroid Build Coastguard Worker .fsa_ax25 = {
305*cf84ac9aSAndroid Build Coastguard Worker .sax25_family = AF_AX25,
306*cf84ac9aSAndroid Build Coastguard Worker .sax25_call = AX25_ADDR("VALID ", 13),
307*cf84ac9aSAndroid Build Coastguard Worker .sax25_ndigis = 8,
308*cf84ac9aSAndroid Build Coastguard Worker },
309*cf84ac9aSAndroid Build Coastguard Worker .fsa_digipeater = {
310*cf84ac9aSAndroid Build Coastguard Worker AX25_ADDR("SPA CE", 0),
311*cf84ac9aSAndroid Build Coastguard Worker AX25_ADDR("SSID ", 16),
312*cf84ac9aSAndroid Build Coastguard Worker AX25_ADDR(" ", 0),
313*cf84ac9aSAndroid Build Coastguard Worker AX25_ADDR("NULL\0", 3),
314*cf84ac9aSAndroid Build Coastguard Worker AX25_ADDR("A-B-C", 4),
315*cf84ac9aSAndroid Build Coastguard Worker AX25_ADDR(",}]\"\\'", 5),
316*cf84ac9aSAndroid Build Coastguard Worker AX25_ADDR("DASH-0", 6),
317*cf84ac9aSAndroid Build Coastguard Worker AX25_ADDR("\n\tABCD", 7),
318*cf84ac9aSAndroid Build Coastguard Worker },
319*cf84ac9aSAndroid Build Coastguard Worker };
320*cf84ac9aSAndroid Build Coastguard Worker const ax25_address aux_addrs[] = {
321*cf84ac9aSAndroid Build Coastguard Worker AX25_ADDR("VALID2", 7),
322*cf84ac9aSAndroid Build Coastguard Worker AX25_ADDR("OK ", 15),
323*cf84ac9aSAndroid Build Coastguard Worker AX25_ADDR("FINE ", 2),
324*cf84ac9aSAndroid Build Coastguard Worker AX25_ADDR("smalls", 9),
325*cf84ac9aSAndroid Build Coastguard Worker };
326*cf84ac9aSAndroid Build Coastguard Worker
327*cf84ac9aSAndroid Build Coastguard Worker enum { AX25_ALIGN = ALIGNOF(struct full_sockaddr_ax25), };
328*cf84ac9aSAndroid Build Coastguard Worker size_t size = sizeof(ax25);
329*cf84ac9aSAndroid Build Coastguard Worker size_t surplus = ROUNDUP(sizeof(ax25_address), AX25_ALIGN);
330*cf84ac9aSAndroid Build Coastguard Worker void *sax_void = midtail_alloc(size, surplus);
331*cf84ac9aSAndroid Build Coastguard Worker struct full_sockaddr_ax25 *sax = sax_void;
332*cf84ac9aSAndroid Build Coastguard Worker long rc;
333*cf84ac9aSAndroid Build Coastguard Worker
334*cf84ac9aSAndroid Build Coastguard Worker fill_memory(sax, size);
335*cf84ac9aSAndroid Build Coastguard Worker sax->fsa_ax25.sax25_family = AF_AX25;
336*cf84ac9aSAndroid Build Coastguard Worker rc = connect(-1, sax_void, sizeof(struct sockaddr_ax25) - 1);
337*cf84ac9aSAndroid Build Coastguard Worker printf("connect(-1, {sa_family=AF_AX25, sa_data=\"\\202\\203\\204\\205"
338*cf84ac9aSAndroid Build Coastguard Worker "\\206\\207\\210\\211\\212\\213\\214\\215\\216\"}, %zu) = %s\n",
339*cf84ac9aSAndroid Build Coastguard Worker sizeof(struct sockaddr_ax25) - 1, sprintrc(rc));
340*cf84ac9aSAndroid Build Coastguard Worker
341*cf84ac9aSAndroid Build Coastguard Worker memcpy(sax, &ax25, sizeof(ax25));
342*cf84ac9aSAndroid Build Coastguard Worker rc = connect(-1, sax_void, sizeof(struct sockaddr_ax25));
343*cf84ac9aSAndroid Build Coastguard Worker printf("connect(-1, {sa_family=AF_AX25, fsa_ax25={sax25_call=VALID-13"
344*cf84ac9aSAndroid Build Coastguard Worker ", sax25_ndigis=8}, fsa_digipeater=[/* ??? */]}, %zu) = %s\n",
345*cf84ac9aSAndroid Build Coastguard Worker sizeof(struct sockaddr_ax25), sprintrc(rc));
346*cf84ac9aSAndroid Build Coastguard Worker
347*cf84ac9aSAndroid Build Coastguard Worker sax->fsa_ax25.sax25_ndigis = 0;
348*cf84ac9aSAndroid Build Coastguard Worker rc = connect(-1, sax_void, sizeof(struct sockaddr_ax25));
349*cf84ac9aSAndroid Build Coastguard Worker printf("connect(-1, {sa_family=AF_AX25, sax25_call=VALID-13"
350*cf84ac9aSAndroid Build Coastguard Worker ", sax25_ndigis=0}, %zu) = %s\n",
351*cf84ac9aSAndroid Build Coastguard Worker sizeof(struct sockaddr_ax25), sprintrc(rc));
352*cf84ac9aSAndroid Build Coastguard Worker
353*cf84ac9aSAndroid Build Coastguard Worker sax->fsa_ax25.sax25_ndigis = 8;
354*cf84ac9aSAndroid Build Coastguard Worker size = sizeof(struct sockaddr_ax25) + sizeof(ax25_address) * 3 + 1;
355*cf84ac9aSAndroid Build Coastguard Worker rc = connect(-1, sax_void, size);
356*cf84ac9aSAndroid Build Coastguard Worker printf("connect(-1, {sa_family=AF_AX25, fsa_ax25={sax25_call=VALID-13"
357*cf84ac9aSAndroid Build Coastguard Worker ", sax25_ndigis=8}, fsa_digipeater"
358*cf84ac9aSAndroid Build Coastguard Worker "=[{ax25_call=\"\\xa6\\xa0\\x82\\x40\\x86\\x8a\\x00\""
359*cf84ac9aSAndroid Build Coastguard Worker "} /* SPA CE-0 */"
360*cf84ac9aSAndroid Build Coastguard Worker ", {ax25_call=\"\\xa6\\xa6\\x92\\x88\\x40\\x40\\x20\""
361*cf84ac9aSAndroid Build Coastguard Worker "} /* SSID-0 */"
362*cf84ac9aSAndroid Build Coastguard Worker ", *"
363*cf84ac9aSAndroid Build Coastguard Worker ", /* ??? */], ...}, %zu) = %s\n",
364*cf84ac9aSAndroid Build Coastguard Worker size, sprintrc(rc));
365*cf84ac9aSAndroid Build Coastguard Worker
366*cf84ac9aSAndroid Build Coastguard Worker sax->fsa_digipeater[2].ax25_call[6] = 0x4;
367*cf84ac9aSAndroid Build Coastguard Worker size = sizeof(struct sockaddr_ax25) + sizeof(ax25_address) * 4;
368*cf84ac9aSAndroid Build Coastguard Worker rc = connect(-1, sax_void, size);
369*cf84ac9aSAndroid Build Coastguard Worker printf("connect(-1, {sa_family=AF_AX25, fsa_ax25={sax25_call=VALID-13"
370*cf84ac9aSAndroid Build Coastguard Worker ", sax25_ndigis=8}, fsa_digipeater"
371*cf84ac9aSAndroid Build Coastguard Worker "=[{ax25_call=\"\\xa6\\xa0\\x82\\x40\\x86\\x8a\\x00\""
372*cf84ac9aSAndroid Build Coastguard Worker "} /* SPA CE-0 */"
373*cf84ac9aSAndroid Build Coastguard Worker ", {ax25_call=\"\\xa6\\xa6\\x92\\x88\\x40\\x40\\x20\""
374*cf84ac9aSAndroid Build Coastguard Worker "} /* SSID-0 */"
375*cf84ac9aSAndroid Build Coastguard Worker ", {ax25_call=\"\\x40\\x40\\x40\\x40\\x40\\x40\\x04\"} /* -2 */"
376*cf84ac9aSAndroid Build Coastguard Worker ", {ax25_call=\"\\x9c\\xaa\\x98\\x98\\x00\\x00\\x06\"}"
377*cf84ac9aSAndroid Build Coastguard Worker ", /* ??? */]}, %zu) = %s\n",
378*cf84ac9aSAndroid Build Coastguard Worker size, sprintrc(rc));
379*cf84ac9aSAndroid Build Coastguard Worker
380*cf84ac9aSAndroid Build Coastguard Worker memcpy(sax->fsa_digipeater, aux_addrs, sizeof(aux_addrs));
381*cf84ac9aSAndroid Build Coastguard Worker sax->fsa_digipeater[2].ax25_call[6] = 0xa5;
382*cf84ac9aSAndroid Build Coastguard Worker sax->fsa_digipeater[4].ax25_call[5] = 0x40;
383*cf84ac9aSAndroid Build Coastguard Worker for (size_t i = 0; i < 3; i++) {
384*cf84ac9aSAndroid Build Coastguard Worker size = sizeof(ax25) + sizeof(ax25_address) * (i / 2);
385*cf84ac9aSAndroid Build Coastguard Worker rc = connect(-1, sax_void, size);
386*cf84ac9aSAndroid Build Coastguard Worker printf("connect(-1, {sa_family=AF_AX25"
387*cf84ac9aSAndroid Build Coastguard Worker ", fsa_ax25={sax25_call=VALID-13, sax25_ndigis=%d}"
388*cf84ac9aSAndroid Build Coastguard Worker ", fsa_digipeater=[VALID2-7, OK-15, %s /* FINE-2 */"
389*cf84ac9aSAndroid Build Coastguard Worker ", {ax25_call=\"\\xe6\\xda\\xc2\\xd8\\xd8\\xe6\\x12\""
390*cf84ac9aSAndroid Build Coastguard Worker "} /* smalls-9 */"
391*cf84ac9aSAndroid Build Coastguard Worker ", {ax25_call=\"\\x%s\\x%s\\x84\\x5a\\x86\\x40\\x08\""
392*cf84ac9aSAndroid Build Coastguard Worker "} /* %sB-C-4 */"
393*cf84ac9aSAndroid Build Coastguard Worker ", {ax25_call=\"\\x58\\xfa\\xba\\x44\\x%s\\x%s\\x0a\""
394*cf84ac9aSAndroid Build Coastguard Worker "}%s"
395*cf84ac9aSAndroid Build Coastguard Worker ", {ax25_call=\"\\x88\\x82\\xa6\\x90\\x5a\\x%s\\x0c\""
396*cf84ac9aSAndroid Build Coastguard Worker "}%s"
397*cf84ac9aSAndroid Build Coastguard Worker "%s]%s}, %zu) = %s\n"
398*cf84ac9aSAndroid Build Coastguard Worker , sax->fsa_ax25.sax25_ndigis
399*cf84ac9aSAndroid Build Coastguard Worker , i
400*cf84ac9aSAndroid Build Coastguard Worker ? "{ax25_call=\"\\x8c\\x92\\x9c\\x8a\\x40\\x41\\x04\"}"
401*cf84ac9aSAndroid Build Coastguard Worker : "{ax25_call=\"\\x8c\\x92\\x9c\\x8a\\x40\\x40\\xa5\"}"
402*cf84ac9aSAndroid Build Coastguard Worker , i ? "40" : "82"
403*cf84ac9aSAndroid Build Coastguard Worker , i ? "40" : "5a"
404*cf84ac9aSAndroid Build Coastguard Worker , i ? " " : "A-"
405*cf84ac9aSAndroid Build Coastguard Worker , i ? "54" : "b8"
406*cf84ac9aSAndroid Build Coastguard Worker , i ? "5e" : "4e"
407*cf84ac9aSAndroid Build Coastguard Worker , i ? "" : " /* ,}]\"\\'-5 */"
408*cf84ac9aSAndroid Build Coastguard Worker , i ? "fe" : "60"
409*cf84ac9aSAndroid Build Coastguard Worker , i ? "" : " /* DASH-0-6 */"
410*cf84ac9aSAndroid Build Coastguard Worker , i == 1
411*cf84ac9aSAndroid Build Coastguard Worker ? ""
412*cf84ac9aSAndroid Build Coastguard Worker : ", {ax25_call=\"\\x14\\x12\\x82\\x84\\x86\\x88\\x0e\"}"
413*cf84ac9aSAndroid Build Coastguard Worker , i > 1 ? ", ..." : ""
414*cf84ac9aSAndroid Build Coastguard Worker , size, sprintrc(rc));
415*cf84ac9aSAndroid Build Coastguard Worker
416*cf84ac9aSAndroid Build Coastguard Worker if (i == 1) {
417*cf84ac9aSAndroid Build Coastguard Worker sax_void = (char *) sax_void - surplus;
418*cf84ac9aSAndroid Build Coastguard Worker memmove(sax_void, sax, sizeof(ax25));
419*cf84ac9aSAndroid Build Coastguard Worker sax = sax_void;
420*cf84ac9aSAndroid Build Coastguard Worker }
421*cf84ac9aSAndroid Build Coastguard Worker
422*cf84ac9aSAndroid Build Coastguard Worker sax->fsa_ax25.sax25_ndigis = 7 + 2 * i;
423*cf84ac9aSAndroid Build Coastguard Worker
424*cf84ac9aSAndroid Build Coastguard Worker sax->fsa_digipeater[2].ax25_call[5] = 0x41;
425*cf84ac9aSAndroid Build Coastguard Worker sax->fsa_digipeater[2].ax25_call[6] = 0x4;
426*cf84ac9aSAndroid Build Coastguard Worker
427*cf84ac9aSAndroid Build Coastguard Worker sax->fsa_digipeater[4].ax25_call[0] = 0x40;
428*cf84ac9aSAndroid Build Coastguard Worker sax->fsa_digipeater[4].ax25_call[1] = 0x40;
429*cf84ac9aSAndroid Build Coastguard Worker
430*cf84ac9aSAndroid Build Coastguard Worker sax->fsa_digipeater[5].ax25_call[4] = '*' << 1;
431*cf84ac9aSAndroid Build Coastguard Worker sax->fsa_digipeater[5].ax25_call[5] = '/' << 1;
432*cf84ac9aSAndroid Build Coastguard Worker
433*cf84ac9aSAndroid Build Coastguard Worker sax->fsa_digipeater[6].ax25_call[5] = 0xfe;
434*cf84ac9aSAndroid Build Coastguard Worker }
435*cf84ac9aSAndroid Build Coastguard Worker }
436*cf84ac9aSAndroid Build Coastguard Worker
437*cf84ac9aSAndroid Build Coastguard Worker static void
check_x25(void)438*cf84ac9aSAndroid Build Coastguard Worker check_x25(void)
439*cf84ac9aSAndroid Build Coastguard Worker {
440*cf84ac9aSAndroid Build Coastguard Worker static const struct sockaddr_x25 c_x25 = {
441*cf84ac9aSAndroid Build Coastguard Worker .sx25_family = AF_X25,
442*cf84ac9aSAndroid Build Coastguard Worker .sx25_addr = { "0123456789abcdef" },
443*cf84ac9aSAndroid Build Coastguard Worker };
444*cf84ac9aSAndroid Build Coastguard Worker void *x25_void = tail_memdup(&c_x25, sizeof(c_x25) + 1);
445*cf84ac9aSAndroid Build Coastguard Worker struct sockaddr_x25 *x25 = x25_void;
446*cf84ac9aSAndroid Build Coastguard Worker long rc;
447*cf84ac9aSAndroid Build Coastguard Worker
448*cf84ac9aSAndroid Build Coastguard Worker rc = connect(-1, x25, sizeof(c_x25) - 1);
449*cf84ac9aSAndroid Build Coastguard Worker printf("connect(-1, {sa_family=AF_X25"
450*cf84ac9aSAndroid Build Coastguard Worker ", sa_data=\"0123456789abcde\"}, %zu) = %s\n",
451*cf84ac9aSAndroid Build Coastguard Worker sizeof(c_x25) - 1, sprintrc(rc));
452*cf84ac9aSAndroid Build Coastguard Worker
453*cf84ac9aSAndroid Build Coastguard Worker for (size_t i = 0; i < 2; i++) {
454*cf84ac9aSAndroid Build Coastguard Worker rc = connect(-1, x25, sizeof(c_x25) + i);
455*cf84ac9aSAndroid Build Coastguard Worker printf("connect(-1, {sa_family=AF_X25"
456*cf84ac9aSAndroid Build Coastguard Worker ", sx25_addr={x25_addr=\"0123456789abcde\"...}"
457*cf84ac9aSAndroid Build Coastguard Worker "}, %zu) = %s\n",
458*cf84ac9aSAndroid Build Coastguard Worker sizeof(c_x25) + i, sprintrc(rc));
459*cf84ac9aSAndroid Build Coastguard Worker }
460*cf84ac9aSAndroid Build Coastguard Worker
461*cf84ac9aSAndroid Build Coastguard Worker x25->sx25_addr.x25_addr[10] = '\0';
462*cf84ac9aSAndroid Build Coastguard Worker rc = connect(-1, x25, sizeof(c_x25));
463*cf84ac9aSAndroid Build Coastguard Worker printf("connect(-1, {sa_family=AF_X25"
464*cf84ac9aSAndroid Build Coastguard Worker ", sx25_addr={x25_addr=\"0123456789\"}"
465*cf84ac9aSAndroid Build Coastguard Worker "}, %zu) = %s\n",
466*cf84ac9aSAndroid Build Coastguard Worker sizeof(c_x25), sprintrc(rc));
467*cf84ac9aSAndroid Build Coastguard Worker }
468*cf84ac9aSAndroid Build Coastguard Worker
469*cf84ac9aSAndroid Build Coastguard Worker static void
check_nl(void)470*cf84ac9aSAndroid Build Coastguard Worker check_nl(void)
471*cf84ac9aSAndroid Build Coastguard Worker {
472*cf84ac9aSAndroid Build Coastguard Worker TAIL_ALLOC_OBJECT_VAR_PTR(struct sockaddr_nl, nl);
473*cf84ac9aSAndroid Build Coastguard Worker nl->nl_family = AF_NETLINK;
474*cf84ac9aSAndroid Build Coastguard Worker nl->nl_pid = 1234567890;
475*cf84ac9aSAndroid Build Coastguard Worker nl->nl_groups = 0xfacefeed;
476*cf84ac9aSAndroid Build Coastguard Worker unsigned int len = sizeof(*nl);
477*cf84ac9aSAndroid Build Coastguard Worker int ret = connect(-1, (void *) nl, len);
478*cf84ac9aSAndroid Build Coastguard Worker printf("connect(-1, {sa_family=AF_NETLINK, nl_pid=%d"
479*cf84ac9aSAndroid Build Coastguard Worker ", nl_groups=%#08x}, %u) = %d EBADF (%m)\n",
480*cf84ac9aSAndroid Build Coastguard Worker nl->nl_pid, nl->nl_groups, len, ret);
481*cf84ac9aSAndroid Build Coastguard Worker
482*cf84ac9aSAndroid Build Coastguard Worker nl = ((void *) nl) - 4;
483*cf84ac9aSAndroid Build Coastguard Worker nl->nl_family = AF_NETLINK;
484*cf84ac9aSAndroid Build Coastguard Worker nl->nl_pid = 1234567890;
485*cf84ac9aSAndroid Build Coastguard Worker nl->nl_groups = 0xfacefeed;
486*cf84ac9aSAndroid Build Coastguard Worker len = sizeof(*nl) + 4;
487*cf84ac9aSAndroid Build Coastguard Worker ret = connect(-1, (void *) nl, len);
488*cf84ac9aSAndroid Build Coastguard Worker printf("connect(-1, {sa_family=AF_NETLINK, nl_pid=%d"
489*cf84ac9aSAndroid Build Coastguard Worker ", nl_groups=%#08x}, %u) = %d EBADF (%m)\n",
490*cf84ac9aSAndroid Build Coastguard Worker nl->nl_pid, nl->nl_groups, len, ret);
491*cf84ac9aSAndroid Build Coastguard Worker }
492*cf84ac9aSAndroid Build Coastguard Worker
493*cf84ac9aSAndroid Build Coastguard Worker static void
check_ll(void)494*cf84ac9aSAndroid Build Coastguard Worker check_ll(void)
495*cf84ac9aSAndroid Build Coastguard Worker {
496*cf84ac9aSAndroid Build Coastguard Worker struct sockaddr_ll c_ll = {
497*cf84ac9aSAndroid Build Coastguard Worker .sll_family = AF_PACKET,
498*cf84ac9aSAndroid Build Coastguard Worker .sll_protocol = htons(ETH_P_ALL),
499*cf84ac9aSAndroid Build Coastguard Worker .sll_ifindex = 0xfacefeed,
500*cf84ac9aSAndroid Build Coastguard Worker .sll_hatype = ARPHRD_ETHER,
501*cf84ac9aSAndroid Build Coastguard Worker .sll_pkttype = PACKET_HOST,
502*cf84ac9aSAndroid Build Coastguard Worker .sll_halen = sizeof(c_ll.sll_addr),
503*cf84ac9aSAndroid Build Coastguard Worker .sll_addr = "abcdefgh"
504*cf84ac9aSAndroid Build Coastguard Worker };
505*cf84ac9aSAndroid Build Coastguard Worker void *ll = tail_memdup(&c_ll, sizeof(c_ll));
506*cf84ac9aSAndroid Build Coastguard Worker unsigned int len = sizeof(c_ll);
507*cf84ac9aSAndroid Build Coastguard Worker int ret = connect(-1, ll, len);
508*cf84ac9aSAndroid Build Coastguard Worker printf("connect(-1, {sa_family=AF_PACKET"
509*cf84ac9aSAndroid Build Coastguard Worker ", sll_protocol=htons(ETH_P_ALL)"
510*cf84ac9aSAndroid Build Coastguard Worker ", sll_ifindex=%u, sll_hatype=ARPHRD_ETHER"
511*cf84ac9aSAndroid Build Coastguard Worker ", sll_pkttype=PACKET_HOST, sll_halen=%u, sll_addr="
512*cf84ac9aSAndroid Build Coastguard Worker "[%#02x, %#02x, %#02x, %#02x, %#02x, %#02x, %#02x, %#02x]"
513*cf84ac9aSAndroid Build Coastguard Worker "}, %u) = %d EBADF (%m)\n",
514*cf84ac9aSAndroid Build Coastguard Worker c_ll.sll_ifindex, c_ll.sll_halen,
515*cf84ac9aSAndroid Build Coastguard Worker c_ll.sll_addr[0], c_ll.sll_addr[1],
516*cf84ac9aSAndroid Build Coastguard Worker c_ll.sll_addr[2], c_ll.sll_addr[3],
517*cf84ac9aSAndroid Build Coastguard Worker c_ll.sll_addr[4], c_ll.sll_addr[5],
518*cf84ac9aSAndroid Build Coastguard Worker c_ll.sll_addr[6], c_ll.sll_addr[7],
519*cf84ac9aSAndroid Build Coastguard Worker len, ret);
520*cf84ac9aSAndroid Build Coastguard Worker
521*cf84ac9aSAndroid Build Coastguard Worker ((struct sockaddr_ll *) ll)->sll_halen++;
522*cf84ac9aSAndroid Build Coastguard Worker ret = connect(-1, ll, len);
523*cf84ac9aSAndroid Build Coastguard Worker printf("connect(-1, {sa_family=AF_PACKET"
524*cf84ac9aSAndroid Build Coastguard Worker ", sll_protocol=htons(ETH_P_ALL)"
525*cf84ac9aSAndroid Build Coastguard Worker ", sll_ifindex=%u, sll_hatype=ARPHRD_ETHER"
526*cf84ac9aSAndroid Build Coastguard Worker ", sll_pkttype=PACKET_HOST, sll_halen=%u, sll_addr="
527*cf84ac9aSAndroid Build Coastguard Worker "[%#02x, %#02x, %#02x, %#02x, %#02x, %#02x, %#02x, %#02x, ...]"
528*cf84ac9aSAndroid Build Coastguard Worker "}, %u) = %d EBADF (%m)\n",
529*cf84ac9aSAndroid Build Coastguard Worker c_ll.sll_ifindex, c_ll.sll_halen + 1,
530*cf84ac9aSAndroid Build Coastguard Worker c_ll.sll_addr[0], c_ll.sll_addr[1],
531*cf84ac9aSAndroid Build Coastguard Worker c_ll.sll_addr[2], c_ll.sll_addr[3],
532*cf84ac9aSAndroid Build Coastguard Worker c_ll.sll_addr[4], c_ll.sll_addr[5],
533*cf84ac9aSAndroid Build Coastguard Worker c_ll.sll_addr[6], c_ll.sll_addr[7],
534*cf84ac9aSAndroid Build Coastguard Worker len, ret);
535*cf84ac9aSAndroid Build Coastguard Worker
536*cf84ac9aSAndroid Build Coastguard Worker ((struct sockaddr_ll *) ll)->sll_halen = 0;
537*cf84ac9aSAndroid Build Coastguard Worker ret = connect(-1, ll, len);
538*cf84ac9aSAndroid Build Coastguard Worker printf("connect(-1, {sa_family=AF_PACKET"
539*cf84ac9aSAndroid Build Coastguard Worker ", sll_protocol=htons(ETH_P_ALL)"
540*cf84ac9aSAndroid Build Coastguard Worker ", sll_ifindex=%u, sll_hatype=ARPHRD_ETHER"
541*cf84ac9aSAndroid Build Coastguard Worker ", sll_pkttype=PACKET_HOST, sll_halen=0}, %u)"
542*cf84ac9aSAndroid Build Coastguard Worker " = %d EBADF (%m)\n", c_ll.sll_ifindex, len, ret);
543*cf84ac9aSAndroid Build Coastguard Worker
544*cf84ac9aSAndroid Build Coastguard Worker ((struct sockaddr_ll *) ll)->sll_ifindex = ifindex_lo();
545*cf84ac9aSAndroid Build Coastguard Worker if (((struct sockaddr_ll *) ll)->sll_ifindex) {
546*cf84ac9aSAndroid Build Coastguard Worker ret = connect(-1, ll, len);
547*cf84ac9aSAndroid Build Coastguard Worker printf("connect(-1, {sa_family=AF_PACKET"
548*cf84ac9aSAndroid Build Coastguard Worker ", sll_protocol=htons(ETH_P_ALL)"
549*cf84ac9aSAndroid Build Coastguard Worker ", sll_ifindex=%s"
550*cf84ac9aSAndroid Build Coastguard Worker ", sll_hatype=ARPHRD_ETHER"
551*cf84ac9aSAndroid Build Coastguard Worker ", sll_pkttype=PACKET_HOST, sll_halen=0}, %u)"
552*cf84ac9aSAndroid Build Coastguard Worker " = %d EBADF (%m)\n", IFINDEX_LO_STR, len, ret);
553*cf84ac9aSAndroid Build Coastguard Worker }
554*cf84ac9aSAndroid Build Coastguard Worker }
555*cf84ac9aSAndroid Build Coastguard Worker
556*cf84ac9aSAndroid Build Coastguard Worker #ifdef HAVE_BLUETOOTH_BLUETOOTH_H
557*cf84ac9aSAndroid Build Coastguard Worker static void
check_hci(void)558*cf84ac9aSAndroid Build Coastguard Worker check_hci(void)
559*cf84ac9aSAndroid Build Coastguard Worker {
560*cf84ac9aSAndroid Build Coastguard Worker const unsigned short h_port = 12345;
561*cf84ac9aSAndroid Build Coastguard Worker TAIL_ALLOC_OBJECT_VAR_PTR(struct sockaddr_hci, hci);
562*cf84ac9aSAndroid Build Coastguard Worker hci->hci_family = AF_BLUETOOTH;
563*cf84ac9aSAndroid Build Coastguard Worker hci->hci_dev = htobs(h_port);
564*cf84ac9aSAndroid Build Coastguard Worker hci->hci_channel = HCI_CHANNEL_RAW;
565*cf84ac9aSAndroid Build Coastguard Worker unsigned int len = sizeof(*hci);
566*cf84ac9aSAndroid Build Coastguard Worker int ret = connect(-1, (void *) hci, len);
567*cf84ac9aSAndroid Build Coastguard Worker printf("connect(-1, {sa_family=AF_BLUETOOTH, hci_dev=htobs(%hu)"
568*cf84ac9aSAndroid Build Coastguard Worker ", hci_channel=HCI_CHANNEL_RAW}, %u) = %d EBADF (%m)\n",
569*cf84ac9aSAndroid Build Coastguard Worker h_port, len, ret);
570*cf84ac9aSAndroid Build Coastguard Worker }
571*cf84ac9aSAndroid Build Coastguard Worker
572*cf84ac9aSAndroid Build Coastguard Worker static void
check_sco(void)573*cf84ac9aSAndroid Build Coastguard Worker check_sco(void)
574*cf84ac9aSAndroid Build Coastguard Worker {
575*cf84ac9aSAndroid Build Coastguard Worker const struct sockaddr_sco c_sco = {
576*cf84ac9aSAndroid Build Coastguard Worker .sco_family = AF_BLUETOOTH,
577*cf84ac9aSAndroid Build Coastguard Worker .sco_bdaddr.b = "abcdef"
578*cf84ac9aSAndroid Build Coastguard Worker };
579*cf84ac9aSAndroid Build Coastguard Worker void *sco = tail_memdup(&c_sco, sizeof(c_sco));
580*cf84ac9aSAndroid Build Coastguard Worker unsigned int len = sizeof(c_sco);
581*cf84ac9aSAndroid Build Coastguard Worker int ret = connect(-1, sco, len);
582*cf84ac9aSAndroid Build Coastguard Worker printf("connect(-1, {sa_family=AF_BLUETOOTH"
583*cf84ac9aSAndroid Build Coastguard Worker ", sco_bdaddr=%02x:%02x:%02x:%02x:%02x:%02x"
584*cf84ac9aSAndroid Build Coastguard Worker "}, %u) = %d EBADF (%m)\n",
585*cf84ac9aSAndroid Build Coastguard Worker c_sco.sco_bdaddr.b[0], c_sco.sco_bdaddr.b[1],
586*cf84ac9aSAndroid Build Coastguard Worker c_sco.sco_bdaddr.b[2], c_sco.sco_bdaddr.b[3],
587*cf84ac9aSAndroid Build Coastguard Worker c_sco.sco_bdaddr.b[4], c_sco.sco_bdaddr.b[5],
588*cf84ac9aSAndroid Build Coastguard Worker len, ret);
589*cf84ac9aSAndroid Build Coastguard Worker }
590*cf84ac9aSAndroid Build Coastguard Worker
591*cf84ac9aSAndroid Build Coastguard Worker static void
check_rc(void)592*cf84ac9aSAndroid Build Coastguard Worker check_rc(void)
593*cf84ac9aSAndroid Build Coastguard Worker {
594*cf84ac9aSAndroid Build Coastguard Worker const struct sockaddr_rc c_rc = {
595*cf84ac9aSAndroid Build Coastguard Worker .rc_family = AF_BLUETOOTH,
596*cf84ac9aSAndroid Build Coastguard Worker .rc_bdaddr.b = "abcdef",
597*cf84ac9aSAndroid Build Coastguard Worker .rc_channel = 42
598*cf84ac9aSAndroid Build Coastguard Worker };
599*cf84ac9aSAndroid Build Coastguard Worker void *rc = tail_memdup(&c_rc, sizeof(c_rc));
600*cf84ac9aSAndroid Build Coastguard Worker unsigned int len = sizeof(c_rc);
601*cf84ac9aSAndroid Build Coastguard Worker int ret = connect(-1, rc, len);
602*cf84ac9aSAndroid Build Coastguard Worker printf("connect(-1, {sa_family=AF_BLUETOOTH"
603*cf84ac9aSAndroid Build Coastguard Worker ", rc_bdaddr=%02x:%02x:%02x:%02x:%02x:%02x"
604*cf84ac9aSAndroid Build Coastguard Worker ", rc_channel=%u}, %u) = %d EBADF (%m)\n",
605*cf84ac9aSAndroid Build Coastguard Worker c_rc.rc_bdaddr.b[0], c_rc.rc_bdaddr.b[1],
606*cf84ac9aSAndroid Build Coastguard Worker c_rc.rc_bdaddr.b[2], c_rc.rc_bdaddr.b[3],
607*cf84ac9aSAndroid Build Coastguard Worker c_rc.rc_bdaddr.b[4], c_rc.rc_bdaddr.b[5],
608*cf84ac9aSAndroid Build Coastguard Worker c_rc.rc_channel, len, ret);
609*cf84ac9aSAndroid Build Coastguard Worker }
610*cf84ac9aSAndroid Build Coastguard Worker
611*cf84ac9aSAndroid Build Coastguard Worker static void
check_l2(void)612*cf84ac9aSAndroid Build Coastguard Worker check_l2(void)
613*cf84ac9aSAndroid Build Coastguard Worker {
614*cf84ac9aSAndroid Build Coastguard Worker const unsigned short h_psm = 12345;
615*cf84ac9aSAndroid Build Coastguard Worker const unsigned short h_cid = 13579;
616*cf84ac9aSAndroid Build Coastguard Worker struct sockaddr_l2 c_l2 = {
617*cf84ac9aSAndroid Build Coastguard Worker .l2_family = AF_BLUETOOTH,
618*cf84ac9aSAndroid Build Coastguard Worker .l2_psm = htobs(h_psm),
619*cf84ac9aSAndroid Build Coastguard Worker .l2_bdaddr.b = "abcdef",
620*cf84ac9aSAndroid Build Coastguard Worker .l2_cid = htobs(h_cid),
621*cf84ac9aSAndroid Build Coastguard Worker #ifdef HAVE_STRUCT_SOCKADDR_L2_L2_BDADDR_TYPE
622*cf84ac9aSAndroid Build Coastguard Worker .l2_bdaddr_type = 0xce,
623*cf84ac9aSAndroid Build Coastguard Worker #endif
624*cf84ac9aSAndroid Build Coastguard Worker };
625*cf84ac9aSAndroid Build Coastguard Worker void *l2 = tail_memdup(&c_l2, sizeof(c_l2));
626*cf84ac9aSAndroid Build Coastguard Worker unsigned int len = sizeof(c_l2);
627*cf84ac9aSAndroid Build Coastguard Worker
628*cf84ac9aSAndroid Build Coastguard Worker int ret = connect(-1, l2, len);
629*cf84ac9aSAndroid Build Coastguard Worker printf("connect(-1, {sa_family=AF_BLUETOOTH"
630*cf84ac9aSAndroid Build Coastguard Worker ", l2_psm=htobs(L2CAP_PSM_DYN_START + %hu)"
631*cf84ac9aSAndroid Build Coastguard Worker ", l2_bdaddr=%02x:%02x:%02x:%02x:%02x:%02x"
632*cf84ac9aSAndroid Build Coastguard Worker ", l2_cid=htobs(L2CAP_CID_DYN_START + %hu)"
633*cf84ac9aSAndroid Build Coastguard Worker #ifdef HAVE_STRUCT_SOCKADDR_L2_L2_BDADDR_TYPE
634*cf84ac9aSAndroid Build Coastguard Worker ", l2_bdaddr_type=0xce /* BDADDR_??? */"
635*cf84ac9aSAndroid Build Coastguard Worker #endif
636*cf84ac9aSAndroid Build Coastguard Worker "}, %u) = %d EBADF (%m)\n",
637*cf84ac9aSAndroid Build Coastguard Worker (short) (h_psm - 0x1001),
638*cf84ac9aSAndroid Build Coastguard Worker c_l2.l2_bdaddr.b[0], c_l2.l2_bdaddr.b[1],
639*cf84ac9aSAndroid Build Coastguard Worker c_l2.l2_bdaddr.b[2], c_l2.l2_bdaddr.b[3],
640*cf84ac9aSAndroid Build Coastguard Worker c_l2.l2_bdaddr.b[4], c_l2.l2_bdaddr.b[5],
641*cf84ac9aSAndroid Build Coastguard Worker (short) (h_cid - 0x40), len, ret);
642*cf84ac9aSAndroid Build Coastguard Worker
643*cf84ac9aSAndroid Build Coastguard Worker c_l2.l2_psm = htobs(1);
644*cf84ac9aSAndroid Build Coastguard Worker c_l2.l2_cid = htobs(1);
645*cf84ac9aSAndroid Build Coastguard Worker #ifdef HAVE_STRUCT_SOCKADDR_L2_L2_BDADDR_TYPE
646*cf84ac9aSAndroid Build Coastguard Worker c_l2.l2_bdaddr_type = BDADDR_LE_RANDOM;
647*cf84ac9aSAndroid Build Coastguard Worker #endif
648*cf84ac9aSAndroid Build Coastguard Worker memcpy(l2, &c_l2, sizeof(c_l2));
649*cf84ac9aSAndroid Build Coastguard Worker ret = connect(-1, l2, len);
650*cf84ac9aSAndroid Build Coastguard Worker printf("connect(-1, {sa_family=AF_BLUETOOTH"
651*cf84ac9aSAndroid Build Coastguard Worker ", l2_psm=htobs(L2CAP_PSM_SDP)"
652*cf84ac9aSAndroid Build Coastguard Worker ", l2_bdaddr=%02x:%02x:%02x:%02x:%02x:%02x"
653*cf84ac9aSAndroid Build Coastguard Worker ", l2_cid=htobs(L2CAP_CID_SIGNALING)"
654*cf84ac9aSAndroid Build Coastguard Worker #ifdef HAVE_STRUCT_SOCKADDR_L2_L2_BDADDR_TYPE
655*cf84ac9aSAndroid Build Coastguard Worker ", l2_bdaddr_type=BDADDR_LE_RANDOM"
656*cf84ac9aSAndroid Build Coastguard Worker #endif
657*cf84ac9aSAndroid Build Coastguard Worker "}, %u) = %d EBADF (%m)\n",
658*cf84ac9aSAndroid Build Coastguard Worker c_l2.l2_bdaddr.b[0], c_l2.l2_bdaddr.b[1],
659*cf84ac9aSAndroid Build Coastguard Worker c_l2.l2_bdaddr.b[2], c_l2.l2_bdaddr.b[3],
660*cf84ac9aSAndroid Build Coastguard Worker c_l2.l2_bdaddr.b[4], c_l2.l2_bdaddr.b[5],
661*cf84ac9aSAndroid Build Coastguard Worker len, ret);
662*cf84ac9aSAndroid Build Coastguard Worker
663*cf84ac9aSAndroid Build Coastguard Worker c_l2.l2_psm = htobs(0xbad);
664*cf84ac9aSAndroid Build Coastguard Worker c_l2.l2_cid = htobs(8);
665*cf84ac9aSAndroid Build Coastguard Worker #ifdef HAVE_STRUCT_SOCKADDR_L2_L2_BDADDR_TYPE
666*cf84ac9aSAndroid Build Coastguard Worker c_l2.l2_bdaddr_type = 3;
667*cf84ac9aSAndroid Build Coastguard Worker #endif
668*cf84ac9aSAndroid Build Coastguard Worker memcpy(l2, &c_l2, sizeof(c_l2));
669*cf84ac9aSAndroid Build Coastguard Worker ret = connect(-1, l2, len);
670*cf84ac9aSAndroid Build Coastguard Worker printf("connect(-1, {sa_family=AF_BLUETOOTH"
671*cf84ac9aSAndroid Build Coastguard Worker ", l2_psm=htobs(0xbad /* L2CAP_PSM_??? */)"
672*cf84ac9aSAndroid Build Coastguard Worker ", l2_bdaddr=%02x:%02x:%02x:%02x:%02x:%02x"
673*cf84ac9aSAndroid Build Coastguard Worker ", l2_cid=htobs(0x8 /* L2CAP_CID_??? */)"
674*cf84ac9aSAndroid Build Coastguard Worker #ifdef HAVE_STRUCT_SOCKADDR_L2_L2_BDADDR_TYPE
675*cf84ac9aSAndroid Build Coastguard Worker ", l2_bdaddr_type=0x3 /* BDADDR_??? */"
676*cf84ac9aSAndroid Build Coastguard Worker #endif
677*cf84ac9aSAndroid Build Coastguard Worker "}, %u) = %d EBADF (%m)\n",
678*cf84ac9aSAndroid Build Coastguard Worker c_l2.l2_bdaddr.b[0], c_l2.l2_bdaddr.b[1],
679*cf84ac9aSAndroid Build Coastguard Worker c_l2.l2_bdaddr.b[2], c_l2.l2_bdaddr.b[3],
680*cf84ac9aSAndroid Build Coastguard Worker c_l2.l2_bdaddr.b[4], c_l2.l2_bdaddr.b[5],
681*cf84ac9aSAndroid Build Coastguard Worker len, ret);
682*cf84ac9aSAndroid Build Coastguard Worker
683*cf84ac9aSAndroid Build Coastguard Worker c_l2.l2_psm = htobs(0x10ff);
684*cf84ac9aSAndroid Build Coastguard Worker c_l2.l2_cid = htobs(0xffff);
685*cf84ac9aSAndroid Build Coastguard Worker memcpy(l2, &c_l2, 12);
686*cf84ac9aSAndroid Build Coastguard Worker ret = connect(-1, l2, 12);
687*cf84ac9aSAndroid Build Coastguard Worker printf("connect(-1, {sa_family=AF_BLUETOOTH"
688*cf84ac9aSAndroid Build Coastguard Worker ", l2_psm=htobs(L2CAP_PSM_AUTO_END)"
689*cf84ac9aSAndroid Build Coastguard Worker ", l2_bdaddr=%02x:%02x:%02x:%02x:%02x:%02x"
690*cf84ac9aSAndroid Build Coastguard Worker ", l2_cid=htobs(L2CAP_CID_DYN_END)"
691*cf84ac9aSAndroid Build Coastguard Worker "}, 12) = %d EBADF (%m)\n",
692*cf84ac9aSAndroid Build Coastguard Worker c_l2.l2_bdaddr.b[0], c_l2.l2_bdaddr.b[1],
693*cf84ac9aSAndroid Build Coastguard Worker c_l2.l2_bdaddr.b[2], c_l2.l2_bdaddr.b[3],
694*cf84ac9aSAndroid Build Coastguard Worker c_l2.l2_bdaddr.b[4], c_l2.l2_bdaddr.b[5],
695*cf84ac9aSAndroid Build Coastguard Worker ret);
696*cf84ac9aSAndroid Build Coastguard Worker }
697*cf84ac9aSAndroid Build Coastguard Worker #endif
698*cf84ac9aSAndroid Build Coastguard Worker
699*cf84ac9aSAndroid Build Coastguard Worker static void
check_raw(void)700*cf84ac9aSAndroid Build Coastguard Worker check_raw(void)
701*cf84ac9aSAndroid Build Coastguard Worker {
702*cf84ac9aSAndroid Build Coastguard Worker union {
703*cf84ac9aSAndroid Build Coastguard Worker struct sockaddr *sa;
704*cf84ac9aSAndroid Build Coastguard Worker struct sockaddr_storage *st;
705*cf84ac9aSAndroid Build Coastguard Worker } u = { .st = tail_alloc(sizeof(*u.st)) };
706*cf84ac9aSAndroid Build Coastguard Worker memset(u.st, '0', sizeof(*u.st));
707*cf84ac9aSAndroid Build Coastguard Worker u.sa->sa_family = 0xff;
708*cf84ac9aSAndroid Build Coastguard Worker unsigned int len = sizeof(*u.st) + 8;
709*cf84ac9aSAndroid Build Coastguard Worker int ret = connect(-1, (void *) u.st, len);
710*cf84ac9aSAndroid Build Coastguard Worker printf("connect(-1, {sa_family=%#x /* AF_??? */, sa_data=\"%.*u\"}"
711*cf84ac9aSAndroid Build Coastguard Worker ", %u) = %d EBADF (%m)\n", u.sa->sa_family,
712*cf84ac9aSAndroid Build Coastguard Worker (int) (sizeof(*u.st) - sizeof(u.sa->sa_family)), 0, len, ret);
713*cf84ac9aSAndroid Build Coastguard Worker
714*cf84ac9aSAndroid Build Coastguard Worker u.sa->sa_family = 0;
715*cf84ac9aSAndroid Build Coastguard Worker len = sizeof(u.sa->sa_family) + 1;
716*cf84ac9aSAndroid Build Coastguard Worker ret = connect(-1, (void *) u.st, len);
717*cf84ac9aSAndroid Build Coastguard Worker printf("connect(-1, {sa_family=AF_UNSPEC, sa_data=\"0\"}, %u)"
718*cf84ac9aSAndroid Build Coastguard Worker " = %d EBADF (%m)\n", len, ret);
719*cf84ac9aSAndroid Build Coastguard Worker
720*cf84ac9aSAndroid Build Coastguard Worker u.sa->sa_family = AF_BLUETOOTH;
721*cf84ac9aSAndroid Build Coastguard Worker ++len;
722*cf84ac9aSAndroid Build Coastguard Worker ret = connect(-1, (void *) u.st, len);
723*cf84ac9aSAndroid Build Coastguard Worker printf("connect(-1, {sa_family=AF_BLUETOOTH, sa_data=\"00\"}, %u)"
724*cf84ac9aSAndroid Build Coastguard Worker " = %d EBADF (%m)\n", len, ret);
725*cf84ac9aSAndroid Build Coastguard Worker }
726*cf84ac9aSAndroid Build Coastguard Worker
727*cf84ac9aSAndroid Build Coastguard Worker int
main(void)728*cf84ac9aSAndroid Build Coastguard Worker main(void)
729*cf84ac9aSAndroid Build Coastguard Worker {
730*cf84ac9aSAndroid Build Coastguard Worker check_un();
731*cf84ac9aSAndroid Build Coastguard Worker check_in();
732*cf84ac9aSAndroid Build Coastguard Worker check_in6();
733*cf84ac9aSAndroid Build Coastguard Worker check_ipx();
734*cf84ac9aSAndroid Build Coastguard Worker check_ax25();
735*cf84ac9aSAndroid Build Coastguard Worker check_x25();
736*cf84ac9aSAndroid Build Coastguard Worker check_nl();
737*cf84ac9aSAndroid Build Coastguard Worker check_ll();
738*cf84ac9aSAndroid Build Coastguard Worker #ifdef HAVE_BLUETOOTH_BLUETOOTH_H
739*cf84ac9aSAndroid Build Coastguard Worker check_hci();
740*cf84ac9aSAndroid Build Coastguard Worker check_sco();
741*cf84ac9aSAndroid Build Coastguard Worker check_rc();
742*cf84ac9aSAndroid Build Coastguard Worker check_l2();
743*cf84ac9aSAndroid Build Coastguard Worker #endif
744*cf84ac9aSAndroid Build Coastguard Worker check_raw();
745*cf84ac9aSAndroid Build Coastguard Worker
746*cf84ac9aSAndroid Build Coastguard Worker puts("+++ exited with 0 +++");
747*cf84ac9aSAndroid Build Coastguard Worker return 0;
748*cf84ac9aSAndroid Build Coastguard Worker }
749