Subversion Repositories planix.SVN

Rev

Rev 2 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 1
#include <sys/types.h>
2
#include <unistd.h>
3
#include <string.h>
4
 
5
/* bsd extensions */
6
#include <sys/uio.h>
7
#include <sys/socket.h>
8
 
9
#include "priv.h"
10
 
11
int
12
writev(int fd, struct iovec *v, int ent)
13
{
14
	int i, n, written;
15
	char *t, *e, *f;
16
	char buf[10*1024];
17
 
18
	written = 0;
19
	t = buf;
20
	e = buf+sizeof(buf);
21
	for(;ent ; v++, ent--){
22
		n = v->iov_len;
23
		f = v->iov_base;
24
		while(n > 0){
25
			i = e-t;
26
			if(n < i){
27
				memmove(t, f, n);
28
				t += n;
29
				break;
30
			}
31
			memmove(t, f, i);
32
			n -= i;
33
			f += i;
34
			i = write(fd, buf, sizeof(buf));
35
			if(i < 0){
36
				if(written > 0){
37
					return written;
38
				}else{
39
					_syserrno();
40
					return -1;
41
				}
42
			}
43
			written += i;
44
			if(i != sizeof(buf)) {
45
				return written;
46
			}
47
			t = buf;
48
		}
49
	}
50
	i = t - buf;
51
	if(i > 0){
52
		n = write(fd, buf, i);
53
		if(n < 0){
54
			if(written == 0){
55
				_syserrno();
56
				return -1;
57
			}
58
		} else
59
			written += n;
60
	}
61
	return written;
62
}