Added errno.

This commit is contained in:
Abdulaziz Ghuloum 2008-11-25 22:52:26 -05:00
parent 55974d44fa
commit 3049d3d22e
6 changed files with 15 additions and 2 deletions

View File

@ -25,7 +25,8 @@
pointer->integer integer->pointer pointer? dlopen dlsym pointer->integer integer->pointer pointer? dlopen dlsym
dlclose dlerror dlclose dlerror
make-c-callout make-c-callback make-c-callout make-c-callback
pointer-size) pointer-size
errno)
(import (ikarus) (ikarus system $foreign)) (import (ikarus) (ikarus system $foreign))

View File

@ -2,6 +2,7 @@
(library (ikarus.pointers) (library (ikarus.pointers)
(export pointer? integer->pointer pointer->integer (export pointer? integer->pointer pointer->integer
dlopen dlerror dlclose dlsym malloc free dlopen dlerror dlclose dlsym malloc free
errno
pointer-ref-c-signed-char pointer-ref-c-signed-char
pointer-ref-c-signed-short pointer-ref-c-signed-short
pointer-ref-c-signed-int pointer-ref-c-signed-int
@ -264,6 +265,9 @@
(or (foreign-call "ikrt_prepare_callback" data) (or (foreign-call "ikrt_prepare_callback" data)
(die who "cannot prepare foreign callback"))))))) (die who "cannot prepare foreign callback")))))))
(define (errno)
(foreign-call "ikrt_last_errno"))
) )

View File

@ -1 +1 @@
1691 1692

View File

@ -1475,6 +1475,7 @@
[dlsym $for] [dlsym $for]
[malloc $for] [malloc $for]
[free $for] [free $for]
[errno $for]
[pointer-ref-c-signed-char $for] [pointer-ref-c-signed-char $for]
[pointer-ref-c-signed-short $for] [pointer-ref-c-signed-short $for]
[pointer-ref-c-signed-int $for] [pointer-ref-c-signed-int $for]

View File

@ -172,6 +172,7 @@ typedef struct ikpcb{
struct timeval collect_utime; struct timeval collect_utime;
struct timeval collect_stime; struct timeval collect_stime;
struct timeval collect_rtime; struct timeval collect_rtime;
int last_errno;
} ikpcb; } ikpcb;
typedef struct { typedef struct {

View File

@ -1,6 +1,7 @@
#include "ikarus-data.h" #include "ikarus-data.h"
#include "config.h" #include "config.h"
#include <sys/errno.h>
#if ENABLE_LIBFFI #if ENABLE_LIBFFI
#include <ffi.h> #include <ffi.h>
@ -337,6 +338,7 @@ ikrt_ffi_call(ikptr data, ikptr argsvec, ikpcb* pcb) {
avalues[n] = NULL; avalues[n] = NULL;
void* rvalue = alloc_room_for_type(cif->rtype); void* rvalue = alloc_room_for_type(cif->rtype);
ffi_call(cif, fn, rvalue, avalues); ffi_call(cif, fn, rvalue, avalues);
pcb->last_errno = errno;
ikptr val = ffi_to_scheme_value_cast(unfix(rtype), rvalue, pcb); ikptr val = ffi_to_scheme_value_cast(unfix(rtype), rvalue, pcb);
for(i=0; i<n; i++){ for(i=0; i<n; i++){
free(avalues[i]); free(avalues[i]);
@ -360,6 +362,10 @@ ikrt_ffi_call(ikptr data, ikptr argsvec, ikpcb* pcb) {
return val; return val;
} }
ikptr
ikrt_last_errno(ikpcb* pcb){
return s_to_number(pcb->last_errno, pcb);
}
/* /*