diff options
-rw-r--r-- | common/log.c | 20 | ||||
-rw-r--r-- | common/readline.c | 27 | ||||
-rw-r--r-- | include/readline.h | 1 |
3 files changed, 47 insertions, 1 deletions
diff --git a/common/log.c b/common/log.c index f9242bf4..0c0ecf89 100644 --- a/common/log.c +++ b/common/log.c | |||
@@ -1,5 +1,6 @@ | |||
1 | #include "log.h" | 1 | #include "log.h" |
2 | #include "sway.h" | 2 | #include "sway.h" |
3 | #include "readline.h" | ||
3 | #include <stdarg.h> | 4 | #include <stdarg.h> |
4 | #include <stdio.h> | 5 | #include <stdio.h> |
5 | #include <stdlib.h> | 6 | #include <stdlib.h> |
@@ -142,6 +143,9 @@ void error_handler(int sig) { | |||
142 | void *array[max_lines]; | 143 | void *array[max_lines]; |
143 | char **bt; | 144 | char **bt; |
144 | size_t bt_len; | 145 | size_t bt_len; |
146 | char maps_file[256]; | ||
147 | char maps_buffer[1024]; | ||
148 | FILE *maps; | ||
145 | 149 | ||
146 | sway_log(L_ERROR, "Error: Signal %d. Printing backtrace", sig); | 150 | sway_log(L_ERROR, "Error: Signal %d. Printing backtrace", sig); |
147 | bt_len = backtrace(array, max_lines); | 151 | bt_len = backtrace(array, max_lines); |
@@ -155,6 +159,22 @@ void error_handler(int sig) { | |||
155 | for (i = 0; (size_t)i < bt_len; i++) { | 159 | for (i = 0; (size_t)i < bt_len; i++) { |
156 | sway_log(L_ERROR, "Backtrace: %s", bt[i]); | 160 | sway_log(L_ERROR, "Backtrace: %s", bt[i]); |
157 | } | 161 | } |
162 | |||
163 | sway_log(L_ERROR, "Maps:"); | ||
164 | pid_t pid = getpid(); | ||
165 | if (snprintf(maps_file, 255, "/proc/%zd/maps", (size_t)pid) < 255) { | ||
166 | maps = fopen(maps_file, "r"); | ||
167 | while (!feof(maps)) { | ||
168 | char *m = read_line_buffer(maps, maps_buffer, 1024); | ||
169 | if (!m) { | ||
170 | fclose(maps); | ||
171 | sway_log(L_ERROR, "Unable to allocate memory to show maps"); | ||
172 | break; | ||
173 | } | ||
174 | sway_log(L_ERROR, m); | ||
175 | } | ||
176 | fclose(maps); | ||
177 | } | ||
158 | #else | 178 | #else |
159 | sway_log(L_ERROR, "Error: Signal %d.", sig); | 179 | sway_log(L_ERROR, "Error: Signal %d.", sig); |
160 | #endif | 180 | #endif |
diff --git a/common/readline.c b/common/readline.c index e75b183f..76ed6926 100644 --- a/common/readline.c +++ b/common/readline.c | |||
@@ -3,7 +3,7 @@ | |||
3 | #include <stdio.h> | 3 | #include <stdio.h> |
4 | 4 | ||
5 | char *read_line(FILE *file) { | 5 | char *read_line(FILE *file) { |
6 | int length = 0, size = 128; | 6 | size_t length = 0, size = 128; |
7 | char *string = malloc(size); | 7 | char *string = malloc(size); |
8 | if (!string) { | 8 | if (!string) { |
9 | return NULL; | 9 | return NULL; |
@@ -37,3 +37,28 @@ char *read_line(FILE *file) { | |||
37 | string[length] = '\0'; | 37 | string[length] = '\0'; |
38 | return string; | 38 | return string; |
39 | } | 39 | } |
40 | |||
41 | char *read_line_buffer(FILE *file, char *string, size_t string_len) { | ||
42 | size_t length = 0; | ||
43 | if (!string) { | ||
44 | return NULL; | ||
45 | } | ||
46 | while (1) { | ||
47 | int c = getc(file); | ||
48 | if (c == EOF || c == '\n' || c == '\0') { | ||
49 | break; | ||
50 | } | ||
51 | if (c == '\r') { | ||
52 | continue; | ||
53 | } | ||
54 | string[length++] = c; | ||
55 | if (string_len <= length) { | ||
56 | return NULL; | ||
57 | } | ||
58 | } | ||
59 | if (length + 1 == string_len) { | ||
60 | return NULL; | ||
61 | } | ||
62 | string[length] = '\0'; | ||
63 | return string; | ||
64 | } | ||
diff --git a/include/readline.h b/include/readline.h index dbe937c1..b3e06d4b 100644 --- a/include/readline.h +++ b/include/readline.h | |||
@@ -4,5 +4,6 @@ | |||
4 | #include <stdio.h> | 4 | #include <stdio.h> |
5 | 5 | ||
6 | char *read_line(FILE *file); | 6 | char *read_line(FILE *file); |
7 | char *read_line_buffer(FILE *file, char *string, size_t string_len); | ||
7 | 8 | ||
8 | #endif | 9 | #endif |