summaryrefslogtreecommitdiff
path: root/core/sendfile.c
diff options
context:
space:
mode:
authorRoberto De Ioris <info@unbit.it>2013-02-28 10:02:56 +0100
committerRoberto De Ioris <info@unbit.it>2013-02-28 10:02:56 +0100
commit22d9a2b831df10d2566592e65de91be38daf4e65 (patch)
tree1f4c954b3813ada520a3149b6c8e429f3befd2a3 /core/sendfile.c
parent6bccb62799d80e2d0d7073486ace2ca85e605b0d (diff)
downloaduwsgi-22d9a2b831df10d2566592e65de91be38daf4e65.tar.gz
fixed OpenBSD support
Diffstat (limited to 'core/sendfile.c')
-rw-r--r--core/sendfile.c65
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
}