[project @ 1999-07-01 13:12:09 by simonmar]
[ghc-hetmet.git] / ghc / lib / std / cbits / readFile.c
index fa6aa87..8956e98 100644 (file)
@@ -1,7 +1,7 @@
 /* 
  * (c) The GRASP/AQUA Project, Glasgow University, 1994-1998
  *
- * $Id: readFile.c,v 1.3 1998/12/02 13:27:45 simonm Exp $
+ * $Id: readFile.c,v 1.5 1999/07/01 13:12:09 simonmar Exp $
  *
  * hGetContents Runtime Support
  */
@@ -9,6 +9,10 @@
 #include "Rts.h"
 #include "stgio.h"
 
+#ifdef HAVE_WINSOCK_H
+#include <winsock.h>
+#endif
+
 #define EOT 4
 
 /* Filling up a (block-buffered) buffer, that
@@ -72,7 +76,15 @@ StgForeignPtr ptr;
     if ( fo->flags & FILEOBJ_NONBLOCKING_IO && inputReady (ptr,0) != 1 )
       return FILEOBJ_BLOCKED_READ;
 
-    while ((count = read(fd, fo->buf, fo->bufSize)) <= 0) {
+    while ((count =
+            (
+#ifdef HAVE_WINSOCK_H
+              fo->flags & FILEOBJ_WINSOCK ?
+                recv(fd, fo->buf, fo->bufSize, 0) :
+                read(fd, fo->buf, fo->bufSize))) <= 0 ) {
+#else
+                read(fd, fo->buf, fo->bufSize))) <= 0 ) {
+#endif
        if ( count == 0 ) {
             FILEOBJ_SET_EOF(fo);
            ghc_errtype = ERR_EOF;
@@ -157,7 +169,15 @@ StgInt len;
     if ( fo->flags & FILEOBJ_NONBLOCKING_IO && inputReady (ptr,0) != 1 )
       return FILEOBJ_BLOCKED_READ;
 
-    while ((count = read(fd, p, len)) < len) {
+    while ((count =
+             (
+#ifdef HAVE_WINSOCK_H
+              fo->flags & FILEOBJ_WINSOCK ?
+                recv(fd, p, len, 0) :
+                read(fd, p, len))) <= 0 ) {
+#else
+                read(fd, p, len))) <= 0 ) {
+#endif
        if ( count == 0 ) { /* EOF */
            break;
        } else if ( count == -1 && errno == EAGAIN) {
@@ -258,7 +278,7 @@ StgForeignPtr ptr;
 {
     IOFileObject* fo= (IOFileObject*)ptr;
     int count,rc=0;
-    char c;
+    unsigned char c;
 
     /* Check if someone hasn't zapped us */
     if ( fo == NULL || fo->fd == -1)
@@ -296,7 +316,15 @@ StgForeignPtr ptr;
     if ( fo->flags & FILEOBJ_NONBLOCKING_IO && inputReady (ptr,0) != 1 )
       return FILEOBJ_BLOCKED_READ;
 
-    while ( (count = read(fo->fd, &c, 1)) <= 0 ) {
+    while ( (count = 
+              (
+#ifdef HAVE_WINSOCK_H
+                fo->flags & FILEOBJ_WINSOCK ?
+                recv(fo->fd, &c, 1, 0) :
+                read(fo->fd, &c, 1))) <= 0 ) {
+#else
+                read(fo->fd, &c, 1))) <= 0 ) {
+#endif
        if ( count == 0 ) {
            ghc_errtype = ERR_EOF;
            ghc_errstr = "";