rename14.c revision bdbaec51a423e715c2b03ed9e497e9a1fba6103e
1d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew/*
2d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew *
3d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew *   Copyright (c) International Business Machines  Corp., 2002
4d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew *
5d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew *   This program is free software;  you can redistribute it and/or modify
6d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew *   it under the terms of the GNU General Public License as published by
7d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew *   the Free Software Foundation; either version 2 of the License, or
8d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew *   (at your option) any later version.
9d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew *
10d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew *   This program is distributed in the hope that it will be useful,
11d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew *   but WITHOUT ANY WARRANTY;  without even the implied warranty of
12d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
13d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew *   the GNU General Public License for more details.
14d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew *
15d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew *   You should have received a copy of the GNU General Public License
16d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew *   along with this program;  if not, write to the Free Software
17d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew */
19d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew
20d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew/* 11/12/2002   Port to LTP     robbiew@us.ibm.com */
21d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew/* 06/30/2001	Port to Linux	nsharoff@us.ibm.com */
22d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew
23d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew/*
24d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew * NAME
25d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew *	rename14.c - create and rename files
26d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew *
27d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew * CALLS
28d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew *	create, unlink, rename
29d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew *
30d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew * ALGORITHM
31d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew *	Creates two processes.  One creates and unlinks a file.
32d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew *	The other renames that file.
33d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew *
34d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew */
35d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew
36bdbaec51a423e715c2b03ed9e497e9a1fba6103esubrata_modak#include <stdio.h>
37a70576c4834d89f937e46698fef4114736cce4d7robbiew#include <errno.h>
38d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew#include <signal.h>
39d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew#include <stdlib.h>
40d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew#include <unistd.h>
41d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew#include <wait.h>
42d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew#include <sys/types.h>
43d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew#include <sys/stat.h>
44d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew#include <fcntl.h>
45d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew
46d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew/** LTP Port **/
47d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew#include "test.h"
48d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew#include "usctest.h"
49d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew
50d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew#define FAILED 0
51d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew#define PASSED 1
52d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew
53d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiewint local_flag = PASSED;
54d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew
55d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiewchar *TCID="rename14";            /* Test program identifier.    */
56d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiewint TST_TOTAL=1;                /* Total number of test cases. */
57d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiewextern int Tst_count;           /* Test Case counter for tst_* routines */
58d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew/**************/
59d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew
60d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew
61d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew#define RUNTIME	45
62d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew
63d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiewint kidpid[2];
64d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiewint parent_pid;
65d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew
66d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew
67d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiewint main (argc, argv)
68d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	int  argc;
69d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	char *argv[];
70d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew{
7148f20313857f6afce9317e83d98d9ee536d2377dsubrata_modak	int pid;
72d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	sigset_t set;
73d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	struct sigaction act, oact;
74d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	int	term();
75d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	int	al();
76d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	void dochild1();
77d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	void dochild2();
78d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew
79d34d581c6a320e356a6cda923c7aa399479e812crobbiew#ifdef UCLINUX
80d34d581c6a320e356a6cda923c7aa399479e812crobbiew	char *msg;		/* message returned from parse_opts */
81d34d581c6a320e356a6cda923c7aa399479e812crobbiew
82d34d581c6a320e356a6cda923c7aa399479e812crobbiew	/* Parse standard options given to run the test. */
83d34d581c6a320e356a6cda923c7aa399479e812crobbiew	msg = parse_opts(argc, argv, (option_t *)NULL, NULL);
84d34d581c6a320e356a6cda923c7aa399479e812crobbiew	if (msg != (char *)NULL) {
85d34d581c6a320e356a6cda923c7aa399479e812crobbiew		tst_brkm(TBROK, NULL, "OPTION PARSING ERROR - %s", msg);
86d34d581c6a320e356a6cda923c7aa399479e812crobbiew	}
87d34d581c6a320e356a6cda923c7aa399479e812crobbiew
88d34d581c6a320e356a6cda923c7aa399479e812crobbiew	maybe_run_child(&dochild1, "n", 1);
89d34d581c6a320e356a6cda923c7aa399479e812crobbiew	maybe_run_child(&dochild2, "n", 2);
90d34d581c6a320e356a6cda923c7aa399479e812crobbiew#endif
91d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	sigemptyset(&set);
92d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	act.sa_handler = (void(*)())term;
93d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	act.sa_mask = set;
94d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	act.sa_flags = 0;
95d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	if (sigaction(SIGTERM, &act, &oact)) {
96d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew		tst_resm(TBROK,"Sigaction(SIGTERM)");
97d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew		tst_exit();
98d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	}
99d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew
100d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	sigemptyset(&set);
101d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	act.sa_handler = (void(*)())al;
102d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	act.sa_mask = set;
103d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	act.sa_flags = 0;
104d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	if (sigaction(SIGALRM, &act, 0)) {
105d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew		tst_resm(TBROK,"Sigaction(SIGALRM)");
106d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew		tst_exit();
1074bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak	}
108d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	parent_pid = getpid();
109d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	tst_tmpdir();
110d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew/*--------------------------------------------------------------*/
111d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew
112d34d581c6a320e356a6cda923c7aa399479e812crobbiew	pid = FORK_OR_VFORK();
113d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	if (pid < 0) {
114cff4af016805c764c391c473d4c95b999dcdf148vapier		tst_resm(TBROK,"fork() returned %d", pid);
115bdbaec51a423e715c2b03ed9e497e9a1fba6103esubrata_modak		tst_exit();
116d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	}
117d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	if (pid == 0) {
118d34d581c6a320e356a6cda923c7aa399479e812crobbiew#ifdef UCLINUX
119d34d581c6a320e356a6cda923c7aa399479e812crobbiew		if (self_exec(argv[0], "n", 1) < 0) {
120d34d581c6a320e356a6cda923c7aa399479e812crobbiew			tst_resm(TBROK,"self_exec failed");
121d34d581c6a320e356a6cda923c7aa399479e812crobbiew		}
122d34d581c6a320e356a6cda923c7aa399479e812crobbiew#else
123d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew		dochild1();
124d34d581c6a320e356a6cda923c7aa399479e812crobbiew#endif
125d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	}
126d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	kidpid[0] = pid;
127d34d581c6a320e356a6cda923c7aa399479e812crobbiew	pid = FORK_OR_VFORK();
128d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	if (pid < 0) {
129d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew		(void)kill(kidpid[0], SIGTERM);
130d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew		(void)unlink("./rename14");
131cff4af016805c764c391c473d4c95b999dcdf148vapier		tst_resm(TBROK,"fork() returned %d", pid);
132bdbaec51a423e715c2b03ed9e497e9a1fba6103esubrata_modak		tst_exit();
133d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	}
134d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	if (pid == 0) {
135d34d581c6a320e356a6cda923c7aa399479e812crobbiew#ifdef UCLINUX
136d34d581c6a320e356a6cda923c7aa399479e812crobbiew		if (self_exec(argv[0], "n", 1) < 0) {
137d34d581c6a320e356a6cda923c7aa399479e812crobbiew			tst_resm(TBROK,"self_exec failed");
138d34d581c6a320e356a6cda923c7aa399479e812crobbiew		}
139d34d581c6a320e356a6cda923c7aa399479e812crobbiew#else
140d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew		dochild2();
141d34d581c6a320e356a6cda923c7aa399479e812crobbiew#endif
142d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	}
143d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	kidpid[1] = pid;
144d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew
145d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	alarm(RUNTIME);
146d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew
147d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	/* Collect child processes. */
1489e9306f7282497eed0715ec64f1f3dcbb1c8a00fmreed	/* Wait for timeout */
1499e9306f7282497eed0715ec64f1f3dcbb1c8a00fmreed	pause();
1504bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak
151d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	kill(kidpid[0], SIGTERM);
152d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	kill(kidpid[1], SIGTERM);
153d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew
1548bf4e9675d5b930d91c090acd1acdb2ec7da4c4fsubrata_modak	waitpid(kidpid[0], NULL, 0);
1558bf4e9675d5b930d91c090acd1acdb2ec7da4c4fsubrata_modak	waitpid(kidpid[1], NULL, 0);
1568bf4e9675d5b930d91c090acd1acdb2ec7da4c4fsubrata_modak
157d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	unlink("./rename14");
158d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	unlink("./rename14xyz");
159d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	(local_flag == PASSED) ?
160d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	    tst_resm(TPASS, "Test Passed")
161d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	:   tst_resm(TFAIL, "Test Failed");
162d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew
163d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	tst_rmdir();
164d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew/*--------------------------------------------------------------*/
165d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	tst_exit();	/* THIS CALL DOES NOT RETURN - EXITS!!	*/
166d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew/*--------------------------------------------------------------*/
16743337a3cf6f8809647cf9fc6c0054241f44b1fb1subrata_modak	return 0;
168d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew}
169d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew/* FUNCTIONS GO HERE */
170d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew
171d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiewint term()
172d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew{
173d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	if (parent_pid != getpid())
174d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew		exit(0);
175d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	if (kidpid[0])
176d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew		return(kill(kidpid[0], SIGTERM));
177d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	if (kidpid[1])
178d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew		return(kill(kidpid[1], SIGTERM));
17943337a3cf6f8809647cf9fc6c0054241f44b1fb1subrata_modak        return 0;
180d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew}
181d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew
182d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiewint al()
183d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew{
184d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	if (kidpid[0])
185d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew		return(kill(kidpid[0], SIGTERM));
186d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	if (kidpid[1])
187d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew		return(kill(kidpid[1], SIGTERM));
18843337a3cf6f8809647cf9fc6c0054241f44b1fb1subrata_modak        return 0;
189d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew}
190d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew
191d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiewvoid dochild1()
192d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew{
193d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	int fd;
194d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew
195d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	for (;;) {
196d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew		fd = creat("./rename14", 0666);
197d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew		unlink("./rename14");
198d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew		close(fd);
199d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	}
200d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew}
201d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew
202d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiewvoid dochild2()
203d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew{
204d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	for (;;) {
205d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew		rename("./rename14", "./rename14xyz");
206d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	}
207d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew}
208