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