diff options
| -rw-r--r-- | lib/util/xfile.c | 25 | ||||
| -rw-r--r-- | source3/client/client.c | 3 | 
2 files changed, 23 insertions, 5 deletions
diff --git a/lib/util/xfile.c b/lib/util/xfile.c index 94b0ee9b18..cf195706db 100644 --- a/lib/util/xfile.c +++ b/lib/util/xfile.c @@ -329,12 +329,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;  } diff --git a/source3/client/client.c b/source3/client/client.c index 26badc4051..39f8f90bba 100644 --- a/source3/client/client.c +++ b/source3/client/client.c @@ -1652,6 +1652,9 @@ static int do_put(const char *rname, const char *lname, bool reput)  		d_printf("ERROR: Not enough memory!\n");  		return 1;  	} + +	x_setvbuf(f, NULL, X_IOFBF, maxwrite); +  	while (!x_feof(f)) {  		int n = maxwrite;  		int ret;  | 
