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>
41249f40545ff10418724fcd8cfa1e10b892725f38Steven Jackson#include <sys/wait.h>
42d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew#include <sys/types.h>
43d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew#include <sys/stat.h>
44d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew#include <fcntl.h>
45d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew
46d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew#include "test.h"
47d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew
48d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew#define FAILED 0
49d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew#define PASSED 1
50d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew
51d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiewint local_flag = PASSED;
52d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew
53fdce7d5e2a219d201a2b0e3bab6b61b01ec1d716Cyril Hrubischar *TCID = "rename14";
54fdce7d5e2a219d201a2b0e3bab6b61b01ec1d716Cyril Hrubisint TST_TOTAL = 1;
55d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew
56d567dd125fb97aae00dee54c368c2886823366beCyril Hrubis#define RUNTIME	5
57d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew
58d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiewint kidpid[2];
59d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiewint parent_pid;
60d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew
61db08a151325057eb28c3cfeff0f400545f673e83Cyril Hrubisint term(void);
62db08a151325057eb28c3cfeff0f400545f673e83Cyril Hrubisint al(void);
63db08a151325057eb28c3cfeff0f400545f673e83Cyril Hrubisvoid dochild1(void);
64db08a151325057eb28c3cfeff0f400545f673e83Cyril Hrubisvoid dochild2(void);
65db08a151325057eb28c3cfeff0f400545f673e83Cyril Hrubis
66c57fba5535abf457e33dd7a986b6c512d95cdef6Mike Frysingerint main(int argc, char *argv[])
67d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew{
6848f20313857f6afce9317e83d98d9ee536d2377dsubrata_modak	int pid;
69d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	sigset_t set;
70d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	struct sigaction act, oact;
71d34d581c6a320e356a6cda923c7aa399479e812crobbiew
72d6d11d08678aac1ed2c370ea8e42e5f45aea07beCyril Hrubis	tst_parse_opts(argc, argv, NULL, NULL);
73d34d581c6a320e356a6cda923c7aa399479e812crobbiew
74d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	sigemptyset(&set);
7556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	act.sa_handler = (void (*)())term;
76d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	act.sa_mask = set;
77d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	act.sa_flags = 0;
78d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	if (sigaction(SIGTERM, &act, &oact)) {
79526fdf8d8ea3b43b73de7cc25eb754f12702c8d2Cyril Hrubis		tst_brkm(TBROK, NULL, "Sigaction(SIGTERM)");
80d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	}
81d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew
82d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	sigemptyset(&set);
8356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	act.sa_handler = (void (*)())al;
84d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	act.sa_mask = set;
85d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	act.sa_flags = 0;
86d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	if (sigaction(SIGALRM, &act, 0)) {
87526fdf8d8ea3b43b73de7cc25eb754f12702c8d2Cyril Hrubis		tst_brkm(TBROK, NULL, "Sigaction(SIGALRM)");
884bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak	}
89d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	parent_pid = getpid();
90d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	tst_tmpdir();
91d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew
92d34d581c6a320e356a6cda923c7aa399479e812crobbiew	pid = FORK_OR_VFORK();
93db08a151325057eb28c3cfeff0f400545f673e83Cyril Hrubis	if (pid < 0)
94526fdf8d8ea3b43b73de7cc25eb754f12702c8d2Cyril Hrubis		tst_brkm(TBROK, NULL, "fork() returned %d", pid);
95db08a151325057eb28c3cfeff0f400545f673e83Cyril Hrubis	if (pid == 0)
96d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew		dochild1();
97db08a151325057eb28c3cfeff0f400545f673e83Cyril Hrubis
98d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	kidpid[0] = pid;
99d34d581c6a320e356a6cda923c7aa399479e812crobbiew	pid = FORK_OR_VFORK();
100d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	if (pid < 0) {
101d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew		(void)kill(kidpid[0], SIGTERM);
102d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew		(void)unlink("./rename14");
103526fdf8d8ea3b43b73de7cc25eb754f12702c8d2Cyril Hrubis		tst_brkm(TBROK, NULL, "fork() returned %d", pid);
104d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	}
105db08a151325057eb28c3cfeff0f400545f673e83Cyril Hrubis	if (pid == 0)
106d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew		dochild2();
107db08a151325057eb28c3cfeff0f400545f673e83Cyril Hrubis
108d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	kidpid[1] = pid;
109d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew
110d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	alarm(RUNTIME);
111d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew
112d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	/* Collect child processes. */
1139e9306f7282497eed0715ec64f1f3dcbb1c8a00fmreed	/* Wait for timeout */
1149e9306f7282497eed0715ec64f1f3dcbb1c8a00fmreed	pause();
1154bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak
116d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	kill(kidpid[0], SIGTERM);
117d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	kill(kidpid[1], SIGTERM);
118d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew
1198bf4e9675d5b930d91c090acd1acdb2ec7da4c4fsubrata_modak	waitpid(kidpid[0], NULL, 0);
1208bf4e9675d5b930d91c090acd1acdb2ec7da4c4fsubrata_modak	waitpid(kidpid[1], NULL, 0);
1218bf4e9675d5b930d91c090acd1acdb2ec7da4c4fsubrata_modak
122d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	unlink("./rename14");
123d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	unlink("./rename14xyz");
12456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	(local_flag == PASSED) ? tst_resm(TPASS, "Test Passed")
12556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	    : tst_resm(TFAIL, "Test Failed");
126d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew
127d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	tst_rmdir();
12853740500924f6439623a8ac256b5be2d6c59ed1fGarrett Cooper	tst_exit();
129d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew}
13056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak
131c57fba5535abf457e33dd7a986b6c512d95cdef6Mike Frysingerint term(void)
132d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew{
133d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	if (parent_pid != getpid())
134d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew		exit(0);
135d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	if (kidpid[0])
13656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		return (kill(kidpid[0], SIGTERM));
137d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	if (kidpid[1])
13856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		return (kill(kidpid[1], SIGTERM));
13956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	return 0;
140d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew}
141d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew
142c57fba5535abf457e33dd7a986b6c512d95cdef6Mike Frysingerint al(void)
143d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew{
144d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	if (kidpid[0])
14556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		return (kill(kidpid[0], SIGTERM));
146d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	if (kidpid[1])
14756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		return (kill(kidpid[1], SIGTERM));
14856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	return 0;
149d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew}
150d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew
151c57fba5535abf457e33dd7a986b6c512d95cdef6Mike Frysingervoid dochild1(void)
152d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew{
153d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	int fd;
154d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew
155d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	for (;;) {
156d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew		fd = creat("./rename14", 0666);
157d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew		unlink("./rename14");
158d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew		close(fd);
159d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew	}
160d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew}
161d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew
162c57fba5535abf457e33dd7a986b6c512d95cdef6Mike Frysingervoid dochild2(void)
163d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew{
164db08a151325057eb28c3cfeff0f400545f673e83Cyril Hrubis	for (;;)
165d6c7b1f84e7fba6d494b9a48c4f9ea54b6da1471robbiew		rename("./rename14", "./rename14xyz");
166ec6edca7aa42b6affd989ef91b5897f96795e40fChris Dearman}
167