1f08c3bdfSopenharmony_ci/*
2f08c3bdfSopenharmony_ci *
3f08c3bdfSopenharmony_ci *   Copyright (c) International Business Machines  Corp., 2002
4f08c3bdfSopenharmony_ci *
5f08c3bdfSopenharmony_ci *   This program is free software;  you can redistribute it and/or modify
6f08c3bdfSopenharmony_ci *   it under the terms of the GNU General Public License as published by
7f08c3bdfSopenharmony_ci *   the Free Software Foundation; either version 2 of the License, or
8f08c3bdfSopenharmony_ci *   (at your option) any later version.
9f08c3bdfSopenharmony_ci *
10f08c3bdfSopenharmony_ci *   This program is distributed in the hope that it will be useful,
11f08c3bdfSopenharmony_ci *   but WITHOUT ANY WARRANTY;  without even the implied warranty of
12f08c3bdfSopenharmony_ci *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
13f08c3bdfSopenharmony_ci *   the GNU General Public License for more details.
14f08c3bdfSopenharmony_ci *
15f08c3bdfSopenharmony_ci *   You should have received a copy of the GNU General Public License
16f08c3bdfSopenharmony_ci *   along with this program;  if not, write to the Free Software
17f08c3bdfSopenharmony_ci *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18f08c3bdfSopenharmony_ci */
19f08c3bdfSopenharmony_ci
20f08c3bdfSopenharmony_ci/* 11/01/2002	Port to LTP	robbiew@us.ibm.com */
21f08c3bdfSopenharmony_ci/* 06/30/2001	Port to Linux	nsharoff@us.ibm.com */
22f08c3bdfSopenharmony_ci
23f08c3bdfSopenharmony_ci			   /*inode02.c */
24f08c3bdfSopenharmony_ci/*======================================================================
25f08c3bdfSopenharmony_ci	=================== TESTPLAN SEGMENT ===================
26f08c3bdfSopenharmony_ciCALLS:	mkdir, stat, open
27f08c3bdfSopenharmony_ci
28f08c3bdfSopenharmony_ci	Run with TERM mode.
29f08c3bdfSopenharmony_ci
30f08c3bdfSopenharmony_ci>KEYS:  < file system and I/O management, system resource constraints.
31f08c3bdfSopenharmony_ci>WHAT:  < Can the system handle a heavy load on the file system I/O
32f08c3bdfSopenharmony_ci	< functions?
33f08c3bdfSopenharmony_ci>HOW:   < Create several identical process that call inode02.c.  This
34f08c3bdfSopenharmony_ci	< will simulate the multi-user environment, and hopefully uncover
35f08c3bdfSopenharmony_ci	< conflicts that might occur in "real life" use.
36f08c3bdfSopenharmony_ci>BUGS:  <
37f08c3bdfSopenharmony_ci======================================================================*/
38f08c3bdfSopenharmony_ci
39f08c3bdfSopenharmony_ci#define PATH_STRING_LENGTH  1024
40f08c3bdfSopenharmony_ci#define NAME_LENGTH  8
41f08c3bdfSopenharmony_ci#define MAX_PATH_STRING_LENGTH  (PATH_STRING_LENGTH - NAME_LENGTH - 40)
42f08c3bdfSopenharmony_ci#define DIRECTORY_MODE  00777
43f08c3bdfSopenharmony_ci#define FILE_MODE       00777
44f08c3bdfSopenharmony_ci
45f08c3bdfSopenharmony_ci#define MKDIR_STRING_LENGTH  (MAX_PATH_STRING_LENGTH + 7)
46f08c3bdfSopenharmony_ci
47f08c3bdfSopenharmony_ci/* #define DEBUG	 you can watch the generation with this flag */
48f08c3bdfSopenharmony_ci
49f08c3bdfSopenharmony_ci#define TRUE  1
50f08c3bdfSopenharmony_ci#define FALSE 0
51f08c3bdfSopenharmony_ci#define READ  0
52f08c3bdfSopenharmony_ci#define WRITE 1
53f08c3bdfSopenharmony_ci
54f08c3bdfSopenharmony_ci#include <stdio.h>
55f08c3bdfSopenharmony_ci#include <errno.h>
56f08c3bdfSopenharmony_ci#include <sys/types.h>
57f08c3bdfSopenharmony_ci#include <sys/stat.h>
58f08c3bdfSopenharmony_ci#include <signal.h>
59f08c3bdfSopenharmony_ci#include <fcntl.h>
60f08c3bdfSopenharmony_ci#include <errno.h>
61f08c3bdfSopenharmony_ci#include <sys/wait.h>
62f08c3bdfSopenharmony_ci
63f08c3bdfSopenharmony_ci#ifdef LINUX
64f08c3bdfSopenharmony_ci#include <stdlib.h>
65f08c3bdfSopenharmony_ci#include <unistd.h>
66f08c3bdfSopenharmony_ci#include <string.h>
67f08c3bdfSopenharmony_ci#endif
68f08c3bdfSopenharmony_ci
69f08c3bdfSopenharmony_ci#define MAXCHILD	25
70f08c3bdfSopenharmony_ciint allchild[MAXCHILD + 1];
71f08c3bdfSopenharmony_ci
72f08c3bdfSopenharmony_cichar name[NAME_LENGTH + 1];
73f08c3bdfSopenharmony_cichar path_string[PATH_STRING_LENGTH + 1];
74f08c3bdfSopenharmony_cichar read_string[PATH_STRING_LENGTH + 1];
75f08c3bdfSopenharmony_cichar write_string[PATH_STRING_LENGTH + 1];
76f08c3bdfSopenharmony_cichar remove_string[PATH_STRING_LENGTH + 10];
77f08c3bdfSopenharmony_ciint parent_pid;
78f08c3bdfSopenharmony_ciint nchild;
79f08c3bdfSopenharmony_ci
80f08c3bdfSopenharmony_ciFILE *list_stream = NULL;
81f08c3bdfSopenharmony_ciint list_id;
82f08c3bdfSopenharmony_ciint file_id;
83f08c3bdfSopenharmony_ci
84f08c3bdfSopenharmony_ciint increment_name(), get_next_name(), mode(), escrivez(), massmurder();
85f08c3bdfSopenharmony_ciint max_depth, max_breadth, file_length;
86f08c3bdfSopenharmony_ciint bd_arg(char *);
87f08c3bdfSopenharmony_ci
88f08c3bdfSopenharmony_ci#ifdef LINUX
89f08c3bdfSopenharmony_civoid (*sigset(int, void (*)(int))) (int);
90f08c3bdfSopenharmony_ci#endif
91f08c3bdfSopenharmony_ci
92f08c3bdfSopenharmony_ci/** LTP Port **/
93f08c3bdfSopenharmony_ci#include "test.h"
94f08c3bdfSopenharmony_ci
95f08c3bdfSopenharmony_civoid setup(void);
96f08c3bdfSopenharmony_civoid fail_exit(void);
97f08c3bdfSopenharmony_civoid anyfail(void);
98f08c3bdfSopenharmony_civoid ok_exit(void);
99f08c3bdfSopenharmony_civoid forkfail(void);
100f08c3bdfSopenharmony_civoid terror(char *);
101f08c3bdfSopenharmony_ciint instress(void);
102f08c3bdfSopenharmony_ci
103f08c3bdfSopenharmony_ci#define FAILED 0
104f08c3bdfSopenharmony_ci#define PASSED 1
105f08c3bdfSopenharmony_ci
106f08c3bdfSopenharmony_ciint local_flag = PASSED;
107f08c3bdfSopenharmony_ciFILE *temp;
108f08c3bdfSopenharmony_ci
109f08c3bdfSopenharmony_cichar *TCID = "inode02";		/* Test program identifier.    */
110f08c3bdfSopenharmony_ciint TST_TOTAL = 1;		/* Total number of test cases. */
111f08c3bdfSopenharmony_ci/**************/
112f08c3bdfSopenharmony_ci
113f08c3bdfSopenharmony_ciint main(int argc, char *argv[])
114f08c3bdfSopenharmony_ci{
115f08c3bdfSopenharmony_ci	int pid, tree(), p, status;
116f08c3bdfSopenharmony_ci	int count, child;
117f08c3bdfSopenharmony_ci	register int i;
118f08c3bdfSopenharmony_ci	int term();
119f08c3bdfSopenharmony_ci
120f08c3bdfSopenharmony_ci	setup();
121f08c3bdfSopenharmony_ci
122f08c3bdfSopenharmony_ci	parent_pid = getpid();
123f08c3bdfSopenharmony_ci
124f08c3bdfSopenharmony_ci	if (sigset(SIGTERM, (void (*)())term) == SIG_ERR) {
125f08c3bdfSopenharmony_ci		tst_resm(TBROK, "\tSIGTERM sigset set failed, errno=%d",
126f08c3bdfSopenharmony_ci			 errno);
127f08c3bdfSopenharmony_ci		exit(1);
128f08c3bdfSopenharmony_ci	}
129f08c3bdfSopenharmony_ci
130f08c3bdfSopenharmony_ci	/************************************************/
131f08c3bdfSopenharmony_ci	/*                                              */
132f08c3bdfSopenharmony_ci	/*  Input the parameters for the directory---   */
133f08c3bdfSopenharmony_ci	/*  file trees which are to be generated        */
134f08c3bdfSopenharmony_ci	/*                                              */
135f08c3bdfSopenharmony_ci	/************************************************/
136f08c3bdfSopenharmony_ci
137f08c3bdfSopenharmony_ci	if (argc < 2) {
138f08c3bdfSopenharmony_ci		max_depth = 6;
139f08c3bdfSopenharmony_ci		max_breadth = 5;
140f08c3bdfSopenharmony_ci		file_length = 8;
141f08c3bdfSopenharmony_ci		nchild = 5;
142f08c3bdfSopenharmony_ci	} else if (argc < 5) {
143f08c3bdfSopenharmony_ci		tst_resm(TCONF, "Bad argument count.");
144f08c3bdfSopenharmony_ci		printf
145f08c3bdfSopenharmony_ci		    ("\tinode02 max_depth max_breadth file_length #children\n\tdefault: inode02 6 5 8 5\n");
146f08c3bdfSopenharmony_ci		exit(1);
147f08c3bdfSopenharmony_ci	} else {
148f08c3bdfSopenharmony_ci		i = 1;
149f08c3bdfSopenharmony_ci		if (sscanf(argv[i++], "%d", &max_depth) != 1)
150f08c3bdfSopenharmony_ci			bd_arg(argv[i - 1]);
151f08c3bdfSopenharmony_ci		if (sscanf(argv[i++], "%d", &max_breadth) != 1)
152f08c3bdfSopenharmony_ci			bd_arg(argv[i - 1]);
153f08c3bdfSopenharmony_ci		if (sscanf(argv[i++], "%d", &file_length) != 1)
154f08c3bdfSopenharmony_ci			bd_arg(argv[i - 1]);
155f08c3bdfSopenharmony_ci		if (sscanf(argv[i++], "%d", &nchild) != 1)
156f08c3bdfSopenharmony_ci			bd_arg(argv[i - 1]);
157f08c3bdfSopenharmony_ci		if (nchild > MAXCHILD) {
158f08c3bdfSopenharmony_ci			fprintf(temp, "too many children - max is %d\n",
159f08c3bdfSopenharmony_ci				MAXCHILD);
160f08c3bdfSopenharmony_ci			exit(1);
161f08c3bdfSopenharmony_ci		}
162f08c3bdfSopenharmony_ci	}
163f08c3bdfSopenharmony_ci
164f08c3bdfSopenharmony_ci	/************************************************/
165f08c3bdfSopenharmony_ci	/*                                              */
166f08c3bdfSopenharmony_ci	/*  Generate and check nchild trees             */
167f08c3bdfSopenharmony_ci	/*                                              */
168f08c3bdfSopenharmony_ci	/************************************************/
169f08c3bdfSopenharmony_ci
170f08c3bdfSopenharmony_ci	for (p = 0; p < nchild; p++) {
171f08c3bdfSopenharmony_ci		pid = fork();
172f08c3bdfSopenharmony_ci		if (pid == 0) {
173f08c3bdfSopenharmony_ci			tree();
174f08c3bdfSopenharmony_ci		} else {
175f08c3bdfSopenharmony_ci			if (pid < 1) {
176f08c3bdfSopenharmony_ci				terror
177f08c3bdfSopenharmony_ci				    ("Fork failed (may be OK if under stress)");
178f08c3bdfSopenharmony_ci				massmurder();
179f08c3bdfSopenharmony_ci				if (instress()) {
180f08c3bdfSopenharmony_ci					ok_exit();
181f08c3bdfSopenharmony_ci				}
182f08c3bdfSopenharmony_ci				forkfail();
183f08c3bdfSopenharmony_ci			}
184f08c3bdfSopenharmony_ci		}
185f08c3bdfSopenharmony_ci	}
186f08c3bdfSopenharmony_ci
187f08c3bdfSopenharmony_ci	count = 0;
188f08c3bdfSopenharmony_ci	while ((child = wait(&status)) > 0) {
189f08c3bdfSopenharmony_ci#ifdef DEBUG
190f08c3bdfSopenharmony_ci		tst_resm(TINFO, "Test %d exited status = %d\n", child, status);
191f08c3bdfSopenharmony_ci#endif
192f08c3bdfSopenharmony_ci		if (status) {
193f08c3bdfSopenharmony_ci			fprintf(temp, "Test %d failed - expected 0 exit.\n",
194f08c3bdfSopenharmony_ci				child);
195f08c3bdfSopenharmony_ci			local_flag = FAILED;
196f08c3bdfSopenharmony_ci		}
197f08c3bdfSopenharmony_ci		count++;
198f08c3bdfSopenharmony_ci	}
199f08c3bdfSopenharmony_ci
200f08c3bdfSopenharmony_ci	if (count != nchild) {
201f08c3bdfSopenharmony_ci		tst_resm(TFAIL, "Wrong number of children waited on!");
202f08c3bdfSopenharmony_ci		tst_resm(TFAIL, "Saw %d, expected %d", count, nchild);
203f08c3bdfSopenharmony_ci		local_flag = FAILED;
204f08c3bdfSopenharmony_ci	}
205f08c3bdfSopenharmony_ci
206f08c3bdfSopenharmony_ci	/************************************************/
207f08c3bdfSopenharmony_ci	/*                                              */
208f08c3bdfSopenharmony_ci	/*  And report the results..........            */
209f08c3bdfSopenharmony_ci	/*                                              */
210f08c3bdfSopenharmony_ci	/************************************************/
211f08c3bdfSopenharmony_ci
212f08c3bdfSopenharmony_ci	anyfail();
213f08c3bdfSopenharmony_ci	/** NOT REACHED **/
214f08c3bdfSopenharmony_ci	tst_exit();
215f08c3bdfSopenharmony_ci}
216f08c3bdfSopenharmony_ci
217f08c3bdfSopenharmony_ciint bd_arg(char *str)
218f08c3bdfSopenharmony_ci{
219f08c3bdfSopenharmony_ci	fprintf(temp,
220f08c3bdfSopenharmony_ci		"Bad argument - %s - could not parse as number.\n\tinode02 [max_depth] [max_breadth] [file_length] [#children]\n\tdefault: inode02 6 5 8 5\n",
221f08c3bdfSopenharmony_ci		str);
222f08c3bdfSopenharmony_ci	exit(1);
223f08c3bdfSopenharmony_ci}
224f08c3bdfSopenharmony_ci
225f08c3bdfSopenharmony_ciint tree(void)
226f08c3bdfSopenharmony_ci
227f08c3bdfSopenharmony_ci/************************************************/
228f08c3bdfSopenharmony_ci/*						*/
229f08c3bdfSopenharmony_ci/*  		      TREE			*/
230f08c3bdfSopenharmony_ci/*						*/
231f08c3bdfSopenharmony_ci/*   generate a tree of directories and files   */
232f08c3bdfSopenharmony_ci/*   and save the path names in the path_list	*/
233f08c3bdfSopenharmony_ci/*   file 					*/
234f08c3bdfSopenharmony_ci/*						*/
235f08c3bdfSopenharmony_ci/*   then, read the path names and attempt to   */
236f08c3bdfSopenharmony_ci/*   access the corresponding directories and	*/
237f08c3bdfSopenharmony_ci/*   files					*/
238f08c3bdfSopenharmony_ci/*						*/
239f08c3bdfSopenharmony_ci/************************************************/
240f08c3bdfSopenharmony_ci{
241f08c3bdfSopenharmony_ci	int gen_ret_val, ch_ret_val, exit_val, level;
242f08c3bdfSopenharmony_ci	int ret_val;
243f08c3bdfSopenharmony_ci	int generate(), check();
244f08c3bdfSopenharmony_ci	char path_list_string[PATH_STRING_LENGTH + 10];
245f08c3bdfSopenharmony_ci	int len;
246f08c3bdfSopenharmony_ci	int status;
247f08c3bdfSopenharmony_ci	int snp_ret;
248f08c3bdfSopenharmony_ci
249f08c3bdfSopenharmony_ci	/********************************/
250f08c3bdfSopenharmony_ci	/*                              */
251f08c3bdfSopenharmony_ci	/*  make the root directory for */
252f08c3bdfSopenharmony_ci	/*  the tree                    */
253f08c3bdfSopenharmony_ci	/*                              */
254f08c3bdfSopenharmony_ci	/********************************/
255f08c3bdfSopenharmony_ci
256f08c3bdfSopenharmony_ci	sprintf(path_string, "inode02.%d", getpid());
257f08c3bdfSopenharmony_ci
258f08c3bdfSopenharmony_ci	ret_val = mkdir(path_string, DIRECTORY_MODE);
259f08c3bdfSopenharmony_ci
260f08c3bdfSopenharmony_ci	if (ret_val == -1) {
261f08c3bdfSopenharmony_ci		tst_resm(TBROK,
262f08c3bdfSopenharmony_ci			 "Reason: Impossible to create directory %s, errno=%d\n",
263f08c3bdfSopenharmony_ci			 path_string, errno);
264f08c3bdfSopenharmony_ci		exit(-5);
265f08c3bdfSopenharmony_ci	}
266f08c3bdfSopenharmony_ci
267f08c3bdfSopenharmony_ci	strcpy(remove_string, "rm -rf ");
268f08c3bdfSopenharmony_ci	strcat(remove_string, path_string);
269f08c3bdfSopenharmony_ci
270f08c3bdfSopenharmony_ci#ifdef DEBUG
271f08c3bdfSopenharmony_ci	tst_resm(TINFO, "\n%s\n", path_string);
272f08c3bdfSopenharmony_ci#endif
273f08c3bdfSopenharmony_ci
274f08c3bdfSopenharmony_ci	/****************************************/
275f08c3bdfSopenharmony_ci	/*                                      */
276f08c3bdfSopenharmony_ci	/*  create the "path_list" file, in     */
277f08c3bdfSopenharmony_ci	/*  which the list of generated paths   */
278f08c3bdfSopenharmony_ci	/*  will be stored so that they later   */
279f08c3bdfSopenharmony_ci	/*  may be checked                      */
280f08c3bdfSopenharmony_ci	/*                                      */
281f08c3bdfSopenharmony_ci	/****************************************/
282f08c3bdfSopenharmony_ci
283f08c3bdfSopenharmony_ci	snp_ret = snprintf(path_list_string, sizeof(path_list_string),
284f08c3bdfSopenharmony_ci		"%s/path_list",	path_string);
285f08c3bdfSopenharmony_ci	if (snp_ret < 0 || snp_ret >= sizeof(path_list_string)) {
286f08c3bdfSopenharmony_ci		tst_resm(TBROK, "snprintf(path_list_string,..) returned %d",
287f08c3bdfSopenharmony_ci			snp_ret);
288f08c3bdfSopenharmony_ci		exit(-1);
289f08c3bdfSopenharmony_ci	}
290f08c3bdfSopenharmony_ci	list_id = creat(path_list_string, FILE_MODE);
291f08c3bdfSopenharmony_ci	if (list_id == -1) {
292f08c3bdfSopenharmony_ci		fprintf(temp,
293f08c3bdfSopenharmony_ci			"\nThe path_list file '%s' cannot be created, errno=%d\n",
294f08c3bdfSopenharmony_ci			path_list_string, errno);
295f08c3bdfSopenharmony_ci		exit(-7);
296f08c3bdfSopenharmony_ci	}
297f08c3bdfSopenharmony_ci
298f08c3bdfSopenharmony_ci	/****************************************/
299f08c3bdfSopenharmony_ci	/*                                      */
300f08c3bdfSopenharmony_ci	/*   and store its name in path_list    */
301f08c3bdfSopenharmony_ci	/*                                      */
302f08c3bdfSopenharmony_ci	/****************************************/
303f08c3bdfSopenharmony_ci
304f08c3bdfSopenharmony_ci	strcpy(write_string, path_string);
305f08c3bdfSopenharmony_ci	len = strlen(write_string);
306f08c3bdfSopenharmony_ci	write_string[len++] = 'D';
307f08c3bdfSopenharmony_ci	write_string[len] = '\0';
308f08c3bdfSopenharmony_ci	escrivez(write_string);
309f08c3bdfSopenharmony_ci
310f08c3bdfSopenharmony_ci	/****************************************/
311f08c3bdfSopenharmony_ci	/*                                      */
312f08c3bdfSopenharmony_ci	/*   generate the directory-file tree   */
313f08c3bdfSopenharmony_ci	/*                                      */
314f08c3bdfSopenharmony_ci	/****************************************/
315f08c3bdfSopenharmony_ci
316f08c3bdfSopenharmony_ci	level = 0;
317f08c3bdfSopenharmony_ci
318f08c3bdfSopenharmony_ci#ifdef DEBUG
319f08c3bdfSopenharmony_ci	tst_resm(TINFO, "\n\t%s\n\n", "GENERATING:");
320f08c3bdfSopenharmony_ci#endif
321f08c3bdfSopenharmony_ci
322f08c3bdfSopenharmony_ci	gen_ret_val = generate(path_string, level);
323f08c3bdfSopenharmony_ci	close(list_id);
324f08c3bdfSopenharmony_ci	list_id = open(path_list_string, READ);
325f08c3bdfSopenharmony_ci	if (list_id == -1) {
326f08c3bdfSopenharmony_ci		fprintf(temp,
327f08c3bdfSopenharmony_ci			"\nThe path_list file cannot be opened for reading, errno=%d\n",
328f08c3bdfSopenharmony_ci			errno);
329f08c3bdfSopenharmony_ci		exit(-8);
330f08c3bdfSopenharmony_ci	}
331f08c3bdfSopenharmony_ci	list_stream = fdopen(list_id, "r");
332f08c3bdfSopenharmony_ci
333f08c3bdfSopenharmony_ci	/****************************************/
334f08c3bdfSopenharmony_ci	/*                                      */
335f08c3bdfSopenharmony_ci	/*   check the directory-file tree      */
336f08c3bdfSopenharmony_ci	/*      for correctness                 */
337f08c3bdfSopenharmony_ci	/*                                      */
338f08c3bdfSopenharmony_ci	/****************************************/
339f08c3bdfSopenharmony_ci
340f08c3bdfSopenharmony_ci#ifdef DEBUG
341f08c3bdfSopenharmony_ci	tst_resm(TINFO, "\n\t%s\n\n", "CHECKING:");
342f08c3bdfSopenharmony_ci#endif
343f08c3bdfSopenharmony_ci
344f08c3bdfSopenharmony_ci	ch_ret_val = check();
345f08c3bdfSopenharmony_ci
346f08c3bdfSopenharmony_ci	exit_val = MIN(ch_ret_val, gen_ret_val);
347f08c3bdfSopenharmony_ci
348f08c3bdfSopenharmony_ci	status = fclose(list_stream);
349f08c3bdfSopenharmony_ci	if (status != 0) {
350f08c3bdfSopenharmony_ci		fprintf(temp,
351f08c3bdfSopenharmony_ci			"Failed to close list_stream: ret=%d errno=%d (%s)\n",
352f08c3bdfSopenharmony_ci			status, errno, strerror(errno));
353f08c3bdfSopenharmony_ci		exit(-8);
354f08c3bdfSopenharmony_ci	}
355f08c3bdfSopenharmony_ci
356f08c3bdfSopenharmony_ci	/*
357f08c3bdfSopenharmony_ci	 * Remove file.
358f08c3bdfSopenharmony_ci	 */
359f08c3bdfSopenharmony_ci
360f08c3bdfSopenharmony_ci	status = system(remove_string);
361f08c3bdfSopenharmony_ci	if (status) {
362f08c3bdfSopenharmony_ci		fprintf(temp, "Caution - `%s' failed.\n", remove_string);
363f08c3bdfSopenharmony_ci		fprintf(temp, "Status returned %d.\n", status);
364f08c3bdfSopenharmony_ci	}
365f08c3bdfSopenharmony_ci
366f08c3bdfSopenharmony_ci	/****************************************/
367f08c3bdfSopenharmony_ci	/*                                      */
368f08c3bdfSopenharmony_ci	/*         .....and exit main           */
369f08c3bdfSopenharmony_ci	/*                                      */
370f08c3bdfSopenharmony_ci	/****************************************/
371f08c3bdfSopenharmony_ci
372f08c3bdfSopenharmony_ci	exit(exit_val);
373f08c3bdfSopenharmony_ci}
374f08c3bdfSopenharmony_ci
375f08c3bdfSopenharmony_ciint generate(char *string, int level)
376f08c3bdfSopenharmony_ci
377f08c3bdfSopenharmony_ci/****************************************/
378f08c3bdfSopenharmony_ci/*					*/
379f08c3bdfSopenharmony_ci/*   generate recursively a tree of	*/
380f08c3bdfSopenharmony_ci/*   directories and files:  within   	*/
381f08c3bdfSopenharmony_ci/*   created directory, an alternating	*/
382f08c3bdfSopenharmony_ci/*   series of files and directories 	*/
383f08c3bdfSopenharmony_ci/*   are constructed---until tree	*/
384f08c3bdfSopenharmony_ci/*   breadth and depth limits are	*/
385f08c3bdfSopenharmony_ci/*   reached or an error occurs		*/
386f08c3bdfSopenharmony_ci/*					*/
387f08c3bdfSopenharmony_ci/****************************************/
388f08c3bdfSopenharmony_ci/***************************/
389f08c3bdfSopenharmony_ci/*  string:                */
390f08c3bdfSopenharmony_ci/*  the directory path     */
391f08c3bdfSopenharmony_ci/*  string below which a   */
392f08c3bdfSopenharmony_ci/*  tree is generated      */
393f08c3bdfSopenharmony_ci/*                         */
394f08c3bdfSopenharmony_ci/***************************/
395f08c3bdfSopenharmony_ci
396f08c3bdfSopenharmony_ci/***************************/
397f08c3bdfSopenharmony_ci/* level:                  */
398f08c3bdfSopenharmony_ci/* the tree depth variable */
399f08c3bdfSopenharmony_ci/*                         */
400f08c3bdfSopenharmony_ci/***************************/
401f08c3bdfSopenharmony_ci{
402f08c3bdfSopenharmony_ci	int switch_flag;
403f08c3bdfSopenharmony_ci	int ret_val = 0;
404f08c3bdfSopenharmony_ci	int new_ret_val, len, ret_len;
405f08c3bdfSopenharmony_ci	char new_string[PATH_STRING_LENGTH + 1];
406f08c3bdfSopenharmony_ci	int new_level;
407f08c3bdfSopenharmony_ci	int i, j;		/* iteration counters */
408f08c3bdfSopenharmony_ci	int snp_ret;
409f08c3bdfSopenharmony_ci
410f08c3bdfSopenharmony_ci	switch_flag = level & TRUE;
411f08c3bdfSopenharmony_ci	if (strlen(string) >= MAX_PATH_STRING_LENGTH) {
412f08c3bdfSopenharmony_ci
413f08c3bdfSopenharmony_ci		/********************************/
414f08c3bdfSopenharmony_ci		/*                              */
415f08c3bdfSopenharmony_ci		/*   Maximum path name length   */
416f08c3bdfSopenharmony_ci		/*          reached             */
417f08c3bdfSopenharmony_ci		/*                              */
418f08c3bdfSopenharmony_ci		/********************************/
419f08c3bdfSopenharmony_ci
420f08c3bdfSopenharmony_ci		fprintf(temp, "\nMaximum path_name length reached\n");
421f08c3bdfSopenharmony_ci		return (-1);
422f08c3bdfSopenharmony_ci	} else if (level < max_depth) {
423f08c3bdfSopenharmony_ci		for (i = 0; i <= max_breadth; i++) {
424f08c3bdfSopenharmony_ci			get_next_name();
425f08c3bdfSopenharmony_ci			snp_ret = snprintf(new_string, sizeof(new_string),
426f08c3bdfSopenharmony_ci				"%s/%s", string, name);
427f08c3bdfSopenharmony_ci			if (snp_ret < 0 || snp_ret >= sizeof(new_string)) {
428f08c3bdfSopenharmony_ci				tst_resm(TBROK, "snprintf(new_string,..) "
429f08c3bdfSopenharmony_ci					"returned %d", snp_ret);
430f08c3bdfSopenharmony_ci				exit(-1);
431f08c3bdfSopenharmony_ci			}
432f08c3bdfSopenharmony_ci
433f08c3bdfSopenharmony_ci			/****************************************/
434f08c3bdfSopenharmony_ci			/*                                      */
435f08c3bdfSopenharmony_ci			/*    switch between creating files     */
436f08c3bdfSopenharmony_ci			/*    and making directories            */
437f08c3bdfSopenharmony_ci			/*                                      */
438f08c3bdfSopenharmony_ci			/****************************************/
439f08c3bdfSopenharmony_ci
440f08c3bdfSopenharmony_ci			if (switch_flag) {
441f08c3bdfSopenharmony_ci				switch_flag = FALSE;
442f08c3bdfSopenharmony_ci
443f08c3bdfSopenharmony_ci				/****************************************/
444f08c3bdfSopenharmony_ci				/*                                      */
445f08c3bdfSopenharmony_ci				/*        create a new file             */
446f08c3bdfSopenharmony_ci				/*                                      */
447f08c3bdfSopenharmony_ci				/****************************************/
448f08c3bdfSopenharmony_ci
449f08c3bdfSopenharmony_ci				file_id = creat(new_string, FILE_MODE);
450f08c3bdfSopenharmony_ci				if (file_id == -1) {
451f08c3bdfSopenharmony_ci					fprintf(temp,
452f08c3bdfSopenharmony_ci						"\nImpossible to create file %s, errno=%d\n",
453f08c3bdfSopenharmony_ci						new_string, errno);
454f08c3bdfSopenharmony_ci					return (-2);
455f08c3bdfSopenharmony_ci				}
456f08c3bdfSopenharmony_ci#ifdef DEBUG
457f08c3bdfSopenharmony_ci				tst_resm(TINFO, "%d  %s F\n", level,
458f08c3bdfSopenharmony_ci					 new_string);
459f08c3bdfSopenharmony_ci#endif
460f08c3bdfSopenharmony_ci
461f08c3bdfSopenharmony_ci				/****************************************/
462f08c3bdfSopenharmony_ci				/*                                      */
463f08c3bdfSopenharmony_ci				/*            write to it               */
464f08c3bdfSopenharmony_ci				/*                                      */
465f08c3bdfSopenharmony_ci				/****************************************/
466f08c3bdfSopenharmony_ci
467f08c3bdfSopenharmony_ci				len = strlen(new_string);
468f08c3bdfSopenharmony_ci				for (j = 1; j <= file_length; j++) {
469f08c3bdfSopenharmony_ci					ret_len =
470f08c3bdfSopenharmony_ci					    write(file_id, new_string, len);
471f08c3bdfSopenharmony_ci					if (ret_len != len) {
472f08c3bdfSopenharmony_ci						fprintf(temp,
473f08c3bdfSopenharmony_ci							"\nUnsuccessful write to file %s, errno=%d\n",
474f08c3bdfSopenharmony_ci							new_string, errno);
475f08c3bdfSopenharmony_ci						return (-3);
476f08c3bdfSopenharmony_ci					}
477f08c3bdfSopenharmony_ci				}
478f08c3bdfSopenharmony_ci				close(file_id);
479f08c3bdfSopenharmony_ci
480f08c3bdfSopenharmony_ci				/****************************************/
481f08c3bdfSopenharmony_ci				/*                                      */
482f08c3bdfSopenharmony_ci				/*   and store its name in path_list    */
483f08c3bdfSopenharmony_ci				/*                                      */
484f08c3bdfSopenharmony_ci				/****************************************/
485f08c3bdfSopenharmony_ci
486f08c3bdfSopenharmony_ci				strcpy(write_string, new_string);
487f08c3bdfSopenharmony_ci				len = strlen(write_string);
488f08c3bdfSopenharmony_ci				write_string[len++] = 'F';
489f08c3bdfSopenharmony_ci				write_string[len] = '\0';
490f08c3bdfSopenharmony_ci				escrivez(write_string);
491f08c3bdfSopenharmony_ci			} else {
492f08c3bdfSopenharmony_ci				switch_flag = TRUE;
493f08c3bdfSopenharmony_ci
494f08c3bdfSopenharmony_ci				/****************************************/
495f08c3bdfSopenharmony_ci				/*                                      */
496f08c3bdfSopenharmony_ci				/*       or make a directory            */
497f08c3bdfSopenharmony_ci				/*                                      */
498f08c3bdfSopenharmony_ci				/*  (mknod can only be called when in   */
499f08c3bdfSopenharmony_ci				/*   super user mode)                   */
500f08c3bdfSopenharmony_ci				/*                                      */
501f08c3bdfSopenharmony_ci				/****************************************/
502f08c3bdfSopenharmony_ci
503f08c3bdfSopenharmony_ci				ret_val = mkdir(new_string, DIRECTORY_MODE);
504f08c3bdfSopenharmony_ci
505f08c3bdfSopenharmony_ci				if (ret_val != 0) {
506f08c3bdfSopenharmony_ci					fprintf(temp,
507f08c3bdfSopenharmony_ci						"\nImpossible to create directory %s, errno=%d\n",
508f08c3bdfSopenharmony_ci						new_string, errno);
509f08c3bdfSopenharmony_ci					return (-5);
510f08c3bdfSopenharmony_ci				}
511f08c3bdfSopenharmony_ci#ifdef DEBUG
512f08c3bdfSopenharmony_ci				tst_resm(TINFO, "%d  %s D\n", level,
513f08c3bdfSopenharmony_ci					 new_string);
514f08c3bdfSopenharmony_ci#endif
515f08c3bdfSopenharmony_ci
516f08c3bdfSopenharmony_ci				/****************************************/
517f08c3bdfSopenharmony_ci				/*                                      */
518f08c3bdfSopenharmony_ci				/*     store its name in path_list      */
519f08c3bdfSopenharmony_ci				/*                                      */
520f08c3bdfSopenharmony_ci				/****************************************/
521f08c3bdfSopenharmony_ci
522f08c3bdfSopenharmony_ci				strcpy(write_string, new_string);
523f08c3bdfSopenharmony_ci				len = strlen(write_string);
524f08c3bdfSopenharmony_ci				write_string[len++] = 'D';
525f08c3bdfSopenharmony_ci				write_string[len] = '\0';
526f08c3bdfSopenharmony_ci				escrivez(write_string);
527f08c3bdfSopenharmony_ci
528f08c3bdfSopenharmony_ci				/****************************************/
529f08c3bdfSopenharmony_ci				/*                                      */
530f08c3bdfSopenharmony_ci				/*      and generate a new level        */
531f08c3bdfSopenharmony_ci				/*                                      */
532f08c3bdfSopenharmony_ci				/****************************************/
533f08c3bdfSopenharmony_ci
534f08c3bdfSopenharmony_ci				new_level = level + 1;
535f08c3bdfSopenharmony_ci				new_ret_val = generate(new_string, new_level);
536f08c3bdfSopenharmony_ci				if (new_ret_val < ret_val)
537f08c3bdfSopenharmony_ci					ret_val = new_ret_val;
538f08c3bdfSopenharmony_ci			}
539f08c3bdfSopenharmony_ci		}
540f08c3bdfSopenharmony_ci
541f08c3bdfSopenharmony_ci		/********************************/
542f08c3bdfSopenharmony_ci		/*                              */
543f08c3bdfSopenharmony_ci		/*    Maximum breadth reached   */
544f08c3bdfSopenharmony_ci		/*                              */
545f08c3bdfSopenharmony_ci		/********************************/
546f08c3bdfSopenharmony_ci
547f08c3bdfSopenharmony_ci		return (ret_val);
548f08c3bdfSopenharmony_ci	} else
549f08c3bdfSopenharmony_ci		    /********************************/
550f08c3bdfSopenharmony_ci		/*                             */
551f08c3bdfSopenharmony_ci		/*    Maximum depth reached    */
552f08c3bdfSopenharmony_ci		/*                             */
553f08c3bdfSopenharmony_ci /********************************/
554f08c3bdfSopenharmony_ci		return 0;
555f08c3bdfSopenharmony_ci}
556f08c3bdfSopenharmony_ci
557f08c3bdfSopenharmony_ciint check(void)
558f08c3bdfSopenharmony_ci
559f08c3bdfSopenharmony_ci/****************************************/
560f08c3bdfSopenharmony_ci/*					*/
561f08c3bdfSopenharmony_ci/*   check for file and directory	*/
562f08c3bdfSopenharmony_ci/*   correctness by reading records	*/
563f08c3bdfSopenharmony_ci/*   from the path_list and attempting	*/
564f08c3bdfSopenharmony_ci/*   to determine if the corresponding	*/
565f08c3bdfSopenharmony_ci/*   files or directories are as 	*/
566f08c3bdfSopenharmony_ci/*   created 				*/
567f08c3bdfSopenharmony_ci/*					*/
568f08c3bdfSopenharmony_ci/****************************************/
569f08c3bdfSopenharmony_ci{
570f08c3bdfSopenharmony_ci	int len, path_mode, val, ret_len, j;
571f08c3bdfSopenharmony_ci
572f08c3bdfSopenharmony_ci	for (;;) {
573f08c3bdfSopenharmony_ci
574f08c3bdfSopenharmony_ci		/****************************************/
575f08c3bdfSopenharmony_ci		/*                                      */
576f08c3bdfSopenharmony_ci		/*  read a path string from path_list   */
577f08c3bdfSopenharmony_ci		/*                                      */
578f08c3bdfSopenharmony_ci		/****************************************/
579f08c3bdfSopenharmony_ci
580f08c3bdfSopenharmony_ci		if (fscanf(list_stream, "%s", path_string) == EOF) {
581f08c3bdfSopenharmony_ci
582f08c3bdfSopenharmony_ci#ifdef DEBUG
583f08c3bdfSopenharmony_ci			tst_resm(TINFO, "\nEnd of path_list file reached \n");
584f08c3bdfSopenharmony_ci#endif
585f08c3bdfSopenharmony_ci
586f08c3bdfSopenharmony_ci			return 0;
587f08c3bdfSopenharmony_ci		}
588f08c3bdfSopenharmony_ci#ifdef DEBUG
589f08c3bdfSopenharmony_ci		tst_resm(TINFO, "%s\n", path_string);
590f08c3bdfSopenharmony_ci#endif
591f08c3bdfSopenharmony_ci
592f08c3bdfSopenharmony_ci		len = strlen(path_string);
593f08c3bdfSopenharmony_ci		len--;
594f08c3bdfSopenharmony_ci		if (path_string[len] == 'F') {
595f08c3bdfSopenharmony_ci
596f08c3bdfSopenharmony_ci		/********************************/
597f08c3bdfSopenharmony_ci			/*                              */
598f08c3bdfSopenharmony_ci			/*    this should be a file     */
599f08c3bdfSopenharmony_ci			/*                              */
600f08c3bdfSopenharmony_ci		/********************************/
601f08c3bdfSopenharmony_ci
602f08c3bdfSopenharmony_ci			path_string[len] = '\0';
603f08c3bdfSopenharmony_ci			file_id = open(path_string, READ);
604f08c3bdfSopenharmony_ci			if (file_id <= 0) {
605f08c3bdfSopenharmony_ci				fprintf(temp,
606f08c3bdfSopenharmony_ci					"\nImpossible to open file %s, errno=%d\n",
607f08c3bdfSopenharmony_ci					path_string, errno);
608f08c3bdfSopenharmony_ci				return (-1);
609f08c3bdfSopenharmony_ci			}
610f08c3bdfSopenharmony_ci
611f08c3bdfSopenharmony_ci			else {
612f08c3bdfSopenharmony_ci				/********************************/
613f08c3bdfSopenharmony_ci				/*                              */
614f08c3bdfSopenharmony_ci				/*    check its contents        */
615f08c3bdfSopenharmony_ci				/*                              */
616f08c3bdfSopenharmony_ci				/********************************/
617f08c3bdfSopenharmony_ci
618f08c3bdfSopenharmony_ci				ret_len = 0;
619f08c3bdfSopenharmony_ci				len = strlen(path_string);
620f08c3bdfSopenharmony_ci				for (j = 1; j <= file_length; j++) {
621f08c3bdfSopenharmony_ci					ret_len =
622f08c3bdfSopenharmony_ci					    read(file_id, read_string, len);
623f08c3bdfSopenharmony_ci					if (len != ret_len) {
624f08c3bdfSopenharmony_ci						fprintf(temp,
625f08c3bdfSopenharmony_ci							"\nFile read error for file %s, errno=%d\n",
626f08c3bdfSopenharmony_ci							path_string, errno);
627f08c3bdfSopenharmony_ci						return (-3);
628f08c3bdfSopenharmony_ci					}
629f08c3bdfSopenharmony_ci					read_string[len] = '\0';
630f08c3bdfSopenharmony_ci					val = strcmp(read_string, path_string);
631f08c3bdfSopenharmony_ci					if (val != 0) {
632f08c3bdfSopenharmony_ci						fprintf(temp,
633f08c3bdfSopenharmony_ci							"\nContents of file %s are different than expected: %s\n",
634f08c3bdfSopenharmony_ci							path_string,
635f08c3bdfSopenharmony_ci							read_string);
636f08c3bdfSopenharmony_ci						return (-4);
637f08c3bdfSopenharmony_ci					}
638f08c3bdfSopenharmony_ci				}
639f08c3bdfSopenharmony_ci				close(file_id);
640f08c3bdfSopenharmony_ci			}	/* else for */
641f08c3bdfSopenharmony_ci			if (ret_len <= 0) {
642f08c3bdfSopenharmony_ci				fprintf(temp,
643f08c3bdfSopenharmony_ci					"\nImpossible to read file %s, errno=%d\n",
644f08c3bdfSopenharmony_ci					path_string, errno);
645f08c3bdfSopenharmony_ci				return (-2);
646f08c3bdfSopenharmony_ci			}
647f08c3bdfSopenharmony_ci		} else {
648f08c3bdfSopenharmony_ci
649f08c3bdfSopenharmony_ci		/********************************/
650f08c3bdfSopenharmony_ci			/*                              */
651f08c3bdfSopenharmony_ci			/*  otherwise..........         */
652f08c3bdfSopenharmony_ci			/*  it should be a directory    */
653f08c3bdfSopenharmony_ci			/*                              */
654f08c3bdfSopenharmony_ci		/********************************/
655f08c3bdfSopenharmony_ci
656f08c3bdfSopenharmony_ci			path_string[len] = '\0';
657f08c3bdfSopenharmony_ci			path_mode = mode(path_string);
658f08c3bdfSopenharmony_ci			if (path_mode == -1) {
659f08c3bdfSopenharmony_ci				fprintf(temp,
660f08c3bdfSopenharmony_ci					"\nPreviously created directory path %s was not open\n",
661f08c3bdfSopenharmony_ci					path_string);
662f08c3bdfSopenharmony_ci				return (-4);
663f08c3bdfSopenharmony_ci			}
664f08c3bdfSopenharmony_ci			if ((040000 & path_mode) != 040000) {
665f08c3bdfSopenharmony_ci				fprintf(temp,
666f08c3bdfSopenharmony_ci					"\nPath %s was not recognized to be a directory\n",
667f08c3bdfSopenharmony_ci					path_string);
668f08c3bdfSopenharmony_ci				fprintf(temp, "Its mode is %o\n", path_mode);
669f08c3bdfSopenharmony_ci				return (-5);
670f08c3bdfSopenharmony_ci			}
671f08c3bdfSopenharmony_ci		}
672f08c3bdfSopenharmony_ci	}			/* while */
673f08c3bdfSopenharmony_ci}
674f08c3bdfSopenharmony_ci
675f08c3bdfSopenharmony_ciint get_next_name(void)
676f08c3bdfSopenharmony_ci
677f08c3bdfSopenharmony_ci/****************************************/
678f08c3bdfSopenharmony_ci/*					*/
679f08c3bdfSopenharmony_ci/*   get the next---in a dictionary	*/
680f08c3bdfSopenharmony_ci/*   sense---file or directory name	*/
681f08c3bdfSopenharmony_ci/*					*/
682f08c3bdfSopenharmony_ci/****************************************/
683f08c3bdfSopenharmony_ci{
684f08c3bdfSopenharmony_ci	static int k;
685f08c3bdfSopenharmony_ci	int i;
686f08c3bdfSopenharmony_ci	int last_position;
687f08c3bdfSopenharmony_ci
688f08c3bdfSopenharmony_ci	last_position = NAME_LENGTH - 1;
689f08c3bdfSopenharmony_ci	if (k == 0) {
690f08c3bdfSopenharmony_ci
691f08c3bdfSopenharmony_ci		/************************/
692f08c3bdfSopenharmony_ci		/*                      */
693f08c3bdfSopenharmony_ci		/*   initialize name    */
694f08c3bdfSopenharmony_ci		/*                      */
695f08c3bdfSopenharmony_ci		/************************/
696f08c3bdfSopenharmony_ci
697f08c3bdfSopenharmony_ci		for (i = 0; i < NAME_LENGTH; i++)
698f08c3bdfSopenharmony_ci			name[i] = 'a';
699f08c3bdfSopenharmony_ci		name[NAME_LENGTH] = '\0';
700f08c3bdfSopenharmony_ci		k++;
701f08c3bdfSopenharmony_ci	}
702f08c3bdfSopenharmony_ci					    /********************************/
703f08c3bdfSopenharmony_ci	/*                              */
704f08c3bdfSopenharmony_ci	else
705f08c3bdfSopenharmony_ci		increment_name(last_position);	/* i.e., beginning at the last  */
706f08c3bdfSopenharmony_ci	/* position                     */
707f08c3bdfSopenharmony_ci	/*                              */
708f08c3bdfSopenharmony_ci					    /********************************/
709f08c3bdfSopenharmony_ci	return 0;
710f08c3bdfSopenharmony_ci}
711f08c3bdfSopenharmony_ci
712f08c3bdfSopenharmony_ciint increment_name(int position)
713f08c3bdfSopenharmony_ci
714f08c3bdfSopenharmony_ci/****************************************/
715f08c3bdfSopenharmony_ci/*					*/
716f08c3bdfSopenharmony_ci/*  recursively revise the letters in 	*/
717f08c3bdfSopenharmony_ci/*  a name to get the lexiographically	*/
718f08c3bdfSopenharmony_ci/*  next name				*/
719f08c3bdfSopenharmony_ci/*					*/
720f08c3bdfSopenharmony_ci/****************************************/
721f08c3bdfSopenharmony_ci{
722f08c3bdfSopenharmony_ci	int next_position;
723f08c3bdfSopenharmony_ci
724f08c3bdfSopenharmony_ci	if (name[position] == 'z')
725f08c3bdfSopenharmony_ci		if (position == 0) {
726f08c3bdfSopenharmony_ci			fprintf(temp,
727f08c3bdfSopenharmony_ci				"ERROR: There are no more available names\n");
728f08c3bdfSopenharmony_ci			exit(-1);
729f08c3bdfSopenharmony_ci		} else {
730f08c3bdfSopenharmony_ci			name[position] = 'a';	       /**********************/
731f08c3bdfSopenharmony_ci			next_position = --position;	/*                    */
732f08c3bdfSopenharmony_ci			increment_name(next_position);	/*  increment the     */
733f08c3bdfSopenharmony_ci			/*  previous letter   */
734f08c3bdfSopenharmony_ci			/*                    */
735f08c3bdfSopenharmony_ci						       /**********************/
736f08c3bdfSopenharmony_ci		}
737f08c3bdfSopenharmony_ci				  /*********************************/
738f08c3bdfSopenharmony_ci	/*                               */
739f08c3bdfSopenharmony_ci	else
740f08c3bdfSopenharmony_ci		name[position]++;	/* otherwise, increment this one */
741f08c3bdfSopenharmony_ci	return 0;		/*                               */
742f08c3bdfSopenharmony_ci				  /*********************************/
743f08c3bdfSopenharmony_ci}
744f08c3bdfSopenharmony_ci
745f08c3bdfSopenharmony_ciint mode(char *path_string)
746f08c3bdfSopenharmony_ci
747f08c3bdfSopenharmony_ci/****************************************/
748f08c3bdfSopenharmony_ci/*					*/
749f08c3bdfSopenharmony_ci/*   determine and return the mode of	*/
750f08c3bdfSopenharmony_ci/*   the file named by path_string 	*/
751f08c3bdfSopenharmony_ci/*					*/
752f08c3bdfSopenharmony_ci/****************************************/
753f08c3bdfSopenharmony_ci{
754f08c3bdfSopenharmony_ci	struct stat buf;
755f08c3bdfSopenharmony_ci	int ret_val, mod;
756f08c3bdfSopenharmony_ci
757f08c3bdfSopenharmony_ci	ret_val = stat(path_string, &buf);
758f08c3bdfSopenharmony_ci	if (ret_val == -1)
759f08c3bdfSopenharmony_ci		return (-1);
760f08c3bdfSopenharmony_ci	else {
761f08c3bdfSopenharmony_ci		mod = buf.st_mode;
762f08c3bdfSopenharmony_ci		return (mod);
763f08c3bdfSopenharmony_ci	}
764f08c3bdfSopenharmony_ci}
765f08c3bdfSopenharmony_ci
766f08c3bdfSopenharmony_ciint escrivez(char *string)
767f08c3bdfSopenharmony_ci{
768f08c3bdfSopenharmony_ci	char write_string[PATH_STRING_LENGTH + 1];
769f08c3bdfSopenharmony_ci	int len, ret_len;
770f08c3bdfSopenharmony_ci
771f08c3bdfSopenharmony_ci	strcpy(write_string, string);
772f08c3bdfSopenharmony_ci	len = strlen(write_string);
773f08c3bdfSopenharmony_ci	write_string[len] = '\n';
774f08c3bdfSopenharmony_ci	len++;
775f08c3bdfSopenharmony_ci	ret_len = write(list_id, write_string, len);
776f08c3bdfSopenharmony_ci	if (len != ret_len) {
777f08c3bdfSopenharmony_ci		fprintf(temp,
778f08c3bdfSopenharmony_ci			"A string of deviant length %d written to path_list, errno=%d\n",
779f08c3bdfSopenharmony_ci			ret_len, errno);
780f08c3bdfSopenharmony_ci		exit(-2);
781f08c3bdfSopenharmony_ci	}
782f08c3bdfSopenharmony_ci	return 0;
783f08c3bdfSopenharmony_ci}
784f08c3bdfSopenharmony_ci
785f08c3bdfSopenharmony_ciint term(void)
786f08c3bdfSopenharmony_ci{
787f08c3bdfSopenharmony_ci	int status;
788f08c3bdfSopenharmony_ci
789f08c3bdfSopenharmony_ci	fflush(temp);
790f08c3bdfSopenharmony_ci	if (parent_pid == getpid()) {
791f08c3bdfSopenharmony_ci		massmurder();	/* kill kids */
792f08c3bdfSopenharmony_ci		fprintf(temp, "\term1 - SIGTERM received by parent.\n");
793f08c3bdfSopenharmony_ci		fflush(temp);
794f08c3bdfSopenharmony_ci	} else {
795f08c3bdfSopenharmony_ci		fprintf(temp, "\tchild - got SIGTERM signal.\n");
796f08c3bdfSopenharmony_ci		if (list_stream != NULL)
797f08c3bdfSopenharmony_ci			fclose(list_stream);
798f08c3bdfSopenharmony_ci		close(list_id);
799f08c3bdfSopenharmony_ci		close(file_id);
800f08c3bdfSopenharmony_ci		status = system(remove_string);
801f08c3bdfSopenharmony_ci		if (status) {
802f08c3bdfSopenharmony_ci			fprintf(temp, "Caution - ``%s'' returned status %d\n",
803f08c3bdfSopenharmony_ci				remove_string, status);
804f08c3bdfSopenharmony_ci		}
805f08c3bdfSopenharmony_ci		exit(0);
806f08c3bdfSopenharmony_ci	}
807f08c3bdfSopenharmony_ci	return 0;
808f08c3bdfSopenharmony_ci}
809f08c3bdfSopenharmony_ci
810f08c3bdfSopenharmony_ciint massmurder(void)
811f08c3bdfSopenharmony_ci{
812f08c3bdfSopenharmony_ci	int i;
813f08c3bdfSopenharmony_ci	for (i = 0; i < MAXCHILD; i++) {
814f08c3bdfSopenharmony_ci		if (allchild[i]) {
815f08c3bdfSopenharmony_ci			kill(allchild[i], SIGTERM);
816f08c3bdfSopenharmony_ci		}
817f08c3bdfSopenharmony_ci	}
818f08c3bdfSopenharmony_ci	return 0;
819f08c3bdfSopenharmony_ci}
820f08c3bdfSopenharmony_ci
821f08c3bdfSopenharmony_ci/** LTP Port **/
822f08c3bdfSopenharmony_ci/*
823f08c3bdfSopenharmony_ci * setup
824f08c3bdfSopenharmony_ci *
825f08c3bdfSopenharmony_ci * Do set up - here its a dummy function
826f08c3bdfSopenharmony_ci */
827f08c3bdfSopenharmony_civoid setup(void)
828f08c3bdfSopenharmony_ci{
829f08c3bdfSopenharmony_ci	tst_tmpdir();
830f08c3bdfSopenharmony_ci	temp = stderr;
831f08c3bdfSopenharmony_ci}
832f08c3bdfSopenharmony_ci
833f08c3bdfSopenharmony_ci/*
834f08c3bdfSopenharmony_ci * fail_exit()
835f08c3bdfSopenharmony_ci *
836f08c3bdfSopenharmony_ci * Exit on failure
837f08c3bdfSopenharmony_ci */
838f08c3bdfSopenharmony_civoid fail_exit(void)
839f08c3bdfSopenharmony_ci{
840f08c3bdfSopenharmony_ci	tst_brkm(TFAIL, tst_rmdir, "Test failed");
841f08c3bdfSopenharmony_ci}
842f08c3bdfSopenharmony_ci
843f08c3bdfSopenharmony_ci/*
844f08c3bdfSopenharmony_ci *
845f08c3bdfSopenharmony_ci * Function: anyfail()
846f08c3bdfSopenharmony_ci *
847f08c3bdfSopenharmony_ci * Description: Exit a test.
848f08c3bdfSopenharmony_ci */
849f08c3bdfSopenharmony_civoid anyfail(void)
850f08c3bdfSopenharmony_ci{
851f08c3bdfSopenharmony_ci	(local_flag == FAILED) ? tst_resm(TFAIL, "Test failed")
852f08c3bdfSopenharmony_ci	    : tst_resm(TPASS, "Test passed");
853f08c3bdfSopenharmony_ci	tst_rmdir();
854f08c3bdfSopenharmony_ci	tst_exit();
855f08c3bdfSopenharmony_ci}
856f08c3bdfSopenharmony_ci
857f08c3bdfSopenharmony_ci/*
858f08c3bdfSopenharmony_ci * ok_exit
859f08c3bdfSopenharmony_ci *
860f08c3bdfSopenharmony_ci * Calling block passed the test
861f08c3bdfSopenharmony_ci */
862f08c3bdfSopenharmony_civoid ok_exit(void)
863f08c3bdfSopenharmony_ci{
864f08c3bdfSopenharmony_ci	local_flag = PASSED;
865f08c3bdfSopenharmony_ci	return;
866f08c3bdfSopenharmony_ci}
867f08c3bdfSopenharmony_ci
868f08c3bdfSopenharmony_ci/*
869f08c3bdfSopenharmony_ci * forkfail()
870f08c3bdfSopenharmony_ci *
871f08c3bdfSopenharmony_ci * exit on failure
872f08c3bdfSopenharmony_ci */
873f08c3bdfSopenharmony_civoid forkfail(void)
874f08c3bdfSopenharmony_ci{
875f08c3bdfSopenharmony_ci	tst_brkm(TBROK, tst_rmdir, "Reason: %s", strerror(errno));
876f08c3bdfSopenharmony_ci}
877f08c3bdfSopenharmony_ci
878f08c3bdfSopenharmony_ci/*
879f08c3bdfSopenharmony_ci * Function: terror
880f08c3bdfSopenharmony_ci *
881f08c3bdfSopenharmony_ci * Description: prints error message this may not be because some part of the
882f08c3bdfSopenharmony_ci *              test case failed, for example fork() failed. We will log this
883f08c3bdfSopenharmony_ci *              failure as TBROK instead of TFAIL.
884f08c3bdfSopenharmony_ci */
885f08c3bdfSopenharmony_civoid terror(char *message)
886f08c3bdfSopenharmony_ci{
887f08c3bdfSopenharmony_ci	tst_resm(TBROK, "Reason: %s:%s", message, strerror(errno));
888f08c3bdfSopenharmony_ci	return;
889f08c3bdfSopenharmony_ci}
890f08c3bdfSopenharmony_ci
891f08c3bdfSopenharmony_ci/*
892f08c3bdfSopenharmony_ci * instress
893f08c3bdfSopenharmony_ci *
894f08c3bdfSopenharmony_ci * Assume that we are always running under stress, so this function will
895f08c3bdfSopenharmony_ci * return > 0 value always.
896f08c3bdfSopenharmony_ci */
897f08c3bdfSopenharmony_ciint instress(void)
898f08c3bdfSopenharmony_ci{
899f08c3bdfSopenharmony_ci	tst_resm(TINFO, "System resource may be too low, fork() malloc()"
900f08c3bdfSopenharmony_ci		 " etc are likely to fail.\n");
901f08c3bdfSopenharmony_ci	return 1;
902f08c3bdfSopenharmony_ci}
903