#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
f = next;
next = f->next_ftran;
-#if HAVE_UPLOAD
- if (f->upload == 1 && fds[f->sock].revents & POLLHUP) {
+#if WANT_UPLOAD
+ if ((f->upload == 1) && (fds[f->sock].revents & POLLHUP)) {
finish_transfer(f);
continue;
}
#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
if (xferlog == NULL) return;
- strftime(temp, 256, "%a %b %d %H:%M:%S %Y", t);
+ strftime(temp, 256, "%a %b %d %H:%M:%S %Y", t);
#if WANT_UPLOAD
- fprintf(xferlog, "%s %u %s %lu %s b _ %c a %s ftp 0 * \n",
+ fprintf(xferlog, "%s %u %s %lu %s b _ %c %c %s ftp 0 *\n",
#else
- fprintf(xferlog, "%s %u %s %lu %s b _ o a %s ftp 0 *\n",
+ fprintf(xferlog, "%s %u %s %lu %s b _ o %c %s ftp 0 *\n",
#endif
temp, (int)(difftime(now, f->tran_start)),
inet_ntoa(f->sin.sin_addr), f->size,
#if WANT_UPLOAD
(f->upload) ? 'i' : 'o',
#endif
- f->owner->username);
+ (f->owner->auth == 4) ? 'r' : 'a', f->owner->username);
fflush(xferlog);
#if 0
#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