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