[project @ 1999-12-08 15:47:06 by simonmar]
[ghc-hetmet.git] / ghc / lib / std / cbits / filePutc.c
index 6c0e999..f9bacd6 100644 (file)
@@ -1,21 +1,26 @@
 /* 
  * (c) The GRASP/AQUA Project, Glasgow University, 1994-1998
  *
- * $Id: filePutc.c,v 1.4 1999/01/12 10:53:02 sewardj Exp $
+ * $Id: filePutc.c,v 1.11 1999/12/08 15:47:07 simonmar Exp $
  *
  * hPutChar Runtime Support
  */
 
 #include "Rts.h"
 #include "stgio.h"
-#include "error.h"
+
+#if defined(HAVE_WINSOCK_H) && !defined(__CYGWIN__) && !defined(__CYGWIN32__)
+#define USE_WINSOCK
+#endif
+
+#ifdef USE_WINSOCK
+#include <winsock.h>
+#endif
 
 #define TERMINATE_LINE(x)   ((x) == '\n')
 
 StgInt
-filePutc(ptr, c)
-StgForeignPtr ptr;
-StgChar c;
+filePutc(StgForeignPtr ptr, StgChar c)
 {
     IOFileObject* fo = (IOFileObject*)ptr;
     int rc = 0;
@@ -70,17 +75,25 @@ StgChar c;
       return rc;
     }
 
-    if ( fo->flags & FILEOBJ_NONBLOCKING_IO )
-      return FILEOBJ_BLOCKED_WRITE;
-
     /* Unbuffered, write the character directly. */
-    while ((rc = write(fo->fd, &c, 1)) == 0 && errno == EINTR) ;
+    while ((rc = (
+#ifdef USE_WINSOCK
+                fo->flags & FILEOBJ_WINSOCK ?
+                send(fo->fd, &c, 1, 0) :
+                write(fo->fd, &c, 1))) <= 0) {
+#else
+                write(fo->fd, &c, 1))) <= 0) {
+#endif
 
-    if (rc == 0) {
-       cvtErrno();
-       stdErrno();
-       return -1;
+        if ( rc == -1 && errno == EAGAIN) {
+           errno = 0;
+           return FILEOBJ_BLOCKED_WRITE;
+       } else if (rc == 0 || (rc == -1 && errno != EINTR)) {
+           cvtErrno();
+           stdErrno();
+           return -1;
+       }
     }
-    return 0;
 
+    return 0;
 }