| /* 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; |
| } |