12 #define T1 "write data before unlink\n"
13 #define T2 "write data after unlink\n"
17 "Usage: %s filename command-sequence\n"
18 " command-sequence items:\n"
21 " O open(O_CREAT|O_RDWR)\n"
25 " M rw mmap to EOF (must open and stat prior)\n"
27 " _ wait for signal\n"
28 " R reference entire mmap-ed region\n"
33 " T ftruncate to zero\n"
35 " W write entire mmap-ed region\n"
40 void null_handler(int unused) { }
42 int main(int argc, char **argv)
44 char *fname, *commands;
47 unsigned char *mmap_ptr = NULL, junk = 0;
51 fprintf(stderr, usage, argv[0]);
55 signal(SIGUSR1, null_handler);
59 for (commands = argv[2]; *commands; commands++) {
65 if (close(fd) == -1) {
72 if (mkdir(fname, 0755) == -1) {
73 perror("mkdir(0755)");
78 if (mknod(fname, S_IFREG | 0644, 0) == -1) {
79 perror("mknod(S_IFREG|0644, 0)");
84 mmap_len = st.st_size;
85 mmap_ptr = mmap(NULL, mmap_len, PROT_WRITE | PROT_READ,
87 if (mmap_ptr == MAP_FAILED) {
93 fd = open(fname, O_CREAT|O_RDWR, 0644);
95 perror("open(O_RDWR|O_CREAT)");
100 fd = open(fname, O_RDONLY);
102 perror("open(O_RDONLY)");
108 if (read(fd, &buf, 1) == -1) {
114 if (fstat(fd, &st) == -1) {
120 for (i = 0; i < mmap_len && mmap_ptr; i += 4096)
124 if (stat(fname, &st) == -1) {
130 if (fchmod(fd, 0) == -1) {
136 if (ftruncate(fd, 0) == -1) {
142 if (unlink(fname) == -1) {
148 if (munmap(mmap_ptr, mmap_len)) {
154 if (write(fd, "w", 1) == -1) {
160 for (i = 0; i < mmap_len && mmap_ptr; i += 4096)
161 mmap_ptr[i] += junk++;
164 if (fsync(fd) == -1) {
170 if (fdatasync(fd) == -1) {
175 if (lseek(fd, 0, SEEK_SET) == -1) {
181 fprintf(stderr, "unknown command \"%c\"\n", *commands);
182 fprintf(stderr, usage, argv[0]);