X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Fruntime.c;h=59cead9c4c6f5a98d35383675efa25b5a3299656;hb=743831e679b673a5680a0afd8402911516bf50e2;hp=09e92c856c603e12c9d73cc434f54476d1eff198;hpb=b46345044a6b9e2db26700e297daedb05307919b;p=sbcl.git diff --git a/src/runtime/runtime.c b/src/runtime/runtime.c index 09e92c8..59cead9 100644 --- a/src/runtime/runtime.c +++ b/src/runtime/runtime.c @@ -43,14 +43,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" @@ -79,10 +79,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 +127,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 +236,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 +307,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 +361,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; @@ -309,8 +397,10 @@ main(int argc, char *argv[], char *envp[]) if (errno) lose("argument to --dynamic-space-size is not a number"); # ifdef MAX_DYNAMIC_SPACE_END - if (!((DYNAMIC_SPACE_START < DYNAMIC_SPACE_START+dynamic_space_size) && - (DYNAMIC_SPACE_START+dynamic_space_size <= MAX_DYNAMIC_SPACE_END))) + if (!((DYNAMIC_SPACE_START < + DYNAMIC_SPACE_START+dynamic_space_size) && + (DYNAMIC_SPACE_START+dynamic_space_size <= + MAX_DYNAMIC_SPACE_END))) lose("specified --dynamic-space-size too large"); # endif } else if (0 == strcmp(arg, "--control-stack-size")) { @@ -335,6 +425,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; @@ -417,14 +513,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(); @@ -433,8 +530,8 @@ main(int argc, char *argv[], char *envp[]) lose("couldn't find initial function\n"); } #ifdef LISP_FEATURE_HPUX - /* -1 = CLOSURE_FUN_OFFSET, 23 = SIMPLE_FUN_CODE_OFFSET, we are not in LANGUAGE_ASSEMBLY - so we cant reach them. */ + /* -1 = CLOSURE_FUN_OFFSET, 23 = SIMPLE_FUN_CODE_OFFSET, we are + * not in LANGUAGE_ASSEMBLY so we cant reach them. */ return_from_lisp_stub = (void *) ((char *)*((unsigned long *) ((char *)initial_function + -1)) + 23); #endif