00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include <cerrno>
00019 #include <cstdio>
00020 #include <cstdlib>
00021 #include <cstring>
00022
00023 #include <libplumbing/logging.h>
00024 #include <libplumbing/logging/stderr.h>
00025
00026
00027 plumbing::logging *plumbing::logging::singleton;
00028
00029
00030 plumbing::logging::~logging()
00031 {
00032 if (singleton == this)
00033 singleton = 0;
00034 }
00035
00036
00037 plumbing::logging::logging()
00038 {
00039 }
00040
00041
00042 void
00043 plumbing::logging::message(const char *fmt, ...)
00044 {
00045 va_list ap;
00046 va_start(ap, fmt);
00047 message_v(fmt, ap);
00048 va_end(ap);
00049 }
00050
00051
00052 void
00053 plumbing::logging::message_v(const char *fmt, va_list ap)
00054 {
00055 char buffer[2000];
00056 vsnprintf(buffer, sizeof(buffer), fmt, ap);
00057 deliver_message_text(buffer);
00058 }
00059
00060
00061 void
00062 plumbing::logging::warning(const char *fmt, ...)
00063 {
00064 va_list ap;
00065 va_start(ap, fmt);
00066 warning_v(fmt, ap);
00067 va_end(ap);
00068 }
00069
00070
00071 void
00072 plumbing::logging::warning_v(const char *fmt, va_list ap)
00073 {
00074 char buffer[2000];
00075 vsnprintf(buffer, sizeof(buffer), fmt, ap);
00076 message("warning: %s", buffer);
00077 }
00078
00079
00080 void
00081 plumbing::logging::fatal_error(const char *fmt, ...)
00082 {
00083 va_list ap;
00084 va_start(ap, fmt);
00085 fatal_error_v(fmt, ap);
00086 va_end(ap);
00087 }
00088
00089
00090 void
00091 plumbing::logging::fatal_error_v(const char *fmt, va_list ap)
00092 {
00093 char buffer[2000];
00094 vsnprintf(buffer, sizeof(buffer), fmt, ap);
00095 deliver_message_text(buffer);
00096 exit();
00097 }
00098
00099
00100 void
00101 plumbing::logging::exit()
00102 {
00103 ::exit(1);
00104 }
00105
00106
00107 void
00108 plumbing::logging::register_stream(logging *ls)
00109 {
00110 singleton = ls;
00111 }
00112
00113
00114 plumbing::logging &
00115 plumbing::logging::get_singleton()
00116 {
00117 if (!singleton)
00118 {
00119 static logging_stderr xerr;
00120 singleton = &xerr;
00121 }
00122 return *singleton;
00123 }
00124
00125
00126