00001
00002
00003
00004
00005
00006 #include <stdio.h>
00007 #include <stdlib.h>
00008 #include <sys/stat.h>
00009 #include <unistd.h>
00010 #include <sys/types.h>
00011 #include <dirent.h>
00012 #include <errno.h>
00013 #include <string.h>
00014 #include <fcntl.h>
00015
00016 #define NUM_FILES 700
00017 #define READDIR_SIZE 100
00018 #define DELETE_SIZE 4
00019
00020 #define TESTDIR "test.dir"
00021
00022 static int test_readdir_os2_delete_ret;
00023
00024 #define FAILED(d) (printf("failure: readdir [\nFailed for %s - %d = %s\n]\n", d, errno, strerror(errno)), test_readdir_os2_delete_ret = 1, 1)
00025
00026 #ifndef MIN
00027 #define MIN(a,b) ((a)<(b)?(a):(b))
00028 #endif
00029
00030 static void cleanup(void)
00031 {
00032
00033 system("rm -rf " TESTDIR);
00034 mkdir(TESTDIR, 0700) == 0 || FAILED("mkdir");
00035 }
00036
00037 static void create_files(void)
00038 {
00039 int i;
00040 for (i=0;i<NUM_FILES;i++) {
00041 char fname[40];
00042 sprintf(fname, TESTDIR "/test%u.txt", i);
00043 close(open(fname, O_CREAT|O_RDWR, 0600)) == 0 || FAILED("close");
00044 }
00045 }
00046
00047 static int os2_delete(DIR *d)
00048 {
00049 off_t offsets[READDIR_SIZE];
00050 int i, j;
00051 struct dirent *de;
00052 char names[READDIR_SIZE][30];
00053
00054
00055 for (i=0, de=readdir(d);
00056 de && i < READDIR_SIZE;
00057 de=readdir(d), i++) {
00058 offsets[i] = telldir(d);
00059 strcpy(names[i], de->d_name);
00060 }
00061
00062 if (i == 0) {
00063 return 0;
00064 }
00065
00066
00067 for (j=0; j<MIN(i, DELETE_SIZE); j++) {
00068 char fname[40];
00069 sprintf(fname, TESTDIR "/%s", names[j]);
00070 unlink(fname) == 0 || FAILED("unlink");
00071 }
00072
00073
00074 seekdir(d, offsets[j-1]);
00075
00076
00077 return j;
00078 }
00079
00080 int test_readdir_os2_delete(void)
00081 {
00082 int total_deleted = 0;
00083 DIR *d;
00084 struct dirent *de;
00085
00086 test_readdir_os2_delete_ret = 0;
00087
00088 cleanup();
00089 create_files();
00090
00091 d = opendir(TESTDIR "/test0.txt");
00092 if (d != NULL) FAILED("opendir() on file succeed");
00093 if (errno != ENOTDIR) FAILED("opendir() on file didn't give ENOTDIR");
00094
00095 d = opendir(TESTDIR);
00096
00097
00098 de = readdir(d);
00099 strcmp(de->d_name, ".") == 0 || FAILED("match .");
00100 de = readdir(d);
00101 strcmp(de->d_name, "..") == 0 || FAILED("match ..");
00102
00103 while (1) {
00104 int n = os2_delete(d);
00105 if (n == 0) break;
00106 total_deleted += n;
00107 }
00108 closedir(d);
00109
00110 fprintf(stderr, "Deleted %d files of %d\n", total_deleted, NUM_FILES);
00111
00112 rmdir(TESTDIR) == 0 || FAILED("rmdir");
00113
00114 system("rm -rf " TESTDIR);
00115
00116 return test_readdir_os2_delete_ret;
00117 }