#include <stropts.h>
#endif
+#if HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+
#if HAVE_SYS_CONF_H
#include <sys/conf.h>
#endif
#include <unistd.h>
#endif
-#if HAVE_ARPA_INET_H
-#include <arpa/inet.h>
-#endif
-
-#if HAVE_SYS_STAT_H
-#include <sys/stat.h>
-#endif
-
-#if HAVE_SYS_IOCTL_H
-#include <sys/ioctl.h>
-#endif
-
#if HAVE_NETINET_IN_SYSTM_H
#include <netinet/in_systm.h>
#endif
+#if HAVE_NETINET_IN_H
+#include <netinet/in.h>
+#endif
+
#if HAVE_NETINET_IP_H
#include <netinet/ip.h>
#endif
#include <netinet/tcp.h>
#endif
+#if HAVE_ARPA_INET_H
+#include <arpa/inet.h>
+#endif
+
+#if HAVE_SYS_STAT_H
+#include <sys/stat.h>
+#endif
+
+#if HAVE_SYS_IOCTL_H
+#include <sys/ioctl.h>
+#endif
+
#if HAVE_LINUX_SOCKET_H
#include <linux/socket.h>
#endif
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
#warning No xferlog support for nonroot yet
#else
/* open xferlog */
- xferlog = fopen("/var/log/xferlog", "r+");
- if (xferlog == NULL) xferlog = fopen("/usr/adm/xferlog", "r+");
+ xferlog = fopen("/var/log/xferlog", "a");
+ if (xferlog == NULL) xferlog = fopen("/usr/adm/xferlog", "a");
if (xferlog != NULL) {
fseek(xferlog, 0L, SEEK_END);
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