getsockopt01.c revision 4548c6cf9bcdd96d8303caa4130ab638b61f8a30
1865695bbc89088b9526ea9045410e5afb70a985cplars/* 2865695bbc89088b9526ea9045410e5afb70a985cplars * 3865695bbc89088b9526ea9045410e5afb70a985cplars * Copyright (c) International Business Machines Corp., 2001 4865695bbc89088b9526ea9045410e5afb70a985cplars * 5865695bbc89088b9526ea9045410e5afb70a985cplars * This program is free software; you can redistribute it and/or modify 6865695bbc89088b9526ea9045410e5afb70a985cplars * it under the terms of the GNU General Public License as published by 7865695bbc89088b9526ea9045410e5afb70a985cplars * the Free Software Foundation; either version 2 of the License, or 8865695bbc89088b9526ea9045410e5afb70a985cplars * (at your option) any later version. 9865695bbc89088b9526ea9045410e5afb70a985cplars * 10865695bbc89088b9526ea9045410e5afb70a985cplars * This program is distributed in the hope that it will be useful, 11865695bbc89088b9526ea9045410e5afb70a985cplars * but WITHOUT ANY WARRANTY; without even the implied warranty of 12865695bbc89088b9526ea9045410e5afb70a985cplars * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See 13865695bbc89088b9526ea9045410e5afb70a985cplars * the GNU General Public License for more details. 14865695bbc89088b9526ea9045410e5afb70a985cplars * 15865695bbc89088b9526ea9045410e5afb70a985cplars * You should have received a copy of the GNU General Public License 16865695bbc89088b9526ea9045410e5afb70a985cplars * along with this program; if not, write to the Free Software 174548c6cf9bcdd96d8303caa4130ab638b61f8a30Wanlong Gao * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 18865695bbc89088b9526ea9045410e5afb70a985cplars */ 19865695bbc89088b9526ea9045410e5afb70a985cplars 20865695bbc89088b9526ea9045410e5afb70a985cplars/* 21865695bbc89088b9526ea9045410e5afb70a985cplars * Test Name: getsockopt01 22865695bbc89088b9526ea9045410e5afb70a985cplars * 23865695bbc89088b9526ea9045410e5afb70a985cplars * Test Description: 24865695bbc89088b9526ea9045410e5afb70a985cplars * Verify that getsockopt() returns the proper errno for various failure cases 25865695bbc89088b9526ea9045410e5afb70a985cplars * 26865695bbc89088b9526ea9045410e5afb70a985cplars * Usage: <for command-line> 27865695bbc89088b9526ea9045410e5afb70a985cplars * getsockopt01 [-c n] [-e] [-i n] [-I x] [-P x] [-t] 28865695bbc89088b9526ea9045410e5afb70a985cplars * where, -c n : Run n copies concurrently. 29865695bbc89088b9526ea9045410e5afb70a985cplars * -e : Turn on errno logging. 30865695bbc89088b9526ea9045410e5afb70a985cplars * -i n : Execute test n times. 31865695bbc89088b9526ea9045410e5afb70a985cplars * -I x : Execute test for x seconds. 32865695bbc89088b9526ea9045410e5afb70a985cplars * -P x : Pause for x seconds between iterations. 33865695bbc89088b9526ea9045410e5afb70a985cplars * -t : Turn on syscall timing. 34865695bbc89088b9526ea9045410e5afb70a985cplars * 35865695bbc89088b9526ea9045410e5afb70a985cplars * HISTORY 36865695bbc89088b9526ea9045410e5afb70a985cplars * 07/2001 Ported by Wayne Boyer 37865695bbc89088b9526ea9045410e5afb70a985cplars * 38865695bbc89088b9526ea9045410e5afb70a985cplars * RESTRICTIONS: 39865695bbc89088b9526ea9045410e5afb70a985cplars * None. 40865695bbc89088b9526ea9045410e5afb70a985cplars */ 41865695bbc89088b9526ea9045410e5afb70a985cplars 42865695bbc89088b9526ea9045410e5afb70a985cplars#include <stdio.h> 43865695bbc89088b9526ea9045410e5afb70a985cplars#include <unistd.h> 44865695bbc89088b9526ea9045410e5afb70a985cplars#include <errno.h> 45dcf2c3dda3666e3acd0022bfcce7c971ca60e347plars#include <fcntl.h> 46865695bbc89088b9526ea9045410e5afb70a985cplars 47865695bbc89088b9526ea9045410e5afb70a985cplars#include <sys/types.h> 48865695bbc89088b9526ea9045410e5afb70a985cplars#include <sys/socket.h> 49865695bbc89088b9526ea9045410e5afb70a985cplars#include <sys/signal.h> 50865695bbc89088b9526ea9045410e5afb70a985cplars#include <sys/ioctl.h> 51865695bbc89088b9526ea9045410e5afb70a985cplars 52865695bbc89088b9526ea9045410e5afb70a985cplars#include <netinet/in.h> 53865695bbc89088b9526ea9045410e5afb70a985cplars 54865695bbc89088b9526ea9045410e5afb70a985cplars#include "test.h" 55865695bbc89088b9526ea9045410e5afb70a985cplars#include "usctest.h" 56865695bbc89088b9526ea9045410e5afb70a985cplars 5756207cec7732e09c216c751c0b5f88a242bacae6subrata_modakchar *TCID = "getsockopt01"; /* Test program identifier. */ 58865695bbc89088b9526ea9045410e5afb70a985cplarsint testno; 59865695bbc89088b9526ea9045410e5afb70a985cplars 6056207cec7732e09c216c751c0b5f88a242bacae6subrata_modakint s; /* socket descriptor */ 61865695bbc89088b9526ea9045410e5afb70a985cplarsstruct sockaddr_in sin0, fsin1; 6256207cec7732e09c216c751c0b5f88a242bacae6subrata_modakint sinlen; 6356207cec7732e09c216c751c0b5f88a242bacae6subrata_modakint optval; 6456207cec7732e09c216c751c0b5f88a242bacae6subrata_modaksocklen_t optlen; 65865695bbc89088b9526ea9045410e5afb70a985cplars 66865695bbc89088b9526ea9045410e5afb70a985cplarsvoid setup(void), setup0(void), setup1(void), 6756207cec7732e09c216c751c0b5f88a242bacae6subrata_modakcleanup(void), cleanup0(void), cleanup1(void); 68865695bbc89088b9526ea9045410e5afb70a985cplars 69865695bbc89088b9526ea9045410e5afb70a985cplarsstruct test_case_t { /* test case structure */ 7056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak int domain; /* PF_INET, PF_UNIX, ... */ 7156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak int type; /* SOCK_STREAM, SOCK_DGRAM ... */ 7256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak int proto; /* protocol number (usually 0 = default) */ 7356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak int level; /* IPPROTO_* */ 7456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak int optname; 7556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak void *optval; 7656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak socklen_t *optlen; 7756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak struct sockaddr *sin; 7856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak int salen; 7956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak int retval; /* syscall return value */ 8056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak int experrno; /* expected errno */ 8156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak void (*setup) (void); 8256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak void (*cleanup) (void); 83865695bbc89088b9526ea9045410e5afb70a985cplars char *desc; 84865695bbc89088b9526ea9045410e5afb70a985cplars} tdat[] = { 8556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak { 8656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak PF_INET, SOCK_STREAM, 0, SOL_SOCKET, SO_OOBINLINE, &optval, 8756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak &optlen, (struct sockaddr *)&fsin1, sizeof(fsin1), 8856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak -1, EBADF, setup0, cleanup0, "bad file descriptor"} 8956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak , { 9056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak PF_INET, SOCK_STREAM, 0, SOL_SOCKET, SO_OOBINLINE, &optval, 9156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak &optlen, (struct sockaddr *)&fsin1, sizeof(fsin1), 9256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak -1, ENOTSOCK, setup0, cleanup0, "bad file descriptor"} 9356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak , 94161b01e69dd6b5431cc05e90bc47269dbed86860mridge#ifndef UCLINUX 9556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak { 9656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak PF_INET, SOCK_STREAM, 0, SOL_SOCKET, SO_OOBINLINE, 0, &optlen, 9756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak (struct sockaddr *)&fsin1, sizeof(fsin1), -1, 9856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak EFAULT, setup1, cleanup1, "invalid option buffer"} 9956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak , { 10056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak PF_INET, SOCK_STREAM, 0, SOL_SOCKET, SO_OOBINLINE, &optval, 0, 10156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak (struct sockaddr *)&fsin1, sizeof(fsin1), -1, 10256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak EFAULT, setup1, cleanup1, "invalid optlen"} 10356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak , 104161b01e69dd6b5431cc05e90bc47269dbed86860mridge#endif /* UCLINUX */ 10556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak { 10656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak PF_INET, SOCK_STREAM, 0, 500, SO_OOBINLINE, &optval, &optlen, 10756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak (struct sockaddr *)&fsin1, sizeof(fsin1), -1, 10856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak EOPNOTSUPP, setup1, cleanup1, "invalid level"} 10956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak , { 11056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak PF_INET, SOCK_STREAM, 0, IPPROTO_UDP, SO_OOBINLINE, &optval, 11156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak &optlen, (struct sockaddr *)&fsin1, sizeof(fsin1), 11256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak -1, EOPNOTSUPP, setup1, cleanup1, "invalid option name"} 11356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak , { 11456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak PF_INET, SOCK_STREAM, 0, IPPROTO_UDP, SO_OOBINLINE, &optval, 11556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak &optlen, (struct sockaddr *)&fsin1, sizeof(fsin1), 11656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak -1, EOPNOTSUPP, setup1, cleanup1, 11756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak "invalid option name (UDP)"} 11856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak , { 11956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak PF_INET, SOCK_STREAM, 0, IPPROTO_IP, -1, &optval, &optlen, 12056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak (struct sockaddr *)&fsin1, sizeof(fsin1), -1, 12156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak ENOPROTOOPT, setup1, cleanup1, "invalid option name (IP)"} 12256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak , { 12356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak PF_INET, SOCK_STREAM, 0, IPPROTO_TCP, -1, &optval, &optlen, 12456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak (struct sockaddr *)&fsin1, sizeof(fsin1), -1, 12556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak ENOPROTOOPT, setup1, cleanup1, "invalid option name (TCP)"} 12656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak,}; 12756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak 12856207cec7732e09c216c751c0b5f88a242bacae6subrata_modakint TST_TOTAL = sizeof(tdat) / sizeof(tdat[0]); /* Total number of test cases. */ 12956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak 13056207cec7732e09c216c751c0b5f88a242bacae6subrata_modakint exp_enos[] = { EBADF, ENOTSOCK, EFAULT, EOPNOTSUPP, ENOPROTOOPT, 0 }; 131865695bbc89088b9526ea9045410e5afb70a985cplars 132865695bbc89088b9526ea9045410e5afb70a985cplars 13356207cec7732e09c216c751c0b5f88a242bacae6subrata_modakint main(int argc, char *argv[]) 134865695bbc89088b9526ea9045410e5afb70a985cplars{ 135865695bbc89088b9526ea9045410e5afb70a985cplars int lc; /* loop counter */ 136865695bbc89088b9526ea9045410e5afb70a985cplars char *msg; /* message returned from parse_opts */ 137865695bbc89088b9526ea9045410e5afb70a985cplars 138865695bbc89088b9526ea9045410e5afb70a985cplars /* Parse standard options given to run the test. */ 13945e285d46ab47b0ff76c88acb5ba97b0bd5f753dGarrett Cooper msg = parse_opts(argc, argv, NULL, NULL); 14045e285d46ab47b0ff76c88acb5ba97b0bd5f753dGarrett Cooper if (msg != NULL) { 141865695bbc89088b9526ea9045410e5afb70a985cplars tst_brkm(TBROK, NULL, "OPTION PARSING ERROR - %s", msg); 142865695bbc89088b9526ea9045410e5afb70a985cplars tst_exit(); 143865695bbc89088b9526ea9045410e5afb70a985cplars } 144865695bbc89088b9526ea9045410e5afb70a985cplars 145865695bbc89088b9526ea9045410e5afb70a985cplars setup(); 146865695bbc89088b9526ea9045410e5afb70a985cplars 147865695bbc89088b9526ea9045410e5afb70a985cplars for (lc = 0; TEST_LOOPING(lc); ++lc) { 148865695bbc89088b9526ea9045410e5afb70a985cplars Tst_count = 0; 14956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak for (testno = 0; testno < TST_TOTAL; ++testno) { 150865695bbc89088b9526ea9045410e5afb70a985cplars tdat[testno].setup(); 151865695bbc89088b9526ea9045410e5afb70a985cplars 152865695bbc89088b9526ea9045410e5afb70a985cplars TEST(getsockopt(s, tdat[testno].level, 15356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tdat[testno].optname, 15456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tdat[testno].optval, 15556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tdat[testno].optlen)); 156865695bbc89088b9526ea9045410e5afb70a985cplars TEST_ERROR_LOG(TEST_ERRNO); 157865695bbc89088b9526ea9045410e5afb70a985cplars if (TEST_RETURN != tdat[testno].retval || 158865695bbc89088b9526ea9045410e5afb70a985cplars (TEST_RETURN < 0 && 159865695bbc89088b9526ea9045410e5afb70a985cplars TEST_ERRNO != tdat[testno].experrno)) { 160865695bbc89088b9526ea9045410e5afb70a985cplars tst_resm(TFAIL, "%s ; returned" 161358c3ee75ca13279ceb0165ef0351e99be271ee6subrata_modak " %ld (expected %d), errno %d (expected" 16256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak " %d)", tdat[testno].desc, 16356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak TEST_RETURN, tdat[testno].retval, 16456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak TEST_ERRNO, tdat[testno].experrno); 165865695bbc89088b9526ea9045410e5afb70a985cplars } else { 166865695bbc89088b9526ea9045410e5afb70a985cplars tst_resm(TPASS, "%s successful", 16756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tdat[testno].desc); 168865695bbc89088b9526ea9045410e5afb70a985cplars } 169865695bbc89088b9526ea9045410e5afb70a985cplars tdat[testno].cleanup(); 170865695bbc89088b9526ea9045410e5afb70a985cplars } 171865695bbc89088b9526ea9045410e5afb70a985cplars } 172865695bbc89088b9526ea9045410e5afb70a985cplars cleanup(); 173865695bbc89088b9526ea9045410e5afb70a985cplars 1747d0a4a57fbcd47f72b67c08df532e8ef47f6fdaeGarrett Cooper tst_exit(); 1752c28215423293e443469a07ae7011135d058b671Garrett Cooper} 176865695bbc89088b9526ea9045410e5afb70a985cplars 17756207cec7732e09c216c751c0b5f88a242bacae6subrata_modakvoid setup(void) 178865695bbc89088b9526ea9045410e5afb70a985cplars{ 17956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak TEST_PAUSE; /* if -P option specified */ 180865695bbc89088b9526ea9045410e5afb70a985cplars 181865695bbc89088b9526ea9045410e5afb70a985cplars /* set up expected error numbers */ 182865695bbc89088b9526ea9045410e5afb70a985cplars TEST_EXP_ENOS(exp_enos); 183865695bbc89088b9526ea9045410e5afb70a985cplars 184865695bbc89088b9526ea9045410e5afb70a985cplars /* initialize local sockaddr */ 185865695bbc89088b9526ea9045410e5afb70a985cplars sin0.sin_family = AF_INET; 186865695bbc89088b9526ea9045410e5afb70a985cplars sin0.sin_port = 0; 187865695bbc89088b9526ea9045410e5afb70a985cplars sin0.sin_addr.s_addr = INADDR_ANY; 188865695bbc89088b9526ea9045410e5afb70a985cplars} 189865695bbc89088b9526ea9045410e5afb70a985cplars 19056207cec7732e09c216c751c0b5f88a242bacae6subrata_modakvoid cleanup(void) 191865695bbc89088b9526ea9045410e5afb70a985cplars{ 192865695bbc89088b9526ea9045410e5afb70a985cplars TEST_CLEANUP; 1932c28215423293e443469a07ae7011135d058b671Garrett Cooper 194865695bbc89088b9526ea9045410e5afb70a985cplars} 195865695bbc89088b9526ea9045410e5afb70a985cplars 19656207cec7732e09c216c751c0b5f88a242bacae6subrata_modakvoid setup0(void) 197865695bbc89088b9526ea9045410e5afb70a985cplars{ 198865695bbc89088b9526ea9045410e5afb70a985cplars if (tdat[testno].experrno == EBADF) 199865695bbc89088b9526ea9045410e5afb70a985cplars s = 400; /* anything not an open file */ 20056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak else if ((s = open("/dev/null", O_WRONLY)) == -1) 20156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tst_brkm(TBROK, cleanup, "error opening /dev/null - " 20256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak "errno: %s", strerror(errno)); 203865695bbc89088b9526ea9045410e5afb70a985cplars} 204865695bbc89088b9526ea9045410e5afb70a985cplars 20556207cec7732e09c216c751c0b5f88a242bacae6subrata_modakvoid cleanup0(void) 206865695bbc89088b9526ea9045410e5afb70a985cplars{ 207865695bbc89088b9526ea9045410e5afb70a985cplars s = -1; 208865695bbc89088b9526ea9045410e5afb70a985cplars} 209865695bbc89088b9526ea9045410e5afb70a985cplars 21056207cec7732e09c216c751c0b5f88a242bacae6subrata_modakvoid setup1(void) 211865695bbc89088b9526ea9045410e5afb70a985cplars{ 212865695bbc89088b9526ea9045410e5afb70a985cplars s = socket(tdat[testno].domain, tdat[testno].type, tdat[testno].proto); 213865695bbc89088b9526ea9045410e5afb70a985cplars if (s < 0) { 21456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tst_brkm(TBROK, cleanup, "socket setup failed for getsockopt: " 21556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak "%s", strerror(errno)); 216865695bbc89088b9526ea9045410e5afb70a985cplars } 21796d23370bd77304b3370f32d8dc92c28c4fc0acbrobbiew if (bind(s, (struct sockaddr *)&sin0, sizeof(sin0)) < 0) { 218865695bbc89088b9526ea9045410e5afb70a985cplars tst_brkm(TBROK, cleanup, "socket bind failed for getsockopt: " 21956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak "%s", strerror(errno)); 220865695bbc89088b9526ea9045410e5afb70a985cplars } 221865695bbc89088b9526ea9045410e5afb70a985cplars sinlen = sizeof(fsin1); 222865695bbc89088b9526ea9045410e5afb70a985cplars optlen = sizeof(optval); 223865695bbc89088b9526ea9045410e5afb70a985cplars} 224865695bbc89088b9526ea9045410e5afb70a985cplars 22556207cec7732e09c216c751c0b5f88a242bacae6subrata_modakvoid cleanup1(void) 226865695bbc89088b9526ea9045410e5afb70a985cplars{ 22756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak (void)close(s); 228865695bbc89088b9526ea9045410e5afb70a985cplars s = -1; 229ec6edca7aa42b6affd989ef91b5897f96795e40fChris Dearman} 230