diff options
Diffstat (limited to 'mdk-stage1/dietlibc/libstdio/fwrite.c')
-rw-r--r-- | mdk-stage1/dietlibc/libstdio/fwrite.c | 28 |
1 files changed, 13 insertions, 15 deletions
diff --git a/mdk-stage1/dietlibc/libstdio/fwrite.c b/mdk-stage1/dietlibc/libstdio/fwrite.c index 5691661a5..e2536ccfb 100644 --- a/mdk-stage1/dietlibc/libstdio/fwrite.c +++ b/mdk-stage1/dietlibc/libstdio/fwrite.c @@ -1,30 +1,28 @@ #include <sys/types.h> #include "dietstdio.h" #include <unistd.h> +#include <errno.h> -size_t fwrite( const void *ptr, size_t size, size_t nmemb, FILE *stream) { +size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream) { int res; -#ifdef WANT_BUFFERED_STDIO - long len=size*nmemb; + unsigned long len=size*nmemb; long i; - if (len>BUFSIZE || (stream->flags&NOBUF)) { - if (!(stream->flags&NOBUF)) fflush(stream); - res=write(stream->fd,ptr,size*nmemb); + if (!nmemb || len/nmemb!=size) return 0; /* check for integer overflow */ + if (len>stream->buflen || (stream->flags&NOBUF)) { + fflush(stream); + do { + res=write(stream->fd,ptr,size*nmemb); + } while (res==-1 && errno==EINTR); } else { register const unsigned char *c=ptr; - for (i=size*nmemb; i>0; --i,++c) - if (fputc(*c,stream)) { - res=-1; - break; - } - res=size*nmemb; + for (i=len; i>0; --i,++c) + if (fputc(*c,stream)) { res=len-i; goto abort; } + res=len; } -#else - res=write(stream->fd,ptr,size*nmemb); -#endif if (res<0) { stream->flags|=ERRORINDICATOR; return 0; } +abort: return size?res/size:0; } |