diff options
Diffstat (limited to 'otherlibs/unix/read.c')
-rw-r--r-- | otherlibs/unix/read.c | 14 |
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); } |