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