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