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