diff --git a/racket/src/cs/c/boot.c b/racket/src/cs/c/boot.c index 9cfcc46722..1a7427da25 100644 --- a/racket/src/cs/c/boot.c +++ b/racket/src/cs/c/boot.c @@ -5,6 +5,7 @@ #include #include #include +#include #include "scheme.h" #include "rktio.h" @@ -78,10 +79,16 @@ static void racket_exit(int v) exit(v); } +static int racket_errno() +{ + return errno; +} + static void init_foreign() { # include "rktio.inc" Sforeign_symbol("racket_exit", (void *)racket_exit); + Sforeign_symbol("racket_errno", (void *)racket_errno); } void racket_boot(int argc, char **argv, char *self, diff --git a/racket/src/cs/rumble/foreign.ss b/racket/src/cs/rumble/foreign.ss index f0dbd73df4..a181b380e6 100644 --- a/racket/src/cs/rumble/foreign.ss +++ b/racket/src/cs/rumble/foreign.ss @@ -1814,24 +1814,36 @@ ;; function is called with interrupts disabled (define get-errno - (let ([get-&errno-name - (case (machine-type) - [(a6nt ta6nt i3nt ti3nt) - (load-shared-object "msvcrt.dll") - "_errno"] - [(a6osx ta6osx i3osx ti3osx) - (load-shared-object "libc.dylib") - "__error"] - [(a6le ta6le i3le ti3le) - (load-shared-object "libc.so.6") - "__errno_location"] - [else - ;; FIXME for more platforms - (load-shared-object "libc.so") - "__error"])]) - (let ([get-&errno (foreign-procedure get-&errno-name () void*)]) - (lambda () - (foreign-ref 'int (get-&errno) 0))))) + (cond + [(foreign-entry? "racket_errno") + (foreign-procedure "racket_errno" () int)] + [else + ;; We get here only during a bootstrapping process or in a + ;; development mode that is not running in a Racket executable + (let ([get-&errno-name + (case (machine-type) + [(a6nt ta6nt i3nt ti3nt) + (load-shared-object "msvcrt.dll") + "_errno"] + [(a6osx ta6osx i3osx ti3osx) + (load-shared-object "libc.dylib") + "__error"] + [(a6le ta6le i3le ti3le) + (load-shared-object "libc.so.6") + "__errno_location"] + [else #f])]) + (cond + [get-&errno-name + (let ([get-&errno (foreign-procedure get-&errno-name () void*)]) + (lambda () + (foreign-ref 'int (get-&errno) 0)))] + [else + (let ([warned? #f]) + (lambda () + (unless warned? + (set! warned? #t) + (#%printf "Warning: not recording actual errno value\n")) + 0))]))])) ;; function is called with interrupts disabled (define get-last-error