curl-library
[PATCH] lib/file.c: Make writes unbuffered by not using FILE streams
From: Sebastian Rasmussen <sebrn_at_axis.com>
Date: Mon, 8 Oct 2012 11:49:47 +0200
Date: Mon, 8 Oct 2012 11:49:47 +0200
--- lib/file.c | 44 ++++++++++++++++---------------------------- 1 file changed, 16 insertions(+), 28 deletions(-) diff --git a/lib/file.c b/lib/file.c index 1025022..2648e1b 100644 --- a/lib/file.c +++ b/lib/file.c @@ -310,7 +310,8 @@ static CURLcode file_upload(struct connectdata *conn) { struct FILEPROTO *file = conn->data->state.proto.file; const char *dir = strchr(file->path, DIRSEP); - FILE *fp; + int fd; + int mode; CURLcode res=CURLE_OK; struct SessionHandle *data = conn->data; char *buf = data->state.buffer; @@ -335,31 +336,18 @@ static CURLcode file_upload(struct connectdata *conn) if(!dir[1]) return CURLE_FILE_COULDNT_READ_FILE; /* fix: better error code */ - if(data->state.resume_from) - fp = fopen( file->path, "ab" ); - else { - int fd; + mode = O_WRONLY|O_CREAT; + #ifdef DOS_FILESYSTEM + mode |= O_BINARY; + #endif -#ifdef DOS_FILESYSTEM - fd = open(file->path, O_WRONLY|O_CREAT|O_TRUNC|O_BINARY, - conn->data->set.new_file_perms); -#else - fd = open(file->path, O_WRONLY|O_CREAT|O_TRUNC, - conn->data->set.new_file_perms); -#endif - if(fd < 0) { - failf(data, "Can't open %s for writing", file->path); - return CURLE_WRITE_ERROR; - } -#ifdef HAVE_FDOPEN - fp = fdopen(fd, "wb"); -#else - close(fd); - fp = fopen(file->path, "wb"); -#endif - } + if(data->state.resume_from) + mode |= O_APPEND; + else + mode |= O_TRUNC; - if(!fp) { + fd = open(file->path, mode, conn->data->set.new_file_perms); + if(fd < 0) { failf(data, "Can't open %s for writing", file->path); return CURLE_WRITE_ERROR; } @@ -370,8 +358,8 @@ static CURLcode file_upload(struct connectdata *conn) /* treat the negative resume offset value as the case of "-" */ if(data->state.resume_from < 0) { - if(fstat(fileno(fp), &file_stat)) { - fclose(fp); + if(fstat(fd, &file_stat)) { + close(fd); failf(data, "Can't get the size of %s", file->path); return CURLE_WRITE_ERROR; } @@ -407,7 +395,7 @@ static CURLcode file_upload(struct connectdata *conn) buf2 = buf; /* write the data to the target */ - nwrite = fwrite(buf2, 1, nread, fp); + nwrite = write(fd, buf2, nread); if(nwrite != nread) { res = CURLE_SEND_ERROR; break; @@ -425,7 +413,7 @@ static CURLcode file_upload(struct connectdata *conn) if(!res && Curl_pgrsUpdate(conn)) res = CURLE_ABORTED_BY_CALLBACK; - fclose(fp); + close(fd); return res; } -- 1.7.10.4 --------------020509080600020601090102 Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline ------------------------------------------------------------------- List admin: http://cool.haxx.se/list/listinfo/curl-library Etiquette: http://curl.haxx.se/mail/etiquette.html --------------020509080600020601090102--Received on 2001-09-17