/*
* (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;
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;
}