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 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" 62865695bbc89088b9526ea9045410e5afb70a985cplars 6364d7fe6d7a8862e7f21aff7187e5539d64179a3cnstrazchar *TCID = "chdir04"; 64865695bbc89088b9526ea9045410e5afb70a985cplars 6556207cec7732e09c216c751c0b5f88a242bacae6subrata_modakchar bad_dir[] = 6656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak "abcdefghijklmnopqrstmnopqrstuvwxyzabcdefghijklmnopqrstmnopqrstuvwxyzabcdefghijklmnopqrstmnopqrstuvwxyzabcdefghijklmnopqrstmnopqrstuvwxyzabcdefghijklmnopqrstmnopqrstuvwxyzabcdefghijklmnopqrstmnopqrstuvwxyzabcdefghijklmnopqrstmnopqrstuvwxyzabcdefghijklmnopqrstmnopqrstuvwxyz"; 67865695bbc89088b9526ea9045410e5afb70a985cplars 68865695bbc89088b9526ea9045410e5afb70a985cplarschar noexist_dir[] = "/tmp/noexistdir"; 69865695bbc89088b9526ea9045410e5afb70a985cplars 70865695bbc89088b9526ea9045410e5afb70a985cplarsstruct test_case_t { 71865695bbc89088b9526ea9045410e5afb70a985cplars char *dname; 72865695bbc89088b9526ea9045410e5afb70a985cplars int error; 73865695bbc89088b9526ea9045410e5afb70a985cplars} TC[] = { 74865695bbc89088b9526ea9045410e5afb70a985cplars /* 7556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak * to test whether chdir() is setting ENAMETOOLONG if the 76865695bbc89088b9526ea9045410e5afb70a985cplars * directory is more than VFS_MAXNAMELEN 77865695bbc89088b9526ea9045410e5afb70a985cplars */ 78354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao { 79354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao bad_dir, ENAMETOOLONG}, 8056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak /* 8156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak * to test whether chdir() is setting ENOENT if the 8256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak * directory is not existing. 8356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak */ 84354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao { 85354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao noexist_dir, ENOENT}, 8671ff32c4bcac9eaa4815181590a7059b49dba6a2Garrett Cooper#ifndef UCLINUX 8756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak /* 8856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak * to test whether chdir() is setting EFAULT if the 8956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak * directory is an invalid address. 9056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak */ 9156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak { 9256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak (void *)-1, EFAULT} 93b5ed1f6ba2e61c48f1775b29ca55531b7aa45008vapier#endif 94865695bbc89088b9526ea9045410e5afb70a985cplars}; 95865695bbc89088b9526ea9045410e5afb70a985cplars 96b863a0bd366f8af57b000e2f1da5da0bfd8cebf7Cyril Hrubisint TST_TOTAL = ARRAY_SIZE(TC); 97b5ed1f6ba2e61c48f1775b29ca55531b7aa45008vapier 98865695bbc89088b9526ea9045410e5afb70a985cplarsint flag; 99865695bbc89088b9526ea9045410e5afb70a985cplars#define FAILED 1 100865695bbc89088b9526ea9045410e5afb70a985cplars 101865695bbc89088b9526ea9045410e5afb70a985cplarsvoid setup(void); 102865695bbc89088b9526ea9045410e5afb70a985cplarsvoid cleanup(void); 103865695bbc89088b9526ea9045410e5afb70a985cplars 10456207cec7732e09c216c751c0b5f88a242bacae6subrata_modakchar *bad_addr = 0; 1051ad845172048e19f8669f4f940296afe39c8f43eplars 10656207cec7732e09c216c751c0b5f88a242bacae6subrata_modakint main(int ac, char **av) 107865695bbc89088b9526ea9045410e5afb70a985cplars{ 10871ff32c4bcac9eaa4815181590a7059b49dba6a2Garrett Cooper int lc; 109865695bbc89088b9526ea9045410e5afb70a985cplars int i; 110865695bbc89088b9526ea9045410e5afb70a985cplars 111d6d11d08678aac1ed2c370ea8e42e5f45aea07beCyril Hrubis tst_parse_opts(ac, av, NULL, NULL); 112865695bbc89088b9526ea9045410e5afb70a985cplars 113865695bbc89088b9526ea9045410e5afb70a985cplars setup(); 114865695bbc89088b9526ea9045410e5afb70a985cplars 115865695bbc89088b9526ea9045410e5afb70a985cplars for (lc = 0; TEST_LOOPING(lc); lc++) { 116d59a659cd639ca2780b00049d102acd2a783d585Caspar Zhang tst_count = 0; 117865695bbc89088b9526ea9045410e5afb70a985cplars 11856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak for (i = 0; i < TST_TOTAL; i++) { 119865695bbc89088b9526ea9045410e5afb70a985cplars 120865695bbc89088b9526ea9045410e5afb70a985cplars TEST(chdir(TC[i].dname)); 121865695bbc89088b9526ea9045410e5afb70a985cplars 122865695bbc89088b9526ea9045410e5afb70a985cplars if (TEST_RETURN != -1) { 123865695bbc89088b9526ea9045410e5afb70a985cplars tst_resm(TFAIL, "call succeeded unexpectedly"); 124865695bbc89088b9526ea9045410e5afb70a985cplars continue; 125865695bbc89088b9526ea9045410e5afb70a985cplars } 126865695bbc89088b9526ea9045410e5afb70a985cplars 12771ff32c4bcac9eaa4815181590a7059b49dba6a2Garrett Cooper if (TEST_ERRNO == TC[i].error) 128354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao tst_resm(TPASS | TTERRNO, "failed as expected"); 12971ff32c4bcac9eaa4815181590a7059b49dba6a2Garrett Cooper else { 130354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao tst_resm(TFAIL | TTERRNO, 131354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao "didn't fail as expected (expected %d)", 132354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao TC[i].error); 133865695bbc89088b9526ea9045410e5afb70a985cplars } 134865695bbc89088b9526ea9045410e5afb70a985cplars } 135865695bbc89088b9526ea9045410e5afb70a985cplars } 136865695bbc89088b9526ea9045410e5afb70a985cplars cleanup(); 137865695bbc89088b9526ea9045410e5afb70a985cplars 13871ff32c4bcac9eaa4815181590a7059b49dba6a2Garrett Cooper tst_exit(); 13971ff32c4bcac9eaa4815181590a7059b49dba6a2Garrett Cooper 14071ff32c4bcac9eaa4815181590a7059b49dba6a2Garrett Cooper} 141865695bbc89088b9526ea9045410e5afb70a985cplars 142c57fba5535abf457e33dd7a986b6c512d95cdef6Mike Frysingervoid setup(void) 143865695bbc89088b9526ea9045410e5afb70a985cplars{ 1442c28215423293e443469a07ae7011135d058b671Garrett Cooper 145865695bbc89088b9526ea9045410e5afb70a985cplars tst_sig(NOFORK, DEF_HANDLER, cleanup); 146865695bbc89088b9526ea9045410e5afb70a985cplars 147865695bbc89088b9526ea9045410e5afb70a985cplars TEST_PAUSE; 148865695bbc89088b9526ea9045410e5afb70a985cplars 149865695bbc89088b9526ea9045410e5afb70a985cplars tst_tmpdir(); 1501ad845172048e19f8669f4f940296afe39c8f43eplars 15171ff32c4bcac9eaa4815181590a7059b49dba6a2Garrett Cooper#ifdef UCLINUX 152d34d581c6a320e356a6cda923c7aa399479e812crobbiew bad_addr = mmap(0, 1, PROT_NONE, 153354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao MAP_PRIVATE_EXCEPT_UCLINUX | MAP_ANONYMOUS, 0, 0); 15471ff32c4bcac9eaa4815181590a7059b49dba6a2Garrett Cooper if (bad_addr == MAP_FAILED) 155354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao tst_brkm(TBROK | TERRNO, cleanup, "mmap() failed"); 1561ad845172048e19f8669f4f940296afe39c8f43eplars TC[2].dname = bad_addr; 157b5ed1f6ba2e61c48f1775b29ca55531b7aa45008vapier#endif 158865695bbc89088b9526ea9045410e5afb70a985cplars} 159865695bbc89088b9526ea9045410e5afb70a985cplars 160c57fba5535abf457e33dd7a986b6c512d95cdef6Mike Frysingervoid cleanup(void) 161865695bbc89088b9526ea9045410e5afb70a985cplars{ 162865695bbc89088b9526ea9045410e5afb70a985cplars tst_rmdir(); 163865695bbc89088b9526ea9045410e5afb70a985cplars 164ec6edca7aa42b6affd989ef91b5897f96795e40fChris Dearman} 165