summaryrefslogtreecommitdiffstats
path: root/otherlibs/unix/read.c
diff options
context:
space:
mode:
Diffstat (limited to 'otherlibs/unix/read.c')
-rw-r--r--otherlibs/unix/read.c14
1 files changed, 12 insertions, 2 deletions
diff --git a/otherlibs/unix/read.c b/otherlibs/unix/read.c
index 5401f83ff..d6f2cbd11 100644
--- a/otherlibs/unix/read.c
+++ b/otherlibs/unix/read.c
@@ -12,16 +12,26 @@
/* $Id$ */
#include <mlvalues.h>
+#include <memory.h>
+#include <signals.h>
#include "unixsupport.h"
value unix_read(fd, buf, ofs, len) /* ML */
value fd, buf, ofs, len;
{
+ long numbytes;
int ret;
- buf = unix_freeze_buffer(buf);
+ char iobuf[UNIX_BUFFER_SIZE];
+ Push_roots(r, 1);
+
+ r[0] = buf;
+ numbytes = Long_val(len);
+ if (numbytes > UNIX_BUFFER_SIZE) numbytes = UNIX_BUFFER_SIZE;
enter_blocking_section();
- ret = read(Int_val(fd), &Byte(buf, Long_val(ofs)), Int_val(len));
+ ret = read(Int_val(fd), iobuf, (int) numbytes);
leave_blocking_section();
if (ret == -1) uerror("read", Nothing);
+ bcopy(iobuf, &Byte(r[0], Long_val(ofs)), ret);
+ Pop_roots();
return Val_int(ret);
}