1 /* 2 * Copyright (c) 2004, Bull S.A.. All rights reserved. 3 * Created by: Sebastien Decugis 4 5 * This program is free software; you can redistribute it and/or modify it 6 * under the terms of version 2 of the GNU General Public License as 7 * published by the Free Software Foundation. 8 * 9 * This program is distributed in the hope that it would be useful, but 10 * WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 12 * 13 * You should have received a copy of the GNU General Public License along 14 * with this program; if not, write the Free Software Foundation, Inc., 15 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 16 17 * This sample test aims to check the following assertion: 18 * 19 * The opened directory streams are copied to the child process. 20 * Positionning information may be shared between both processes. 21 22 * The steps are: 23 * -> Open the current directory, 24 * -> Count the directory entries, then rewind. 25 * -> create a child 26 * -> The child counts the directory entries. 27 28 * The test fails if the directory is read in the parent and not in the child. 29 30 */ 31 32 33 #include <pthread.h> 34 #include <stdarg.h> 35 #include <stdio.h> 36 #include <stdlib.h> 37 #include <string.h> 38 #include <unistd.h> 39 40 #include <sys/wait.h> 41 #include <errno.h> 42 43 #include <dirent.h> 44 45 #include "../testfrmw/testfrmw.h" 46 #include "../testfrmw/testfrmw.c" 47 48 #ifndef VERBOSE 49 #define VERBOSE 1 50 #endif 51 52 static int count(DIR * thedir) 53 { 54 int counter = 0; 55 56 struct dirent *dp; 57 58 rewinddir(thedir); 59 60 /* Count the directory entries */ 61 62 do { 63 dp = readdir(thedir); 64 65 if (dp != NULL) 66 counter++; 67 } 68 while (dp != NULL); 69 70 return counter; 71 } 72 73 int main(void) 74 { 75 int ret, status; 76 pid_t child, ctl; 77 78 int counted; 79 80 /* the '.' directory pointers */ 81 DIR *dotdir; 82 83 output_init(); 84 85 /* Open the directory */ 86 dotdir = opendir("."); 87 88 if (dotdir == NULL) { 89 UNRESOLVED(errno, "opendir failed"); 90 } 91 92 /* Count entries */ 93 counted = count(dotdir); 94 95 #if VERBOSE > 0 96 97 output("Found %d entries in current dir\n", counted); 98 99 #endif 100 101 /* Create the child */ 102 child = fork(); 103 104 if (child == -1) { 105 UNRESOLVED(errno, "Failed to fork"); 106 } 107 108 /* child */ 109 if (child == 0) { 110 /* Count in child process */ 111 counted = count(dotdir); 112 113 #if VERBOSE > 0 114 115 output("Found %d entries in current dir from child\n", counted); 116 #endif 117 118 ret = closedir(dotdir); 119 120 if (ret != 0) { 121 UNRESOLVED(errno, "Failed to close dir in child"); 122 } 123 124 /* We're done */ 125 exit(PTS_PASS); 126 } 127 128 /* Parent joins the child */ 129 ctl = waitpid(child, &status, 0); 130 131 if (ctl != child) { 132 UNRESOLVED(errno, "Waitpid returned the wrong PID"); 133 } 134 135 if (!WIFEXITED(status) || (WEXITSTATUS(status) != PTS_PASS)) { 136 FAILED("Child exited abnormally -- dir stream not copied?"); 137 } 138 139 /* close the directory stream */ 140 ret = closedir(dotdir); 141 142 if (ret != 0) { 143 UNRESOLVED(errno, "Failed to closedir in parent"); 144 } 145 146 #if VERBOSE > 0 147 output("Test passed\n"); 148 149 #endif 150 151 PASSED; 152 } 153