Mercurial > hg > nginx-quic
comparison src/os/unix/freebsd/ngx_sendfile.c @ 3:34a521b1a148
nginx-0.0.1-2002-08-20-18:48:28 import
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Tue, 20 Aug 2002 14:48:28 +0000 |
parents | src/os/unix/ngx_sendfile.c@4eff17414a43 |
children | 669801705ab1 |
comparison
equal
deleted
inserted
replaced
2:ffffe1499bce | 3:34a521b1a148 |
---|---|
1 | |
2 #include <ngx_config.h> | |
3 #include <ngx_types.h> | |
4 #include <ngx_file.h> | |
5 #include <ngx_socket.h> | |
6 #include <ngx_errno.h> | |
7 #include <ngx_log.h> | |
8 #include <ngx_sendv.h> | |
9 #include <ngx_sendfile.h> | |
10 | |
11 /* | |
12 TODO: | |
13 FreeBSD: | |
14 check sent if errno == EINTR then should return right sent. | |
15 */ | |
16 | |
17 /* | |
18 returns | |
19 0 done | |
20 -1 error | |
21 */ | |
22 | |
23 #if (HAVE_FREEBSD_SENDFILE) | |
24 | |
25 int ngx_sendfile(ngx_socket_t s, | |
26 ngx_iovec_t *headers, int hdr_cnt, | |
27 ngx_file_t fd, off_t offset, size_t nbytes, | |
28 ngx_iovec_t *trailers, int trl_cnt, | |
29 off_t *sent, | |
30 ngx_log_t *log) | |
31 { | |
32 int rc, i; | |
33 ngx_err_t err; | |
34 struct sf_hdtr hdtr; | |
35 | |
36 hdtr.headers = headers; | |
37 hdtr.hdr_cnt = hdr_cnt; | |
38 hdtr.trailers = trailers; | |
39 hdtr.trl_cnt = trl_cnt; | |
40 | |
41 #if (HAVE_FREEBSD_SENDFILE_NBYTES_BUG) | |
42 for (i = 0; i < hdr_cnt; i++) | |
43 nbytes += headers[i].iov_len; | |
44 #endif | |
45 | |
46 rc = sendfile(fd, s, offset, nbytes, &hdtr, sent, 0); | |
47 | |
48 if (rc == -1) { | |
49 err = ngx_socket_errno; | |
50 if (err != NGX_EAGAIN && err != NGX_EINTR) { | |
51 ngx_log_error(NGX_LOG_ERR, log, err, | |
52 "ngx_sendfile: sendfile failed"); | |
53 return -1; | |
54 | |
55 } else { | |
56 ngx_log_error(NGX_LOG_INFO, log, err, | |
57 "ngx_sendfile: sendfile sent only %qd bytes", *sent); | |
58 } | |
59 } | |
60 | |
61 ngx_log_debug(log, "ngx_sendfile: %d, @%qd %qd:%d" _ | |
62 rc _ offset _ *sent _ nbytes); | |
63 | |
64 return 0; | |
65 } | |
66 | |
67 #endif |