2 test readdir/unlink pattern that OS/2 uses
3 tridge@samba.org July 2005
11 #include <sys/types.h>
18 #define READDIR_SIZE 100
21 #define TESTDIR "test.dir"
23 #define FAILED() (fprintf(stderr, "Failed at %s:%d - %s\n", __FUNCTION__, __LINE__, strerror(errno)), exit(1), 1)
26 #define MIN(a,b) ((a)<(b)?(a):(b))
29 static void cleanup(void)
31 /* I'm a lazy bastard */
32 system("rm -rf " TESTDIR);
33 mkdir(TESTDIR, 0700) == 0 || FAILED();
36 static void create_files()
39 for (i=0;i<NUM_FILES;i++) {
41 snprintf(fname, sizeof(fname), TESTDIR "/test%u.txt", i);
42 close(open(fname, O_CREAT|O_RDWR, 0600)) == 0 || FAILED();
46 static int os2_delete(DIR *d)
48 off_t offsets[READDIR_SIZE];
51 char names[READDIR_SIZE][30];
53 /* scan, remembering offsets */
54 for (i=0, de=readdir(d);
55 de && i < READDIR_SIZE;
57 offsets[i] = telldir(d);
58 strcpy(names[i], de->d_name);
65 /* delete the first few */
66 for (j=0; j<MIN(i, DELETE_SIZE); j++) {
68 snprintf(fname, sizeof(fname), TESTDIR "/%s", names[j]);
69 unlink(fname) == 0 || FAILED();
72 /* seek to just after the deletion */
73 seekdir(d, offsets[j-1]);
75 /* return number deleted */
81 int total_deleted = 0;
90 /* skip past . and .. */
92 strcmp(de->d_name, ".") == 0 || FAILED();
94 strcmp(de->d_name, "..") == 0 || FAILED();
97 int n = os2_delete(d);
103 printf("Deleted %d files of %d\n", total_deleted, NUM_FILES);
105 rmdir(TESTDIR) == 0 || FAILED();