#if defined(PLATFORM_LINUX)
ssize_t r;
#elif defined(PLATFORM_FREEBSD) || defined(PLATFORM_DARWIN)
- off_t r;
+ off_t o, r;
#endif
if (fconv) {
sprintf(range_buf, "bytes %jd-%jd/%jd",
file_start, file_end, (intmax_t)st.st_size);
+#if defined(PLATFORM_LINUX)
if(file_start > 0) {
off_t off;
if ((off = lseek(fd, file_start, SEEK_SET)) != file_start) {
return HTTP_STATUS_INTERNAL;
}
}
+#elif defined(PLATFORM_FREEBSD) || defined(PLATFORM_DARWIN)
+ o = file_start;
+#endif
if (preop) {
ret = preop(hc, file_start, content_len, opaque);
chunk = MIN(1024 * ((stats ? 128 : 1024) * 1024), content_len);
#if defined(PLATFORM_LINUX)
r = sendfile(hc->hc_fd, fd, NULL, chunk);
+ if (r < 0) {
+ ret = -1;
+ break;
+ }
#elif defined(PLATFORM_FREEBSD)
- sendfile(fd, hc->hc_fd, 0, chunk, NULL, &r, 0);
+ ret = sendfile(fd, hc->hc_fd, o, chunk, NULL, &r, 0);
+ if (ret < 0)
+ break;
+ o += r;
#elif defined(PLATFORM_DARWIN)
r = chunk;
- sendfile(fd, hc->hc_fd, 0, &r, NULL, 0);
-#endif
- if(r < 0) {
- ret = -1;
+ ret = sendfile(fd, hc->hc_fd, o, &r, NULL, 0);
+ if (ret < 0)
break;
- }
+ o += r;
+#endif
content_len -= r;
if (stats)
stats(hc, r, opaque);