| 839 | } |
| 840 | |
| 841 | void fatal_vfmt(const char *fmt, va_list ap) |
| 842 | { |
| 843 | va_list ap2; |
| 844 | |
| 845 | /* You are not allowed to re-use va_lists, so make a copy. */ |
| 846 | va_copy(ap2, ap); |
| 847 | vfprintf(stderr, fmt, ap); |
| 848 | fprintf(stderr, "\n"); |
| 849 | |
| 850 | if (!crashlog) |
| 851 | exit(1); |
| 852 | |
| 853 | logv(crashlog, LOG_BROKEN, NULL, true, fmt, ap2); |
| 854 | abort(); |
| 855 | /* va_copy() must be matched with va_end(), even if unreachable. */ |
| 856 | va_end(ap2); |
| 857 | } |
| 858 | |
| 859 | void fatal(const char *fmt, ...) |
| 860 | { |