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