00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 # if !defined(_MSC_VER)
00025 # include <stdio.h>
00026 # include <string.h>
00027 # endif
00028 # include <stdarg.h>
00029 # include <errno.h>
00030 # include <TsErrataUtil.h>
00031 # include "ts/ink_string.h"
00032 # include "ts/ink_defs.h"
00033
00034 namespace ts { namespace msg {
00035
00036 Errata::Code FATAL = 3;
00037 Errata::Code WARN = 2;
00038 Errata::Code INFO = 1;
00039 Errata::Code DEBUG = 0;
00040
00041 # if defined(_MSC_VER)
00042 char* strerror_r(int err, char* s, size_t n) {
00043 ink_strlcpy(s, strerror(err), n);
00044 return s;
00045 }
00046
00047 # define snprintf _snprintf
00048 # endif
00049
00050 Errata&
00051 log(Errata& err, Errata::Id id, Errata::Code code, char const* text) {
00052 err.push(id, code, text);
00053 return err;
00054 }
00055
00056 Errata&
00057 log(Errata& err, Errata::Code code, char const* text) {
00058 err.push(0, code, text);
00059 return err;
00060 }
00061
00062 Errata&
00063 log(RvBase& rv, Errata::Code code, char const* text) {
00064 rv._errata.push(0, code, text);
00065 return rv._errata;
00066 }
00067
00068 Errata
00069 log(Errata::Code code, char const* text) {
00070 Errata err;
00071 err.push(0, code, text);
00072 return err;
00073 }
00074
00075 Errata&
00076 vlogf(
00077 Errata& err,
00078 Errata::Id id,
00079 Errata::Code code,
00080 char const* format,
00081 va_list& rest
00082 ) {
00083 static size_t const SIZE = 8192;
00084 char buffer[SIZE];
00085
00086 vsnprintf(buffer, SIZE, format, rest);
00087 err.push(id, code, buffer);
00088 return err;
00089 }
00090
00091 Errata&
00092 logf(
00093 Errata& err,
00094 Errata::Id id,
00095 Errata::Code code,
00096 char const* format,
00097 ...
00098 ) {
00099 va_list rest;
00100 va_start(rest, format);
00101 return vlogf(err, id, code, format, rest);
00102 }
00103
00104 Errata
00105 logf(Errata::Code code, char const* format, ...) {
00106 Errata err;
00107 va_list rest;
00108 va_start(rest, format);
00109 return vlogf(err, Errata::Id(0), code, format, rest);
00110 }
00111
00112 Errata&
00113 logf(Errata& err, Errata::Code code, char const* format, ...) {
00114 va_list rest;
00115 va_start(rest, format);
00116 return vlogf(err, Errata::Id(0), code, format, rest);
00117 }
00118
00119 Errata&
00120 logf(RvBase& base, Errata::Code code, char const* format, ...) {
00121 va_list rest;
00122 va_start(rest, format);
00123 return vlogf(base._errata, Errata::Id(0), code, format, rest);
00124 }
00125
00126 Errata
00127 log_errno(Errata::Code code, char const* text) {
00128 static size_t const SIZE = 1024;
00129 char buffer[SIZE];
00130 ATS_UNUSED_RETURN(strerror_r(errno, buffer, SIZE));
00131 return logf(code, "%s [%d] %s", text, errno, buffer);
00132 }
00133
00134 Errata
00135 vlogf_errno(Errata& errata, Errata::Id id, Errata::Code code, char const* format, va_list& rest) {
00136 int e = errno;
00137 int n;
00138 static int const E_SIZE = 256;
00139 char e_buffer[E_SIZE];
00140 static int const T_SIZE = 8192;
00141 char t_buffer[T_SIZE];
00142
00143 n = vsnprintf(t_buffer, T_SIZE, format, rest);
00144 if (0 <= n && n < T_SIZE) {
00145 ATS_UNUSED_RETURN(strerror_r(e, e_buffer, E_SIZE));
00146 n += snprintf(t_buffer + n, T_SIZE - n, "[%d] %s", e, e_buffer);
00147 }
00148 errata.push(id, code, t_buffer);
00149 return errata;
00150 }
00151
00152 Errata
00153 logf_errno(Errata::Code code, char const* format, ...) {
00154 Errata zret;
00155 va_list rest;
00156 va_start(rest, format);
00157 return vlogf_errno(zret, 0, code, format, rest);
00158 }
00159
00160 Errata
00161 logf_errno(Errata& errata, Errata::Code code, char const* format, ...) {
00162 va_list rest;
00163 va_start(rest, format);
00164 return vlogf_errno(errata, 0, code, format, rest);
00165 }
00166
00167 Errata
00168 logf_errno(RvBase& rv, Errata::Code code, char const* format, ...) {
00169 va_list rest;
00170 va_start(rest, format);
00171 return vlogf_errno(rv._errata, 0, code, format, rest);
00172 }
00173
00174 }}