diff options
Diffstat (limited to 'src/libc')
-rw-r--r-- | src/libc/intr.c | 22 |
1 files changed, 20 insertions, 2 deletions
diff --git a/src/libc/intr.c b/src/libc/intr.c index 12e6f4c..e751fa1 100644 --- a/src/libc/intr.c +++ b/src/libc/intr.c @@ -1,4 +1,5 @@ #include <camellia/intr.h> +#include <stdbool.h> #include <stdio.h> #include <stdlib.h> @@ -9,6 +10,23 @@ void intr_set(void (*fn)(struct intr_data *)) { _intr = fn ? fn : intr_null; } -void intr_default(struct intr_data *) { - exit(-1); +/* does haystack begin with needle? */ +static +bool strprefix(const char *haystack, const char *needle) +{ + for (;; haystack++, needle++) { + if (*needle == '\0') return true; + /* note that *haystack == '\0' implies *needle != *haystack */ + if (*needle != *haystack) return false; + } +} + +__attribute__((visibility("hidden"))) +extern char __executable_start[]; + +void intr_default(struct intr_data *d) { + if (strprefix(d->msg, "sys: ")) { + fprintf(stderr, "%s: %s (base %p)\n", getprogname(), d->msg, __executable_start); + } + exit(1); } |