From a44a00b405bebd849c59cf2188bdf07d532bf880 Mon Sep 17 00:00:00 2001 From: Abdulaziz Ghuloum Date: Thu, 9 Apr 2009 23:55:44 +0300 Subject: [PATCH] Applied patch that fixes bug: dirent->d_namlen not available on linux. Thanks Derick Eddington. --- scheme/ikarus.io.ss | 5 ++++- scheme/last-revision | 2 +- src/ikarus-io.c | 5 +++-- 3 files changed, 8 insertions(+), 4 deletions(-) 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);