1865695bbc89088b9526ea9045410e5afb70a985cplars/*
2865695bbc89088b9526ea9045410e5afb70a985cplars *
3865695bbc89088b9526ea9045410e5afb70a985cplars *   Copyright (c) International Business Machines  Corp., 2001
4e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril 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: send01
23865695bbc89088b9526ea9045410e5afb70a985cplars *
24865695bbc89088b9526ea9045410e5afb70a985cplars * Test Description:
25865695bbc89088b9526ea9045410e5afb70a985cplars *  Verify that send() returns the proper errno for various failure cases
26865695bbc89088b9526ea9045410e5afb70a985cplars *
27865695bbc89088b9526ea9045410e5afb70a985cplars * HISTORY
28865695bbc89088b9526ea9045410e5afb70a985cplars *	07/2001 Ported by Wayne Boyer
29865695bbc89088b9526ea9045410e5afb70a985cplars *
30865695bbc89088b9526ea9045410e5afb70a985cplars */
31865695bbc89088b9526ea9045410e5afb70a985cplars
32865695bbc89088b9526ea9045410e5afb70a985cplars#include <stdio.h>
33865695bbc89088b9526ea9045410e5afb70a985cplars#include <unistd.h>
34865695bbc89088b9526ea9045410e5afb70a985cplars#include <errno.h>
350c850b719f171808712bcb4be0de9e329e456859plars#include <fcntl.h>
36865695bbc89088b9526ea9045410e5afb70a985cplars
37865695bbc89088b9526ea9045410e5afb70a985cplars#include <sys/types.h>
38865695bbc89088b9526ea9045410e5afb70a985cplars#include <sys/socket.h>
39865695bbc89088b9526ea9045410e5afb70a985cplars#include <sys/signal.h>
40865695bbc89088b9526ea9045410e5afb70a985cplars#include <sys/un.h>
41865695bbc89088b9526ea9045410e5afb70a985cplars
42865695bbc89088b9526ea9045410e5afb70a985cplars#include <netinet/in.h>
43865695bbc89088b9526ea9045410e5afb70a985cplars
44865695bbc89088b9526ea9045410e5afb70a985cplars#include "test.h"
4559c9acba8a6908776f84d1f54a82e7f31c653d9cCyril Hrubis#include "safe_macros.h"
46865695bbc89088b9526ea9045410e5afb70a985cplars
47e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubischar *TCID = "send01";
48865695bbc89088b9526ea9045410e5afb70a985cplarsint testno;
49865695bbc89088b9526ea9045410e5afb70a985cplars
50e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubisstatic char buf[1024], bigbuf[128 * 1024];
51e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubisstatic int s;
52e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubisstatic struct sockaddr_in sin1;
53354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaostatic int sfd;			/* shared between do_child and start_server */
54865695bbc89088b9526ea9045410e5afb70a985cplars
55865695bbc89088b9526ea9045410e5afb70a985cplarsstruct test_case_t {		/* test case structure */
5656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	int domain;		/* PF_INET, PF_UNIX, ... */
5756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	int type;		/* SOCK_STREAM, SOCK_DGRAM ... */
5856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	int proto;		/* protocol number (usually 0 = default) */
5956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	void *buf;		/* send data buffer */
6056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	int buflen;		/* send's 3rd argument */
6156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	unsigned flags;		/* send's 4th argument */
62e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubis	int retval;
63e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubis	int experrno;
64354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	void (*setup) (void);
65354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	void (*cleanup) (void);
66865695bbc89088b9526ea9045410e5afb70a985cplars	char *desc;
67e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubis};
68e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubis
69e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubisstatic void cleanup(void);
70e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubisstatic void do_child(void);
71e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubisstatic void setup(void);
72e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubisstatic void setup0(void);
73e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubisstatic void setup1(void);
74e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubisstatic void setup2(void);
75e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubisstatic void cleanup0(void);
76e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubisstatic void cleanup1(void);
77e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubis
78e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubisstatic struct test_case_t tdat[] = {
79e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubis	{.domain = PF_INET,
80e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubis	 .type = SOCK_STREAM,
81e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubis	 .proto = 0,
82e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubis	 .buf = buf,
83e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubis	 .buflen = sizeof(buf),
84e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubis	 .flags = 0,
85e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubis	 .retval = -1,
86e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubis	 .experrno = EBADF,
87e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubis	 .setup = setup0,
88e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubis	 .cleanup = cleanup0,
89354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 .desc = "bad file descriptor"}
90354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	,
91e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubis	{.domain = 0,
92e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubis	 .type = 0,
93e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubis	 .proto = 0,
94e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubis	 .buf = buf,
95e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubis	 .buflen = sizeof(buf),
96e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubis	 .flags = 0,
97e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubis	 .retval = -1,
98e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubis	 .experrno = ENOTSOCK,
99e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubis	 .setup = setup0,
100e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubis	 .cleanup = cleanup0,
101354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 .desc = "invalid socket"}
102354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	,
1037ec19d9c95d491394401f8e2d88ec94f13f596dfvapier#ifndef UCLINUX
104e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubis	/* Skip since uClinux does not implement memory protection */
105e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubis	{.domain = PF_INET,
106e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubis	 .type = SOCK_STREAM,
107e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubis	 .proto = 0,
108e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubis	 .buf = (void *)-1,
109e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubis	 .buflen = sizeof(buf),
110e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubis	 .flags = 0,
111e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubis	 .retval = -1,
112e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubis	 .experrno = EFAULT,
113e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubis	 .setup = setup1,
114e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubis	 .cleanup = cleanup1,
115354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 .desc = "invalid send buffer"}
116354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	,
1177ec19d9c95d491394401f8e2d88ec94f13f596dfvapier#endif
118e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubis	{.domain = PF_INET,
119e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubis	 .type = SOCK_DGRAM,
120e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubis	 .proto = 0,
121e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubis	 .buf = bigbuf,
122e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubis	 .buflen = sizeof(bigbuf),
123e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubis	 .flags = 0,
124e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubis	 .retval = -1,
125e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubis	 .experrno = EMSGSIZE,
126e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubis	 .setup = setup1,
127e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubis	 .cleanup = cleanup1,
128354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 .desc = "UDP message too big"}
129354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	,
130e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubis	{.domain = PF_INET,
131e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubis	 .type = SOCK_STREAM,
132e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubis	 .proto = 0,
133e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubis	 .buf = buf,
134e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubis	 .buflen = sizeof(buf),
135e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubis	 .flags = 0,
136e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubis	 .retval = -1,
137e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubis	 .experrno = EPIPE,
138e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubis	 .setup = setup2,
139e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubis	 .cleanup = cleanup1,
140354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 .desc = "local endpoint shutdown"}
141354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	,
1427ec19d9c95d491394401f8e2d88ec94f13f596dfvapier#ifndef UCLINUX
143e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubis	/* Skip since uClinux does not implement memory protection */
144e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubis	{.domain = PF_INET,
1451c6354e6a4b92aebcd43351cf4e775a9a12dc8e7Jan Stancek	 .type = SOCK_DGRAM,
146e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubis	 .proto = 0,
1471c6354e6a4b92aebcd43351cf4e775a9a12dc8e7Jan Stancek	 .buf = buf,
148e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubis	 .buflen = sizeof(buf),
1491c6354e6a4b92aebcd43351cf4e775a9a12dc8e7Jan Stancek	 .flags = MSG_OOB,
150e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubis	 .retval = -1,
1511c6354e6a4b92aebcd43351cf4e775a9a12dc8e7Jan Stancek	 .experrno = EOPNOTSUPP,
1521c6354e6a4b92aebcd43351cf4e775a9a12dc8e7Jan Stancek	 .setup = setup1,
153e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubis	 .cleanup = cleanup1,
154e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubis	 .desc = "invalid flags set"}
1557ec19d9c95d491394401f8e2d88ec94f13f596dfvapier#endif
156865695bbc89088b9526ea9045410e5afb70a985cplars};
157865695bbc89088b9526ea9045410e5afb70a985cplars
158e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubisint TST_TOTAL = sizeof(tdat) / sizeof(tdat[0]);
159865695bbc89088b9526ea9045410e5afb70a985cplars
160d34d581c6a320e356a6cda923c7aa399479e812crobbiew#ifdef UCLINUX
161d34d581c6a320e356a6cda923c7aa399479e812crobbiewstatic char *argv0;
162d34d581c6a320e356a6cda923c7aa399479e812crobbiew#endif
163d34d581c6a320e356a6cda923c7aa399479e812crobbiew
164e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubisstatic pid_t start_server(struct sockaddr_in *sin0)
165aa01abda2e81e2a85d462479ff7dab8b534b20a8robbiew{
16656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	pid_t pid;
1676e4e77a974ebeaa5704fa6d127e163a484b12607Jan Stancek	socklen_t slen = sizeof(*sin0);
1686e4e77a974ebeaa5704fa6d127e163a484b12607Jan Stancek
1696e4e77a974ebeaa5704fa6d127e163a484b12607Jan Stancek	sin0->sin_family = AF_INET;
1706e4e77a974ebeaa5704fa6d127e163a484b12607Jan Stancek	sin0->sin_port = 0; /* pick random free port */
1716e4e77a974ebeaa5704fa6d127e163a484b12607Jan Stancek	sin0->sin_addr.s_addr = INADDR_ANY;
172aa01abda2e81e2a85d462479ff7dab8b534b20a8robbiew
173aa01abda2e81e2a85d462479ff7dab8b534b20a8robbiew	sfd = socket(PF_INET, SOCK_STREAM, 0);
174aa01abda2e81e2a85d462479ff7dab8b534b20a8robbiew	if (sfd < 0) {
175354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		tst_brkm(TBROK | TERRNO, cleanup, "server socket failed");
176aa01abda2e81e2a85d462479ff7dab8b534b20a8robbiew		return -1;
177aa01abda2e81e2a85d462479ff7dab8b534b20a8robbiew	}
1786e4e77a974ebeaa5704fa6d127e163a484b12607Jan Stancek	if (bind(sfd, (struct sockaddr *)sin0, sizeof(*sin0)) < 0) {
179354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		tst_brkm(TBROK | TERRNO, cleanup, "server bind failed");
180aa01abda2e81e2a85d462479ff7dab8b534b20a8robbiew		return -1;
181aa01abda2e81e2a85d462479ff7dab8b534b20a8robbiew	}
182aa01abda2e81e2a85d462479ff7dab8b534b20a8robbiew	if (listen(sfd, 10) < 0) {
183354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		tst_brkm(TBROK | TERRNO, cleanup, "server listen failed");
184aa01abda2e81e2a85d462479ff7dab8b534b20a8robbiew		return -1;
185aa01abda2e81e2a85d462479ff7dab8b534b20a8robbiew	}
186e74013a59a7991cffff55889f634413e92cfbc91Cyril Hrubis	SAFE_GETSOCKNAME(cleanup, sfd, (struct sockaddr *)sin0, &slen);
1876e4e77a974ebeaa5704fa6d127e163a484b12607Jan Stancek
188d34d581c6a320e356a6cda923c7aa399479e812crobbiew	switch ((pid = FORK_OR_VFORK())) {
189e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubis	case 0:
190d34d581c6a320e356a6cda923c7aa399479e812crobbiew#ifdef UCLINUX
191c450e0643d1d1cd67e42d4f056ce3caf2f128843vapier		if (self_exec(argv0, "d", sfd) < 0)
192354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			tst_brkm(TBROK | TERRNO, cleanup,
193e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubis				 "server self_exec failed");
194d34d581c6a320e356a6cda923c7aa399479e812crobbiew#else
195d34d581c6a320e356a6cda923c7aa399479e812crobbiew		do_child();
196d34d581c6a320e356a6cda923c7aa399479e812crobbiew#endif
197aa01abda2e81e2a85d462479ff7dab8b534b20a8robbiew		break;
198aa01abda2e81e2a85d462479ff7dab8b534b20a8robbiew	case -1:
199354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		tst_brkm(TBROK | TERRNO, cleanup, "server fork failed");
200e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubis	default:
201e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubis		close(sfd);
202aa01abda2e81e2a85d462479ff7dab8b534b20a8robbiew		return pid;
203aa01abda2e81e2a85d462479ff7dab8b534b20a8robbiew	}
204aa01abda2e81e2a85d462479ff7dab8b534b20a8robbiew
205e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubis	exit(1);
206d34d581c6a320e356a6cda923c7aa399479e812crobbiew}
207d34d581c6a320e356a6cda923c7aa399479e812crobbiew
208e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubisstatic void do_child(void)
209d34d581c6a320e356a6cda923c7aa399479e812crobbiew{
21056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	fd_set afds, rfds;
21156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	int nfds, cc, fd;
21256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	struct sockaddr_in fsin;
213d34d581c6a320e356a6cda923c7aa399479e812crobbiew
214aa01abda2e81e2a85d462479ff7dab8b534b20a8robbiew	FD_ZERO(&afds);
215aa01abda2e81e2a85d462479ff7dab8b534b20a8robbiew	FD_SET(sfd, &afds);
216aa01abda2e81e2a85d462479ff7dab8b534b20a8robbiew
2177855d094bbeb9b8ce43dd698ec82e400eb91e709Cyril Hrubis	nfds = sfd + 1;
218aa01abda2e81e2a85d462479ff7dab8b534b20a8robbiew
219aa01abda2e81e2a85d462479ff7dab8b534b20a8robbiew	/* accept connections until killed */
220aa01abda2e81e2a85d462479ff7dab8b534b20a8robbiew	while (1) {
22156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		socklen_t fromlen;
222aa01abda2e81e2a85d462479ff7dab8b534b20a8robbiew
223aa01abda2e81e2a85d462479ff7dab8b534b20a8robbiew		memcpy(&rfds, &afds, sizeof(rfds));
224aa01abda2e81e2a85d462479ff7dab8b534b20a8robbiew
225e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubis		if (select(nfds, &rfds, NULL, NULL, NULL) < 0)
226aa01abda2e81e2a85d462479ff7dab8b534b20a8robbiew			if (errno != EINTR)
227aa01abda2e81e2a85d462479ff7dab8b534b20a8robbiew				exit(1);
228aa01abda2e81e2a85d462479ff7dab8b534b20a8robbiew		if (FD_ISSET(sfd, &rfds)) {
229aa01abda2e81e2a85d462479ff7dab8b534b20a8robbiew			int newfd;
230aa01abda2e81e2a85d462479ff7dab8b534b20a8robbiew
231aa01abda2e81e2a85d462479ff7dab8b534b20a8robbiew			fromlen = sizeof(fsin);
23256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak			newfd = accept(sfd, (struct sockaddr *)&fsin, &fromlen);
2337855d094bbeb9b8ce43dd698ec82e400eb91e709Cyril Hrubis			if (newfd >= 0) {
234aa01abda2e81e2a85d462479ff7dab8b534b20a8robbiew				FD_SET(newfd, &afds);
2357855d094bbeb9b8ce43dd698ec82e400eb91e709Cyril Hrubis				nfds = MAX(nfds, newfd + 1);
2367855d094bbeb9b8ce43dd698ec82e400eb91e709Cyril Hrubis			}
237aa01abda2e81e2a85d462479ff7dab8b534b20a8robbiew		}
23856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		for (fd = 0; fd < nfds; ++fd) {
239aa01abda2e81e2a85d462479ff7dab8b534b20a8robbiew			if (fd != sfd && FD_ISSET(fd, &rfds)) {
240aa01abda2e81e2a85d462479ff7dab8b534b20a8robbiew				cc = read(fd, buf, sizeof(buf));
241aa01abda2e81e2a85d462479ff7dab8b534b20a8robbiew				if (cc == 0 || (cc < 0 && errno != EINTR)) {
242e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubis					close(fd);
243aa01abda2e81e2a85d462479ff7dab8b534b20a8robbiew					FD_CLR(fd, &afds);
244aa01abda2e81e2a85d462479ff7dab8b534b20a8robbiew				}
245aa01abda2e81e2a85d462479ff7dab8b534b20a8robbiew			}
246aa01abda2e81e2a85d462479ff7dab8b534b20a8robbiew		}
247aa01abda2e81e2a85d462479ff7dab8b534b20a8robbiew	}
248aa01abda2e81e2a85d462479ff7dab8b534b20a8robbiew}
249aa01abda2e81e2a85d462479ff7dab8b534b20a8robbiew
25056207cec7732e09c216c751c0b5f88a242bacae6subrata_modakint main(int ac, char *av[])
251865695bbc89088b9526ea9045410e5afb70a985cplars{
252e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubis	int lc;
253865695bbc89088b9526ea9045410e5afb70a985cplars
254d6d11d08678aac1ed2c370ea8e42e5f45aea07beCyril Hrubis	tst_parse_opts(ac, av, NULL, NULL);
255e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubis
256d34d581c6a320e356a6cda923c7aa399479e812crobbiew#ifdef UCLINUX
257d34d581c6a320e356a6cda923c7aa399479e812crobbiew	argv0 = av[0];
258d34d581c6a320e356a6cda923c7aa399479e812crobbiew	maybe_run_child(&do_child, "d", &sfd);
259d34d581c6a320e356a6cda923c7aa399479e812crobbiew#endif
260d34d581c6a320e356a6cda923c7aa399479e812crobbiew
261865695bbc89088b9526ea9045410e5afb70a985cplars	setup();
262865695bbc89088b9526ea9045410e5afb70a985cplars
263865695bbc89088b9526ea9045410e5afb70a985cplars	for (lc = 0; TEST_LOOPING(lc); ++lc) {
264865695bbc89088b9526ea9045410e5afb70a985cplars
265d59a659cd639ca2780b00049d102acd2a783d585Caspar Zhang		tst_count = 0;
266865695bbc89088b9526ea9045410e5afb70a985cplars
26756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		for (testno = 0; testno < TST_TOTAL; ++testno) {
268865695bbc89088b9526ea9045410e5afb70a985cplars			tdat[testno].setup();
269865695bbc89088b9526ea9045410e5afb70a985cplars
270e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubis			TEST(send(s, tdat[testno].buf, tdat[testno].buflen,
271354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				  tdat[testno].flags));
272865695bbc89088b9526ea9045410e5afb70a985cplars
273865695bbc89088b9526ea9045410e5afb70a985cplars			if (TEST_RETURN != -1) {
274865695bbc89088b9526ea9045410e5afb70a985cplars				tst_resm(TFAIL, "call succeeded unexpectedly");
275865695bbc89088b9526ea9045410e5afb70a985cplars				continue;
276865695bbc89088b9526ea9045410e5afb70a985cplars			}
277865695bbc89088b9526ea9045410e5afb70a985cplars
278865695bbc89088b9526ea9045410e5afb70a985cplars			if (TEST_ERRNO != tdat[testno].experrno) {
279865695bbc89088b9526ea9045410e5afb70a985cplars				tst_resm(TFAIL, "%s ; returned"
280c450e0643d1d1cd67e42d4f056ce3caf2f128843vapier					 " %ld (expected %d), errno %d (expected"
28156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak					 " %d)", tdat[testno].desc,
28256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak					 TEST_RETURN, tdat[testno].retval,
28356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak					 TEST_ERRNO, tdat[testno].experrno);
284865695bbc89088b9526ea9045410e5afb70a985cplars			} else {
285865695bbc89088b9526ea9045410e5afb70a985cplars				tst_resm(TPASS, "%s successful",
28656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak					 tdat[testno].desc);
287865695bbc89088b9526ea9045410e5afb70a985cplars			}
288865695bbc89088b9526ea9045410e5afb70a985cplars			tdat[testno].cleanup();
289865695bbc89088b9526ea9045410e5afb70a985cplars		}
290865695bbc89088b9526ea9045410e5afb70a985cplars	}
291865695bbc89088b9526ea9045410e5afb70a985cplars	cleanup();
292865695bbc89088b9526ea9045410e5afb70a985cplars
29353740500924f6439623a8ac256b5be2d6c59ed1fGarrett Cooper	tst_exit();
294865695bbc89088b9526ea9045410e5afb70a985cplars}
295865695bbc89088b9526ea9045410e5afb70a985cplars
296e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubisstatic pid_t server_pid;
297865695bbc89088b9526ea9045410e5afb70a985cplars
298e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubisstatic void setup(void)
299865695bbc89088b9526ea9045410e5afb70a985cplars{
300e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubis	TEST_PAUSE;
301865695bbc89088b9526ea9045410e5afb70a985cplars
302e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubis	server_pid = start_server(&sin1);
303865695bbc89088b9526ea9045410e5afb70a985cplars
304e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubis	signal(SIGPIPE, SIG_IGN);
305865695bbc89088b9526ea9045410e5afb70a985cplars}
306865695bbc89088b9526ea9045410e5afb70a985cplars
307e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubisstatic void cleanup(void)
308865695bbc89088b9526ea9045410e5afb70a985cplars{
309e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubis	kill(server_pid, SIGKILL);
3102c28215423293e443469a07ae7011135d058b671Garrett Cooper
311865695bbc89088b9526ea9045410e5afb70a985cplars}
312865695bbc89088b9526ea9045410e5afb70a985cplars
313e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubisstatic void setup0(void)
314865695bbc89088b9526ea9045410e5afb70a985cplars{
315865695bbc89088b9526ea9045410e5afb70a985cplars	if (tdat[testno].experrno == EBADF)
316865695bbc89088b9526ea9045410e5afb70a985cplars		s = 400;	/* anything not an open file */
317354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	else if ((s = open("/dev/null", O_WRONLY)) == -1)
318354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		tst_brkm(TBROK | TERRNO, cleanup, "open(/dev/null) failed");
319865695bbc89088b9526ea9045410e5afb70a985cplars}
320865695bbc89088b9526ea9045410e5afb70a985cplars
321e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubisstatic void cleanup0(void)
322865695bbc89088b9526ea9045410e5afb70a985cplars{
323865695bbc89088b9526ea9045410e5afb70a985cplars	s = -1;
324865695bbc89088b9526ea9045410e5afb70a985cplars}
325865695bbc89088b9526ea9045410e5afb70a985cplars
326e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubisstatic void setup1(void)
327865695bbc89088b9526ea9045410e5afb70a985cplars{
328eb6418fe9d7a9bdb71fb22db3d322ba8f42bad83Cyril Hrubis	s = SAFE_SOCKET(cleanup, tdat[testno].domain, tdat[testno].type,
329eb6418fe9d7a9bdb71fb22db3d322ba8f42bad83Cyril Hrubis			tdat[testno].proto);
33059c9acba8a6908776f84d1f54a82e7f31c653d9cCyril Hrubis	SAFE_CONNECT(cleanup, s, (const struct sockaddr *)&sin1, sizeof(sin1));
331865695bbc89088b9526ea9045410e5afb70a985cplars}
332865695bbc89088b9526ea9045410e5afb70a985cplars
333e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubisstatic void cleanup1(void)
334865695bbc89088b9526ea9045410e5afb70a985cplars{
335e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubis	close(s);
336865695bbc89088b9526ea9045410e5afb70a985cplars	s = -1;
337865695bbc89088b9526ea9045410e5afb70a985cplars}
338865695bbc89088b9526ea9045410e5afb70a985cplars
339e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubisstatic void setup2(void)
340865695bbc89088b9526ea9045410e5afb70a985cplars{
341e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubis	setup1();
342e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubis
343c450e0643d1d1cd67e42d4f056ce3caf2f128843vapier	if (shutdown(s, 1) < 0)
344354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		tst_brkm(TBROK | TERRNO, cleanup, "socket setup failed connect "
345c450e0643d1d1cd67e42d4f056ce3caf2f128843vapier			 "test %d", testno);
346e90b03c8f259990fe6a40e75e5e6a4aec046a1dbCyril Hrubis}
347