summaryrefslogtreecommitdiff
path: root/core/sendfile.c
diff options
context:
space:
mode:
authorUnbit <info@unbit.it>2014-08-26 12:43:40 +0200
committerUnbit <info@unbit.it>2014-08-26 12:43:40 +0200
commit8cd13f2ad9018c7c96d0c1265dc5e685757778a0 (patch)
treea8ac17aa70c0a1e354650fb72fb9d5d88ff0bfab /core/sendfile.c
parent13df278cc4bf82245ba405bafe25a0effb13032b (diff)
downloaduwsgi-8cd13f2ad9018c7c96d0c1265dc5e685757778a0.tar.gz
fixed sendfile on smartos/omnios
Diffstat (limited to 'core/sendfile.c')
-rw-r--r--core/sendfile.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/core/sendfile.c b/core/sendfile.c
index 9dd11eff..482460da 100644
--- a/core/sendfile.c
+++ b/core/sendfile.c
@@ -20,9 +20,18 @@ ssize_t uwsgi_sendfile_do(int sockfd, int filefd, size_t pos, size_t len) {
int sf_ret = sendfile(filefd, sockfd, pos, &sf_len, NULL, 0);
if (sf_ret == 0 || (sf_ret == -1 && errno == EAGAIN)) return sf_len;
return -1;
-#elif defined(__linux__) || defined(__sun__) || defined(__GNU_kFreeBSD__)
+#elif defined(__linux__) || defined(__GNU_kFreeBSD__)
off_t off = pos;
return sendfile(sockfd, filefd, &off, len);
+#elif defined(__sun__)
+ off_t off = pos;
+ ssize_t wlen = sendfile(sockfd, filefd, &off, len);
+ if (wlen < 0 && uwsgi_is_again()) {
+ if (off - pos > 0) {
+ return off-pos;
+ }
+ }
+ return wlen;
#endif
no_sendfile: