chdir04.c revision 71ff32c4bcac9eaa4815181590a7059b49dba6a2
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 17865695bbc89088b9526ea9045410e5afb70a985cplars * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 18865695bbc89088b9526ea9045410e5afb70a985cplars */ 19865695bbc89088b9526ea9045410e5afb70a985cplars 20865695bbc89088b9526ea9045410e5afb70a985cplars/* 21865695bbc89088b9526ea9045410e5afb70a985cplars * NAME 2264d7fe6d7a8862e7f21aff7187e5539d64179a3cnstraz * chdir04.c 23865695bbc89088b9526ea9045410e5afb70a985cplars * 24865695bbc89088b9526ea9045410e5afb70a985cplars * DESCRIPTION 25865695bbc89088b9526ea9045410e5afb70a985cplars * Testcase to test whether chdir(2) sets errno correctly. 264bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak * 27865695bbc89088b9526ea9045410e5afb70a985cplars * ALGORITHM 28865695bbc89088b9526ea9045410e5afb70a985cplars * 1. Test for ENAMETOOLONG: 29865695bbc89088b9526ea9045410e5afb70a985cplars * Create a bad directory name with length more than 30865695bbc89088b9526ea9045410e5afb70a985cplars * 31865695bbc89088b9526ea9045410e5afb70a985cplars * VFS_MAXNAMELEN (Linux kernel variable), and attempt to 32865695bbc89088b9526ea9045410e5afb70a985cplars * chdir(2) to it. 33865695bbc89088b9526ea9045410e5afb70a985cplars * 34865695bbc89088b9526ea9045410e5afb70a985cplars * 2. Test for ENOENT: 35865695bbc89088b9526ea9045410e5afb70a985cplars * Attempt to chdir(2) on a non-existent directory 36865695bbc89088b9526ea9045410e5afb70a985cplars * 37865695bbc89088b9526ea9045410e5afb70a985cplars * 3. Test for EFAULT: 38865695bbc89088b9526ea9045410e5afb70a985cplars * Pass an address which lies outside the address space of the 39865695bbc89088b9526ea9045410e5afb70a985cplars * process, and expect an EFAULT. 40865695bbc89088b9526ea9045410e5afb70a985cplars * 41865695bbc89088b9526ea9045410e5afb70a985cplars * USAGE: <for command-line> 4264d7fe6d7a8862e7f21aff7187e5539d64179a3cnstraz * chdir04 [-c n] [-e] [-i n] [-I x] [-P x] [-t] 43865695bbc89088b9526ea9045410e5afb70a985cplars * where, -c n : Run n copies concurrently. 44865695bbc89088b9526ea9045410e5afb70a985cplars * -e : Turn on errno logging. 45865695bbc89088b9526ea9045410e5afb70a985cplars * -i n : Execute test n times. 46865695bbc89088b9526ea9045410e5afb70a985cplars * -I x : Execute test for x seconds. 47865695bbc89088b9526ea9045410e5afb70a985cplars * -P x : Pause for x seconds between iterations. 48865695bbc89088b9526ea9045410e5afb70a985cplars * -t : Turn on syscall timing. 49865695bbc89088b9526ea9045410e5afb70a985cplars * 50865695bbc89088b9526ea9045410e5afb70a985cplars * HISTORY 51865695bbc89088b9526ea9045410e5afb70a985cplars * 07/2001 Ported by Wayne Boyer 52865695bbc89088b9526ea9045410e5afb70a985cplars * 53865695bbc89088b9526ea9045410e5afb70a985cplars * RESTRICTIONS 54865695bbc89088b9526ea9045410e5afb70a985cplars * NONE 55865695bbc89088b9526ea9045410e5afb70a985cplars */ 56865695bbc89088b9526ea9045410e5afb70a985cplars 57865695bbc89088b9526ea9045410e5afb70a985cplars#include <stdio.h> 58865695bbc89088b9526ea9045410e5afb70a985cplars#include <errno.h> 59865695bbc89088b9526ea9045410e5afb70a985cplars#include <sys/stat.h> 601ad845172048e19f8669f4f940296afe39c8f43eplars#include <sys/mman.h> 6171ff32c4bcac9eaa4815181590a7059b49dba6a2Garrett Cooper#include "test.h" 6271ff32c4bcac9eaa4815181590a7059b49dba6a2Garrett Cooper#include "usctest.h" 63865695bbc89088b9526ea9045410e5afb70a985cplars 6464d7fe6d7a8862e7f21aff7187e5539d64179a3cnstrazchar *TCID = "chdir04"; 65865695bbc89088b9526ea9045410e5afb70a985cplars 6656207cec7732e09c216c751c0b5f88a242bacae6subrata_modakint exp_enos[] = { ENAMETOOLONG, ENOENT, EFAULT, 0 }; 67865695bbc89088b9526ea9045410e5afb70a985cplars 6856207cec7732e09c216c751c0b5f88a242bacae6subrata_modakchar bad_dir[] = 6956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak "abcdefghijklmnopqrstmnopqrstuvwxyzabcdefghijklmnopqrstmnopqrstuvwxyzabcdefghijklmnopqrstmnopqrstuvwxyzabcdefghijklmnopqrstmnopqrstuvwxyzabcdefghijklmnopqrstmnopqrstuvwxyzabcdefghijklmnopqrstmnopqrstuvwxyzabcdefghijklmnopqrstmnopqrstuvwxyzabcdefghijklmnopqrstmnopqrstuvwxyz"; 70865695bbc89088b9526ea9045410e5afb70a985cplars 71865695bbc89088b9526ea9045410e5afb70a985cplarschar noexist_dir[] = "/tmp/noexistdir"; 72865695bbc89088b9526ea9045410e5afb70a985cplars 73865695bbc89088b9526ea9045410e5afb70a985cplarsstruct test_case_t { 74865695bbc89088b9526ea9045410e5afb70a985cplars char *dname; 75865695bbc89088b9526ea9045410e5afb70a985cplars int error; 76865695bbc89088b9526ea9045410e5afb70a985cplars} TC[] = { 77865695bbc89088b9526ea9045410e5afb70a985cplars /* 7856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak * to test whether chdir() is setting ENAMETOOLONG if the 79865695bbc89088b9526ea9045410e5afb70a985cplars * directory is more than VFS_MAXNAMELEN 80865695bbc89088b9526ea9045410e5afb70a985cplars */ 8171ff32c4bcac9eaa4815181590a7059b49dba6a2Garrett Cooper { bad_dir, ENAMETOOLONG}, 8256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak /* 8356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak * to test whether chdir() is setting ENOENT if the 8456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak * directory is not existing. 8556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak */ 8671ff32c4bcac9eaa4815181590a7059b49dba6a2Garrett Cooper { noexist_dir, ENOENT}, 8771ff32c4bcac9eaa4815181590a7059b49dba6a2Garrett Cooper#ifndef UCLINUX 8856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak /* 8956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak * to test whether chdir() is setting EFAULT if the 9056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak * directory is an invalid address. 9156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak */ 9256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak { 9356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak (void *)-1, EFAULT} 94b5ed1f6ba2e61c48f1775b29ca55531b7aa45008vapier#endif 95865695bbc89088b9526ea9045410e5afb70a985cplars}; 96865695bbc89088b9526ea9045410e5afb70a985cplars 97b5ed1f6ba2e61c48f1775b29ca55531b7aa45008vapierint TST_TOTAL = (sizeof(TC) / sizeof(*TC)); 98b5ed1f6ba2e61c48f1775b29ca55531b7aa45008vapier 99865695bbc89088b9526ea9045410e5afb70a985cplarsint flag; 100865695bbc89088b9526ea9045410e5afb70a985cplars#define FAILED 1 101865695bbc89088b9526ea9045410e5afb70a985cplars 102865695bbc89088b9526ea9045410e5afb70a985cplarsvoid setup(void); 103865695bbc89088b9526ea9045410e5afb70a985cplarsvoid cleanup(void); 104865695bbc89088b9526ea9045410e5afb70a985cplars 10556207cec7732e09c216c751c0b5f88a242bacae6subrata_modakchar *bad_addr = 0; 1061ad845172048e19f8669f4f940296afe39c8f43eplars 10756207cec7732e09c216c751c0b5f88a242bacae6subrata_modakint main(int ac, char **av) 108865695bbc89088b9526ea9045410e5afb70a985cplars{ 10971ff32c4bcac9eaa4815181590a7059b49dba6a2Garrett Cooper int lc; 110865695bbc89088b9526ea9045410e5afb70a985cplars int i; 11171ff32c4bcac9eaa4815181590a7059b49dba6a2Garrett Cooper char *msg; 112865695bbc89088b9526ea9045410e5afb70a985cplars 11371ff32c4bcac9eaa4815181590a7059b49dba6a2Garrett Cooper if ((msg = parse_opts(ac, av, NULL, NULL)) != NULL) 11460fa8014af7534eaefa901200c8df4b74ce422e6Garrett Cooper tst_brkm(TBROK, NULL, "OPTION PARSING ERROR - %s", msg); 115865695bbc89088b9526ea9045410e5afb70a985cplars 116865695bbc89088b9526ea9045410e5afb70a985cplars setup(); 117865695bbc89088b9526ea9045410e5afb70a985cplars 118865695bbc89088b9526ea9045410e5afb70a985cplars TEST_EXP_ENOS(exp_enos); 119865695bbc89088b9526ea9045410e5afb70a985cplars 120865695bbc89088b9526ea9045410e5afb70a985cplars for (lc = 0; TEST_LOOPING(lc); lc++) { 121865695bbc89088b9526ea9045410e5afb70a985cplars Tst_count = 0; 122865695bbc89088b9526ea9045410e5afb70a985cplars 12356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak for (i = 0; i < TST_TOTAL; i++) { 124865695bbc89088b9526ea9045410e5afb70a985cplars 125865695bbc89088b9526ea9045410e5afb70a985cplars TEST(chdir(TC[i].dname)); 126865695bbc89088b9526ea9045410e5afb70a985cplars 127865695bbc89088b9526ea9045410e5afb70a985cplars if (TEST_RETURN != -1) { 128865695bbc89088b9526ea9045410e5afb70a985cplars tst_resm(TFAIL, "call succeeded unexpectedly"); 129865695bbc89088b9526ea9045410e5afb70a985cplars continue; 130865695bbc89088b9526ea9045410e5afb70a985cplars } 131865695bbc89088b9526ea9045410e5afb70a985cplars 13271ff32c4bcac9eaa4815181590a7059b49dba6a2Garrett Cooper if (TEST_ERRNO == TC[i].error) 13371ff32c4bcac9eaa4815181590a7059b49dba6a2Garrett Cooper tst_resm(TPASS|TTERRNO, "failed as expected"); 13471ff32c4bcac9eaa4815181590a7059b49dba6a2Garrett Cooper else { 13571ff32c4bcac9eaa4815181590a7059b49dba6a2Garrett Cooper tst_resm(TFAIL|TTERRNO, 13671ff32c4bcac9eaa4815181590a7059b49dba6a2Garrett Cooper "didn't fail as expected (expected %d)", 13771ff32c4bcac9eaa4815181590a7059b49dba6a2Garrett Cooper TC[i].error); 138865695bbc89088b9526ea9045410e5afb70a985cplars } 139865695bbc89088b9526ea9045410e5afb70a985cplars } 140865695bbc89088b9526ea9045410e5afb70a985cplars } 141865695bbc89088b9526ea9045410e5afb70a985cplars cleanup(); 142865695bbc89088b9526ea9045410e5afb70a985cplars 14371ff32c4bcac9eaa4815181590a7059b49dba6a2Garrett Cooper tst_exit(); 14471ff32c4bcac9eaa4815181590a7059b49dba6a2Garrett Cooper 14571ff32c4bcac9eaa4815181590a7059b49dba6a2Garrett Cooper} 146865695bbc89088b9526ea9045410e5afb70a985cplars 14756207cec7732e09c216c751c0b5f88a242bacae6subrata_modakvoid setup() 148865695bbc89088b9526ea9045410e5afb70a985cplars{ 1492c28215423293e443469a07ae7011135d058b671Garrett Cooper 150865695bbc89088b9526ea9045410e5afb70a985cplars tst_sig(NOFORK, DEF_HANDLER, cleanup); 151865695bbc89088b9526ea9045410e5afb70a985cplars 152865695bbc89088b9526ea9045410e5afb70a985cplars TEST_PAUSE; 153865695bbc89088b9526ea9045410e5afb70a985cplars 154865695bbc89088b9526ea9045410e5afb70a985cplars tst_tmpdir(); 1551ad845172048e19f8669f4f940296afe39c8f43eplars 15671ff32c4bcac9eaa4815181590a7059b49dba6a2Garrett Cooper#ifdef UCLINUX 157d34d581c6a320e356a6cda923c7aa399479e812crobbiew bad_addr = mmap(0, 1, PROT_NONE, 15871ff32c4bcac9eaa4815181590a7059b49dba6a2Garrett Cooper MAP_PRIVATE_EXCEPT_UCLINUX|MAP_ANONYMOUS, 0, 0); 15971ff32c4bcac9eaa4815181590a7059b49dba6a2Garrett Cooper if (bad_addr == MAP_FAILED) 16072d585638d4052a3e46b83dd2b0d13a1f5466625vapier tst_brkm(TBROK|TERRNO, cleanup, "mmap() failed"); 1611ad845172048e19f8669f4f940296afe39c8f43eplars TC[2].dname = bad_addr; 162b5ed1f6ba2e61c48f1775b29ca55531b7aa45008vapier#endif 163865695bbc89088b9526ea9045410e5afb70a985cplars} 164865695bbc89088b9526ea9045410e5afb70a985cplars 16556207cec7732e09c216c751c0b5f88a242bacae6subrata_modakvoid cleanup() 166865695bbc89088b9526ea9045410e5afb70a985cplars{ 167865695bbc89088b9526ea9045410e5afb70a985cplars TEST_CLEANUP; 168865695bbc89088b9526ea9045410e5afb70a985cplars 169865695bbc89088b9526ea9045410e5afb70a985cplars tst_rmdir(); 170865695bbc89088b9526ea9045410e5afb70a985cplars 17171ff32c4bcac9eaa4815181590a7059b49dba6a2Garrett Cooper} 172