summaryrefslogtreecommitdiff
path: root/src/libc/intr.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/libc/intr.c')
-rw-r--r--src/libc/intr.c22
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);
}