brians | 343bc11 | 2013-02-10 01:53:46 +0000 | [diff] [blame] | 1 | #include "aos/common/die.h" |
| 2 | |
| 3 | #include <stdlib.h> |
| 4 | #include <stdio.h> |
| 5 | #include <errno.h> |
| 6 | #include <sys/types.h> |
| 7 | #include <unistd.h> |
| 8 | #include <string.h> |
Brian Silverman | 8d2e56e | 2013-09-23 17:55:03 -0700 | [diff] [blame] | 9 | #include <signal.h> |
Brian | 4a424a2 | 2014-04-02 11:52:45 -0700 | [diff] [blame] | 10 | #include <stdint.h> |
brians | 343bc11 | 2013-02-10 01:53:46 +0000 | [diff] [blame] | 11 | |
| 12 | #include <string> |
| 13 | |
brians | 343bc11 | 2013-02-10 01:53:46 +0000 | [diff] [blame] | 14 | namespace aos { |
| 15 | |
| 16 | void Die(const char *format, ...) { |
| 17 | va_list args; |
| 18 | va_start(args, format); |
| 19 | VDie(format, args); |
Brian Silverman | 5b61e46 | 2013-03-16 16:47:23 -0700 | [diff] [blame] | 20 | // va_end(args) // not because VDie never returns |
brians | 343bc11 | 2013-02-10 01:53:46 +0000 | [diff] [blame] | 21 | } |
| 22 | |
| 23 | namespace { |
Brian Silverman | 8d2e56e | 2013-09-23 17:55:03 -0700 | [diff] [blame] | 24 | |
brians | 343bc11 | 2013-02-10 01:53:46 +0000 | [diff] [blame] | 25 | // Calculates the filename to dump the message into. |
| 26 | const std::string GetFilename() { |
| 27 | #ifdef __VXWORKS__ |
| 28 | const char *name = taskName(0); // get the name of this task |
| 29 | if (name == NULL) name = "<unknown>"; |
| 30 | const std::string first_part = "/aos_fatal_error."; |
| 31 | return first_part + std::string(name); |
| 32 | #else |
| 33 | char *filename; |
| 34 | if (asprintf(&filename, "/tmp/aos_fatal_error.%jd", |
| 35 | static_cast<intmax_t>(getpid())) > 0) { |
| 36 | std::string r(filename); |
| 37 | free(filename); |
| 38 | return r; |
| 39 | } else { |
| 40 | fprintf(stderr, "aos fatal: asprintf(%p, \"thingie with %%jd\", %jd)" |
Brian Silverman | 01be000 | 2014-05-10 15:44:38 -0700 | [diff] [blame^] | 41 | " failed with %d\n", &filename, |
| 42 | static_cast<intmax_t>(getpid()), errno); |
brians | 343bc11 | 2013-02-10 01:53:46 +0000 | [diff] [blame] | 43 | return std::string(); |
| 44 | } |
| 45 | #endif |
| 46 | } |
Brian Silverman | 8d2e56e | 2013-09-23 17:55:03 -0700 | [diff] [blame] | 47 | |
| 48 | bool test_mode = false; |
| 49 | |
brians | 343bc11 | 2013-02-10 01:53:46 +0000 | [diff] [blame] | 50 | } // namespace |
brians | 6ed722d | 2013-02-12 03:19:55 +0000 | [diff] [blame] | 51 | |
brians | 343bc11 | 2013-02-10 01:53:46 +0000 | [diff] [blame] | 52 | void VDie(const char *format, va_list args_in) { |
Brian Silverman | 5b61e46 | 2013-03-16 16:47:23 -0700 | [diff] [blame] | 53 | // We don't bother va_ending either of these because we're going nowhere and |
| 54 | // vxworks has some weird bugs that sometimes show up... |
| 55 | va_list args1, args2; |
brians | 343bc11 | 2013-02-10 01:53:46 +0000 | [diff] [blame] | 56 | |
| 57 | fputs("aos fatal: ERROR!! details following\n", stderr); |
Brian Silverman | 5b61e46 | 2013-03-16 16:47:23 -0700 | [diff] [blame] | 58 | va_copy(args1, args_in); |
| 59 | vfprintf(stderr, format, args1); |
Brian Silverman | 8d2e56e | 2013-09-23 17:55:03 -0700 | [diff] [blame] | 60 | if (!test_mode) { |
| 61 | fputs("aos fatal: ERROR!! see stderr for details\n", stdout); |
brians | 343bc11 | 2013-02-10 01:53:46 +0000 | [diff] [blame] | 62 | |
Brian Silverman | 8d2e56e | 2013-09-23 17:55:03 -0700 | [diff] [blame] | 63 | const std::string filename = GetFilename(); |
| 64 | if (!filename.empty()) { |
| 65 | FILE *error_file = fopen(filename.c_str(), "w"); |
| 66 | if (error_file != NULL) { |
| 67 | va_copy(args2, args_in); |
| 68 | vfprintf(error_file, format, args2); |
| 69 | fclose(error_file); |
| 70 | } else { |
Brian Silverman | 01be000 | 2014-05-10 15:44:38 -0700 | [diff] [blame^] | 71 | fprintf(stderr, "aos fatal: fopen('%s', \"w\") failed with %d\n", |
| 72 | filename.c_str(), errno); |
Brian Silverman | 8d2e56e | 2013-09-23 17:55:03 -0700 | [diff] [blame] | 73 | } |
brians | 343bc11 | 2013-02-10 01:53:46 +0000 | [diff] [blame] | 74 | } |
| 75 | } |
| 76 | |
brians | 343bc11 | 2013-02-10 01:53:46 +0000 | [diff] [blame] | 77 | abort(); |
| 78 | } |
| 79 | |
Brian Silverman | 8d2e56e | 2013-09-23 17:55:03 -0700 | [diff] [blame] | 80 | void SetDieTestMode(bool new_test_mode) { |
| 81 | test_mode = new_test_mode; |
| 82 | } |
| 83 | |
brians | 343bc11 | 2013-02-10 01:53:46 +0000 | [diff] [blame] | 84 | } // namespace aos |