diff options
author | Roberto De Ioris <info@unbit.it> | 2013-02-28 10:02:56 +0100 |
---|---|---|
committer | Roberto De Ioris <info@unbit.it> | 2013-02-28 10:02:56 +0100 |
commit | 22d9a2b831df10d2566592e65de91be38daf4e65 (patch) | |
tree | 1f4c954b3813ada520a3149b6c8e429f3befd2a3 /core/sendfile.c | |
parent | 6bccb62799d80e2d0d7073486ace2ca85e605b0d (diff) | |
download | uwsgi-22d9a2b831df10d2566592e65de91be38daf4e65.tar.gz |
fixed OpenBSD support
Diffstat (limited to 'core/sendfile.c')
-rw-r--r-- | core/sendfile.c | 65 |
1 files changed, 12 insertions, 53 deletions
diff --git a/core/sendfile.c b/core/sendfile.c index adc18721..1164c55c 100644 --- a/core/sendfile.c +++ b/core/sendfile.c @@ -19,62 +19,21 @@ ssize_t uwsgi_sendfile_do(int sockfd, int filefd, size_t pos, size_t len) { off_t off = pos; return sendfile(sockfd, filefd, &off, len); #else - static size_t nosf_buf_size = 0; - static char *nosf_buf; - char *nosf_buf2; - - ssize_t jlen = 0; - ssize_t rlen = 0; - ssize_t i = 0; - - if (!nosf_buf) { - nosf_buf = malloc(chunk); - } - else if (chunk != nosf_buf_size) { - nosf_buf2 = realloc(nosf_buf, chunk); - if (!nosf_buf2) { - free(nosf_buf); - } - nosf_buf = nosf_buf2; - } - - if (!nosf_buf) { - uwsgi_error("sendfile malloc()/realloc()"); - return 0; - } - - nosf_buf_size = chunk; - - if (async > 1) { - jlen = read(filefd, nosf_buf, chunk); - if (jlen <= 0) { - uwsgi_error("read()"); - return 0; + // for platform not supporting sendfile we need to rely on boring read/write + // generally that platforms have very low memory, so use a 8k buffer + char buf[8192]; + if (pos > 0) { + if (lseek(filefd, pos, SEEK_SET)) { + uwsgi_error("uwsgi_sendfile_do()/seek()"); + return -1; } - jlen = write(sockfd, nosf_buf, jlen); - if (jlen <= 0) { - uwsgi_error("write()"); - return 0; - } - return jlen; } - - while (i < (int) filesize) { - jlen = read(filefd, nosf_buf, chunk); - if (jlen <= 0) { - uwsgi_error("read()"); - break; - } - i += jlen; - jlen = write(sockfd, nosf_buf, jlen); - if (jlen <= 0) { - uwsgi_error("write()"); - break; - } - rlen += jlen; + ssize_t rlen = read(filefd, buf, UMIN(len, 8192)); + if (rlen <= 0) { + uwsgi_error("uwsgi_sendfile_do()/read()"); + return -1; } - - return rlen; + return write(sockfd, buf, rlen); #endif } |