00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 #include "libts.h"
00026 #include "ink_error.h"
00027 #include "ink_stack_trace.h"
00028 
00029 #include <syslog.h>
00030 #include <signal.h>    
00031 
00032 static int ink_dprintf_level = 0;
00033 
00034 
00035 
00036 
00037 
00038 
00039 
00040 void
00041 ink_die_die_die(int retval)
00042 {
00043   abort();
00044   _exit(retval);
00045   exit(retval);
00046 }
00047 
00048 
00049 
00050 
00051 
00052 
00053 
00054 void
00055 ink_fatal_va(int return_code, const char * fmt, va_list ap)
00056 {
00057   char msg[1024];
00058   const size_t len = sizeof("FATAL: ") - 1;
00059 
00060   strncpy(msg, "FATAL: ", sizeof(msg));
00061   vsnprintf(msg + len, sizeof(msg) - len, fmt, ap);
00062   msg[sizeof(msg) - 1] = 0;
00063 
00064   fprintf(stderr, "%s\n", msg);
00065   syslog(LOG_CRIT, "%s", msg);
00066   ink_stack_trace_dump();
00067   ink_die_die_die(return_code);
00068 }
00069 
00070 void
00071 ink_fatal(int return_code, const char *message_format, ...)
00072 {
00073   va_list ap;
00074   va_start(ap, message_format);
00075   ink_fatal_va(return_code, message_format, ap);
00076   va_end(ap);
00077 }
00078 
00079 void
00080 ink_fatal_die(const char *message_format, ...)
00081 {
00082   va_list ap;
00083   va_start(ap, message_format);
00084   ink_fatal_va(1, message_format, ap);
00085   va_end(ap);
00086 }
00087 
00088 
00089 
00090 
00091 
00092 
00093 
00094 void
00095 ink_pfatal(int return_code, const char *message_format, ...)
00096 {
00097   va_list ap;
00098   char extended_format[4096], message[4096];
00099 
00100   char *errno_string;
00101 
00102   va_start(ap, message_format);
00103   errno_string = strerror(errno);
00104   snprintf(extended_format, sizeof(extended_format) - 1, "FATAL: %s <last errno = %d (%s)>",
00105            message_format, errno, (errno_string == NULL ? "unknown" : errno_string));
00106   extended_format[sizeof(extended_format) - 1] = 0;
00107   vsnprintf(message, sizeof(message) - 1, extended_format, ap);
00108   message[sizeof(message) - 1] = 0;
00109   fprintf(stderr, "%s\n", message);
00110   syslog(LOG_CRIT, "%s", message);
00111   va_end(ap);
00112   ink_stack_trace_dump();
00113   ink_die_die_die(return_code);
00114 }
00115 
00116 
00117 
00118 
00119 
00120 
00121 void
00122 ink_warning(const char *message_format, ...)
00123 {
00124   va_list ap;
00125   char extended_format[4096], message[4096];
00126   va_start(ap, message_format);
00127   snprintf(extended_format, sizeof(extended_format) - 1, "WARNING: %s", message_format);
00128   extended_format[sizeof(extended_format) - 1] = 0;
00129   vsnprintf(message, sizeof(message) - 1, extended_format, ap);
00130   message[sizeof(message) - 1] = 0;
00131   fprintf(stderr, "%s\n", message);
00132   syslog(LOG_WARNING, "%s", message);
00133   va_end(ap);
00134 }
00135 
00136 
00137 
00138 
00139 
00140 
00141 
00142 void
00143 ink_pwarning(const char *message_format, ...)
00144 {
00145   va_list ap;
00146   char extended_format[4096], message[4096];
00147   char *errno_string;
00148 
00149   va_start(ap, message_format);
00150   errno_string = strerror(errno);
00151   snprintf(extended_format, sizeof(extended_format) - 1, "WARNING: %s <last errno = %d (%s)>",
00152            message_format, errno, (errno_string == NULL ? "unknown" : errno_string));
00153   extended_format[sizeof(extended_format) - 1] = 0;
00154   vsnprintf(message, sizeof(message) - 1, extended_format, ap);
00155   message[sizeof(message) - 1] = 0;
00156   fprintf(stderr, "%s\n", message);
00157   syslog(LOG_WARNING, "%s", message);
00158   va_end(ap);
00159 }
00160 
00161 
00162 
00163 
00164 
00165 
00166 void
00167 ink_notice(const char *message_format, ...)
00168 {
00169   va_list ap;
00170   char extended_format[4096], message[4096];
00171   va_start(ap, message_format);
00172   snprintf(extended_format, sizeof(extended_format) - 1, "NOTE: %s", message_format);
00173   extended_format[sizeof(extended_format) - 1] = 0;
00174   vsnprintf(message, sizeof(message) - 1, extended_format, ap);
00175   message[sizeof(message) - 1] = 0;
00176   fprintf(stderr, "%s\n", message);
00177   syslog(LOG_NOTICE, "%s", message);
00178   va_end(ap);
00179 }
00180 
00181 
00182 
00183 
00184 
00185 
00186 void
00187 ink_eprintf(const char *message_format, ...)
00188 {
00189   va_list ap;
00190   char message[4096];
00191   va_start(ap, message_format);
00192   vsnprintf(message, sizeof(message) - 1, message_format, ap);
00193   message[sizeof(message) - 1] = 0;
00194   fprintf(stderr, "ERROR: %s\n", message);
00195   va_end(ap);
00196 }
00197 
00198 
00199 
00200 
00201 
00202 
00203 void
00204 ink_error(const char *message_format, ...)
00205 {
00206   va_list ap;
00207   char extended_format[2048], message[4096];
00208   va_start(ap, message_format);
00209   snprintf(extended_format, sizeof(extended_format) - 1, "ERROR: %s", message_format);
00210   extended_format[sizeof(extended_format) - 1] = 0;
00211   vsnprintf(message, sizeof(message) - 1, extended_format, ap);
00212   message[sizeof(message) - 1] = 0;
00213   fprintf(stderr, "%s\n", message);
00214   syslog(LOG_ERR, "%s", message);
00215   va_end(ap);
00216 }
00217 
00218 
00219 
00220 
00221 
00222 
00223 void
00224 ink_dprintf(int debug_level, const char *message_format, ...)
00225 {
00226   char message[4096];
00227   va_list ap;
00228   if (debug_level <= ink_dprintf_level) {
00229     va_start(ap, message_format);
00230     vsnprintf(message, sizeof(message) - 1, message_format, ap);
00231     message[sizeof(message) - 1] = 0;
00232     fprintf(stderr, "%s\n", message);
00233     va_end(ap);
00234   }
00235 }
00236 
00237 
00238 
00239 
00240 
00241 
00242 int
00243 ink_set_dprintf_level(int debug_level)
00244 {
00245   int old_ink_dprintf_level = ink_dprintf_level;
00246   if ((ink_dprintf_level = debug_level) < 0)
00247     ink_dprintf_level = 0;
00248   return old_ink_dprintf_level;
00249 }