diff --git a/scheme/ikarus.io.ss b/scheme/ikarus.io.ss index 20fa47a..2971628 100644 --- a/scheme/ikarus.io.ss +++ b/scheme/ikarus.io.ss @@ -2610,7 +2610,10 @@ (let ([rv (foreign-call "ikrt_readdir" (directory-stream-pointer x))]) (cond - [(eqv? rv 0) #f] + [(fixnum? rv) + (close-directory-stream x #f) + (io-error who (directory-stream-filename x) rv)] + [(not rv) #f] [else (utf8->string rv)]))) (define close-directory-stream diff --git a/scheme/last-revision b/scheme/last-revision index 1351198..4f5ed40 100644 --- a/scheme/last-revision +++ b/scheme/last-revision @@ -1 +1 @@ -1762 +1763 diff --git a/src/ikarus-io.c b/src/ikarus-io.c index 2f8b0dc..d8277d5 100644 --- a/src/ikarus-io.c +++ b/src/ikarus-io.c @@ -391,11 +391,12 @@ ikrt_opendir(ikptr dirname, ikpcb* pcb){ ikptr ikrt_readdir(ikptr ptr, ikpcb* pcb){ DIR* d = (DIR*) ref(ptr, off_pointer_data); + errno = 0; struct dirent* ent = readdir(d); if (ent == NULL){ - return 0; + return (errno ? ik_errno_to_code() : false_object); } - int len = ent->d_namlen; + int len = strlen(ent->d_name); ikptr bv = ik_safe_alloc(pcb, align(disp_bytevector_data+len+1)) + bytevector_tag; ref(bv, -bytevector_tag) = fix(len);