xref: /illumos-gate/usr/src/lib/libresolv2/common/bsd/writev.c (revision fc910014e8a32a65612105835a10995f2c13d942)
1 #include "port_before.h"
2 
3 #include <sys/types.h>
4 #include <sys/uio.h>
5 #include <sys/stat.h>
6 #include <sys/socket.h>
7 
8 #include "port_after.h"
9 
10 #ifndef NEED_WRITEV
11 int __bindcompat_writev;
12 #else
13 
14 #ifdef _CRAY
15 #define OWN_WRITEV
16 int
17 __writev(int fd, struct iovec *iov, int iovlen)
18 {
19 	struct stat statbuf;
20 
21 	if (fstat(fd, &statbuf) < 0)
22 		return (-1);
23 
24 	/*
25 	 * Allow for atomic writes to network.
26 	 */
27 	if (statbuf.st_mode & S_IFSOCK) {
28 		struct msghdr   mesg;
29 
30 		memset(&mesg, 0, sizeof(mesg));
31 		mesg.msg_name = 0;
32 		mesg.msg_namelen = 0;
33 		mesg.msg_iov = iov;
34 		mesg.msg_iovlen = iovlen;
35 		mesg.msg_accrights = 0;
36 		mesg.msg_accrightslen = 0;
37 		return (sendmsg(fd, &mesg, 0));
38 	} else {
39 		struct iovec *tv;
40 		int i, rcode = 0, count = 0;
41 
42 		for (i = 0, tv = iov; i <= iovlen; tv++) {
43 			rcode = write(fd, tv->iov_base, tv->iov_len);
44 
45 			if (rcode < 0)
46 				break;
47 
48 			count += rcode;
49 		}
50 
51 		if (count == 0)
52 			return (rcode);
53 		else
54 			return (count);
55 	}
56 }
57 
58 #else /*_CRAY*/
59 
60 int
61 __writev(fd, vp, vpcount)
62 	int fd;
63 	const struct iovec *vp;
64 	int vpcount;
65 {
66 	int count = 0;
67 
68 	while (vpcount-- > 0) {
69 		int written = write(fd, vp->iov_base, vp->iov_len);
70 
71 		if (written < 0)
72 			return (-1);
73 		count += written;
74 		if (written != vp->iov_len)
75 			break;
76 		vp++;
77 	}
78 	return (count);
79 }
80 
81 #endif /*_CRAY*/
82 
83 #endif /*NEED_WRITEV*/
84 
85 /*! \file */
86