1865695bbc89088b9526ea9045410e5afb70a985cplars/*
2865695bbc89088b9526ea9045410e5afb70a985cplars *
3865695bbc89088b9526ea9045410e5afb70a985cplars *   Copyright (c) International Business Machines  Corp., 2001
410c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis *   Copyright (c) Cyril Hrubis <chrubis@suse.cz> 2012
5865695bbc89088b9526ea9045410e5afb70a985cplars *
6865695bbc89088b9526ea9045410e5afb70a985cplars *   This program is free software;  you can redistribute it and/or modify
7865695bbc89088b9526ea9045410e5afb70a985cplars *   it under the terms of the GNU General Public License as published by
8865695bbc89088b9526ea9045410e5afb70a985cplars *   the Free Software Foundation; either version 2 of the License, or
9865695bbc89088b9526ea9045410e5afb70a985cplars *   (at your option) any later version.
10865695bbc89088b9526ea9045410e5afb70a985cplars *
11865695bbc89088b9526ea9045410e5afb70a985cplars *   This program is distributed in the hope that it will be useful,
12865695bbc89088b9526ea9045410e5afb70a985cplars *   but WITHOUT ANY WARRANTY;  without even the implied warranty of
13865695bbc89088b9526ea9045410e5afb70a985cplars *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
14865695bbc89088b9526ea9045410e5afb70a985cplars *   the GNU General Public License for more details.
15865695bbc89088b9526ea9045410e5afb70a985cplars *
16865695bbc89088b9526ea9045410e5afb70a985cplars *   You should have received a copy of the GNU General Public License
17865695bbc89088b9526ea9045410e5afb70a985cplars *   along with this program;  if not, write to the Free Software
184548c6cf9bcdd96d8303caa4130ab638b61f8a30Wanlong Gao *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19865695bbc89088b9526ea9045410e5afb70a985cplars */
20865695bbc89088b9526ea9045410e5afb70a985cplars
21865695bbc89088b9526ea9045410e5afb70a985cplars/*
22865695bbc89088b9526ea9045410e5afb70a985cplars * Test Name: sendto01
23865695bbc89088b9526ea9045410e5afb70a985cplars *
24865695bbc89088b9526ea9045410e5afb70a985cplars * Test Description:
25865695bbc89088b9526ea9045410e5afb70a985cplars *  Verify that sendto() returns the proper errno for various failure cases
26865695bbc89088b9526ea9045410e5afb70a985cplars *
27865695bbc89088b9526ea9045410e5afb70a985cplars * HISTORY
28865695bbc89088b9526ea9045410e5afb70a985cplars *	07/2001 Ported by Wayne Boyer
29865695bbc89088b9526ea9045410e5afb70a985cplars */
30865695bbc89088b9526ea9045410e5afb70a985cplars
31865695bbc89088b9526ea9045410e5afb70a985cplars#include <stdio.h>
32865695bbc89088b9526ea9045410e5afb70a985cplars#include <unistd.h>
33865695bbc89088b9526ea9045410e5afb70a985cplars#include <errno.h>
34393f6343e80655ef1af0e38370ba3f877f32982fplars#include <fcntl.h>
35865695bbc89088b9526ea9045410e5afb70a985cplars
36865695bbc89088b9526ea9045410e5afb70a985cplars#include <sys/types.h>
37865695bbc89088b9526ea9045410e5afb70a985cplars#include <sys/socket.h>
38865695bbc89088b9526ea9045410e5afb70a985cplars#include <sys/signal.h>
39865695bbc89088b9526ea9045410e5afb70a985cplars#include <sys/un.h>
40865695bbc89088b9526ea9045410e5afb70a985cplars
41865695bbc89088b9526ea9045410e5afb70a985cplars#include <netinet/in.h>
42865695bbc89088b9526ea9045410e5afb70a985cplars
43865695bbc89088b9526ea9045410e5afb70a985cplars#include "test.h"
4459c9acba8a6908776f84d1f54a82e7f31c653d9cCyril Hrubis#include "safe_macros.h"
45865695bbc89088b9526ea9045410e5afb70a985cplars
4610c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubischar *TCID = "sendto01";
47865695bbc89088b9526ea9045410e5afb70a985cplarsint testno;
48865695bbc89088b9526ea9045410e5afb70a985cplars
4910c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubisstatic char buf[1024], bigbuf[128 * 1024];
5010c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubisstatic int s;
5110c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubisstatic struct sockaddr_in sin1, sin2;
5210c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubisstatic int sfd;
53865695bbc89088b9526ea9045410e5afb70a985cplars
54865695bbc89088b9526ea9045410e5afb70a985cplarsstruct test_case_t {		/* test case structure */
5556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	int domain;		/* PF_INET, PF_UNIX, ... */
5656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	int type;		/* SOCK_STREAM, SOCK_DGRAM ... */
5756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	int proto;		/* protocol number (usually 0 = default) */
5856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	void *buf;		/* send data buffer */
5956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	int buflen;		/* send's 3rd argument */
6056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	unsigned flags;		/* send's 4th argument */
61865695bbc89088b9526ea9045410e5afb70a985cplars	struct sockaddr_in *to;	/* destination */
6256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	int tolen;		/* length of "to" buffer */
6310c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	int retval;
6410c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	int experrno;
65354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	void (*setup) (void);
66354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	void (*cleanup) (void);
67865695bbc89088b9526ea9045410e5afb70a985cplars	char *desc;
6810c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis};
6910c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis
7010c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubisstatic void setup(void);
7110c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubisstatic void setup0(void);
7210c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubisstatic void setup1(void);
7310c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubisstatic void setup2(void);
7410c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubisstatic void setup3(void);
7510c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubisstatic void cleanup(void);
7610c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubisstatic void cleanup0(void);
7710c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubisstatic void cleanup1(void);
7810c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubisstatic void do_child(void);
7910c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis
8010c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubisstruct test_case_t tdat[] = {
8110c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	{.domain = PF_INET,
8210c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .type = SOCK_STREAM,
8310c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .proto = 0,
8410c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .buf = buf,
8510c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .buflen = sizeof(buf),
8610c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .flags = 0,
8710c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .to = &sin1,
8810c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .tolen = sizeof(sin1),
8910c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .retval = -1,
9010c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .experrno = EBADF,
9110c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .setup = setup0,
9210c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .cleanup = cleanup0,
93354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 .desc = "bad file descriptor"}
94354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	,
9510c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	{.domain = 0,
9610c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .type = 0,
9710c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .proto = 0,
9810c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .buf = buf,
9910c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .buflen = sizeof(buf),
10010c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .flags = 0,
10110c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .to = &sin1,
10210c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .tolen = sizeof(sin1),
10310c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .retval = -1,
10410c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .experrno = ENOTSOCK,
10510c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .setup = setup0,
10610c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .cleanup = cleanup0,
107354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 .desc = "invalid socket"}
108354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	,
1097ec19d9c95d491394401f8e2d88ec94f13f596dfvapier#ifndef UCLINUX
11010c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	/* Skip since uClinux does not implement memory protection */
11110c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	{.domain = PF_INET,
11210c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .type = SOCK_DGRAM,
11310c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .proto = 0,
11410c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .buf = (void *)-1,
11510c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .buflen = sizeof(buf),
11610c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .flags = 0,
11710c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .to = &sin1,
11810c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .tolen = sizeof(sin1),
11910c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .retval = -1,
12010c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .experrno = EFAULT,
12110c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .setup = setup1,
12210c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .cleanup = cleanup1,
123354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 .desc = "invalid send buffer"}
124354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	,
1257ec19d9c95d491394401f8e2d88ec94f13f596dfvapier#endif
12610c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	{.domain = PF_INET,
12710c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .type = SOCK_STREAM,
12810c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .proto = 0,
12910c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .buf = buf,
13010c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .buflen = sizeof(buf),
13110c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .flags = 0,
13210c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .to = &sin2,
13310c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .tolen = sizeof(sin2),
13410c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .retval = 0,
13510c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .experrno = EFAULT,
13610c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .setup = setup1,
13710c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .cleanup = cleanup1,
138354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 .desc = "connected TCP"}
139354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	,
14010c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	{.domain = PF_INET,
14110c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .type = SOCK_STREAM,
14210c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .proto = 0,
14310c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .buf = buf,
14410c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .buflen = sizeof(buf),
14510c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .flags = 0,
14610c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .to = &sin1,
14710c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .tolen = sizeof(sin1),
14810c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .retval = -1,
14910c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .experrno = EPIPE,
15010c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .setup = setup3,
15110c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .cleanup = cleanup1,
152354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 .desc = "not connected TCP"}
153354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	,
15410c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	{.domain = PF_INET,
15510c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .type = SOCK_DGRAM,
15610c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .proto = 0,
15710c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .buf = buf,
15810c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .buflen = sizeof(buf),
15910c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .flags = 0,
16010c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .to = &sin1,
16110c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .tolen = -1,
16210c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .retval = -1,
16310c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .experrno = EINVAL,
16410c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .setup = setup1,
16510c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .cleanup = cleanup1,
166354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 .desc = "invalid to buffer length"}
167354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	,
1687ec19d9c95d491394401f8e2d88ec94f13f596dfvapier#ifndef UCLINUX
16910c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	/* Skip since uClinux does not implement memory protection */
17010c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	{.domain = PF_INET,
17110c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .type = SOCK_DGRAM,
17210c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .proto = 0,
17310c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .buf = buf,
17410c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .buflen = sizeof(buf),
17510c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .flags = 0,
17610c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .to = (struct sockaddr_in *)-1,
17710c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .tolen = sizeof(sin1),
17810c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .retval = -1,
17910c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .experrno = EFAULT,
18010c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .setup = setup1,
18110c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .cleanup = cleanup1,
182354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 .desc = "invalid to buffer"}
183354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	,
1847ec19d9c95d491394401f8e2d88ec94f13f596dfvapier#endif
18510c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	{.domain = PF_INET,
18610c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .type = SOCK_DGRAM,
18710c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .proto = 0,
18810c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .buf = bigbuf,
18910c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .buflen = sizeof(bigbuf),
19010c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .flags = 0,
19110c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .to = &sin1,
19210c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .tolen = sizeof(sin1),
19310c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .retval = -1,
19410c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .experrno = EMSGSIZE,
19510c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .setup = setup1,
19610c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .cleanup = cleanup1,
197354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 .desc = "UDP message too big"}
198354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	,
19910c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	{.domain = PF_INET,
20010c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .type = SOCK_STREAM,
20110c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .proto = 0,
20210c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .buf = buf,
20310c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .buflen = sizeof(buf),
20410c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .flags = 0,
20510c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .to = &sin1,
20610c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .tolen = sizeof(sin1),
20710c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .retval = -1,
20810c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .experrno = EPIPE,
20910c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .setup = setup2,
21010c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .cleanup = cleanup1,
211354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 .desc = "local endpoint shutdown"}
212354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	,
21310c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	{.domain = PF_INET,
2141c6354e6a4b92aebcd43351cf4e775a9a12dc8e7Jan Stancek	 .type = SOCK_DGRAM,
21510c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .proto = 0,
21610c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .buf = buf,
21710c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .buflen = sizeof(buf),
2181c6354e6a4b92aebcd43351cf4e775a9a12dc8e7Jan Stancek	 .flags = MSG_OOB,
21910c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .to = &sin1,
22010c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .tolen = sizeof(sin1),
2211c6354e6a4b92aebcd43351cf4e775a9a12dc8e7Jan Stancek	 .retval = -1,
2221c6354e6a4b92aebcd43351cf4e775a9a12dc8e7Jan Stancek	 .experrno = EOPNOTSUPP,
2231c6354e6a4b92aebcd43351cf4e775a9a12dc8e7Jan Stancek	 .setup = setup1,
22410c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .cleanup = cleanup1,
22510c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	 .desc = "invalid flags set"}
226865695bbc89088b9526ea9045410e5afb70a985cplars};
227865695bbc89088b9526ea9045410e5afb70a985cplars
22810c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubisint TST_TOTAL = sizeof(tdat) / sizeof(tdat[0]);
229865695bbc89088b9526ea9045410e5afb70a985cplars
230d34d581c6a320e356a6cda923c7aa399479e812crobbiew#ifdef UCLINUX
231d34d581c6a320e356a6cda923c7aa399479e812crobbiewstatic char *argv0;
232d34d581c6a320e356a6cda923c7aa399479e812crobbiew#endif
233d34d581c6a320e356a6cda923c7aa399479e812crobbiew
23410c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubisstatic pid_t start_server(struct sockaddr_in *sin0)
2358541eeb5c7a26ec652655ef48a8aa77be7d409aarobbiew{
23656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	pid_t pid;
2376e4e77a974ebeaa5704fa6d127e163a484b12607Jan Stancek	socklen_t slen = sizeof(*sin0);
2386e4e77a974ebeaa5704fa6d127e163a484b12607Jan Stancek
2396e4e77a974ebeaa5704fa6d127e163a484b12607Jan Stancek	sin0->sin_family = AF_INET;
2406e4e77a974ebeaa5704fa6d127e163a484b12607Jan Stancek	sin0->sin_port = 0; /* pick random free port */
2416e4e77a974ebeaa5704fa6d127e163a484b12607Jan Stancek	sin0->sin_addr.s_addr = INADDR_ANY;
2428541eeb5c7a26ec652655ef48a8aa77be7d409aarobbiew
2438541eeb5c7a26ec652655ef48a8aa77be7d409aarobbiew	sfd = socket(PF_INET, SOCK_STREAM, 0);
2448541eeb5c7a26ec652655ef48a8aa77be7d409aarobbiew	if (sfd < 0) {
245354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		tst_brkm(TBROK | TERRNO, cleanup, "server socket failed");
2468541eeb5c7a26ec652655ef48a8aa77be7d409aarobbiew		return -1;
2478541eeb5c7a26ec652655ef48a8aa77be7d409aarobbiew	}
2486e4e77a974ebeaa5704fa6d127e163a484b12607Jan Stancek	if (bind(sfd, (struct sockaddr *)sin0, sizeof(*sin0)) < 0) {
249354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		tst_brkm(TBROK | TERRNO, cleanup, "server bind failed");
2508541eeb5c7a26ec652655ef48a8aa77be7d409aarobbiew		return -1;
2518541eeb5c7a26ec652655ef48a8aa77be7d409aarobbiew	}
2528541eeb5c7a26ec652655ef48a8aa77be7d409aarobbiew	if (listen(sfd, 10) < 0) {
253354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		tst_brkm(TBROK | TERRNO, cleanup, "server listen failed");
2548541eeb5c7a26ec652655ef48a8aa77be7d409aarobbiew		return -1;
2558541eeb5c7a26ec652655ef48a8aa77be7d409aarobbiew	}
256e74013a59a7991cffff55889f634413e92cfbc91Cyril Hrubis	SAFE_GETSOCKNAME(cleanup, sfd, (struct sockaddr *)sin0, &slen);
2576e4e77a974ebeaa5704fa6d127e163a484b12607Jan Stancek
258d34d581c6a320e356a6cda923c7aa399479e812crobbiew	switch ((pid = FORK_OR_VFORK())) {
25910c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	case 0:
260d34d581c6a320e356a6cda923c7aa399479e812crobbiew#ifdef UCLINUX
261c450e0643d1d1cd67e42d4f056ce3caf2f128843vapier		if (self_exec(argv0, "d", sfd) < 0)
262354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			tst_brkm(TBROK | TERRNO, cleanup,
263354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				 "server self_exec failed");
264d34d581c6a320e356a6cda923c7aa399479e812crobbiew#else
265d34d581c6a320e356a6cda923c7aa399479e812crobbiew		do_child();
266d34d581c6a320e356a6cda923c7aa399479e812crobbiew#endif
2678541eeb5c7a26ec652655ef48a8aa77be7d409aarobbiew		break;
2688541eeb5c7a26ec652655ef48a8aa77be7d409aarobbiew	case -1:
269354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		tst_brkm(TBROK | TERRNO, cleanup, "server fork failed");
27010c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	default:
27156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		(void)close(sfd);
2728541eeb5c7a26ec652655ef48a8aa77be7d409aarobbiew		return pid;
2738541eeb5c7a26ec652655ef48a8aa77be7d409aarobbiew	}
2748541eeb5c7a26ec652655ef48a8aa77be7d409aarobbiew
27510c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	exit(1);
276d34d581c6a320e356a6cda923c7aa399479e812crobbiew}
277d34d581c6a320e356a6cda923c7aa399479e812crobbiew
27810c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubisstatic void do_child(void)
279d34d581c6a320e356a6cda923c7aa399479e812crobbiew{
280d34d581c6a320e356a6cda923c7aa399479e812crobbiew	struct sockaddr_in fsin;
28156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	fd_set afds, rfds;
28256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	int nfds, cc, fd;
283d34d581c6a320e356a6cda923c7aa399479e812crobbiew
2848541eeb5c7a26ec652655ef48a8aa77be7d409aarobbiew	FD_ZERO(&afds);
2858541eeb5c7a26ec652655ef48a8aa77be7d409aarobbiew	FD_SET(sfd, &afds);
2868541eeb5c7a26ec652655ef48a8aa77be7d409aarobbiew
2877855d094bbeb9b8ce43dd698ec82e400eb91e709Cyril Hrubis	nfds = sfd + 1;
2888541eeb5c7a26ec652655ef48a8aa77be7d409aarobbiew
2898541eeb5c7a26ec652655ef48a8aa77be7d409aarobbiew	/* accept connections until killed */
2908541eeb5c7a26ec652655ef48a8aa77be7d409aarobbiew	while (1) {
29156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		socklen_t fromlen;
2928541eeb5c7a26ec652655ef48a8aa77be7d409aarobbiew
2938541eeb5c7a26ec652655ef48a8aa77be7d409aarobbiew		memcpy(&rfds, &afds, sizeof(rfds));
2948541eeb5c7a26ec652655ef48a8aa77be7d409aarobbiew
29510c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis		if (select(nfds, &rfds, NULL, NULL, NULL) < 0 && errno != EINTR)
29610c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis			exit(1);
29710c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis
2988541eeb5c7a26ec652655ef48a8aa77be7d409aarobbiew		if (FD_ISSET(sfd, &rfds)) {
2998541eeb5c7a26ec652655ef48a8aa77be7d409aarobbiew			int newfd;
3008541eeb5c7a26ec652655ef48a8aa77be7d409aarobbiew
3018541eeb5c7a26ec652655ef48a8aa77be7d409aarobbiew			fromlen = sizeof(fsin);
3028541eeb5c7a26ec652655ef48a8aa77be7d409aarobbiew			newfd = accept(sfd, (struct sockaddr *)&fsin, &fromlen);
3037855d094bbeb9b8ce43dd698ec82e400eb91e709Cyril Hrubis			if (newfd >= 0) {
3048541eeb5c7a26ec652655ef48a8aa77be7d409aarobbiew				FD_SET(newfd, &afds);
3057855d094bbeb9b8ce43dd698ec82e400eb91e709Cyril Hrubis				nfds = MAX(nfds, newfd + 1);
3067855d094bbeb9b8ce43dd698ec82e400eb91e709Cyril Hrubis			}
3078541eeb5c7a26ec652655ef48a8aa77be7d409aarobbiew		}
30856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		for (fd = 0; fd < nfds; ++fd) {
3098541eeb5c7a26ec652655ef48a8aa77be7d409aarobbiew			if (fd != sfd && FD_ISSET(fd, &rfds)) {
3108541eeb5c7a26ec652655ef48a8aa77be7d409aarobbiew				cc = read(fd, buf, sizeof(buf));
3118541eeb5c7a26ec652655ef48a8aa77be7d409aarobbiew				if (cc == 0 || (cc < 0 && errno != EINTR)) {
31256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak					(void)close(fd);
3138541eeb5c7a26ec652655ef48a8aa77be7d409aarobbiew					FD_CLR(fd, &afds);
3148541eeb5c7a26ec652655ef48a8aa77be7d409aarobbiew				}
3158541eeb5c7a26ec652655ef48a8aa77be7d409aarobbiew			}
3168541eeb5c7a26ec652655ef48a8aa77be7d409aarobbiew		}
3178541eeb5c7a26ec652655ef48a8aa77be7d409aarobbiew	}
3188541eeb5c7a26ec652655ef48a8aa77be7d409aarobbiew}
3198541eeb5c7a26ec652655ef48a8aa77be7d409aarobbiew
32056207cec7732e09c216c751c0b5f88a242bacae6subrata_modakint main(int ac, char *av[])
321865695bbc89088b9526ea9045410e5afb70a985cplars{
32210c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	int lc;
323865695bbc89088b9526ea9045410e5afb70a985cplars
324d6d11d08678aac1ed2c370ea8e42e5f45aea07beCyril Hrubis	tst_parse_opts(ac, av, NULL, NULL);
32510c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis
326d34d581c6a320e356a6cda923c7aa399479e812crobbiew#ifdef UCLINUX
327d34d581c6a320e356a6cda923c7aa399479e812crobbiew	argv0 = av[0];
328d34d581c6a320e356a6cda923c7aa399479e812crobbiew	maybe_run_child(&do_child, "d", &sfd);
329d34d581c6a320e356a6cda923c7aa399479e812crobbiew#endif
330d34d581c6a320e356a6cda923c7aa399479e812crobbiew
331865695bbc89088b9526ea9045410e5afb70a985cplars	setup();
332865695bbc89088b9526ea9045410e5afb70a985cplars
333865695bbc89088b9526ea9045410e5afb70a985cplars	for (lc = 0; TEST_LOOPING(lc); ++lc) {
334865695bbc89088b9526ea9045410e5afb70a985cplars
335d59a659cd639ca2780b00049d102acd2a783d585Caspar Zhang		tst_count = 0;
33656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		for (testno = 0; testno < TST_TOTAL; ++testno) {
337865695bbc89088b9526ea9045410e5afb70a985cplars			tdat[testno].setup();
338865695bbc89088b9526ea9045410e5afb70a985cplars
339865695bbc89088b9526ea9045410e5afb70a985cplars			TEST(sendto(s, tdat[testno].buf, tdat[testno].buflen,
34056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak				    tdat[testno].flags,
34156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak				    (const struct sockaddr *)tdat[testno].to,
34256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak				    tdat[testno].tolen));
343865695bbc89088b9526ea9045410e5afb70a985cplars
344865695bbc89088b9526ea9045410e5afb70a985cplars			if (TEST_RETURN > 0)
345605fa3362fd7cef0baa2131be32cf44661783d3eCyril Hrubis				TEST_RETURN = 0;
346865695bbc89088b9526ea9045410e5afb70a985cplars
347865695bbc89088b9526ea9045410e5afb70a985cplars			if (TEST_RETURN != tdat[testno].retval ||
348865695bbc89088b9526ea9045410e5afb70a985cplars			    (TEST_RETURN < 0 &&
349865695bbc89088b9526ea9045410e5afb70a985cplars			     TEST_ERRNO != tdat[testno].experrno)) {
350865695bbc89088b9526ea9045410e5afb70a985cplars				tst_resm(TFAIL, "%s ; returned"
351c450e0643d1d1cd67e42d4f056ce3caf2f128843vapier					 " %ld (expected %d), errno %d (expected"
35256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak					 " %d)", tdat[testno].desc,
35356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak					 TEST_RETURN, tdat[testno].retval,
35456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak					 TEST_ERRNO, tdat[testno].experrno);
355865695bbc89088b9526ea9045410e5afb70a985cplars			} else {
356865695bbc89088b9526ea9045410e5afb70a985cplars				tst_resm(TPASS, "%s successful",
35756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak					 tdat[testno].desc);
358865695bbc89088b9526ea9045410e5afb70a985cplars			}
359865695bbc89088b9526ea9045410e5afb70a985cplars			tdat[testno].cleanup();
360865695bbc89088b9526ea9045410e5afb70a985cplars		}
361865695bbc89088b9526ea9045410e5afb70a985cplars	}
362865695bbc89088b9526ea9045410e5afb70a985cplars	cleanup();
363865695bbc89088b9526ea9045410e5afb70a985cplars
36453740500924f6439623a8ac256b5be2d6c59ed1fGarrett Cooper	tst_exit();
365865695bbc89088b9526ea9045410e5afb70a985cplars}
366865695bbc89088b9526ea9045410e5afb70a985cplars
36710c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubisstatic pid_t server_pid;
368865695bbc89088b9526ea9045410e5afb70a985cplars
36910c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubisstatic void setup(void)
370865695bbc89088b9526ea9045410e5afb70a985cplars{
37110c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	TEST_PAUSE;
372865695bbc89088b9526ea9045410e5afb70a985cplars
37310c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	server_pid = start_server(&sin1);
374865695bbc89088b9526ea9045410e5afb70a985cplars
37510c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	signal(SIGPIPE, SIG_IGN);
376865695bbc89088b9526ea9045410e5afb70a985cplars}
377865695bbc89088b9526ea9045410e5afb70a985cplars
37810c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubisstatic void cleanup(void)
379865695bbc89088b9526ea9045410e5afb70a985cplars{
38010c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	kill(server_pid, SIGKILL);
381865695bbc89088b9526ea9045410e5afb70a985cplars}
382865695bbc89088b9526ea9045410e5afb70a985cplars
38310c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubisstatic void setup0(void)
384865695bbc89088b9526ea9045410e5afb70a985cplars{
385865695bbc89088b9526ea9045410e5afb70a985cplars	if (tdat[testno].experrno == EBADF)
38610c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis		s = 400;
387354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	else if ((s = open("/dev/null", O_WRONLY)) == -1)
388354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		tst_brkm(TBROK | TERRNO, cleanup, "open(/dev/null) failed");
389865695bbc89088b9526ea9045410e5afb70a985cplars}
390865695bbc89088b9526ea9045410e5afb70a985cplars
39110c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubisstatic void cleanup0(void)
392865695bbc89088b9526ea9045410e5afb70a985cplars{
393865695bbc89088b9526ea9045410e5afb70a985cplars	s = -1;
394865695bbc89088b9526ea9045410e5afb70a985cplars}
395865695bbc89088b9526ea9045410e5afb70a985cplars
39610c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubisstatic void setup1(void)
397865695bbc89088b9526ea9045410e5afb70a985cplars{
398eb6418fe9d7a9bdb71fb22db3d322ba8f42bad83Cyril Hrubis	s = SAFE_SOCKET(cleanup, tdat[testno].domain, tdat[testno].type,
399eb6418fe9d7a9bdb71fb22db3d322ba8f42bad83Cyril Hrubis			tdat[testno].proto);
40059c9acba8a6908776f84d1f54a82e7f31c653d9cCyril Hrubis	SAFE_CONNECT(cleanup, s, (const struct sockaddr *)&sin1, sizeof(sin1));
401865695bbc89088b9526ea9045410e5afb70a985cplars}
402865695bbc89088b9526ea9045410e5afb70a985cplars
40310c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubisstatic void cleanup1(void)
404865695bbc89088b9526ea9045410e5afb70a985cplars{
40556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	(void)close(s);
406865695bbc89088b9526ea9045410e5afb70a985cplars	s = -1;
407865695bbc89088b9526ea9045410e5afb70a985cplars}
408865695bbc89088b9526ea9045410e5afb70a985cplars
40910c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubisstatic void setup2(void)
410865695bbc89088b9526ea9045410e5afb70a985cplars{
41110c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis	setup1();
412c450e0643d1d1cd67e42d4f056ce3caf2f128843vapier	if (shutdown(s, 1) < 0)
413354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		tst_brkm(TBROK | TERRNO, cleanup, "socket setup failed connect "
414c450e0643d1d1cd67e42d4f056ce3caf2f128843vapier			 "test %d", testno);
415865695bbc89088b9526ea9045410e5afb70a985cplars}
41610c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis
41710c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubisstatic void setup3(void)
418865695bbc89088b9526ea9045410e5afb70a985cplars{
419eb6418fe9d7a9bdb71fb22db3d322ba8f42bad83Cyril Hrubis	s = SAFE_SOCKET(cleanup, tdat[testno].domain, tdat[testno].type,
420eb6418fe9d7a9bdb71fb22db3d322ba8f42bad83Cyril Hrubis		        tdat[testno].proto);
42110c580b50c1234e5d7b5a5f4d5b3e21cd40b2bb5Cyril Hrubis}
422