X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Fruntime.c;h=0f1f0ff023a01e837bf46361c78f2d76e300772c;hb=2dfaffe8bdce30dac9b5baa4d2645d074a176b4f;hp=fba25c0bd23366c49cf1ddde2c2820d8fa309f80;hpb=f815f89eb5b1a7d5e6fefaf5b19321d8870931f9;p=sbcl.git diff --git a/src/runtime/runtime.c b/src/runtime/runtime.c index fba25c0..0f1f0ff 100644 --- a/src/runtime/runtime.c +++ b/src/runtime/runtime.c @@ -35,6 +35,7 @@ #endif #include #include +#include #if defined(SVR4) || defined(__linux__) #include @@ -43,14 +44,14 @@ #include "signal.h" #include "runtime.h" -#include "alloc.h" #include "vars.h" #include "globals.h" #include "os.h" +#include "interr.h" +#include "alloc.h" #include "interrupt.h" #include "arch.h" #include "gc.h" -#include "interr.h" #include "validate.h" #include "core.h" #include "save.h" @@ -67,7 +68,7 @@ #endif #ifndef SBCL_HOME -#define SBCL_HOME "/usr/local/lib/sbcl/" +#define SBCL_HOME SBCL_PREFIX"/lib/sbcl/" #endif #ifdef LISP_FEATURE_HPUX @@ -79,10 +80,10 @@ extern void *return_from_lisp_stub; /* SIGINT handler that invokes the monitor (for when Lisp isn't up to it) */ static void -sigint_handler(int signal, siginfo_t *info, void *void_context) +sigint_handler(int signal, siginfo_t *info, os_context_t *context) { lose("\nSIGINT hit at 0x%08lX\n", - (unsigned long) *os_context_pc_addr(void_context)); + (unsigned long) *os_context_pc_addr(context)); } /* (This is not static, because we want to be able to call it from @@ -127,6 +128,37 @@ copied_existing_filename_or_null(char *filename) return copied_string(filename); } } + +#ifndef LISP_FEATURE_WIN32 +char * +copied_realpath(const char *pathname) +{ + char *messy, *tidy; + size_t len; + + /* realpath() supposedly can't be counted on to always return + * an absolute path, so we prepend the cwd to relative paths */ + messy = NULL; + if (pathname[0] != '/') { + messy = successful_malloc(PATH_MAX + 1); + if (getcwd(messy, PATH_MAX + 1) == NULL) { + free(messy); + return NULL; + } + len = strlen(messy); + snprintf(messy + len, PATH_MAX + 1 - len, "/%s", pathname); + } + + tidy = successful_malloc(PATH_MAX + 1); + if (realpath((messy ? messy : pathname), tidy) == NULL) { + free(messy); + free(tidy); + return NULL; + } + + return tidy; +} +#endif /* LISP_FEATURE_WIN32 */ /* miscellaneous chattiness */ @@ -205,11 +237,58 @@ search_for_core () return core; } +/* Try to find the path to an executable from argv[0], this is only + * used when os_get_runtime_executable_path() returns NULL */ +#ifdef LISP_FEATURE_WIN32 +char * +search_for_executable(const char *argv0) +{ + return NULL; +} +#else /* LISP_FEATURE_WIN32 */ +char * +search_for_executable(const char *argv0) +{ + char *search, *start, *end, *buf; + + /* If argv[0] contains a slash then it's probably an absolute path + * or relative to the current directory, so check if it exists. */ + if (strchr(argv0, '/') != NULL && access(argv0, F_OK) == 0) + return copied_realpath(argv0); + + /* Bail on an absolute path which doesn't exist */ + if (argv0[0] == '/') + return NULL; + + /* Otherwise check if argv[0] exists relative to any directory in PATH */ + search = getenv("PATH"); + if (search == NULL) + return NULL; + search = copied_string(search); + buf = successful_malloc(PATH_MAX + 1); + for (start = search; (end = strchr(start, ':')) != NULL; start = end + 1) { + *end = '\0'; + snprintf(buf, PATH_MAX + 1, "%s/%s", start, argv0); + if (access(buf, F_OK) == 0) { + free(search); + search = copied_realpath(buf); + free(buf); + return search; + } + } + + free(search); + free(buf); + return NULL; +} +#endif /* LISP_FEATURE_WIN32 */ + char **posix_argv; char *core_string; struct runtime_options *runtime_options; +char *saved_runtime_path = NULL; int main(int argc, char *argv[], char *envp[]) @@ -229,26 +308,34 @@ main(int argc, char *argv[], char *envp[]) /* other command line options */ boolean noinform = 0; boolean end_runtime_options = 0; + boolean disable_lossage_handler_p = 0; lispobj initial_function; const char *sbcl_home = getenv("SBCL_HOME"); interrupt_init(); - block_blockable_signals(); + block_blockable_signals(0, 0); setlocale(LC_ALL, ""); runtime_options = NULL; + /* Save the argv[0] derived runtime path in case + * os_get_runtime_executable_path(1) isn't able to get an + * externally-usable path later on. */ + saved_runtime_path = search_for_executable(argv[0]); + /* Check early to see if this executable has an embedded core, * which also populates runtime_options if the core has runtime * options */ - runtime_path = os_get_runtime_executable_path(); - if (runtime_path) { - os_vm_offset_t offset = search_for_embedded_core(runtime_path); + runtime_path = os_get_runtime_executable_path(0); + if (runtime_path || saved_runtime_path) { + os_vm_offset_t offset = search_for_embedded_core( + runtime_path ? runtime_path : saved_runtime_path); if (offset != -1) { embedded_core_offset = offset; - core = runtime_path; + core = (runtime_path ? runtime_path : + copied_string(saved_runtime_path)); } else { free(runtime_path); } @@ -275,6 +362,8 @@ main(int argc, char *argv[], char *envp[]) * TOPLEVEL-INIT sees the option. */ noinform = 1; end_runtime_options = 1; + disable_lossage_handler_p = 1; + lose_on_corruption_p = 1; break; } else if (0 == strcmp(arg, "--noinform")) { noinform = 1; @@ -337,6 +426,12 @@ main(int argc, char *argv[], char *envp[]) ++n; } ++argi; + } else if (0 == strcmp(arg, "--disable-ldb")) { + disable_lossage_handler_p = 1; + ++argi; + } else if (0 == strcmp(arg, "--lose-on-corruption")) { + lose_on_corruption_p = 1; + ++argi; } else if (0 == strcmp(arg, "--end-runtime-options")) { end_runtime_options = 1; ++argi; @@ -419,14 +514,15 @@ main(int argc, char *argv[], char *envp[]) fflush(stdout); } -#if defined(SVR4) || defined(__linux__) +#if defined(SVR4) || defined(__linux__) || defined(__NetBSD__) tzset(); #endif define_var("nil", NIL, 1); define_var("t", T, 1); - enable_lossage_handler(); + if (!disable_lossage_handler_p) + enable_lossage_handler(); globals_init();