Home | History | Annotate | Download | only in rename
      1 /*
      2  * NAME
      3  *	rename07
      4  *
      5  * DESCRIPTION
      6  *	This test will verify that rename(2) failed in ENOTDIR
      7  *
      8  * CALLS
      9  *	stat,open,rename,mkdir,close
     10  *
     11  * ALGORITHM
     12  *	Setup:
     13  *		Setup signal handling.
     14  *		Create temporary directory.
     15  *		Pause for SIGUSR1 if option specified.
     16  *              create the "old" directory and the "new" file
     17  *              rename the "old" directory to the "new" file
     18  *
     19  *	Test:
     20  *		Loop if the proper options are given.
     21  *                  verify rename() failed and returned ENOTDIR
     22  *
     23  *	Cleanup:
     24  *		Print errno log and/or timing stats if options given
     25  *		Delete the temporary directory created.*
     26  * USAGE
     27  *	rename07 [-c n] [-e] [-i n] [-I x] [-p x] [-t]
     28  *	where,  -c n : Run n copies concurrently.
     29  *		-e   : Turn on errno logging.
     30  *		-i n : Execute test n times.
     31  *		-I x : Execute test for x seconds.
     32  *		-P x : Pause for x seconds between iterations.
     33  *		-t   : Turn on syscall timing.
     34  *
     35  * HISTORY
     36  *	07/2001 Ported by Wayne Boyer
     37  *
     38  * RESTRICTIONS
     39  *	None.
     40  */
     41 #include <sys/types.h>
     42 #include <fcntl.h>
     43 #include <sys/stat.h>
     44 #include <unistd.h>
     45 #include <errno.h>
     46 
     47 #include "test.h"
     48 
     49 void setup();
     50 void cleanup();
     51 
     52 char *TCID = "rename07";
     53 int TST_TOTAL = 1;
     54 
     55 int fd;
     56 char mname[255], fdir[255];
     57 struct stat buf1, buf2;
     58 dev_t olddev, olddev1;
     59 ino_t oldino, oldino1;
     60 
     61 int main(int ac, char **av)
     62 {
     63 	int lc;
     64 
     65 	/*
     66 	 * parse standard options
     67 	 */
     68 	tst_parse_opts(ac, av, NULL, NULL);
     69 
     70 	/*
     71 	 * perform global setup for test
     72 	 */
     73 	setup();
     74 
     75 	/*
     76 	 * check looping state if -i option given
     77 	 */
     78 	for (lc = 0; TEST_LOOPING(lc); lc++) {
     79 
     80 		tst_count = 0;
     81 
     82 		/* rename a directory to a file */
     83 		/* Call rename(2) */
     84 		TEST(rename(fdir, mname));
     85 
     86 		if (TEST_RETURN != -1) {
     87 			tst_resm(TFAIL, "rename(%s, %s) succeeded unexpectedly",
     88 				 fdir, mname);
     89 			continue;
     90 		}
     91 
     92 		if (TEST_ERRNO != ENOTDIR) {
     93 			tst_resm(TFAIL, "Expected ENOTDIR got %d", TEST_ERRNO);
     94 		} else {
     95 			tst_resm(TPASS, "rename() returned ENOTDIR");
     96 		}
     97 	}
     98 
     99 	cleanup();
    100 	tst_exit();
    101 
    102 }
    103 
    104 /*
    105  * setup() - performs all ONE TIME setup for this test.
    106  */
    107 void setup(void)
    108 {
    109 
    110 	tst_sig(NOFORK, DEF_HANDLER, cleanup);
    111 
    112 	TEST_PAUSE;
    113 
    114 	/* Create a temporary directory and make it current. */
    115 	tst_tmpdir();
    116 
    117 	sprintf(fdir, "./rndir_%d", getpid());
    118 	sprintf(mname, "./tfile_%d", getpid());
    119 
    120 	/* create "old" directory */
    121 	if (stat(fdir, &buf1) != -1) {
    122 		tst_brkm(TBROK, cleanup, "tmp directory %s found!", fdir);
    123 	}
    124 
    125 	if (mkdir(fdir, 00770) == -1) {
    126 		tst_brkm(TBROK, cleanup, "Could not create directory %s", fdir);
    127 	}
    128 
    129 	if (stat(fdir, &buf1) == -1) {
    130 		tst_brkm(TBROK, cleanup, "failed to stat directory %s "
    131 			 "in rename()", fdir);
    132 
    133 	}
    134 
    135 	/* save "old"'s dev and ino */
    136 	olddev = buf1.st_dev;
    137 	oldino = buf1.st_ino;
    138 
    139 	SAFE_TOUCH(cleanup, mname, 0700, NULL);
    140 
    141 	if (stat(mname, &buf2) == -1) {
    142 		tst_brkm(TBROK, cleanup, "failed to stat file %s in rename()",
    143 			 mname);
    144 
    145 	}
    146 
    147 	/* save "new"'s dev and ino */
    148 	olddev1 = buf2.st_dev;
    149 	oldino1 = buf2.st_ino;
    150 }
    151 
    152 /*
    153  * cleanup() - performs all ONE TIME cleanup for this test at
    154  *              completion or premature exit.
    155  */
    156 void cleanup(void)
    157 {
    158 
    159 	/*
    160 	 * Remove the temporary directory.
    161 	 */
    162 	tst_rmdir();
    163 }
    164