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 *	rename10
23 *
24 * DESCRIPTION
25 *	This test will verify that rename(2) syscall fails with ENAMETOOLONG
26 *      and ENOENT
27 *
28 * ALGORITHM
29 *	Setup:
30 *		Setup signal handling.
31 *		Create temporary directory.
32 *		Pause for SIGUSR1 if option specified.
33 *              create the "old" file
34 *
35 *	Test:
36 *		Loop if the proper options are given.
37 *              1.  rename the "old" to the "new" file
38 *                  verify rename() failed with error ENAMETOOLONG
39 *
40 *              2.  "new" path contains a directory that does not exist
41 *                  rename the "old" to the "new"
42 *                  verify rename() failed with error ENOENT
43 *	Cleanup:
44 *		Print errno log and/or timing stats if options given
45 *		Delete the temporary directory created.*
46 *
47 * USAGE
48 *	rename10 [-c n] [-e] [-i n] [-I x] [-P x] [-t]
49 *	where,  -c n : Run n copies concurrently.
50 *		-e   : Turn on errno logging.
51 *		-i n : Execute test n times.
52 *		-I x : Execute test for x seconds.
53 *		-P x : Pause for x seconds between iterations.
54 *		-t   : Turn on syscall timing.
55 *
56 * HISTORY
57 *	07/2001 Ported by Wayne Boyer
58 *
59 * RESTRICTIONS
60 *	None.
61 */
62#include <sys/types.h>
63#include <sys/fcntl.h>
64#include <unistd.h>
65#include <errno.h>
66
67#include "test.h"
68
69void setup();
70void cleanup();
71
72char *TCID = "rename10";
73int TST_TOTAL = 2;
74
75char badmname[] =
76    "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstmnopqrstuvwxyzabcdefghijklmnopqrstmnopqrstuvwxyzabcdefghijklmnopqrstmnopqrstuvwxyzabcdefghijklmnopqrstmnopqrstuvwxyzabcdefghijklmnopqrstmnopqrstuvwxyzabcdefghijklmnopqrstmnopqrstuvwxyz";
77
78int fd;
79char fname[255], mname[255];
80char mdir[255];
81
82struct test_case_t {
83	char *fd1;
84	char *fd2;
85	int error;
86} TC[] = {
87	/* badmname is too long for a file name - ENAMETOOLONG */
88	{
89	fname, badmname, ENAMETOOLONG},
90	    /* mname contains a directory component which does not exist - ENOENT */
91	{
92	fname, mname, ENOENT}
93};
94
95int main(int ac, char **av)
96{
97	int lc;
98	int i;
99
100	/*
101	 * parse standard options
102	 */
103	tst_parse_opts(ac, av, NULL, NULL);
104
105	/*
106	 * perform global setup for test
107	 */
108	setup();
109
110	/*
111	 * check looping state if -i option given
112	 */
113	for (lc = 0; TEST_LOOPING(lc); lc++) {
114
115		tst_count = 0;
116
117		/* loop through the test cases */
118		for (i = 0; i < TST_TOTAL; i++) {
119
120			TEST(rename(TC[i].fd1, TC[i].fd2));
121
122			if (TEST_RETURN != -1) {
123				tst_resm(TFAIL, "call succeeded unexpectedly");
124				continue;
125			}
126
127			if (TEST_ERRNO == TC[i].error) {
128				tst_resm(TPASS, "expected failure - "
129					 "errno = %d : %s", TEST_ERRNO,
130					 strerror(TEST_ERRNO));
131			} else {
132				tst_resm(TFAIL, "unexpected error - %d : %s - "
133					 "expected %d", TEST_ERRNO,
134					 strerror(TEST_ERRNO), TC[i].error);
135			}
136		}
137	}
138
139	cleanup();
140	tst_exit();
141
142}
143
144/*
145 * setup() - performs all ONE TIME setup for this test.
146 */
147void setup(void)
148{
149
150	tst_sig(NOFORK, DEF_HANDLER, cleanup);
151
152	TEST_PAUSE;
153
154	/* Create a temporary directory and make it current. */
155	tst_tmpdir();
156
157	sprintf(fname, "./tfile_%d", getpid());
158	sprintf(mdir, "./rndir_%d", getpid());
159	sprintf(mname, "%s/rnfile_%d", mdir, getpid());
160
161	SAFE_TOUCH(cleanup, fname, 0700, NULL);
162}
163
164/*
165 * cleanup() - performs all ONE TIME cleanup for this test at
166 *             completion or premature exit.
167 */
168void cleanup(void)
169{
170
171	/*
172	 * Remove the temporary directory.
173	 */
174	tst_rmdir();
175}
176