diff options
-rwxr-xr-x | configure | 32 | ||||
-rw-r--r-- | sysif.c | 16 | ||||
-rw-r--r-- | txr.1 | 17 |
3 files changed, 65 insertions, 0 deletions
@@ -173,6 +173,7 @@ have_unistd= have_sys_stat= have_sys_types= have_sys_time= +have_strerror_r= have_makedev= have_syslog= have_glob= @@ -2022,6 +2023,37 @@ else fi # +# errno stuff +# + +printf "Checking for strerror_r ..." + +for type in int 'char *' ; do + cat > conftest.c <<! +#include <string.h> + +int main(int argc, char **argv) +{ + $type (*fp)(int, char *, size_t) = strerror_r; + return 0; +} +! + if conftest EXTRA_FLAGS=-Werror=incompatible-pointer-types ; then + if [ "$type" = int ] ; then + printf "yes (POSIX)\n" + printf "#define HAVE_STRERROR_POSIX 1\n" >> config.h + else + printf "yes (GNU)\n" + printf "#define HAVE_STRERROR_GNU 1\n" >> config.h + fi + have_strerror_r=y + break + fi +done + +[ $have_strerror_r ] || printf "no\n" + +# # fcntl # @@ -141,6 +141,21 @@ static val errno_wrap(val newval) return oldval; } +static val strerror_wrap(val errnum) +{ + val self = lit("strerror"); + int eno = c_int(errnum, self); +#if HAVE_STRERROR_POSIX + char buf[128]; + return strerror_r(eno, buf, sizeof buf) >= 0 ? string_utf8(buf) : nil; +#elif HAVE_STRERROR_GNU + char buf[128]; + return string_utf8(strerror_r(eno, buf, sizeof buf)); +#else + return string_utf8(strerror(eno)); +#endif +} + #if HAVE_DAEMON static val daemon_wrap(val nochdir, val noclose) { @@ -2327,6 +2342,7 @@ void sysif_init(void) reg_varl(intern(lit("exdev"), user_package), num_fast(EXDEV)); reg_fun(intern(lit("errno"), user_package), func_n1o(errno_wrap, 0)); + reg_fun(intern(lit("strerror"), user_package), func_n1o(strerror_wrap, 0)); reg_fun(intern(lit("exit"), user_package), func_n1(exit_wrap)); reg_fun(intern(lit("at-exit-call"), user_package), func_n1(at_exit_call)); reg_fun(intern(lit("at-exit-do-not-call"), user_package), func_n1(at_exit_do_not_call)); @@ -58584,6 +58584,23 @@ The place form of .code errno does not take an argument. +.coNP Function @ strerror +.synb +.mets (strerror << errno-value ) +.syne +.desc +The +.code strerror +returns a character string which provides the host platform's description +of the integer +.meta errno-value +obtained from the +.code errno +function. + +If the host platform fails to provide a descripion, the function returns +.codn nil . + .coNP Function @ exit .synb .mets (exit << status ) |