blob: f99d5a56a497a8ea4bc4dbbeea35d6ed0401b9e8 [file] [log] [blame]
/* -*- Mode: C; tab-width: 8; c-basic-offset: 2; indent-tabs-mode: nil; -*- */
#include "util.h"
static char data[10] = "0123456789";
static void test(int use_preadv) {
static const char name[] = "temp";
int fd = open(name, O_CREAT | O_RDWR | O_EXCL, 0600);
struct {
char ch[7];
} * part1;
struct {
char ch[10];
} * part2;
struct iovec iovs[2];
ssize_t nread;
test_assert(fd >= 0);
test_assert(0 == unlink(name));
test_assert(sizeof(data) == write(fd, data, sizeof(data)));
ALLOCATE_GUARD(part1, 'x');
ALLOCATE_GUARD(part2, 'y');
iovs[0].iov_base = part1;
iovs[0].iov_len = sizeof(*part1);
iovs[1].iov_base = part2;
iovs[1].iov_len = sizeof(*part2);
if (use_preadv) {
/* Work around busted preadv prototype in older libcs */
nread = syscall(SYS_preadv, fd, iovs, 2, (off_t)0, 0);
} else {
test_assert(0 == lseek(fd, 0, SEEK_SET));
nread = readv(fd, iovs, 2);
}
test_assert(sizeof(data) == nread);
test_assert(0 == memcmp(part1, data, sizeof(*part1)));
test_assert(
0 == memcmp(part2, data + sizeof(*part1), sizeof(data) - sizeof(*part1)));
test_assert(part2->ch[sizeof(data) - sizeof(*part1)] == 'y');
VERIFY_GUARD(part1);
VERIFY_GUARD(part2);
}
int main(void) {
test(0);
test(1);
atomic_puts("EXIT-SUCCESS");
return 0;
}