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