summaryrefslogtreecommitdiff
path: root/libexec
diff options
context:
space:
mode:
authorDan Moschuk <dan@FreeBSD.org>2000-12-20 03:34:54 +0000
committerDan Moschuk <dan@FreeBSD.org>2000-12-20 03:34:54 +0000
commitf6f0c4b90ded6da6c49c633ea30cde2c1c847bd9 (patch)
treeb6ac39862696b19aac59e0bec6133f3bf5b2198c /libexec
parent56a7c4a8522403f41fe05f09b45c3899356d71a9 (diff)
Notes
Diffstat (limited to 'libexec')
-rw-r--r--libexec/ftpd/ftpd.c42
1 files changed, 22 insertions, 20 deletions
diff --git a/libexec/ftpd/ftpd.c b/libexec/ftpd/ftpd.c
index 2c8591b27b6a..0a4940543e07 100644
--- a/libexec/ftpd/ftpd.c
+++ b/libexec/ftpd/ftpd.c
@@ -1698,9 +1698,10 @@ send_data(instr, outstr, blksize, filesize, isreg)
off_t filesize;
int isreg;
{
- int c, cnt, filefd, netfd;
- char *buf, *bp;
+ int c, filefd, netfd;
+ char *buf;
size_t len;
+ off_t cnt;
transflag++;
if (setjmp(urgcatch)) {
@@ -1737,27 +1738,28 @@ send_data(instr, outstr, blksize, filesize, isreg)
netfd = fileno(outstr);
filefd = fileno(instr);
- if (isreg && filesize < (off_t)16 * 1024 * 1024) {
- buf = mmap(0, filesize, PROT_READ, MAP_SHARED, filefd,
- (off_t)0);
- if (buf == MAP_FAILED) {
- syslog(LOG_WARNING, "mmap(%lu): %m",
- (unsigned long)filesize);
- goto oldway;
- }
- bp = buf;
+ if (isreg) {
+
+ off_t offset;
+ int err;
+
len = filesize;
- do {
- cnt = write(netfd, bp, len);
+ err = cnt = offset = 0;
+
+ while (err != -1 && cnt < filesize) {
+ err = sendfile(filefd, netfd, offset, len,
+ (struct sf_hdtr *) NULL, &cnt, 0);
+ offset += cnt;
len -= cnt;
- bp += cnt;
- if (cnt > 0) byte_count += cnt;
- } while(cnt > 0 && len > 0);
- transflag = 0;
- munmap(buf, (size_t)filesize);
- if (cnt < 0)
- goto data_err;
+ if (err == -1) {
+ if (!cnt)
+ goto oldway;
+
+ goto data_err;
+ }
+ }
+
reply(226, "Transfer complete.");
return;
}