/* Tests sendfilev with bogus inputs. */ #include <errno.h> #include <fcntl.h> #include <stdio.h> #include <string.h> #include <strings.h> #include <unistd.h> #include <sys/sendfile.h> #define CHUNK (8 * 1024) #define TEST_FILE "sendfile.test" int main(int argc, const char *argv[]) { int test_fd = open(TEST_FILE, O_WRONLY | O_CREAT, 0666); if (test_fd < 0) { int error = errno; fprintf(stderr, "open failed: %s (%d).\n", strerror(error), error); return 1; } char chunk1[CHUNK]; bzero(&chunk1, sizeof(chunk1)); ssize_t nbytes = write(test_fd, &chunk1, sizeof(chunk1)); if (nbytes != CHUNK) { int error = errno; fprintf(stderr, "write failed (nbytes=%zd): %s (%d).\n", nbytes, strerror(error), error); return 1; } close(test_fd); printf("Test file created.\n"); test_fd = open(TEST_FILE, O_RDWR, 0666); if (test_fd < 0) { int error = errno; fprintf(stderr, "open failed: %s (%d).\n", strerror(error), error); return 1; } sendfilevec_t vec[2]; vec[0].sfv_fd = SFV_FD_SELF; vec[0].sfv_off = -1; vec[0].sfv_len = 1; vec[0].sfv_flag = 0; vec[1].sfv_fd = test_fd; vec[1].sfv_off = 0; vec[1].sfv_len = CHUNK; vec[1].sfv_flag = 0; size_t xferred; nbytes = sendfilev(test_fd, vec, 2, &xferred); if (nbytes < 0) { if (errno == EFAULT) { printf("Received EFAULT as expected.\n"); } else { fprintf(stderr, "Expected EFAULT, got %d.\n", errno); } } else { fprintf(stderr, "Error: sendfilev returned a positive value.\n"); } nbytes = sendfilev(test_fd, vec, -1, &xferred); if (nbytes < 0) { if (errno == EINVAL) { printf("Received EINVAL as expected.\n"); } else { fprintf(stderr, "Expected EINVAL, got %d.\n", errno); } } else { fprintf(stderr, "Error: sendfilev returned a positive value.\n"); } vec[0].sfv_off = (off_t) "HEADER"; vec[0].sfv_len = 6; nbytes = sendfilev(test_fd, vec, 1, &xferred); if (nbytes < 0) { int error = errno; fprintf(stderr, "sendfilev failed: %s (%d).\n", strerror(error), error); } else { printf("sendfilev for the first buffer succeeded.\n"); } unlink(TEST_FILE); return 0; }