1f962a76fe5a33e6b505962d59a69d69394e16757njn#include <stdio.h> 29f5b781420f77a08b60e9472811cfaffacb414ebnjn#include <sys/types.h> 3f962a76fe5a33e6b505962d59a69d69394e16757njn#include <sys/uio.h> 4f962a76fe5a33e6b505962d59a69d69394e16757njn#include <fcntl.h> 5f962a76fe5a33e6b505962d59a69d69394e16757njn#include <errno.h> 6f962a76fe5a33e6b505962d59a69d69394e16757njn#include <unistd.h> 7f962a76fe5a33e6b505962d59a69d69394e16757njn#include <string.h> 8f962a76fe5a33e6b505962d59a69d69394e16757njn 99f5b781420f77a08b60e9472811cfaffacb414ebnjn#define K_1 8192 10f962a76fe5a33e6b505962d59a69d69394e16757njn#define NBUFS 2 11f962a76fe5a33e6b505962d59a69d69394e16757njn#define CHUNK K_1 /* single chunk */ 12f962a76fe5a33e6b505962d59a69d69394e16757njn#define MAX_IOVEC 2 13f962a76fe5a33e6b505962d59a69d69394e16757njn#define DATA_FILE "writev_data_file" 14f962a76fe5a33e6b505962d59a69d69394e16757njn 15f962a76fe5a33e6b505962d59a69d69394e16757njnstatic char buf1[K_1]; 16f962a76fe5a33e6b505962d59a69d69394e16757njnstatic char buf2[K_1]; 17f962a76fe5a33e6b505962d59a69d69394e16757njnstatic char *buf_list[NBUFS], f_name[]="writev_data_file"; 18f962a76fe5a33e6b505962d59a69d69394e16757njnstatic int fd; 19f962a76fe5a33e6b505962d59a69d69394e16757njn 20f962a76fe5a33e6b505962d59a69d69394e16757njnstruct iovec wr_iovec[MAX_IOVEC] = { 21f962a76fe5a33e6b505962d59a69d69394e16757njn {(caddr_t)-1, CHUNK}, 22f962a76fe5a33e6b505962d59a69d69394e16757njn {(caddr_t)NULL, 0} 23f962a76fe5a33e6b505962d59a69d69394e16757njn}; 24f962a76fe5a33e6b505962d59a69d69394e16757njn 25f962a76fe5a33e6b505962d59a69d69394e16757njnint main(void) 26f962a76fe5a33e6b505962d59a69d69394e16757njn{ 27f962a76fe5a33e6b505962d59a69d69394e16757njn int nbytes; 28f962a76fe5a33e6b505962d59a69d69394e16757njn 29f962a76fe5a33e6b505962d59a69d69394e16757njn /* Fill the buf_list[0] and buf_list[1] with 0 zeros */ 30f962a76fe5a33e6b505962d59a69d69394e16757njn buf_list[0] = buf1; 31f962a76fe5a33e6b505962d59a69d69394e16757njn buf_list[1] = buf2; 32f962a76fe5a33e6b505962d59a69d69394e16757njn memset(buf_list[0], 0, K_1); 33f962a76fe5a33e6b505962d59a69d69394e16757njn memset(buf_list[1], 0, K_1); 34f962a76fe5a33e6b505962d59a69d69394e16757njn 35f962a76fe5a33e6b505962d59a69d69394e16757njn if ((fd = open(f_name, O_WRONLY | O_CREAT, 0666)) < 0) { 36f962a76fe5a33e6b505962d59a69d69394e16757njn fprintf(stderr, "open(2) failed: fname = %s, errno = %d\n", 37f962a76fe5a33e6b505962d59a69d69394e16757njn f_name, errno); 38f962a76fe5a33e6b505962d59a69d69394e16757njn return 1; 39f962a76fe5a33e6b505962d59a69d69394e16757njn } else if ((nbytes = write(fd, buf_list[1], K_1)) != K_1) { 40f962a76fe5a33e6b505962d59a69d69394e16757njn fprintf(stderr, "write(2) failed: nbytes = %d, errno = %d\n", 41f962a76fe5a33e6b505962d59a69d69394e16757njn nbytes, errno); 42f962a76fe5a33e6b505962d59a69d69394e16757njn return 1; 43f962a76fe5a33e6b505962d59a69d69394e16757njn } 44f962a76fe5a33e6b505962d59a69d69394e16757njn if (close(fd) < 0) { 45f962a76fe5a33e6b505962d59a69d69394e16757njn fprintf(stderr, "close failed: errno = %d\n", errno); 46f962a76fe5a33e6b505962d59a69d69394e16757njn return 1; 47f962a76fe5a33e6b505962d59a69d69394e16757njn } 48f962a76fe5a33e6b505962d59a69d69394e16757njn fprintf(stderr, "Test file created.\n"); 49f962a76fe5a33e6b505962d59a69d69394e16757njn if ((fd = open(f_name, O_RDWR, 0666)) < 0) { 50f962a76fe5a33e6b505962d59a69d69394e16757njn fprintf(stderr, "open failed: fname = %s, errno = %d\n", 51f962a76fe5a33e6b505962d59a69d69394e16757njn f_name, errno); 52f962a76fe5a33e6b505962d59a69d69394e16757njn return 1; 53f962a76fe5a33e6b505962d59a69d69394e16757njn } 54f962a76fe5a33e6b505962d59a69d69394e16757njn 55f962a76fe5a33e6b505962d59a69d69394e16757njn lseek(fd, 0, 0); 56f962a76fe5a33e6b505962d59a69d69394e16757njn if (writev(fd, wr_iovec, 2) < 0) { 57f962a76fe5a33e6b505962d59a69d69394e16757njn if (errno == EFAULT) 58f962a76fe5a33e6b505962d59a69d69394e16757njn fprintf(stderr, "Received EFAULT as expected\n"); 59f962a76fe5a33e6b505962d59a69d69394e16757njn else 60f962a76fe5a33e6b505962d59a69d69394e16757njn fprintf(stderr, "Expected EFAULT, got %d\n", errno); 61f962a76fe5a33e6b505962d59a69d69394e16757njn lseek(fd, K_1, 0); 62f962a76fe5a33e6b505962d59a69d69394e16757njn if ((nbytes = read(fd, buf_list[0], CHUNK)) != 0) 63f962a76fe5a33e6b505962d59a69d69394e16757njn fprintf(stderr, "Expected nbytes = 0, got %d\n", nbytes); 64f962a76fe5a33e6b505962d59a69d69394e16757njn } 65f962a76fe5a33e6b505962d59a69d69394e16757njn else 66f962a76fe5a33e6b505962d59a69d69394e16757njn fprintf(stderr, "Error writev returned a positive value\n"); 67f962a76fe5a33e6b505962d59a69d69394e16757njn // Now check invalid vector count 68f962a76fe5a33e6b505962d59a69d69394e16757njn if (writev(fd, wr_iovec, -1) < 0) { 69f962a76fe5a33e6b505962d59a69d69394e16757njn if (errno == EINVAL) 70f962a76fe5a33e6b505962d59a69d69394e16757njn fprintf(stderr, "Received EINVAL as expected\n"); 71f962a76fe5a33e6b505962d59a69d69394e16757njn else 72f962a76fe5a33e6b505962d59a69d69394e16757njn fprintf(stderr, "expected errno = EINVAL, got %d\n", errno); 73f962a76fe5a33e6b505962d59a69d69394e16757njn } 74f962a76fe5a33e6b505962d59a69d69394e16757njn else 75f962a76fe5a33e6b505962d59a69d69394e16757njn fprintf(stderr, "Error writev returned a positive value\n"); 76f962a76fe5a33e6b505962d59a69d69394e16757njn if (readv(fd, wr_iovec, -1) < 0) { 77f962a76fe5a33e6b505962d59a69d69394e16757njn if (errno == EINVAL) 78f962a76fe5a33e6b505962d59a69d69394e16757njn fprintf(stderr, "Received EINVAL as expected\n"); 79f962a76fe5a33e6b505962d59a69d69394e16757njn else 80f962a76fe5a33e6b505962d59a69d69394e16757njn fprintf(stderr, "expected errno = EINVAL, got %d\n", errno); 81f962a76fe5a33e6b505962d59a69d69394e16757njn } 82f962a76fe5a33e6b505962d59a69d69394e16757njn else 837cbe0688bc1ac313110dee71966a5d958f8c7066florian fprintf(stderr, "Error readv returned a positive value\n"); 84f962a76fe5a33e6b505962d59a69d69394e16757njn 85f962a76fe5a33e6b505962d59a69d69394e16757njn unlink(f_name); 86f962a76fe5a33e6b505962d59a69d69394e16757njn 87f962a76fe5a33e6b505962d59a69d69394e16757njn return 0; 88f962a76fe5a33e6b505962d59a69d69394e16757njn} 89f962a76fe5a33e6b505962d59a69d69394e16757njn 90