rename14.c revision d6d11d08678aac1ed2c370ea8e42e5f45aea07be
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
174548c6cf9bcdd96d8303caa4130ab638b61f8a30Wanlong Gao *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 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
49d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew#define FAILED 0
50d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew#define PASSED 1
51d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew
52d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiewint local_flag = PASSED;
53d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew
54fdce7d5e2a219d201a2b0e3bab6b61b01ec1d716Cyril Hrubischar *TCID = "rename14";
55fdce7d5e2a219d201a2b0e3bab6b61b01ec1d716Cyril Hrubisint TST_TOTAL = 1;
56d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew/**************/
57d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew
58d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew#define RUNTIME	45
59d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew
60d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiewint kidpid[2];
61d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiewint parent_pid;
62d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew
63c57fba5535abf457e33dd7a986b6c512d95cdef6Mike Frysingerint main(int argc, char *argv[])
64d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew{
6548f20313857f6afce9317e83d98d9ee536d2377dsubrata_modak	int pid;
66d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	sigset_t set;
67d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	struct sigaction act, oact;
6856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	int term();
6956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	int al();
70d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	void dochild1();
71d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	void dochild2();
72d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew
73d34d581c6a320e356a6cda923c7aa399479e812crobbiew#ifdef UCLINUX
74d34d581c6a320e356a6cda923c7aa399479e812crobbiew
75d6d11d08678aac1ed2c370ea8e42e5f45aea07beCyril Hrubis	tst_parse_opts(argc, argv, NULL, NULL);
76d34d581c6a320e356a6cda923c7aa399479e812crobbiew
77d34d581c6a320e356a6cda923c7aa399479e812crobbiew	maybe_run_child(&dochild1, "n", 1);
78d34d581c6a320e356a6cda923c7aa399479e812crobbiew	maybe_run_child(&dochild2, "n", 2);
79d34d581c6a320e356a6cda923c7aa399479e812crobbiew#endif
80d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	sigemptyset(&set);
8156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	act.sa_handler = (void (*)())term;
82d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	act.sa_mask = set;
83d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	act.sa_flags = 0;
84d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	if (sigaction(SIGTERM, &act, &oact)) {
85526fdf8d8ea3b43b73de7cc25eb754f12702c8d2Cyril Hrubis		tst_brkm(TBROK, NULL, "Sigaction(SIGTERM)");
86d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	}
87d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew
88d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	sigemptyset(&set);
8956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	act.sa_handler = (void (*)())al;
90d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	act.sa_mask = set;
91d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	act.sa_flags = 0;
92d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	if (sigaction(SIGALRM, &act, 0)) {
93526fdf8d8ea3b43b73de7cc25eb754f12702c8d2Cyril Hrubis		tst_brkm(TBROK, NULL, "Sigaction(SIGALRM)");
944bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak	}
95d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	parent_pid = getpid();
96d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	tst_tmpdir();
97d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew/*--------------------------------------------------------------*/
98d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew
99d34d581c6a320e356a6cda923c7aa399479e812crobbiew	pid = FORK_OR_VFORK();
100d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	if (pid < 0) {
101526fdf8d8ea3b43b73de7cc25eb754f12702c8d2Cyril Hrubis		tst_brkm(TBROK, NULL, "fork() returned %d", pid);
102d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	}
103d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	if (pid == 0) {
104d34d581c6a320e356a6cda923c7aa399479e812crobbiew#ifdef UCLINUX
105d34d581c6a320e356a6cda923c7aa399479e812crobbiew		if (self_exec(argv[0], "n", 1) < 0) {
10656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak			tst_resm(TBROK, "self_exec failed");
107d34d581c6a320e356a6cda923c7aa399479e812crobbiew		}
108d34d581c6a320e356a6cda923c7aa399479e812crobbiew#else
109d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew		dochild1();
110d34d581c6a320e356a6cda923c7aa399479e812crobbiew#endif
111d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	}
112d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	kidpid[0] = pid;
113d34d581c6a320e356a6cda923c7aa399479e812crobbiew	pid = FORK_OR_VFORK();
114d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	if (pid < 0) {
115d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew		(void)kill(kidpid[0], SIGTERM);
116d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew		(void)unlink("./rename14");
117526fdf8d8ea3b43b73de7cc25eb754f12702c8d2Cyril Hrubis		tst_brkm(TBROK, NULL, "fork() returned %d", pid);
118d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	}
119d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	if (pid == 0) {
120d34d581c6a320e356a6cda923c7aa399479e812crobbiew#ifdef UCLINUX
121d34d581c6a320e356a6cda923c7aa399479e812crobbiew		if (self_exec(argv[0], "n", 1) < 0) {
12256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak			tst_resm(TBROK, "self_exec failed");
123d34d581c6a320e356a6cda923c7aa399479e812crobbiew		}
124d34d581c6a320e356a6cda923c7aa399479e812crobbiew#else
125d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew		dochild2();
126d34d581c6a320e356a6cda923c7aa399479e812crobbiew#endif
127d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	}
128d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	kidpid[1] = pid;
129d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew
130d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	alarm(RUNTIME);
131d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew
132d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	/* Collect child processes. */
1339e9306f7282497eed0715ec64f1f3dcbb1c8a00fmreed	/* Wait for timeout */
1349e9306f7282497eed0715ec64f1f3dcbb1c8a00fmreed	pause();
1354bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak
136d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	kill(kidpid[0], SIGTERM);
137d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	kill(kidpid[1], SIGTERM);
138d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew
1398bf4e9675d5b930d91c090acd1acdb2ec7da4c4fsubrata_modak	waitpid(kidpid[0], NULL, 0);
1408bf4e9675d5b930d91c090acd1acdb2ec7da4c4fsubrata_modak	waitpid(kidpid[1], NULL, 0);
1418bf4e9675d5b930d91c090acd1acdb2ec7da4c4fsubrata_modak
142d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	unlink("./rename14");
143d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	unlink("./rename14xyz");
14456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	(local_flag == PASSED) ? tst_resm(TPASS, "Test Passed")
14556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	    : tst_resm(TFAIL, "Test Failed");
146d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew
147d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	tst_rmdir();
14853740500924f6439623a8ac256b5be2d6c59ed1fGarrett Cooper	tst_exit();
149d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew}
15056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak
151d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew/* FUNCTIONS GO HERE */
152d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew
153c57fba5535abf457e33dd7a986b6c512d95cdef6Mike Frysingerint term(void)
154d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew{
155d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	if (parent_pid != getpid())
156d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew		exit(0);
157d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	if (kidpid[0])
15856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		return (kill(kidpid[0], SIGTERM));
159d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	if (kidpid[1])
16056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		return (kill(kidpid[1], SIGTERM));
16156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	return 0;
162d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew}
163d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew
164c57fba5535abf457e33dd7a986b6c512d95cdef6Mike Frysingerint al(void)
165d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew{
166d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	if (kidpid[0])
16756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		return (kill(kidpid[0], SIGTERM));
168d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	if (kidpid[1])
16956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		return (kill(kidpid[1], SIGTERM));
17056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	return 0;
171d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew}
172d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew
173c57fba5535abf457e33dd7a986b6c512d95cdef6Mike Frysingervoid dochild1(void)
174d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew{
175d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	int fd;
176d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew
177d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	for (;;) {
178d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew		fd = creat("./rename14", 0666);
179d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew		unlink("./rename14");
180d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew		close(fd);
181d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	}
182d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew}
183d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew
184c57fba5535abf457e33dd7a986b6c512d95cdef6Mike Frysingervoid dochild2(void)
185d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew{
186d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	for (;;) {
187d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew		rename("./rename14", "./rename14xyz");
188d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	}
189ec6edca7aa42b6affd989ef91b5897f96795e40fChris Dearman}
190