| /* 5.t |
| - Write from a mmap() of the same file. (5.t) |
| */ |
| #include "aio_setup.h" |
| #include <sys/mman.h> |
| #include <errno.h> |
| |
| int test_main(void) |
| { |
| int page_size = getpagesize(); |
| #define SIZE 512 |
| char *buf; |
| int rwfd; |
| int status = 0, res; |
| |
| rwfd = open("testdir/rwfile", O_RDWR); assert(rwfd != -1); |
| res = ftruncate(rwfd, 512); assert(res == 0); |
| |
| buf = mmap(0, page_size, PROT_READ|PROT_WRITE, MAP_SHARED, rwfd, 0); |
| assert(buf != (char *)-1); |
| |
| status |= attempt_rw(rwfd, buf, SIZE, 0, WRITE, SIZE); |
| status |= attempt_rw(rwfd, buf, SIZE, 0, READ, SIZE); |
| |
| res = munmap(buf, page_size); assert(res == 0); |
| buf = mmap(0, page_size, PROT_READ|PROT_WRITE, MAP_SHARED, rwfd, 0); |
| assert(buf != (char *)-1); |
| |
| status |= attempt_rw(rwfd, buf, SIZE, 0, READ, SIZE); |
| status |= attempt_rw(rwfd, buf, SIZE, 0, WRITE, SIZE); |
| |
| res = munmap(buf, page_size); assert(res == 0); |
| buf = mmap(0, page_size, PROT_READ, MAP_SHARED, rwfd, 0); |
| assert(buf != (char *)-1); |
| |
| status |= attempt_rw(rwfd, buf, SIZE, 0, WRITE, SIZE); |
| status |= attempt_rw(rwfd, buf, SIZE, 0, READ, -EFAULT); |
| |
| res = munmap(buf, page_size); assert(res == 0); |
| buf = mmap(0, page_size, PROT_WRITE, MAP_SHARED, rwfd, 0); |
| assert(buf != (char *)-1); |
| |
| status |= attempt_rw(rwfd, buf, SIZE, 0, READ, SIZE); |
| |
| /* Whether PROT_WRITE is readable is arch-dependent. So compare |
| * against read result. */ |
| res = read(rwfd, buf, SIZE); |
| if (res < 0) |
| res = -errno; |
| status |= attempt_rw(rwfd, buf, SIZE, 0, WRITE, res); |
| |
| return status; |
| } |
| |