aboutsummaryrefslogtreecommitdiff
path: root/src/os/unix/ngx_sendfile.c
diff options
context:
space:
mode:
authorIgor Sysoev <igor@sysoev.ru>2002-08-06 16:39:45 +0000
committerIgor Sysoev <igor@sysoev.ru>2002-08-06 16:39:45 +0000
commit6de5c2cb63f8aee4bcbec3c363a72fd8e4a4e64d (patch)
tree0e4da305f8101799b6c6aa3002cecf539c2578c0 /src/os/unix/ngx_sendfile.c
downloadnginx-6de5c2cb63f8aee4bcbec3c363a72fd8e4a4e64d.tar.gz
nginx-6de5c2cb63f8aee4bcbec3c363a72fd8e4a4e64d.zip
nginx-0.0.1-2002-08-06-20:39:45 import
The first code that uses "ngx_" prefix, the previous one used "gx_" prefix. At that point the code is not yet usable. The first draft ideas are dated back to 23.10.2001.
Diffstat (limited to 'src/os/unix/ngx_sendfile.c')
-rw-r--r--src/os/unix/ngx_sendfile.c65
1 files changed, 65 insertions, 0 deletions
diff --git a/src/os/unix/ngx_sendfile.c b/src/os/unix/ngx_sendfile.c
new file mode 100644
index 000000000..2bc157361
--- /dev/null
+++ b/src/os/unix/ngx_sendfile.c
@@ -0,0 +1,65 @@
+
+#include <ngx_config.h>
+#include <ngx_types.h>
+#include <ngx_errno.h>
+#include <ngx_log.h>
+#include <ngx_sendv.h>
+#include <ngx_sendfile.h>
+
+/*
+ TODO:
+ FreeBSD:
+ check sent if errno == EINTR then should return right sent.
+*/
+
+/*
+ returns
+ 0 done
+ -1 error
+*/
+
+#if (HAVE_FREEBSD_SENDFILE)
+
+int ngx_sendfile(ngx_socket_t s,
+ ngx_iovec_t *headers, int hdr_cnt,
+ ngx_file_t fd, off_t offset, size_t nbytes,
+ ngx_iovec_t *trailers, int trl_cnt,
+ off_t *sent,
+ ngx_log_t *log)
+{
+ int rc, i;
+ ngx_err_t err;
+ struct sf_hdtr hdtr;
+
+ hdtr.headers = headers;
+ hdtr.hdr_cnt = hdr_cnt;
+ hdtr.trailers = trailers;
+ hdtr.trl_cnt = trl_cnt;
+
+#if (HAVE_FREEBSD_SENDFILE_NBYTES_BUG)
+ for (i = 0; i < hdr_cnt; i++)
+ nbytes += headers[i].iov_len;
+#endif
+
+ rc = sendfile(fd, s, offset, nbytes, &hdtr, sent, 0);
+
+ if (rc == -1) {
+ err = ngx_socket_errno;
+ if (err != NGX_EAGAIN && err != NGX_EINTR) {
+ ngx_log_error(NGX_LOG_ERR, log, err,
+ "ngx_sendfile: sendfile failed");
+ return -1;
+
+ } else {
+ ngx_log_error(NGX_LOG_INFO, log, err,
+ "ngx_sendfile: sendfile sent only %qd bytes", *sent);
+ }
+ }
+
+ ngx_log_debug(log, "ngx_sendfile: %d, @%qd %d:%qd" _
+ rc _ offset _ nbytes _ *sent);
+
+ return 0;
+}
+
+#endif