diff options
author | Gwenolé Beauchesne <gbeauchesne@mandriva.org> | 2003-06-04 18:31:57 +0000 |
---|---|---|
committer | Gwenolé Beauchesne <gbeauchesne@mandriva.org> | 2003-06-04 18:31:57 +0000 |
commit | 09e967c2d732783b2579e4e120cd9b608404cb00 (patch) | |
tree | 8d2783a6a7e33608c6012efd6a88b8f5694df81d /mdk-stage1/dietlibc/libstdio/fwrite.c | |
parent | 18fcff49d3c836697d3b75a3d01d31c700e69974 (diff) | |
download | drakx-backup-do-not-use-09e967c2d732783b2579e4e120cd9b608404cb00.tar drakx-backup-do-not-use-09e967c2d732783b2579e4e120cd9b608404cb00.tar.gz drakx-backup-do-not-use-09e967c2d732783b2579e4e120cd9b608404cb00.tar.bz2 drakx-backup-do-not-use-09e967c2d732783b2579e4e120cd9b608404cb00.tar.xz drakx-backup-do-not-use-09e967c2d732783b2579e4e120cd9b608404cb00.zip |
Merge from R9_0-AMD64, most notably:
- AMD64 support to insmod-busybox, minilibc, et al.
- Sync with insmod-modutils 2.4.19 something but everyone should use
dietlibc nowadays
- Factor out compilation and prefix with $(DIET) for dietlibc builds
- 64-bit & varargs fixes
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; } |