From d36da34581cd277a2face04a11cdb8f81d8d2121 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Wilfried=20G=C3=B6esgens?= Date: Sat, 6 Feb 2010 10:12:48 +0000 Subject: [PATCH] * remember the total size a downloadable file has * use mmap to read the download file for output; this way we don't need to copy it into memory first and can let the kernel do this job * remove the 10k transfer limit --- citadel/context.h | 1 + citadel/file_ops.c | 23 ++++++++++++++--------- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/citadel/context.h b/citadel/context.h index b8e48c42a..ff62295e7 100644 --- a/citadel/context.h +++ b/citadel/context.h @@ -64,6 +64,7 @@ struct CitContext { char cs_inet_fn[128]; /* Friendly-name of outbound Internet mail */ FILE *download_fp; /* Fields relating to file transfer */ + size_t download_fp_total; char download_desired_section[128]; FILE *upload_fp; char upl_file[256]; diff --git a/citadel/file_ops.c b/citadel/file_ops.c index ced5a31d5..6f0669093 100644 --- a/citadel/file_ops.c +++ b/citadel/file_ops.c @@ -15,6 +15,7 @@ #include #include #include +#include #if TIME_WITH_SYS_TIME # include @@ -236,6 +237,7 @@ void OpenCmdResult(char *filename, const char *mime_type) long filesize; fstat(fileno(CC->download_fp), &statbuf); + CC->download_fp_total = statbuf.st_size; filesize = (long) statbuf.st_size; modtime = (time_t) statbuf.st_mtime; @@ -633,20 +635,22 @@ void cmd_read(char *cmdbuf) return; } - if (bytes > 100000) bytes = 100000; - buf = malloc(bytes + 1); - - fseek(CC->download_fp, start_pos, 0); - - actual_bytes = fread(buf, 1, bytes, CC->download_fp); - if (actual_bytes > 0) { + buf = mmap(NULL, + CC->download_fp_total, + PROT_READ, + MAP_PRIVATE, + fileno(CC->download_fp), + 0); + + actual_bytes = CC->download_fp_total - start_pos; + if ((actual_bytes > 0) && (buf != NULL)) { cprintf("%d %d\n", BINARY_FOLLOWS, (int)actual_bytes); - client_write(buf, bytes); + client_write(buf + start_pos, actual_bytes); } else { cprintf("%d %s\n", ERROR, strerror(errno)); } - free(buf); + munmap(buf, CC->download_fp_total); } @@ -732,6 +736,7 @@ void cmd_ndop(char *cmdbuf) CC->dl_is_net = 1; stat(pathname, &statbuf); + CC->download_fp_total = statbuf.st_size; cprintf("%d %ld\n", CIT_OK, (long)statbuf.st_size); } -- 2.30.2