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 * NAME 22865695bbc89088b9526ea9045410e5afb70a985cplars * semop04.c 23865695bbc89088b9526ea9045410e5afb70a985cplars * 24865695bbc89088b9526ea9045410e5afb70a985cplars * DESCRIPTION 25865695bbc89088b9526ea9045410e5afb70a985cplars * semop04 - test for EAGAIN error 26865695bbc89088b9526ea9045410e5afb70a985cplars * 27865695bbc89088b9526ea9045410e5afb70a985cplars * ALGORITHM 28865695bbc89088b9526ea9045410e5afb70a985cplars * create a semaphore set with read and alter permissions 29865695bbc89088b9526ea9045410e5afb70a985cplars * loop if that option was specified 30865695bbc89088b9526ea9045410e5afb70a985cplars * call semop() with two different invalid cases 31865695bbc89088b9526ea9045410e5afb70a985cplars * check the errno value 32865695bbc89088b9526ea9045410e5afb70a985cplars * issue a PASS message if we get EAGAIN 33865695bbc89088b9526ea9045410e5afb70a985cplars * otherwise, the tests fails 34865695bbc89088b9526ea9045410e5afb70a985cplars * issue a FAIL message 35865695bbc89088b9526ea9045410e5afb70a985cplars * call cleanup 36865695bbc89088b9526ea9045410e5afb70a985cplars * 37865695bbc89088b9526ea9045410e5afb70a985cplars * USAGE: <for command-line> 38865695bbc89088b9526ea9045410e5afb70a985cplars * semop04 [-c n] [-e] [-i n] [-I x] [-P x] [-t] 39865695bbc89088b9526ea9045410e5afb70a985cplars * where, -c n : Run n copies concurrently. 40865695bbc89088b9526ea9045410e5afb70a985cplars * -e : Turn on errno logging. 41865695bbc89088b9526ea9045410e5afb70a985cplars * -i n : Execute test n times. 42865695bbc89088b9526ea9045410e5afb70a985cplars * -I x : Execute test for x seconds. 43865695bbc89088b9526ea9045410e5afb70a985cplars * -P x : Pause for x seconds between iterations. 44865695bbc89088b9526ea9045410e5afb70a985cplars * -t : Turn on syscall timing. 45865695bbc89088b9526ea9045410e5afb70a985cplars * 46865695bbc89088b9526ea9045410e5afb70a985cplars * HISTORY 47865695bbc89088b9526ea9045410e5afb70a985cplars * 03/2001 - Written by Wayne Boyer 48865695bbc89088b9526ea9045410e5afb70a985cplars * 49865695bbc89088b9526ea9045410e5afb70a985cplars * RESTRICTIONS 50865695bbc89088b9526ea9045410e5afb70a985cplars * none 51865695bbc89088b9526ea9045410e5afb70a985cplars */ 52865695bbc89088b9526ea9045410e5afb70a985cplars 5323499f09a7c071dfe524cd7c130c67192a162d04robbiew#include "ipcsem.h" 54865695bbc89088b9526ea9045410e5afb70a985cplars 55865695bbc89088b9526ea9045410e5afb70a985cplarschar *TCID = "semop04"; 56865695bbc89088b9526ea9045410e5afb70a985cplarsint TST_TOTAL = 2; 57865695bbc89088b9526ea9045410e5afb70a985cplars 58865695bbc89088b9526ea9045410e5afb70a985cplarsint sem_id_1 = -1; 59865695bbc89088b9526ea9045410e5afb70a985cplars 60865695bbc89088b9526ea9045410e5afb70a985cplarsstruct sembuf s_buf; 61865695bbc89088b9526ea9045410e5afb70a985cplars 62865695bbc89088b9526ea9045410e5afb70a985cplarsstruct test_case_t { 63932d6c8818cb07b2751f5b5af66a64c296b571fciyermanoj union semun get_arr; 64865695bbc89088b9526ea9045410e5afb70a985cplars short op; 65865695bbc89088b9526ea9045410e5afb70a985cplars short flg; 66865695bbc89088b9526ea9045410e5afb70a985cplars short num; 67865695bbc89088b9526ea9045410e5afb70a985cplars int error; 68865695bbc89088b9526ea9045410e5afb70a985cplars} TC[] = { 69865695bbc89088b9526ea9045410e5afb70a985cplars /* EAGAIN sem_op = 0 */ 7056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak { { 7156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak 1}, 0, IPC_NOWAIT, 2, EAGAIN}, 7256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak /* EAGAIN sem_op = -1 */ 7356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak { { 7456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak 0}, -1, IPC_NOWAIT, 2, EAGAIN} 75865695bbc89088b9526ea9045410e5afb70a985cplars}; 76865695bbc89088b9526ea9045410e5afb70a985cplars 7723499f09a7c071dfe524cd7c130c67192a162d04robbiewint main(int ac, char **av) 78865695bbc89088b9526ea9045410e5afb70a985cplars{ 7989af32a63ce8a780ea39337339e14caae244b5a4Cyril Hrubis int lc; 80b6e83fec079e5ba5a354dbeefb0871fec882e599Xiaoguang Wang int val; /* value for SETVAL */ 81bdbaec51a423e715c2b03ed9e497e9a1fba6103esubrata_modak 82865695bbc89088b9526ea9045410e5afb70a985cplars int i; 83865695bbc89088b9526ea9045410e5afb70a985cplars 84d6d11d08678aac1ed2c370ea8e42e5f45aea07beCyril Hrubis tst_parse_opts(ac, av, NULL, NULL); 85865695bbc89088b9526ea9045410e5afb70a985cplars 8656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak setup(); /* global setup */ 87865695bbc89088b9526ea9045410e5afb70a985cplars 88865695bbc89088b9526ea9045410e5afb70a985cplars /* The following loop checks looping state if -i option given */ 89865695bbc89088b9526ea9045410e5afb70a985cplars 90865695bbc89088b9526ea9045410e5afb70a985cplars for (lc = 0; TEST_LOOPING(lc); lc++) { 91d59a659cd639ca2780b00049d102acd2a783d585Caspar Zhang /* reset tst_count in case we are looping */ 92d59a659cd639ca2780b00049d102acd2a783d585Caspar Zhang tst_count = 0; 93865695bbc89088b9526ea9045410e5afb70a985cplars 94b6e83fec079e5ba5a354dbeefb0871fec882e599Xiaoguang Wang val = 1; 9556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak for (i = 0; i < TST_TOTAL; i++) { 96865695bbc89088b9526ea9045410e5afb70a985cplars 97865695bbc89088b9526ea9045410e5afb70a985cplars /* initialize the s_buf buffer */ 98865695bbc89088b9526ea9045410e5afb70a985cplars s_buf.sem_op = TC[i].op; 99865695bbc89088b9526ea9045410e5afb70a985cplars s_buf.sem_flg = TC[i].flg; 100865695bbc89088b9526ea9045410e5afb70a985cplars s_buf.sem_num = TC[i].num; 101865695bbc89088b9526ea9045410e5afb70a985cplars 102865695bbc89088b9526ea9045410e5afb70a985cplars /* initialize all the primitive semaphores */ 1039047afc88abda1d459b459a66167cd9a4bf27752iyermanoj TC[i].get_arr.val = val--; 104932d6c8818cb07b2751f5b5af66a64c296b571fciyermanoj if (semctl(sem_id_1, TC[i].num, SETVAL, TC[i].get_arr) 105865695bbc89088b9526ea9045410e5afb70a985cplars == -1) { 106865695bbc89088b9526ea9045410e5afb70a985cplars tst_brkm(TBROK, cleanup, "semctl() failed"); 107865695bbc89088b9526ea9045410e5afb70a985cplars } 108865695bbc89088b9526ea9045410e5afb70a985cplars 109865695bbc89088b9526ea9045410e5afb70a985cplars /* 110865695bbc89088b9526ea9045410e5afb70a985cplars * make the call with the TEST macro 111865695bbc89088b9526ea9045410e5afb70a985cplars */ 112865695bbc89088b9526ea9045410e5afb70a985cplars 113865695bbc89088b9526ea9045410e5afb70a985cplars TEST(semop(sem_id_1, &s_buf, 1)); 114865695bbc89088b9526ea9045410e5afb70a985cplars 115865695bbc89088b9526ea9045410e5afb70a985cplars if (TEST_RETURN != -1) { 116865695bbc89088b9526ea9045410e5afb70a985cplars tst_resm(TFAIL, "call succeeded unexpectedly"); 117865695bbc89088b9526ea9045410e5afb70a985cplars continue; 118865695bbc89088b9526ea9045410e5afb70a985cplars } 119bdbaec51a423e715c2b03ed9e497e9a1fba6103esubrata_modak 120865695bbc89088b9526ea9045410e5afb70a985cplars if (TEST_ERRNO == TC[i].error) { 12156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tst_resm(TPASS, 12256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak "expected failure - errno = %d" 12356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak " : %s", TEST_ERRNO, 124865695bbc89088b9526ea9045410e5afb70a985cplars strerror(TEST_ERRNO)); 125865695bbc89088b9526ea9045410e5afb70a985cplars } else { 126865695bbc89088b9526ea9045410e5afb70a985cplars tst_resm(TFAIL, "unexpected error - " 127865695bbc89088b9526ea9045410e5afb70a985cplars "%d : %s", TEST_ERRNO, 128865695bbc89088b9526ea9045410e5afb70a985cplars strerror(TEST_ERRNO)); 129865695bbc89088b9526ea9045410e5afb70a985cplars } 130865695bbc89088b9526ea9045410e5afb70a985cplars } 131865695bbc89088b9526ea9045410e5afb70a985cplars } 132865695bbc89088b9526ea9045410e5afb70a985cplars 133865695bbc89088b9526ea9045410e5afb70a985cplars cleanup(); 134865695bbc89088b9526ea9045410e5afb70a985cplars 1357d0a4a57fbcd47f72b67c08df532e8ef47f6fdaeGarrett Cooper tst_exit(); 136865695bbc89088b9526ea9045410e5afb70a985cplars} 137865695bbc89088b9526ea9045410e5afb70a985cplars 138865695bbc89088b9526ea9045410e5afb70a985cplars/* 139865695bbc89088b9526ea9045410e5afb70a985cplars * setup() - performs all the ONE TIME setup for this test. 140865695bbc89088b9526ea9045410e5afb70a985cplars */ 14156207cec7732e09c216c751c0b5f88a242bacae6subrata_modakvoid setup(void) 142865695bbc89088b9526ea9045410e5afb70a985cplars{ 1432c28215423293e443469a07ae7011135d058b671Garrett Cooper 144865695bbc89088b9526ea9045410e5afb70a985cplars tst_sig(NOFORK, DEF_HANDLER, cleanup); 145865695bbc89088b9526ea9045410e5afb70a985cplars 146865695bbc89088b9526ea9045410e5afb70a985cplars TEST_PAUSE; 147865695bbc89088b9526ea9045410e5afb70a985cplars 148865695bbc89088b9526ea9045410e5afb70a985cplars /* 149865695bbc89088b9526ea9045410e5afb70a985cplars * Create a temporary directory and cd into it. 150865695bbc89088b9526ea9045410e5afb70a985cplars * This helps to ensure that a unique msgkey is created. 151865695bbc89088b9526ea9045410e5afb70a985cplars * See ../lib/libipc.c for more information. 152865695bbc89088b9526ea9045410e5afb70a985cplars */ 153865695bbc89088b9526ea9045410e5afb70a985cplars tst_tmpdir(); 154865695bbc89088b9526ea9045410e5afb70a985cplars 155865695bbc89088b9526ea9045410e5afb70a985cplars /* get an IPC resource key */ 156865695bbc89088b9526ea9045410e5afb70a985cplars semkey = getipckey(); 157865695bbc89088b9526ea9045410e5afb70a985cplars 158865695bbc89088b9526ea9045410e5afb70a985cplars /* create a semaphore set with read and alter permissions */ 15956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak /* and PSEMS "primitive" semaphores */ 160865695bbc89088b9526ea9045410e5afb70a985cplars if ((sem_id_1 = 161865695bbc89088b9526ea9045410e5afb70a985cplars semget(semkey, PSEMS, IPC_CREAT | IPC_EXCL | SEM_RA)) == -1) { 162865695bbc89088b9526ea9045410e5afb70a985cplars tst_brkm(TBROK, cleanup, "couldn't create semaphore in setup"); 163865695bbc89088b9526ea9045410e5afb70a985cplars } 164865695bbc89088b9526ea9045410e5afb70a985cplars} 165865695bbc89088b9526ea9045410e5afb70a985cplars 166865695bbc89088b9526ea9045410e5afb70a985cplars/* 167865695bbc89088b9526ea9045410e5afb70a985cplars * cleanup() - performs all the ONE TIME cleanup for this test at completion 168865695bbc89088b9526ea9045410e5afb70a985cplars * or premature exit. 169865695bbc89088b9526ea9045410e5afb70a985cplars */ 17056207cec7732e09c216c751c0b5f88a242bacae6subrata_modakvoid cleanup(void) 171865695bbc89088b9526ea9045410e5afb70a985cplars{ 172865695bbc89088b9526ea9045410e5afb70a985cplars /* if it exists, remove the semaphore resource */ 173865695bbc89088b9526ea9045410e5afb70a985cplars rm_sema(sem_id_1); 174865695bbc89088b9526ea9045410e5afb70a985cplars 175865695bbc89088b9526ea9045410e5afb70a985cplars tst_rmdir(); 176865695bbc89088b9526ea9045410e5afb70a985cplars 177ec6edca7aa42b6affd989ef91b5897f96795e40fChris Dearman} 178