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