#include <stdio.h> #include <sys/types.h> #include <sys/uio.h> #include <fcntl.h> #include <errno.h> #include <unistd.h> #include <string.h> #define K_1 8192 #define NBUFS 2 #define CHUNK K_1 /* single chunk */ #define MAX_IOVEC 2 #define DATA_FILE "writev_data_file" static char buf1[K_1]; static char buf2[K_1]; static char *buf_list[NBUFS], f_name[]="writev_data_file"; static int fd; struct iovec wr_iovec[MAX_IOVEC] = { {(caddr_t)-1, CHUNK}, {(caddr_t)NULL, 0} }; int main(void) { int nbytes; /* Fill the buf_list[0] and buf_list[1] with 0 zeros */ buf_list[0] = buf1; buf_list[1] = buf2; memset(buf_list[0], 0, K_1); memset(buf_list[1], 0, K_1); if ((fd = open(f_name, O_WRONLY | O_CREAT, 0666)) < 0) { fprintf(stderr, "open(2) failed: fname = %s, errno = %d\n", f_name, errno); return 1; } else if ((nbytes = write(fd, buf_list[1], K_1)) != K_1) { fprintf(stderr, "write(2) failed: nbytes = %d, errno = %d\n", nbytes, errno); return 1; } if (close(fd) < 0) { fprintf(stderr, "close failed: errno = %d\n", errno); return 1; } fprintf(stderr, "Test file created.\n"); if ((fd = open(f_name, O_RDWR, 0666)) < 0) { fprintf(stderr, "open failed: fname = %s, errno = %d\n", f_name, errno); return 1; } lseek(fd, 0, 0); if (writev(fd, wr_iovec, 2) < 0) { if (errno == EFAULT) fprintf(stderr, "Received EFAULT as expected\n"); else fprintf(stderr, "Expected EFAULT, got %d\n", errno); lseek(fd, K_1, 0); if ((nbytes = read(fd, buf_list[0], CHUNK)) != 0) fprintf(stderr, "Expected nbytes = 0, got %d\n", nbytes); } else fprintf(stderr, "Error writev returned a positive value\n"); // Now check invalid vector count if (writev(fd, wr_iovec, -1) < 0) { if (errno == EINVAL) fprintf(stderr, "Received EINVAL as expected\n"); else fprintf(stderr, "expected errno = EINVAL, got %d\n", errno); } else fprintf(stderr, "Error writev returned a positive value\n"); if (readv(fd, wr_iovec, -1) < 0) { if (errno == EINVAL) fprintf(stderr, "Received EINVAL as expected\n"); else fprintf(stderr, "expected errno = EINVAL, got %d\n", errno); } else fprintf(stderr, "Error writev returned a positive value\n"); unlink(f_name); return 0; }