• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  *
3  *   Copyright (c) International Business Machines  Corp., 2001
4  *
5  *   This program is free software;  you can redistribute it and/or modify
6  *   it under the terms of the GNU General Public License as published by
7  *   the Free Software Foundation; either version 2 of the License, or
8  *   (at your option) any later version.
9  *
10  *   This program is distributed in the hope that it will be useful,
11  *   but WITHOUT ANY WARRANTY;  without even the implied warranty of
12  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
13  *   the GNU General Public License for more details.
14  *
15  *   You should have received a copy of the GNU General Public License
16  *   along with this program;  if not, write to the Free Software
17  *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18  */
19 
20 /*
21  * NAME
22  *	rename13
23  *
24  * DESCRIPTION
25  *	Verify rename() return successfully and performs no other action
26  *      when "old" file and "new" file link to the same file.
27  *
28  * ALGORITHM
29  *	Setup:
30  *		Setup signal handling.
31  *		Create temporary directory.
32  *		Pause for SIGUSR1 if option specified.
33  *
34  *	Test:
35  *		Loop if the proper options are given.
36  *                  create the "old" file
37  *                  link the "new" file to the "old" file
38  *                  rename the "old" to the "new" file
39  *                  verify the "new" file points to the original file
40  *                  verify the "old" file exists and points to
41  *                         the original file
42  *	Cleanup:
43  *		Print errno log and/or timing stats if options given
44  *		Delete the temporary directory created.
45  *
46  * USAGE
47  *	rename13 [-c n] [-f] [-i n] [-I x] [-P x] [-t]
48  *	where,  -c n : Run n copies concurrently.
49  *		-f   : Turn off functionality Testing.
50  *		-i n : Execute test n times.
51  *		-I x : Execute test for x seconds.
52  *		-P x : Pause for x seconds between iterations.
53  *		-t   : Turn on syscall timing.
54  *
55  * HISTORY
56  *	07/2001 Ported by Wayne Boyer
57  *
58  * RESTRICTIONS
59  *	None.
60  */
61 #include <sys/types.h>
62 #include <fcntl.h>
63 #include <sys/stat.h>
64 #include <unistd.h>
65 #include <errno.h>
66 
67 #include "test.h"
68 #include "safe_macros.h"
69 
70 void setup();
71 void cleanup();
72 
73 char *TCID = "rename13";
74 int TST_TOTAL = 1;
75 
76 int fd;
77 char fname[255], mname[255];
78 struct stat buf1, buf2;
79 dev_t olddev;
80 ino_t oldino;
81 
main(int ac,char ** av)82 int main(int ac, char **av)
83 {
84 	int lc;
85 
86 	/*
87 	 * parse standard options
88 	 */
89 	tst_parse_opts(ac, av, NULL, NULL);
90 
91 	/*
92 	 * perform global setup for test
93 	 */
94 	setup();
95 
96 	/*
97 	 * check looping state if -i option given
98 	 */
99 	for (lc = 0; TEST_LOOPING(lc); lc++) {
100 
101 		tst_count = 0;
102 
103 		/*
104 		 * TEST rename()works when
105 		 * both old file and new file link to the same file
106 		 */
107 
108 		/* Call rename(2) */
109 		TEST(rename(fname, mname));
110 
111 		if (TEST_RETURN == -1) {
112 			tst_resm(TFAIL, "rename(%s, %s) failed", fname, mname);
113 			continue;
114 		}
115 
116 		/* check the existence of "new", and get the status */
117 		SAFE_STAT(cleanup, mname, &buf2);
118 
119 		/* check the existence of "old", and get the status */
120 		SAFE_STAT(cleanup, fname, &buf1);
121 
122 		/* verify the new file is the same as the original */
123 		if (buf2.st_dev != olddev || buf2.st_ino != oldino) {
124 			tst_resm(TFAIL,
125 				 "rename() failed: new file does "
126 				 "not point to the same file as old "
127 				 "file");
128 			continue;
129 		}
130 
131 		/* verify the old file is unchanged */
132 		if (buf1.st_dev != olddev || buf1.st_ino != oldino) {
133 			tst_resm(TFAIL,
134 				 "rename() failed: old file does "
135 				 "not point to the original file");
136 			continue;
137 		}
138 
139 		tst_resm(TPASS, "functionality of rename() is correct");
140 	}
141 
142 	cleanup();
143 	tst_exit();
144 }
145 
146 /*
147  * setup() - performs all ONE TIME setup for this test.
148  */
setup(void)149 void setup(void)
150 {
151 
152 	tst_sig(NOFORK, DEF_HANDLER, cleanup);
153 
154 	TEST_PAUSE;
155 
156 	/* Create a temporary directory and make it current. */
157 	tst_tmpdir();
158 
159 	sprintf(fname, "./tfile_%d", getpid());
160 	sprintf(mname, "./rnfile_%d", getpid());
161 
162 	SAFE_TOUCH(cleanup, fname, 0700, NULL);
163 
164 	SAFE_STAT(cleanup, fname, &buf1);
165 
166 	/* save the dev and inode */
167 	olddev = buf1.st_dev;
168 	oldino = buf1.st_ino;
169 
170 	/* link the "new" file to the "old" file */
171 	SAFE_LINK(cleanup, fname, mname);
172 }
173 
174 /*
175  * cleanup() - performs all ONE TIME cleanup for this test at
176  *             completion or premature exit.
177  */
cleanup(void)178 void cleanup(void)
179 {
180 
181 	/*
182 	 * Remove the temporary directory.
183 	 */
184 	tst_rmdir();
185 
186 }
187