summaryrefslogtreecommitdiff
path: root/ghc/lib/std/cbits/writeFile.c
diff options
context:
space:
mode:
Diffstat (limited to 'ghc/lib/std/cbits/writeFile.c')
-rw-r--r--ghc/lib/std/cbits/writeFile.c198
1 files changed, 0 insertions, 198 deletions
diff --git a/ghc/lib/std/cbits/writeFile.c b/ghc/lib/std/cbits/writeFile.c
deleted file mode 100644
index 383ec52459..0000000000
--- a/ghc/lib/std/cbits/writeFile.c
+++ /dev/null
@@ -1,198 +0,0 @@
-/*
- * (c) The GRASP/AQUA Project, Glasgow University, 1994-1998
- *
- * $Id: writeFile.c,v 1.14 2000/04/12 17:33:16 simonmar Exp $
- *
- * hPutStr Runtime Support
- */
-
-#include "Rts.h"
-#include "stgio.h"
-
-#if defined(HAVE_WINSOCK_H) && !defined(__CYGWIN__) && !defined(__CYGWIN32__)
-#define USE_WINSOCK
-#endif
-
-#ifdef USE_WINSOCK
-#include <winsock.h>
-#endif
-
-StgInt
-writeFileObject(StgForeignPtr ptr, StgInt bytes)
-{
- int rc=0;
- IOFileObject* fo = (IOFileObject*)ptr;
-
- /* If we've got a r/w file object in our hand, flush the
- (input) buffer contents first.
- */
- if ( FILEOBJ_READABLE(fo) && FILEOBJ_JUST_READ(fo) ) {
- fo->flags = (fo->flags & ~FILEOBJ_RW_READ) | FILEOBJ_RW_WRITE;
- rc = flushReadBuffer(ptr);
- if (rc < 0) return rc;
- }
-
- return (writeBuffer(ptr, bytes));
-}
-
-StgInt
-writeBuffer(StgForeignPtr ptr, StgInt bytes)
-{
- int count;
- IOFileObject* fo = (IOFileObject*)ptr;
-
- char *pBuf = (char *) fo->buf + fo->bufRPtr;
-
- bytes -= fo->bufRPtr;
-
- /* Disallow short writes */
- if (bytes == 0 || fo->buf == NULL) {
- fo->bufRPtr = 0;
- return 0;
- }
-
- while ((count =
- (
-#ifdef USE_WINSOCK
- fo->flags & FILEOBJ_WINSOCK ?
- send(fo->fd, pBuf, bytes, 0) :
- write(fo->fd, pBuf, bytes))) < bytes) {
-#else
- write(fo->fd, pBuf, bytes))) < bytes) {
-#endif
- if ( count == -1 && errno == EAGAIN) {
- errno = 0;
- return FILEOBJ_BLOCKED_WRITE;
- }
- else if ( count == -1 && errno != EINTR ) {
- cvtErrno();
- stdErrno();
- return -1;
- }
- else {
- bytes -= count;
- pBuf += count;
- fo->bufRPtr += count;
- }
- }
- /* Signal that we've emptied the buffer */
- fo->bufRPtr = 0;
- fo->bufWPtr = 0;
- return 0;
-}
-
-
-/* ToDo: there's currently no way for writeBuf to return both a
- * partial write and an indication that the write blocked. It needs
- * two calls: one to get the partial result, and the next one to block.
- * This matches Unix write/2, but is rather a waste.
- */
-
-StgInt
-writeBuf(StgForeignPtr ptr, StgAddr buf, StgInt off, StgInt len)
-{
- IOFileObject* fo = (IOFileObject*)ptr;
- int count, total_count;
- int rc = 0;
- char *pBuf = (char *) buf+off;
-
- if (len == 0)
- return 0;
-
- /* First of all, check if we do need to flush the buffer .. */
- /* Note - in the case of line buffering, we do not currently check
- whether we need to flush buffer due to line terminators in the
- buffer we're outputting */
- if ( fo->buf != NULL && /* buffered and */
- (fo->bufWPtr + len < (fo->bufSize)) /* there's room */
- ) {
- /* Block copying is likely to be cheaper than flush, followed by write */
- memcpy(((char*)fo->buf + fo->bufWPtr), pBuf, len);
- fo->bufWPtr += len;
- return len;
- }
- /* If we do overflow, flush current contents of the buffer and
- directly output the chunk.
- (no attempt at splitting up the chunk is currently made)
- */
- if ( fo->buf != NULL && /* buffered and */
- (fo->bufWPtr + len >= (fo->bufSize)) /* there's not room */
- ) {
- /* Flush buffer */
- rc = writeFileObject(ptr, fo->bufWPtr);
- /* ToDo: undo buffer fill if we're blocking.. */
- if (rc != 0) {
- return rc;
- }
- }
-
- total_count = 0;
-
- while ((count =
- (
-#ifdef USE_WINSOCK
- fo->flags & FILEOBJ_WINSOCK ?
- send(fo->fd, pBuf, (int)len, 0) :
- write(fo->fd, pBuf, (int)len))) < len ) {
-#else
- write(fo->fd, pBuf, (int)len))) < len ) {
-#endif
- if ( count >= 0 ) {
- len -= count;
- pBuf += count;
- total_count += count;
- continue;
- } else if ( errno == EAGAIN ) {
- errno = 0;
- if (total_count > 0)
- return total_count; /* partial write */
- else
- return FILEOBJ_BLOCKED_WRITE;
- } else if ( errno != EINTR ) {
- cvtErrno();
- stdErrno();
- return -1;
- }
- }
-
- total_count += count;
- return total_count;
-}
-
-StgInt
-writeBufBA(StgForeignPtr ptr, StgByteArray buf, StgInt off, StgInt len)
-{
- return (writeBuf(ptr,(StgAddr)buf, off, len));
-}
-
-/* -----------------------------------------------------------------------------
- * write_ is just a simple wrapper around write/2 that restarts
- * on EINTR and returns FILEOBJ_BLOCKED_WRITE on EAGAIN.
- * -------------------------------------------------------------------------- */
-
-StgInt
-write_(StgForeignPtr ptr, StgAddr buf, StgInt len)
-{
- IOFileObject* fo = (IOFileObject*)ptr;
- int rc;
-
- while ((rc =
- (
-#ifdef USE_WINSOCK
- fo->flags & FILEOBJ_WINSOCK ?
- send(fo->fd, buf, (int)len, 0) :
- write(fo->fd, buf, (int)len))) < 0 ) {
-#else
- write(fo->fd, buf, (int)len))) < 0 ) {
-#endif
- if ( errno == EAGAIN ) {
- errno = 0;
- return FILEOBJ_BLOCKED_WRITE;
- } else if ( errno != EINTR ) {
- cvtErrno();
- stdErrno();
- return -1;
- }
- }
- return rc;
-}