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/* 10/31/2002 Port to LTP robbiew@us.ibm.com */ 21f08c3bdfSopenharmony_ci/* 06/30/2001 Port to Linux nsharoff@us.ibm.com */ 22f08c3bdfSopenharmony_ci 23f08c3bdfSopenharmony_ci /* inode1.c */ 24f08c3bdfSopenharmony_ci/*====================================================================== 25f08c3bdfSopenharmony_ci =================== TESTPLAN SEGMENT =================== 26f08c3bdfSopenharmony_ciCALLS: mkdir, stat, open 27f08c3bdfSopenharmony_ci 28f08c3bdfSopenharmony_ci run using TERM mode 29f08c3bdfSopenharmony_ci 30f08c3bdfSopenharmony_ci>KEYS: < file system management I/O 31f08c3bdfSopenharmony_ci>WHAT: < Do the system's file system management and I/O functions work 32f08c3bdfSopenharmony_ci < correctly? 33f08c3bdfSopenharmony_ci>HOW: < Construct a directory tree, create files in it, and verify 34f08c3bdfSopenharmony_ci < that this was done as expected. 35f08c3bdfSopenharmony_ci>BUGS: < 36f08c3bdfSopenharmony_ci======================================================================*/ 37f08c3bdfSopenharmony_ci/* modified by dale 25-Jul-84 */ 38f08c3bdfSopenharmony_ci 39f08c3bdfSopenharmony_ci/************************************************/ 40f08c3bdfSopenharmony_ci#define PATH_STRING_LENGTH 100 41f08c3bdfSopenharmony_ci#define NAME_LENGTH 8 42f08c3bdfSopenharmony_ci#define MAX_PATH_STRING_LENGTH (PATH_STRING_LENGTH - NAME_LENGTH) 43f08c3bdfSopenharmony_ci#define MAX_DEPTH 3 44f08c3bdfSopenharmony_ci#define MAX_BREADTH 3 45f08c3bdfSopenharmony_ci#define FILE_LENGTH 100 46f08c3bdfSopenharmony_ci#define DIRECTORY_MODE 00777 47f08c3bdfSopenharmony_ci#define FILE_MODE 00777 48f08c3bdfSopenharmony_ci 49f08c3bdfSopenharmony_ci/* #define PRINT define to get list while running */ 50f08c3bdfSopenharmony_ci 51f08c3bdfSopenharmony_ci#define TRUE 1 52f08c3bdfSopenharmony_ci#define FALSE 0 53f08c3bdfSopenharmony_ci#define READ 0 54f08c3bdfSopenharmony_ci#define WRITE 1 55f08c3bdfSopenharmony_ci 56f08c3bdfSopenharmony_ci#include <stdio.h> 57f08c3bdfSopenharmony_ci#include <errno.h> 58f08c3bdfSopenharmony_ci#include <sys/types.h> 59f08c3bdfSopenharmony_ci#include <sys/stat.h> 60f08c3bdfSopenharmony_ci#include <fcntl.h> 61f08c3bdfSopenharmony_ci#include <signal.h> 62f08c3bdfSopenharmony_ci#include <errno.h> 63f08c3bdfSopenharmony_ci 64f08c3bdfSopenharmony_ci/** LTP Port **/ 65f08c3bdfSopenharmony_ci#include "test.h" 66f08c3bdfSopenharmony_ci 67f08c3bdfSopenharmony_civoid blexit(void); 68f08c3bdfSopenharmony_civoid blenter(void); 69f08c3bdfSopenharmony_civoid setup(void); 70f08c3bdfSopenharmony_civoid fail_exit(void); 71f08c3bdfSopenharmony_civoid anyfail(void); 72f08c3bdfSopenharmony_civoid ok_exit(void); 73f08c3bdfSopenharmony_ci 74f08c3bdfSopenharmony_ci#define FAILED 0 75f08c3bdfSopenharmony_ci#define PASSED 1 76f08c3bdfSopenharmony_ci 77f08c3bdfSopenharmony_ciint local_flag = PASSED; 78f08c3bdfSopenharmony_ciint block_number; 79f08c3bdfSopenharmony_ciFILE *temp; 80f08c3bdfSopenharmony_ci 81f08c3bdfSopenharmony_cichar *TCID = "inode01"; /* Test program identifier. */ 82f08c3bdfSopenharmony_ciint TST_TOTAL = 2; /* Total number of test cases. */ 83f08c3bdfSopenharmony_ci/**************/ 84f08c3bdfSopenharmony_ci 85f08c3bdfSopenharmony_ci#ifdef LINUX 86f08c3bdfSopenharmony_ci#include <string.h> 87f08c3bdfSopenharmony_ci#endif 88f08c3bdfSopenharmony_ci 89f08c3bdfSopenharmony_cichar name[NAME_LENGTH + 1]; 90f08c3bdfSopenharmony_cichar path_string[PATH_STRING_LENGTH + 1]; 91f08c3bdfSopenharmony_cichar read_string[PATH_STRING_LENGTH + 1]; 92f08c3bdfSopenharmony_cichar write_string[PATH_STRING_LENGTH + 1]; 93f08c3bdfSopenharmony_cichar rm_string[200]; 94f08c3bdfSopenharmony_ci 95f08c3bdfSopenharmony_ciFILE *list_stream = NULL; 96f08c3bdfSopenharmony_ciint file_id; 97f08c3bdfSopenharmony_ciint list_id; 98f08c3bdfSopenharmony_ci 99f08c3bdfSopenharmony_ciint increment_name(), get_next_name(), mode(), escrivez(); 100f08c3bdfSopenharmony_ci 101f08c3bdfSopenharmony_ciint main(void) 102f08c3bdfSopenharmony_ci{ 103f08c3bdfSopenharmony_ci char root[16]; //as pids can get much longer 104f08c3bdfSopenharmony_ci int gen_ret_val, ch_ret_val, level; 105f08c3bdfSopenharmony_ci int ret_val; 106f08c3bdfSopenharmony_ci int generate(), check(); 107f08c3bdfSopenharmony_ci char path_list_string[PATH_STRING_LENGTH + 1]; 108f08c3bdfSopenharmony_ci int status; 109f08c3bdfSopenharmony_ci int len; 110f08c3bdfSopenharmony_ci int term(); 111f08c3bdfSopenharmony_ci int snp_ret; 112f08c3bdfSopenharmony_ci 113f08c3bdfSopenharmony_ci strcpy(path_string, "inode"); 114f08c3bdfSopenharmony_ci sprintf(root, "A%d", getpid()); 115f08c3bdfSopenharmony_ci strcat(path_string, root); 116f08c3bdfSopenharmony_ci 117f08c3bdfSopenharmony_ci strcpy(rm_string, "rm -rf "); 118f08c3bdfSopenharmony_ci strcat(rm_string, path_string); 119f08c3bdfSopenharmony_ci 120f08c3bdfSopenharmony_ci setup(); 121f08c3bdfSopenharmony_ci 122f08c3bdfSopenharmony_ci if (signal(SIGTERM, (void (*)())term) == SIG_ERR) { 123f08c3bdfSopenharmony_ci fprintf(temp, "\tSIGTERM signal set failed!, errno=%d\n", 124f08c3bdfSopenharmony_ci errno); 125f08c3bdfSopenharmony_ci fail_exit(); 126f08c3bdfSopenharmony_ci } 127f08c3bdfSopenharmony_ci 128f08c3bdfSopenharmony_ci blenter(); 129f08c3bdfSopenharmony_ci 130f08c3bdfSopenharmony_ci /********************************/ 131f08c3bdfSopenharmony_ci /* */ 132f08c3bdfSopenharmony_ci /* make the root directory for */ 133f08c3bdfSopenharmony_ci /* the tree */ 134f08c3bdfSopenharmony_ci /* */ 135f08c3bdfSopenharmony_ci /********************************/ 136f08c3bdfSopenharmony_ci 137f08c3bdfSopenharmony_ci ret_val = mkdir(path_string, DIRECTORY_MODE); 138f08c3bdfSopenharmony_ci 139f08c3bdfSopenharmony_ci if (ret_val == -1) { 140f08c3bdfSopenharmony_ci perror("mkdir error"); 141f08c3bdfSopenharmony_ci fprintf(temp, "\tcreating directory '%s'\n", path_string); 142f08c3bdfSopenharmony_ci fprintf(temp, "\t\n%s Impossible to create directory %s\n", 143f08c3bdfSopenharmony_ci root, path_string); 144f08c3bdfSopenharmony_ci fail_exit(); 145f08c3bdfSopenharmony_ci } 146f08c3bdfSopenharmony_ci#ifdef PRINT 147f08c3bdfSopenharmony_ci printf("\n%s\n", path_string); 148f08c3bdfSopenharmony_ci#endif 149f08c3bdfSopenharmony_ci 150f08c3bdfSopenharmony_ci /****************************************/ 151f08c3bdfSopenharmony_ci /* */ 152f08c3bdfSopenharmony_ci /* create the "path_list" file, in */ 153f08c3bdfSopenharmony_ci /* which the list of generated paths */ 154f08c3bdfSopenharmony_ci /* will be stored so that they later */ 155f08c3bdfSopenharmony_ci /* may be checked */ 156f08c3bdfSopenharmony_ci /* */ 157f08c3bdfSopenharmony_ci /****************************************/ 158f08c3bdfSopenharmony_ci 159f08c3bdfSopenharmony_ci snp_ret = snprintf(path_list_string, sizeof(path_list_string), 160f08c3bdfSopenharmony_ci "%s/path_list", path_string); 161f08c3bdfSopenharmony_ci if (snp_ret < 0 || snp_ret >= sizeof(path_list_string)) { 162f08c3bdfSopenharmony_ci tst_resm(TBROK, "snprintf(path_list_string,..) returned %d", 163f08c3bdfSopenharmony_ci snp_ret); 164f08c3bdfSopenharmony_ci fail_exit(); 165f08c3bdfSopenharmony_ci } 166f08c3bdfSopenharmony_ci list_id = creat(path_list_string, FILE_MODE); 167f08c3bdfSopenharmony_ci if (list_id == -1) { 168f08c3bdfSopenharmony_ci fprintf(temp, 169f08c3bdfSopenharmony_ci "\t\n%s The path_list file cannot be created, errno=%d \n", 170f08c3bdfSopenharmony_ci root, errno); 171f08c3bdfSopenharmony_ci fail_exit(); 172f08c3bdfSopenharmony_ci } 173f08c3bdfSopenharmony_ci 174f08c3bdfSopenharmony_ci /****************************************/ 175f08c3bdfSopenharmony_ci /* */ 176f08c3bdfSopenharmony_ci /* and store its name in path_list */ 177f08c3bdfSopenharmony_ci /* */ 178f08c3bdfSopenharmony_ci /****************************************/ 179f08c3bdfSopenharmony_ci 180f08c3bdfSopenharmony_ci strcpy(write_string, path_string); 181f08c3bdfSopenharmony_ci len = strlen(write_string); 182f08c3bdfSopenharmony_ci write_string[len++] = 'D'; 183f08c3bdfSopenharmony_ci write_string[len] = '\0'; 184f08c3bdfSopenharmony_ci escrivez(write_string); 185f08c3bdfSopenharmony_ci 186f08c3bdfSopenharmony_ci /****************************************/ 187f08c3bdfSopenharmony_ci /* */ 188f08c3bdfSopenharmony_ci /* generate the directory-file tree */ 189f08c3bdfSopenharmony_ci /* */ 190f08c3bdfSopenharmony_ci /****************************************/ 191f08c3bdfSopenharmony_ci 192f08c3bdfSopenharmony_ci level = 0; 193f08c3bdfSopenharmony_ci 194f08c3bdfSopenharmony_ci#ifdef PRINT 195f08c3bdfSopenharmony_ci printf("\n\t%s\n\n", "GENERATING:"); 196f08c3bdfSopenharmony_ci#endif 197f08c3bdfSopenharmony_ci 198f08c3bdfSopenharmony_ci gen_ret_val = generate(path_string, level); 199f08c3bdfSopenharmony_ci 200f08c3bdfSopenharmony_ci if (gen_ret_val) { 201f08c3bdfSopenharmony_ci fprintf(temp, 202f08c3bdfSopenharmony_ci "Failure occured in generate routine, return value %d\n", 203f08c3bdfSopenharmony_ci gen_ret_val); 204f08c3bdfSopenharmony_ci local_flag = FAILED; 205f08c3bdfSopenharmony_ci } 206f08c3bdfSopenharmony_ci 207f08c3bdfSopenharmony_ci blexit(); 208f08c3bdfSopenharmony_ci blenter(); 209f08c3bdfSopenharmony_ci 210f08c3bdfSopenharmony_ci close(list_id); 211f08c3bdfSopenharmony_ci list_id = open(path_list_string, READ); 212f08c3bdfSopenharmony_ci if (list_id == -1) { 213f08c3bdfSopenharmony_ci fprintf(temp, 214f08c3bdfSopenharmony_ci "\t\n%s The path_list file cannot be opened for reading, errno=%d\n", 215f08c3bdfSopenharmony_ci root, errno); 216f08c3bdfSopenharmony_ci fail_exit(); 217f08c3bdfSopenharmony_ci } 218f08c3bdfSopenharmony_ci list_stream = fdopen(list_id, "r"); 219f08c3bdfSopenharmony_ci 220f08c3bdfSopenharmony_ci /****************************************/ 221f08c3bdfSopenharmony_ci /* */ 222f08c3bdfSopenharmony_ci /* check the directory-file tree */ 223f08c3bdfSopenharmony_ci /* for correctness */ 224f08c3bdfSopenharmony_ci /* */ 225f08c3bdfSopenharmony_ci /****************************************/ 226f08c3bdfSopenharmony_ci 227f08c3bdfSopenharmony_ci#ifdef PRINT 228f08c3bdfSopenharmony_ci printf("\n\t%s\n\n", "CHECKING:"); 229f08c3bdfSopenharmony_ci#endif 230f08c3bdfSopenharmony_ci 231f08c3bdfSopenharmony_ci ch_ret_val = check(); 232f08c3bdfSopenharmony_ci 233f08c3bdfSopenharmony_ci if (ch_ret_val) { 234f08c3bdfSopenharmony_ci fprintf(temp, 235f08c3bdfSopenharmony_ci "Failure occured in check routine, return value %d\n", 236f08c3bdfSopenharmony_ci ch_ret_val); 237f08c3bdfSopenharmony_ci local_flag = FAILED; 238f08c3bdfSopenharmony_ci } 239f08c3bdfSopenharmony_ci 240f08c3bdfSopenharmony_ci status = fclose(list_stream); 241f08c3bdfSopenharmony_ci if (status != 0) { 242f08c3bdfSopenharmony_ci fprintf(temp, 243f08c3bdfSopenharmony_ci "Failed to close list_stream: ret=%d errno=%d (%s)\n", 244f08c3bdfSopenharmony_ci status, errno, strerror(errno)); 245f08c3bdfSopenharmony_ci local_flag = FAILED; 246f08c3bdfSopenharmony_ci } 247f08c3bdfSopenharmony_ci 248f08c3bdfSopenharmony_ci blexit(); 249f08c3bdfSopenharmony_ci 250f08c3bdfSopenharmony_ci /* 251f08c3bdfSopenharmony_ci * Now fork and exec a system call to remove the directory. 252f08c3bdfSopenharmony_ci */ 253f08c3bdfSopenharmony_ci 254f08c3bdfSopenharmony_ci#ifdef DEBUG 255f08c3bdfSopenharmony_ci fprintf(temp, "\nClean up:\trm string = %s\n", rm_string); 256f08c3bdfSopenharmony_ci#endif 257f08c3bdfSopenharmony_ci fflush(stdout); 258f08c3bdfSopenharmony_ci fflush(temp); 259f08c3bdfSopenharmony_ci 260f08c3bdfSopenharmony_ci status = system(rm_string); 261f08c3bdfSopenharmony_ci 262f08c3bdfSopenharmony_ci if (status) { 263f08c3bdfSopenharmony_ci fprintf(temp, "Caution-``%s'' may have failed\n", rm_string); 264f08c3bdfSopenharmony_ci fprintf(temp, "rm command exit status = %d\n", status); 265f08c3bdfSopenharmony_ci } 266f08c3bdfSopenharmony_ci 267f08c3bdfSopenharmony_ci /****************************************/ 268f08c3bdfSopenharmony_ci /* */ 269f08c3bdfSopenharmony_ci /* .....and exit main */ 270f08c3bdfSopenharmony_ci /* */ 271f08c3bdfSopenharmony_ci /****************************************/ 272f08c3bdfSopenharmony_ci 273f08c3bdfSopenharmony_ci anyfail(); 274f08c3bdfSopenharmony_ci /***** NOT REACHED ******/ 275f08c3bdfSopenharmony_ci tst_exit(); 276f08c3bdfSopenharmony_ci} 277f08c3bdfSopenharmony_ci 278f08c3bdfSopenharmony_ciint generate(char *string, int level) 279f08c3bdfSopenharmony_ci 280f08c3bdfSopenharmony_ci/****************************************/ 281f08c3bdfSopenharmony_ci/* */ 282f08c3bdfSopenharmony_ci/* generate recursively a tree of */ 283f08c3bdfSopenharmony_ci/* directories and files: within */ 284f08c3bdfSopenharmony_ci/* created directory, an alternating */ 285f08c3bdfSopenharmony_ci/* series of files and directories */ 286f08c3bdfSopenharmony_ci/* are constructed---until tree */ 287f08c3bdfSopenharmony_ci/* breadth and depth limits are */ 288f08c3bdfSopenharmony_ci/* reached or an error occurs */ 289f08c3bdfSopenharmony_ci/* */ 290f08c3bdfSopenharmony_ci/****************************************/ 291f08c3bdfSopenharmony_ci/***************************/ 292f08c3bdfSopenharmony_ci/* string[] */ 293f08c3bdfSopenharmony_ci/* the directory path */ 294f08c3bdfSopenharmony_ci/* string below which a */ 295f08c3bdfSopenharmony_ci/* tree is generated */ 296f08c3bdfSopenharmony_ci/* */ 297f08c3bdfSopenharmony_ci/***************************/ 298f08c3bdfSopenharmony_ci 299f08c3bdfSopenharmony_ci/***************************/ 300f08c3bdfSopenharmony_ci/* level */ 301f08c3bdfSopenharmony_ci/* the tree depth variable */ 302f08c3bdfSopenharmony_ci/* */ 303f08c3bdfSopenharmony_ci/***************************/ 304f08c3bdfSopenharmony_ci{ 305f08c3bdfSopenharmony_ci int switch_flag; 306f08c3bdfSopenharmony_ci int ret_val = 0; 307f08c3bdfSopenharmony_ci int new_ret_val, len, ret_len; 308f08c3bdfSopenharmony_ci char new_string[PATH_STRING_LENGTH + 1]; 309f08c3bdfSopenharmony_ci int new_level; 310f08c3bdfSopenharmony_ci int i, j; /* iteration counters */ 311f08c3bdfSopenharmony_ci int snp_ret; 312f08c3bdfSopenharmony_ci 313f08c3bdfSopenharmony_ci switch_flag = level & TRUE; 314f08c3bdfSopenharmony_ci if (strlen(string) >= MAX_PATH_STRING_LENGTH) { 315f08c3bdfSopenharmony_ci 316f08c3bdfSopenharmony_ci /********************************/ 317f08c3bdfSopenharmony_ci /* */ 318f08c3bdfSopenharmony_ci /* Maximum path name length */ 319f08c3bdfSopenharmony_ci /* reached */ 320f08c3bdfSopenharmony_ci /* */ 321f08c3bdfSopenharmony_ci /********************************/ 322f08c3bdfSopenharmony_ci 323f08c3bdfSopenharmony_ci fprintf(temp, "\tMaximum path_name length reached.\n"); 324f08c3bdfSopenharmony_ci return (-1); 325f08c3bdfSopenharmony_ci } else if (level < MAX_DEPTH) { 326f08c3bdfSopenharmony_ci for (i = 0; i <= MAX_BREADTH; i++) { 327f08c3bdfSopenharmony_ci get_next_name(); 328f08c3bdfSopenharmony_ci snp_ret = snprintf(new_string, sizeof(new_string), 329f08c3bdfSopenharmony_ci "%s/%s", string, name); 330f08c3bdfSopenharmony_ci if (snp_ret < 0 || snp_ret >= sizeof(new_string)) { 331f08c3bdfSopenharmony_ci tst_resm(TBROK, "snprintf(new_string,..) " 332f08c3bdfSopenharmony_ci "returned %d", snp_ret); 333f08c3bdfSopenharmony_ci fail_exit(); 334f08c3bdfSopenharmony_ci } 335f08c3bdfSopenharmony_ci 336f08c3bdfSopenharmony_ci /****************************************/ 337f08c3bdfSopenharmony_ci /* */ 338f08c3bdfSopenharmony_ci /* switch between creating files */ 339f08c3bdfSopenharmony_ci /* and making directories */ 340f08c3bdfSopenharmony_ci /* */ 341f08c3bdfSopenharmony_ci /****************************************/ 342f08c3bdfSopenharmony_ci 343f08c3bdfSopenharmony_ci if (switch_flag) { 344f08c3bdfSopenharmony_ci switch_flag = FALSE; 345f08c3bdfSopenharmony_ci 346f08c3bdfSopenharmony_ci /****************************************/ 347f08c3bdfSopenharmony_ci /* */ 348f08c3bdfSopenharmony_ci /* create a new file */ 349f08c3bdfSopenharmony_ci /* */ 350f08c3bdfSopenharmony_ci /****************************************/ 351f08c3bdfSopenharmony_ci 352f08c3bdfSopenharmony_ci file_id = creat(new_string, FILE_MODE); 353f08c3bdfSopenharmony_ci if (file_id == -1) { 354f08c3bdfSopenharmony_ci fprintf(temp, 355f08c3bdfSopenharmony_ci "\tImpossible to create file %s, errno=%d\n", 356f08c3bdfSopenharmony_ci new_string, errno); 357f08c3bdfSopenharmony_ci return (-2); 358f08c3bdfSopenharmony_ci } 359f08c3bdfSopenharmony_ci#ifdef PRINT 360f08c3bdfSopenharmony_ci printf("%d %s F\n", level, new_string); 361f08c3bdfSopenharmony_ci#endif 362f08c3bdfSopenharmony_ci 363f08c3bdfSopenharmony_ci /****************************************/ 364f08c3bdfSopenharmony_ci /* */ 365f08c3bdfSopenharmony_ci /* write to it */ 366f08c3bdfSopenharmony_ci /* */ 367f08c3bdfSopenharmony_ci /****************************************/ 368f08c3bdfSopenharmony_ci 369f08c3bdfSopenharmony_ci len = strlen(new_string); 370f08c3bdfSopenharmony_ci for (j = 1; j <= FILE_LENGTH; j++) { 371f08c3bdfSopenharmony_ci ret_len = 372f08c3bdfSopenharmony_ci write(file_id, new_string, len); 373f08c3bdfSopenharmony_ci if (ret_len != len) { 374f08c3bdfSopenharmony_ci fprintf(temp, 375f08c3bdfSopenharmony_ci "\tUnsuccessful write to file %s, expected return of %d, got %d, errno=%d\n", 376f08c3bdfSopenharmony_ci new_string, len, 377f08c3bdfSopenharmony_ci ret_len, errno); 378f08c3bdfSopenharmony_ci return (-3); 379f08c3bdfSopenharmony_ci } 380f08c3bdfSopenharmony_ci } 381f08c3bdfSopenharmony_ci close(file_id); 382f08c3bdfSopenharmony_ci 383f08c3bdfSopenharmony_ci /****************************************/ 384f08c3bdfSopenharmony_ci /* */ 385f08c3bdfSopenharmony_ci /* and store its name in path_list */ 386f08c3bdfSopenharmony_ci /* */ 387f08c3bdfSopenharmony_ci /****************************************/ 388f08c3bdfSopenharmony_ci 389f08c3bdfSopenharmony_ci strcpy(write_string, new_string); 390f08c3bdfSopenharmony_ci len = strlen(write_string); 391f08c3bdfSopenharmony_ci write_string[len++] = 'F'; 392f08c3bdfSopenharmony_ci write_string[len] = '\0'; 393f08c3bdfSopenharmony_ci escrivez(write_string); 394f08c3bdfSopenharmony_ci } else { 395f08c3bdfSopenharmony_ci switch_flag = TRUE; 396f08c3bdfSopenharmony_ci 397f08c3bdfSopenharmony_ci /****************************************/ 398f08c3bdfSopenharmony_ci /* */ 399f08c3bdfSopenharmony_ci /* or make a directory */ 400f08c3bdfSopenharmony_ci /* */ 401f08c3bdfSopenharmony_ci /****************************************/ 402f08c3bdfSopenharmony_ci 403f08c3bdfSopenharmony_ci ret_val = mkdir(new_string, DIRECTORY_MODE); 404f08c3bdfSopenharmony_ci 405f08c3bdfSopenharmony_ci if (ret_val != 0) { 406f08c3bdfSopenharmony_ci fprintf(temp, 407f08c3bdfSopenharmony_ci "\tImpossible to create directory %s, errno=%d\n", 408f08c3bdfSopenharmony_ci new_string, errno); 409f08c3bdfSopenharmony_ci return (-5); 410f08c3bdfSopenharmony_ci } 411f08c3bdfSopenharmony_ci#ifdef PRINT 412f08c3bdfSopenharmony_ci printf("%d %s D\n", level, new_string); 413f08c3bdfSopenharmony_ci#endif 414f08c3bdfSopenharmony_ci 415f08c3bdfSopenharmony_ci /****************************************/ 416f08c3bdfSopenharmony_ci /* */ 417f08c3bdfSopenharmony_ci /* store its name in path_list */ 418f08c3bdfSopenharmony_ci /* */ 419f08c3bdfSopenharmony_ci /****************************************/ 420f08c3bdfSopenharmony_ci 421f08c3bdfSopenharmony_ci strcpy(write_string, new_string); 422f08c3bdfSopenharmony_ci len = strlen(write_string); 423f08c3bdfSopenharmony_ci write_string[len++] = 'D'; 424f08c3bdfSopenharmony_ci write_string[len] = '\0'; 425f08c3bdfSopenharmony_ci escrivez(write_string); 426f08c3bdfSopenharmony_ci 427f08c3bdfSopenharmony_ci /****************************************/ 428f08c3bdfSopenharmony_ci /* */ 429f08c3bdfSopenharmony_ci /* and generate a new level */ 430f08c3bdfSopenharmony_ci /* */ 431f08c3bdfSopenharmony_ci /****************************************/ 432f08c3bdfSopenharmony_ci 433f08c3bdfSopenharmony_ci new_level = level + 1; 434f08c3bdfSopenharmony_ci new_ret_val = generate(new_string, new_level); 435f08c3bdfSopenharmony_ci if (new_ret_val < ret_val) 436f08c3bdfSopenharmony_ci ret_val = new_ret_val; 437f08c3bdfSopenharmony_ci } 438f08c3bdfSopenharmony_ci } 439f08c3bdfSopenharmony_ci 440f08c3bdfSopenharmony_ci /********************************/ 441f08c3bdfSopenharmony_ci /* */ 442f08c3bdfSopenharmony_ci /* Maximum breadth reached */ 443f08c3bdfSopenharmony_ci /* */ 444f08c3bdfSopenharmony_ci /********************************/ 445f08c3bdfSopenharmony_ci 446f08c3bdfSopenharmony_ci return (ret_val); 447f08c3bdfSopenharmony_ci } else 448f08c3bdfSopenharmony_ci /********************************/ 449f08c3bdfSopenharmony_ci /* */ 450f08c3bdfSopenharmony_ci /* Maximum depth reached */ 451f08c3bdfSopenharmony_ci /* */ 452f08c3bdfSopenharmony_ci /********************************/ 453f08c3bdfSopenharmony_ci return 0; 454f08c3bdfSopenharmony_ci} 455f08c3bdfSopenharmony_ci 456f08c3bdfSopenharmony_ciint check(void) 457f08c3bdfSopenharmony_ci 458f08c3bdfSopenharmony_ci/****************************************/ 459f08c3bdfSopenharmony_ci/* */ 460f08c3bdfSopenharmony_ci/* check for file and directory */ 461f08c3bdfSopenharmony_ci/* correctness by reading records */ 462f08c3bdfSopenharmony_ci/* from the path_list and attempting */ 463f08c3bdfSopenharmony_ci/* to determine if the corresponding */ 464f08c3bdfSopenharmony_ci/* files or directories are as */ 465f08c3bdfSopenharmony_ci/* created */ 466f08c3bdfSopenharmony_ci/* */ 467f08c3bdfSopenharmony_ci/****************************************/ 468f08c3bdfSopenharmony_ci{ 469f08c3bdfSopenharmony_ci int len, path_mode, val, ret_len, j; 470f08c3bdfSopenharmony_ci 471f08c3bdfSopenharmony_ci for (;;) { 472f08c3bdfSopenharmony_ci 473f08c3bdfSopenharmony_ci /****************************************/ 474f08c3bdfSopenharmony_ci /* */ 475f08c3bdfSopenharmony_ci /* read a path string from path_list */ 476f08c3bdfSopenharmony_ci /* */ 477f08c3bdfSopenharmony_ci /****************************************/ 478f08c3bdfSopenharmony_ci 479f08c3bdfSopenharmony_ci if (fscanf(list_stream, "%s", path_string) == EOF) { 480f08c3bdfSopenharmony_ci 481f08c3bdfSopenharmony_ci#ifdef PRINT 482f08c3bdfSopenharmony_ci printf("\nEnd of path_list file reached \n"); 483f08c3bdfSopenharmony_ci#endif 484f08c3bdfSopenharmony_ci 485f08c3bdfSopenharmony_ci return 0; 486f08c3bdfSopenharmony_ci } 487f08c3bdfSopenharmony_ci#ifdef PRINT 488f08c3bdfSopenharmony_ci printf("%s\n", path_string); 489f08c3bdfSopenharmony_ci#endif 490f08c3bdfSopenharmony_ci 491f08c3bdfSopenharmony_ci len = strlen(path_string); 492f08c3bdfSopenharmony_ci len--; 493f08c3bdfSopenharmony_ci if (path_string[len] == 'F') { 494f08c3bdfSopenharmony_ci 495f08c3bdfSopenharmony_ci /********************************/ 496f08c3bdfSopenharmony_ci /* */ 497f08c3bdfSopenharmony_ci /* this should be a file */ 498f08c3bdfSopenharmony_ci /* */ 499f08c3bdfSopenharmony_ci /********************************/ 500f08c3bdfSopenharmony_ci 501f08c3bdfSopenharmony_ci path_string[len] = '\0'; 502f08c3bdfSopenharmony_ci file_id = open(path_string, READ); 503f08c3bdfSopenharmony_ci if (file_id <= 0) { 504f08c3bdfSopenharmony_ci fprintf(temp, 505f08c3bdfSopenharmony_ci "\tImpossible to open file %s, errno=%d\n", 506f08c3bdfSopenharmony_ci path_string, errno); 507f08c3bdfSopenharmony_ci return (-1); 508f08c3bdfSopenharmony_ci } 509f08c3bdfSopenharmony_ci 510f08c3bdfSopenharmony_ci else { 511f08c3bdfSopenharmony_ci /********************************/ 512f08c3bdfSopenharmony_ci /* */ 513f08c3bdfSopenharmony_ci /* check its contents */ 514f08c3bdfSopenharmony_ci /* */ 515f08c3bdfSopenharmony_ci /********************************/ 516f08c3bdfSopenharmony_ci 517f08c3bdfSopenharmony_ci len = strlen(path_string); 518f08c3bdfSopenharmony_ci for (j = 1; j <= FILE_LENGTH; j++) { 519f08c3bdfSopenharmony_ci ret_len = 520f08c3bdfSopenharmony_ci read(file_id, read_string, len); 521f08c3bdfSopenharmony_ci if (len != ret_len) { 522f08c3bdfSopenharmony_ci fprintf(temp, 523f08c3bdfSopenharmony_ci "\tFile read error for file %s, expected return of %d, got %d, errno=%d\n", 524f08c3bdfSopenharmony_ci path_string, len, 525f08c3bdfSopenharmony_ci ret_len, errno); 526f08c3bdfSopenharmony_ci return (-3); 527f08c3bdfSopenharmony_ci } 528f08c3bdfSopenharmony_ci read_string[len] = '\0'; 529f08c3bdfSopenharmony_ci val = strcmp(read_string, path_string); 530f08c3bdfSopenharmony_ci if (val != 0) { 531f08c3bdfSopenharmony_ci fprintf(temp, 532f08c3bdfSopenharmony_ci "\tContents of file %s are different than expected: %s\n", 533f08c3bdfSopenharmony_ci path_string, 534f08c3bdfSopenharmony_ci read_string); 535f08c3bdfSopenharmony_ci return (-4); 536f08c3bdfSopenharmony_ci } 537f08c3bdfSopenharmony_ci } 538f08c3bdfSopenharmony_ci close(file_id); 539f08c3bdfSopenharmony_ci } /* else for */ 540f08c3bdfSopenharmony_ci if (ret_len <= 0) { 541f08c3bdfSopenharmony_ci fprintf(temp, "\tImpossible to read file %s\n", 542f08c3bdfSopenharmony_ci path_string); 543f08c3bdfSopenharmony_ci return (-2); 544f08c3bdfSopenharmony_ci } 545f08c3bdfSopenharmony_ci } else { 546f08c3bdfSopenharmony_ci 547f08c3bdfSopenharmony_ci /********************************/ 548f08c3bdfSopenharmony_ci /* */ 549f08c3bdfSopenharmony_ci /* otherwise.......... */ 550f08c3bdfSopenharmony_ci /* it should be a directory */ 551f08c3bdfSopenharmony_ci /* */ 552f08c3bdfSopenharmony_ci /********************************/ 553f08c3bdfSopenharmony_ci 554f08c3bdfSopenharmony_ci path_string[len] = '\0'; 555f08c3bdfSopenharmony_ci path_mode = mode(path_string); 556f08c3bdfSopenharmony_ci if (path_mode == -1) { 557f08c3bdfSopenharmony_ci fprintf(temp, 558f08c3bdfSopenharmony_ci "\tPreviously created directory path %s was not open\n", 559f08c3bdfSopenharmony_ci path_string); 560f08c3bdfSopenharmony_ci return (-4); 561f08c3bdfSopenharmony_ci } 562f08c3bdfSopenharmony_ci if ((040000 & path_mode) != 040000) { 563f08c3bdfSopenharmony_ci fprintf(temp, 564f08c3bdfSopenharmony_ci "\tPath %s was not recognized to be a directory\n", 565f08c3bdfSopenharmony_ci path_string); 566f08c3bdfSopenharmony_ci fprintf(temp, "\tIts mode is %o\n", path_mode); 567f08c3bdfSopenharmony_ci return (-5); 568f08c3bdfSopenharmony_ci } 569f08c3bdfSopenharmony_ci } 570f08c3bdfSopenharmony_ci } /* while */ 571f08c3bdfSopenharmony_ci} 572f08c3bdfSopenharmony_ci 573f08c3bdfSopenharmony_ciint get_next_name(void) 574f08c3bdfSopenharmony_ci 575f08c3bdfSopenharmony_ci/****************************************/ 576f08c3bdfSopenharmony_ci/* */ 577f08c3bdfSopenharmony_ci/* get the next---in a dictionary */ 578f08c3bdfSopenharmony_ci/* sense---file or directory name */ 579f08c3bdfSopenharmony_ci/* */ 580f08c3bdfSopenharmony_ci/****************************************/ 581f08c3bdfSopenharmony_ci{ 582f08c3bdfSopenharmony_ci static int k; 583f08c3bdfSopenharmony_ci int i; 584f08c3bdfSopenharmony_ci int last_position; 585f08c3bdfSopenharmony_ci 586f08c3bdfSopenharmony_ci last_position = NAME_LENGTH - 1; 587f08c3bdfSopenharmony_ci if (k == 0) { 588f08c3bdfSopenharmony_ci 589f08c3bdfSopenharmony_ci /************************/ 590f08c3bdfSopenharmony_ci /* */ 591f08c3bdfSopenharmony_ci /* initialize name */ 592f08c3bdfSopenharmony_ci /* */ 593f08c3bdfSopenharmony_ci /************************/ 594f08c3bdfSopenharmony_ci 595f08c3bdfSopenharmony_ci for (i = 0; i < NAME_LENGTH; i++) 596f08c3bdfSopenharmony_ci name[i] = 'a'; 597f08c3bdfSopenharmony_ci name[NAME_LENGTH] = '\0'; 598f08c3bdfSopenharmony_ci k++; 599f08c3bdfSopenharmony_ci } 600f08c3bdfSopenharmony_ci /********************************/ 601f08c3bdfSopenharmony_ci /* */ 602f08c3bdfSopenharmony_ci else 603f08c3bdfSopenharmony_ci increment_name(last_position); /* i.e., beginning at the last */ 604f08c3bdfSopenharmony_ci /* position */ 605f08c3bdfSopenharmony_ci /* */ 606f08c3bdfSopenharmony_ci /********************************/ 607f08c3bdfSopenharmony_ci return 0; 608f08c3bdfSopenharmony_ci} 609f08c3bdfSopenharmony_ci 610f08c3bdfSopenharmony_ciint increment_name(int position) 611f08c3bdfSopenharmony_ci 612f08c3bdfSopenharmony_ci/****************************************/ 613f08c3bdfSopenharmony_ci/* */ 614f08c3bdfSopenharmony_ci/* recursively revise the letters in */ 615f08c3bdfSopenharmony_ci/* a name to get the lexiographically */ 616f08c3bdfSopenharmony_ci/* next name */ 617f08c3bdfSopenharmony_ci/* */ 618f08c3bdfSopenharmony_ci/****************************************/ 619f08c3bdfSopenharmony_ci{ 620f08c3bdfSopenharmony_ci int next_position; 621f08c3bdfSopenharmony_ci 622f08c3bdfSopenharmony_ci if (name[position] == 'z') 623f08c3bdfSopenharmony_ci if (position == 0) { 624f08c3bdfSopenharmony_ci fprintf(temp, 625f08c3bdfSopenharmony_ci "\tERROR: There are no more available names\n"); 626f08c3bdfSopenharmony_ci fail_exit(); 627f08c3bdfSopenharmony_ci } else { 628f08c3bdfSopenharmony_ci name[position] = 'a'; /**********************/ 629f08c3bdfSopenharmony_ci next_position = --position; /* */ 630f08c3bdfSopenharmony_ci increment_name(next_position); /* increment the */ 631f08c3bdfSopenharmony_ci /* previous letter */ 632f08c3bdfSopenharmony_ci /* */ 633f08c3bdfSopenharmony_ci /**********************/ 634f08c3bdfSopenharmony_ci } 635f08c3bdfSopenharmony_ci /*********************************/ 636f08c3bdfSopenharmony_ci /* */ 637f08c3bdfSopenharmony_ci else 638f08c3bdfSopenharmony_ci name[position]++; /* otherwise, increment this one */ 639f08c3bdfSopenharmony_ci return 0; /* */ 640f08c3bdfSopenharmony_ci /*********************************/ 641f08c3bdfSopenharmony_ci} 642f08c3bdfSopenharmony_ci 643f08c3bdfSopenharmony_ciint mode(char *path_string) 644f08c3bdfSopenharmony_ci 645f08c3bdfSopenharmony_ci/****************************************/ 646f08c3bdfSopenharmony_ci/* */ 647f08c3bdfSopenharmony_ci/* determine and return the mode of */ 648f08c3bdfSopenharmony_ci/* the file named by path_string */ 649f08c3bdfSopenharmony_ci/* */ 650f08c3bdfSopenharmony_ci/****************************************/ 651f08c3bdfSopenharmony_ci{ 652f08c3bdfSopenharmony_ci struct stat buf; 653f08c3bdfSopenharmony_ci int ret_val, mod; 654f08c3bdfSopenharmony_ci 655f08c3bdfSopenharmony_ci ret_val = stat(path_string, &buf); 656f08c3bdfSopenharmony_ci if (ret_val == -1) 657f08c3bdfSopenharmony_ci return (-1); 658f08c3bdfSopenharmony_ci else { 659f08c3bdfSopenharmony_ci mod = buf.st_mode; 660f08c3bdfSopenharmony_ci return (mod); 661f08c3bdfSopenharmony_ci } 662f08c3bdfSopenharmony_ci} 663f08c3bdfSopenharmony_ci 664f08c3bdfSopenharmony_ciint escrivez(char *string) 665f08c3bdfSopenharmony_ci{ 666f08c3bdfSopenharmony_ci char write_string[PATH_STRING_LENGTH + 1]; 667f08c3bdfSopenharmony_ci int len, ret_len; 668f08c3bdfSopenharmony_ci 669f08c3bdfSopenharmony_ci strcpy(write_string, string); 670f08c3bdfSopenharmony_ci len = strlen(write_string); 671f08c3bdfSopenharmony_ci write_string[len] = '\n'; 672f08c3bdfSopenharmony_ci len++; 673f08c3bdfSopenharmony_ci ret_len = write(list_id, write_string, len); 674f08c3bdfSopenharmony_ci if (len != ret_len) { 675f08c3bdfSopenharmony_ci fprintf(temp, 676f08c3bdfSopenharmony_ci "\tA string of deviant length %d written to path_list, errno=%d\n", 677f08c3bdfSopenharmony_ci ret_len, errno); 678f08c3bdfSopenharmony_ci fail_exit(); 679f08c3bdfSopenharmony_ci } 680f08c3bdfSopenharmony_ci return 0; 681f08c3bdfSopenharmony_ci} 682f08c3bdfSopenharmony_ci 683f08c3bdfSopenharmony_ciint term(void) 684f08c3bdfSopenharmony_ci{ 685f08c3bdfSopenharmony_ci int status; 686f08c3bdfSopenharmony_ci 687f08c3bdfSopenharmony_ci fprintf(temp, "\tterm - got SIGTERM, cleaning up.\n"); 688f08c3bdfSopenharmony_ci 689f08c3bdfSopenharmony_ci if (list_stream != NULL) 690f08c3bdfSopenharmony_ci fclose(list_stream); 691f08c3bdfSopenharmony_ci close(list_id); 692f08c3bdfSopenharmony_ci close(file_id); 693f08c3bdfSopenharmony_ci 694f08c3bdfSopenharmony_ci status = system(rm_string); 695f08c3bdfSopenharmony_ci if (status) { 696f08c3bdfSopenharmony_ci fprintf(temp, "Caution - ``%s'' may have failed.\n", rm_string); 697f08c3bdfSopenharmony_ci fprintf(temp, "rm command exit status = %d\n", status); 698f08c3bdfSopenharmony_ci } 699f08c3bdfSopenharmony_ci 700f08c3bdfSopenharmony_ci ok_exit(); 701f08c3bdfSopenharmony_ci /***NOT REACHED***/ 702f08c3bdfSopenharmony_ci return 0; 703f08c3bdfSopenharmony_ci 704f08c3bdfSopenharmony_ci} 705f08c3bdfSopenharmony_ci 706f08c3bdfSopenharmony_ci/** LTP Port **/ 707f08c3bdfSopenharmony_ci/* 708f08c3bdfSopenharmony_ci * setup 709f08c3bdfSopenharmony_ci * 710f08c3bdfSopenharmony_ci * Do set up - here its a dummy function 711f08c3bdfSopenharmony_ci */ 712f08c3bdfSopenharmony_civoid setup(void) 713f08c3bdfSopenharmony_ci{ 714f08c3bdfSopenharmony_ci tst_tmpdir(); 715f08c3bdfSopenharmony_ci temp = stderr; 716f08c3bdfSopenharmony_ci} 717f08c3bdfSopenharmony_ci 718f08c3bdfSopenharmony_ci/* 719f08c3bdfSopenharmony_ci * Function: blexit() 720f08c3bdfSopenharmony_ci * 721f08c3bdfSopenharmony_ci * Description: This function will exit a block, a block may be a lo 722f08c3bdfSopenharmony_cigical unit 723f08c3bdfSopenharmony_ci * of a test. It will report the status if the test ie 724f08c3bdfSopenharmony_cifail or 725f08c3bdfSopenharmony_ci * pass. 726f08c3bdfSopenharmony_ci */ 727f08c3bdfSopenharmony_civoid blexit(void) 728f08c3bdfSopenharmony_ci{ 729f08c3bdfSopenharmony_ci (local_flag == PASSED) ? tst_resm(TPASS, "Test block %d", block_number) 730f08c3bdfSopenharmony_ci : tst_resm(TFAIL, "Test block %d", block_number); 731f08c3bdfSopenharmony_ci block_number++; 732f08c3bdfSopenharmony_ci return; 733f08c3bdfSopenharmony_ci} 734f08c3bdfSopenharmony_ci 735f08c3bdfSopenharmony_ci/* 736f08c3bdfSopenharmony_ci * Function: blenter() 737f08c3bdfSopenharmony_ci * 738f08c3bdfSopenharmony_ci * Description: Print message on entering a new block 739f08c3bdfSopenharmony_ci */ 740f08c3bdfSopenharmony_civoid blenter(void) 741f08c3bdfSopenharmony_ci{ 742f08c3bdfSopenharmony_ci local_flag = PASSED; 743f08c3bdfSopenharmony_ci return; 744f08c3bdfSopenharmony_ci} 745f08c3bdfSopenharmony_ci 746f08c3bdfSopenharmony_ci/* 747f08c3bdfSopenharmony_ci * fail_exit() 748f08c3bdfSopenharmony_ci * 749f08c3bdfSopenharmony_ci * Exit on failure 750f08c3bdfSopenharmony_ci */ 751f08c3bdfSopenharmony_civoid fail_exit(void) 752f08c3bdfSopenharmony_ci{ 753f08c3bdfSopenharmony_ci tst_brkm(TFAIL, tst_rmdir, "Test failed"); 754f08c3bdfSopenharmony_ci} 755f08c3bdfSopenharmony_ci 756f08c3bdfSopenharmony_ci/* 757f08c3bdfSopenharmony_ci * 758f08c3bdfSopenharmony_ci * Function: anyfail() 759f08c3bdfSopenharmony_ci * 760f08c3bdfSopenharmony_ci * Description: Exit a test. 761f08c3bdfSopenharmony_ci */ 762f08c3bdfSopenharmony_civoid anyfail(void) 763f08c3bdfSopenharmony_ci{ 764f08c3bdfSopenharmony_ci (local_flag == FAILED) ? tst_resm(TFAIL, "Test failed") 765f08c3bdfSopenharmony_ci : tst_resm(TPASS, "Test passed"); 766f08c3bdfSopenharmony_ci tst_rmdir(); 767f08c3bdfSopenharmony_ci tst_exit(); 768f08c3bdfSopenharmony_ci} 769f08c3bdfSopenharmony_ci 770f08c3bdfSopenharmony_ci/* 771f08c3bdfSopenharmony_ci * ok_exit 772f08c3bdfSopenharmony_ci * 773f08c3bdfSopenharmony_ci * Calling block passed the test 774f08c3bdfSopenharmony_ci */ 775f08c3bdfSopenharmony_civoid ok_exit(void) 776f08c3bdfSopenharmony_ci{ 777f08c3bdfSopenharmony_ci local_flag = PASSED; 778f08c3bdfSopenharmony_ci return; 779f08c3bdfSopenharmony_ci} 780