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