Home | History | Annotate | Download | only in statfs
      1 /*
      2  *
      3  *   Copyright (C) Bull S.A. 2001
      4  *   Copyright (c) International Business Machines  Corp., 2001
      5  *
      6  *   This program is free software;  you can redistribute it and/or modify
      7  *   it under the terms of the GNU General Public License as published by
      8  *   the Free Software Foundation; either version 2 of the License, or
      9  *   (at your option) any later version.
     10  *
     11  *   This program is distributed in the hope that it will be useful,
     12  *   but WITHOUT ANY WARRANTY;  without even the implied warranty of
     13  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
     14  *   the GNU General Public License for more details.
     15  *
     16  *   You should have received a copy of the GNU General Public License
     17  *   along with this program;  if not, write to the Free Software
     18  *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
     19  */
     20 
     21 /*
     22  * NAME
     23  *	statfs03.c
     24  *
     25  * DESCRIPTION
     26  *	Testcase to check that statfs(2) sets errno to EACCES when
     27  *	search permission is denied for a component of the path prefix of path.
     28  *
     29  * ALGORITHM
     30  *	 Use a component of the pathname, where search permission
     31  *	 is denied for a component of the path prefix of path.
     32  *
     33  * USAGE:  <for command-line>
     34  *  statfs03 [-c n] [-e] [-i n] [-I x] [-P x] [-t]
     35  *     where,  -c n : Run n copies concurrently.
     36  *             -e   : Turn on errno logging.
     37  *             -i n : Execute test n times.
     38  *             -I x : Execute test for x seconds.
     39  *             -P x : Pause for x seconds between iterations.
     40  *             -t   : Turn on syscall timing.
     41  *
     42  * HISTORY
     43  *	05/2002 Ported by Jacky Malcles
     44  *
     45  * RESTRICTIONS
     46  *	NONE
     47  *
     48  */
     49 #include <sys/types.h>
     50 #include <sys/statfs.h>
     51 #include <sys/stat.h>
     52 #include <sys/vfs.h>
     53 #include <fcntl.h>
     54 #include <errno.h>
     55 #include <stdio.h>
     56 #include "test.h"
     57 #include "safe_macros.h"
     58 #include <pwd.h>
     59 
     60 char *TCID = "statfs03";
     61 int TST_TOTAL = 1;
     62 int fileHandle = 0;
     63 
     64 char nobody_uid[] = "nobody";
     65 struct passwd *ltpuser;
     66 
     67 char fname[30] = "testfile";
     68 char path[50];
     69 struct statfs buf;
     70 
     71 void setup(void);
     72 void cleanup(void);
     73 
     74 int main(int ac, char **av)
     75 {
     76 	int lc;
     77 
     78 	tst_parse_opts(ac, av, NULL, NULL);
     79 
     80 	setup();
     81 
     82 	for (lc = 0; TEST_LOOPING(lc); lc++) {
     83 
     84 		tst_count = 0;
     85 
     86 		TEST(statfs(path, &buf));
     87 
     88 		if (TEST_RETURN != -1) {
     89 			tst_resm(TFAIL, "call succeeded unexpectedly");
     90 
     91 		} else {
     92 
     93 			if (TEST_ERRNO == EACCES) {
     94 				tst_resm(TPASS, "expected failure - "
     95 					 "errno = %d : %s", TEST_ERRNO,
     96 					 strerror(TEST_ERRNO));
     97 			} else {
     98 				tst_resm(TFAIL, "unexpected error - %d : %s - "
     99 					 "expected %d", TEST_ERRNO,
    100 					 strerror(TEST_ERRNO), EACCES);
    101 			}
    102 		}
    103 	}
    104 
    105 	cleanup();
    106 	tst_exit();
    107 }
    108 
    109 /*
    110  * setup() - performs all ONE TIME setup for this test.
    111  */
    112 void setup(void)
    113 {
    114 
    115 	tst_require_root();
    116 
    117 	tst_sig(NOFORK, DEF_HANDLER, cleanup);
    118 
    119 	TEST_PAUSE;
    120 
    121 	/* make a temporary directory and cd to it */
    122 	tst_tmpdir();
    123 	SAFE_CHMOD(cleanup, tst_get_tmpdir(), S_IRWXU);
    124 
    125 	/* create a test file */
    126 	sprintf(fname, "%s.%d", fname, getpid());
    127 	if (mkdir(fname, 0444) == -1) {
    128 		tst_resm(TFAIL, "creat(2) FAILED to creat temp file");
    129 	} else {
    130 		sprintf(path, "%s/%s", fname, fname);
    131 		if ((fileHandle = creat(path, 0444)) == -1)
    132 			tst_brkm(TFAIL | TERRNO, cleanup, "creat failed");
    133 	}
    134 
    135 	ltpuser = getpwnam(nobody_uid);
    136 	if (ltpuser == NULL)
    137 		tst_brkm(TBROK | TERRNO, cleanup, "getpwnam failed");
    138 	if (seteuid(ltpuser->pw_uid) == -1) {
    139 		tst_resm(TINFO | TERRNO, "seteuid failed to "
    140 			 "to set the effective uid to %d", ltpuser->pw_uid);
    141 	}
    142 
    143 }
    144 
    145 /*
    146  * cleanup() - performs all ONE TIME cleanup for this test at
    147  *	       completion or premature exit.
    148  */
    149 void cleanup(void)
    150 {
    151 	/* reset the process ID to the saved ID (root) */
    152 	if (setuid(0) == -1) {
    153 		tst_resm(TINFO, "setuid(0) failed");
    154 	}
    155 
    156 	/*
    157 	 * print timing stats if that option was specified.
    158 	 * print errno log if that option was specified.
    159 	 */
    160 	close(fileHandle);
    161 
    162 	/* delete the test directory created in setup() */
    163 	tst_rmdir();
    164 
    165 }
    166