X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=ftpd.c;h=374db9691ba4900cda937a2c21fc84bf6547b5f9;hb=847984a5954562e4217a03f2a9f029ed50f6865e;hp=d7f460621d8013a9d6cc08811093583e95cc4af0;hpb=edd8d592e5a946f6f6ffc3dcd5e7e05da8ed4261;p=betaftpd diff --git a/ftpd.c b/ftpd.c index d7f4606..374db96 100644 --- a/ftpd.c +++ b/ftpd.c @@ -36,6 +36,10 @@ #include #endif +#if HAVE_SYS_TYPES_H +#include +#endif + #if HAVE_SYS_CONF_H #include #endif @@ -72,22 +76,14 @@ #include #endif -#if HAVE_ARPA_INET_H -#include -#endif - -#if HAVE_SYS_STAT_H -#include -#endif - -#if HAVE_SYS_IOCTL_H -#include -#endif - #if HAVE_NETINET_IN_SYSTM_H #include #endif +#if HAVE_NETINET_IN_H +#include +#endif + #if HAVE_NETINET_IP_H #include #endif @@ -96,6 +92,18 @@ #include #endif +#if HAVE_ARPA_INET_H +#include +#endif + +#if HAVE_SYS_STAT_H +#include +#endif + +#if HAVE_SYS_IOCTL_H +#include +#endif + #if HAVE_LINUX_SOCKET_H #include #endif @@ -194,7 +202,7 @@ fd_set master_fds, master_send_fds; FILE *xferlog = NULL; #endif -#if HAVE_LINUX_SENDFILE +#if HAVE_LINUX_SENDFILE || HAVE_BSD_SENDFILE int sendfile_supported = 1; #endif @@ -624,8 +632,8 @@ int process_all_sendfiles(fd_set * const active_clients, const int num_ac) 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; } @@ -760,7 +768,7 @@ int do_download(struct ftran *f) #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', @@ -779,7 +787,7 @@ int do_download(struct ftran *f) } #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 @@ -839,11 +847,11 @@ void write_xferlog(struct ftran *f) 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, @@ -851,7 +859,7 @@ void write_xferlog(struct ftran *f) #if WANT_UPLOAD (f->upload) ? 'i' : 'o', #endif - f->owner->username); + (f->owner->auth == 4) ? 'r' : 'a', f->owner->username); fflush(xferlog); #if 0 @@ -944,8 +952,8 @@ int main(void) #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); @@ -973,7 +981,7 @@ int main(void) 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; @@ -981,7 +989,7 @@ int main(void) 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 @@ -1338,7 +1346,7 @@ void init_file_transfer(struct ftran * const f) */ #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; @@ -1481,6 +1489,24 @@ 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) +{ +#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