network-wise, as well as assisting in testing, which led to
BetaFTPD running properly on FreeBSD for the first time.
+Unknown <liangyi@netchina.com.cn>
+- Made the FreeBSD support for sendfile(), as well as did other
+ things (like testing and profiling) for the FreeBSD port.
+
In addition, there are numerous users who by themselves may have
done very little, but together have been the driving force behind
the BetaFTPD development. To all of you who have ever sent in
FILE *xferlog = NULL;
#endif
-#if HAVE_LINUX_SENDFILE
+#if HAVE_LINUX_SENDFILE || HAVE_BSD_SENDFILE
int sendfile_supported = 1;
#endif
#endif
int size;
-#if HAVE_LINUX_SENDFILE
+#if HAVE_LINUX_SENDFILE || HAVE_BSD_SENDFILE
/*
* We handle the optimal case first, which is sendfile().
* Here we use a rather simplified sending `algorithm',
}
#endif
- err = sendfile(f->sock, f->local_file, &f->pos, size);
+ err = mysendfile(f->sock, f->local_file, &f->pos, size);
return (f->pos < f->size) && (err > -1);
}
#endif
alarm(60);
signal(SIGALRM, handle_alarm);
-#if HAVE_LINUX_SENDFILE
+#if HAVE_LINUX_SENDFILE || HAVE_BSD_SENDFILE
/* check that sendfile() is really implemented (same check as configure does) */
{
int out_fd = 1, in_fd = 0;
size_t size = 1024;
errno = 0;
- sendfile(out_fd, in_fd, &offset, size);
+ mysendfile(out_fd, in_fd, &offset, size);
if (errno == ENOSYS) sendfile_supported = 0;
}
#endif
*/
#if HAVE_MMAP
if (f->dir_listing == 0) {
-#if HAVE_LINUX_SENDFILE
+#if HAVE_LINUX_SENDFILE || HAVE_BSD_SENDFILE
int do_mmap = (sendfile_supported) ? 0 : 1;
#else
int do_mmap = 1;
}
#endif
+#if HAVE_BSD_SENDFILE || HAVE_LINUX_SENDFILE
+int mysendfile(int sock, int fd, off_t *offset, size_t count)
+{
+#if HAVE_BSD_SENDFILE
+ int err;
+ off_t ssize = 0;
+
+ err = sendfile(fd, sock, *offset, count, NULL, &ssize, 0);
+ if (ssize > 0) *offset += ssize;
+#else /* !HAVE_BSD_SENDFILE */
+#if HAVE_LINUX_SENDFILE
+ return sendfile(sock, fd, offset, count);
+#endif /* HAVE_LINUX_SENDFILE */
+#endif /* !HAVE_BSD_SENDFILE */
+}
+#endif /* HAVE_BSD_SENDFILE || HAVE_LINUX_SENDFILE */
+
+
#if WANT_MESSAGE
/*
* dump_file(): Dumps a file on the control connection. Used for
void clear_bad_fds(int * const server_sock);
#endif
+#if HAVE_BSD_SENDFILE || HAVE_LINUX_SENDFILE
+int mysendfile(int sock, int fd, off_t *offset, size_t count);
+#endif
+
#if WANT_MESSAGE
void dump_file(struct conn * const c, const int num, const char * const filename);
void list_readmes(struct conn * const c);