From 3c6f3bb6998f821f253a0c53bb2b7157475bf073 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Mon, 15 Dec 2008 12:46:04 +0100 Subject: [PATCH] Fix bug 5969: Optimize smbclient put command This used to be checkin 3f0406f6 to master (cherry picked from commit 91ecce438f0fd38ac933ba9bc493e79f8eb5a63a) --- source/lib/xfile.c | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/source/lib/xfile.c b/source/lib/xfile.c index e44a92d34dc..aba49b690bb 100644 --- a/source/lib/xfile.c +++ b/source/lib/xfile.c @@ -354,12 +354,27 @@ int x_fgetc(XFILE *f) /* simulate fread */ size_t x_fread(void *p, size_t size, size_t nmemb, XFILE *f) { + size_t remaining = size * nmemb; size_t total = 0; - while (total < size*nmemb) { - int c = x_fgetc(f); - if (c == EOF) break; - (total+(char *)p)[0] = (char)c; - total++; + + while (remaining > 0) { + size_t thistime; + + x_fillbuf(f); + + if (f->bufused == 0) { + f->flags |= X_FLAG_EOF; + break; + } + + thistime = MIN(f->bufused, remaining); + + memcpy((char *)p+total, f->next, thistime); + + f->next += thistime; + f->bufused -= thistime; + remaining -= thistime; + total += thistime; } return total/size; } -- 2.11.4.GIT