~ chicken-core (chicken-5) 28347b495e52e06f0f408e8b63ac347feaa8b0d3
commit 28347b495e52e06f0f408e8b63ac347feaa8b0d3 Author: felix <felix@call-with-current-continuation.org> AuthorDate: Fri Feb 12 15:09:36 2010 +0100 Commit: felix <felix@call-with-current-continuation.org> CommitDate: Fri Feb 12 15:09:36 2010 +0100 added ##sys#path-to-executable (untested) diff --git a/chicken.h b/chicken.h index bae4e99f..ccc7acc9 100644 --- a/chicken.h +++ b/chicken.h @@ -890,6 +890,7 @@ DECL_C_PROC_p0 (128, 1,0,0,0,0,0,0,0) # define C_trunc trunc # define C_fabs fabs # define C_modf modf +# define C_readlink readlink # ifdef __linux__ extern double round(double); extern double trunc(double); @@ -1710,6 +1711,7 @@ C_fctexport C_word C_fcall C_i_foreign_unsigned_integer_argumentp(C_word x) C_re C_fctexport C_char *C_lookup_procedure_id(void *ptr); C_fctexport void *C_lookup_procedure_ptr(C_char *id); C_fctexport C_word C_dunload(C_word name); +C_fctexport C_char *C_executable_path(); #ifdef C_SIXTY_FOUR C_fctexport void C_ccall C_peek_signed_integer_32(C_word c, C_word closure, C_word k, C_word v, C_word index) C_noret; diff --git a/library.scm b/library.scm index fe823d0b..2f781ac0 100644 --- a/library.scm +++ b/library.scm @@ -3405,6 +3405,12 @@ EOF (define ##sys#pathname-directory-separator #\/) ; DEPRECATED +;;; Access executable path + +(define ##sys#path-to-executable + (foreign-lambda c-string "C_executable_path")) + + ;;; Feature identifiers: (define ##sys#->feature-id diff --git a/runtime.c b/runtime.c index b225e15f..002ccc89 100644 --- a/runtime.c +++ b/runtime.c @@ -8728,7 +8728,39 @@ static C_regparm C_word C_fcall decode_literal2(C_word **ptr, C_char **str, } -C_regparm C_word C_fcall C_decode_literal(C_word **ptr, C_char *str) +C_regparm C_word C_fcall +C_decode_literal(C_word **ptr, C_char *str) { return decode_literal2(ptr, &str, NULL); } + + +C_char * +C_executable_path() +{ +#ifdef __linux__ + char linkname[64]; /* /proc/<pid>/exe */ + pid_t pid; + int ret; + + pid = C_getpid(); + C_sprintf(linkname, "/proc/%i/exe", pid); + ret = C_readlink(linkname, buffer, STRING_BUFFER_SIZE - 1); + + if(ret == -1 || ret >= STRING_BUFFER_SIZE - 1) + return NULL; + + buffer[ ret ] = 0; + return buffer; +#elseif defined(_WIN32) && !defined(__CYGWIN__) + int n = GetModuleFileName(NULL, buffer, STRING_BUFFER_SIZE - 1); + + if(n == 0 || n >= STRING_BUFFER_SIZE - 1) + return NULL; + + buffer[ n ] = 0; + return buffer; +#else + return NULL; +#endif +}Trap