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
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038 #ifndef lint
00039 static char copyright[] =
00040 "@(#) Copyright (c) 2002\n\
00041 Netherlands Forensic Institute. All rights reserved.\n";
00042 #endif
00043
00044 #ifdef HAVE_CONFIG_H
00045 #include <config.h>
00046 #endif
00047
00048 #include <errno.h>
00049 #include <stdlib.h>
00050 #include <stdio.h>
00051 #include <string.h>
00052
00053 #include "rdd.h"
00054 #include "rdd_internals.h"
00055 #include "rdd.h"
00056 #include "error.h"
00057
00058 #define NO_CONSOLE 0
00059 #define CONSOLE 1
00060
00061 static char *progname = "<unknown program>";
00062 static char *email_addr = PACKAGE_BUGREPORT;
00063
00064 static char *bug_message_fmt =
00065 "Rdd has crashed. Please do the following:\n"
00066 " 1. Write down the time of day reported by your computer.\n"
00067 " 2. If rdd dumped core, save a copy of the core file.\n"
00068 " 3. Save a copy of /var/log/messages.\n"
00069 " 4. Save a copy of your rdd binary.\n"
00070 " 4. Report this problem to %s.\n";
00071
00072 static FILE *logfp = NULL;
00073 static int new_line = 1;
00074
00075 #if defined(RDD_CONSOLE)
00076 #define LOGFP (logfp)
00077 #else
00078 #define LOGFP ((logfp) == NULL ? stderr : (logfp))
00079 #endif
00080
00084 static void
00085 log_vprintf(int console, char *fmt, va_list ap)
00086 {
00087 if (console) {
00088 #if defined(RDD_CONSOLE)
00089 rdd_cons_vprintf(fmt, ap);
00090 #else
00091
00092
00093 vfprintf(stderr, fmt, ap);
00094 #endif
00095 }
00096
00097 if (logfp != NULL) {
00098
00099
00100
00101 vfprintf(logfp, fmt, ap);
00102 } else if (! console) {
00103
00104
00105
00106
00107
00108 #if defined(RDD_CONSOLE)
00109 rdd_cons_vprintf(fmt, ap);
00110 #else
00111
00112
00113 vfprintf(stderr, fmt, ap);
00114 #endif
00115 }
00116 }
00117
00118 static void
00119 log_printf(int console, char *fmt, ...)
00120 {
00121 va_list ap;
00122
00123 va_start(ap, fmt);
00124 log_vprintf(console, fmt, ap);
00125 va_end(ap);
00126 }
00127
00128 static void
00129 log_flush(void)
00130 {
00131 if (logfp != NULL) fflush(logfp);
00132 }
00133
00134 void
00135 set_progname(char *name)
00136 {
00137 progname = name;
00138 }
00139
00140 void
00141 set_logfile(FILE *fp)
00142 {
00143 if (logfp != NULL) {
00144 fflush(logfp);
00145 }
00146 logfp = fp;
00147 }
00148
00149 void
00150 bug(char *fmt, ...)
00151 {
00152 va_list ap;
00153
00154 va_start(ap, fmt);
00155 log_printf(CONSOLE, "%s: bug: ", progname);
00156 log_vprintf(CONSOLE, fmt, ap);
00157 log_printf(CONSOLE, "\n\n");
00158 log_printf(CONSOLE, bug_message_fmt, email_addr);
00159 log_flush();
00160 va_end(ap);
00161 abort();
00162 }
00163
00164 void
00165 error(char *fmt, ...)
00166 {
00167 va_list ap;
00168
00169 va_start(ap, fmt);
00170 log_printf(CONSOLE, "%s: ", progname);
00171 log_vprintf(CONSOLE, fmt, ap);
00172 log_printf(CONSOLE, "\n");
00173 log_flush();
00174 va_end(ap);
00175 exit(EXIT_FAILURE);
00176 }
00177
00178 void
00179 warn(char *fmt, ...)
00180 {
00181 va_list ap;
00182
00183 va_start(ap, fmt);
00184 log_printf(CONSOLE, "(warning) %s: ", progname);
00185 log_vprintf(CONSOLE, fmt, ap);
00186 log_printf(CONSOLE, "\n");
00187 log_flush();
00188 va_end(ap);
00189 }
00190
00191 void
00192 unix_warn(char *fmt, ...)
00193 {
00194 va_list ap;
00195 int err = errno;
00196
00197 va_start(ap, fmt);
00198 log_printf(CONSOLE, "%s: ", progname);
00199 log_vprintf(CONSOLE, fmt, ap);
00200 log_printf(CONSOLE, ": %s\n", strerror(err));
00201 log_flush();
00202 va_end(ap);
00203 }
00204
00205 void
00206 unix_error(char *fmt, ...)
00207 {
00208 va_list ap;
00209 int err = errno;
00210
00211 va_start(ap, fmt);
00212 log_printf(CONSOLE, "%s: ", progname);
00213 log_vprintf(CONSOLE, fmt, ap);
00214 log_printf(CONSOLE, ": %s\n", strerror(err));
00215 log_flush();
00216 va_end(ap);
00217 exit(EXIT_FAILURE);
00218 }
00219
00220 void
00221 errlog(char *fmt, ...)
00222 {
00223 va_list ap;
00224
00225 if (new_line) log_printf(CONSOLE, "%s: ", rdd_ctime());
00226
00227 va_start(ap, fmt);
00228 log_vprintf(CONSOLE, fmt, ap);
00229 va_end(ap);
00230
00231 new_line = 0;
00232 }
00233
00234 void
00235 errlognl(char *fmt, ...)
00236 {
00237 va_list ap;
00238
00239 if (new_line) log_printf(CONSOLE, "%s: ", rdd_ctime());
00240
00241 va_start(ap, fmt);
00242 log_vprintf(CONSOLE, fmt, ap);
00243 log_printf(CONSOLE, "\n");
00244 log_flush();
00245 va_end(ap);
00246
00247 new_line = 1;
00248 }
00249
00250 void
00251 rdd_error(int errcode, char *fmt, ...)
00252 {
00253 char msg[1024];
00254 va_list ap;
00255 int rc;
00256
00257 va_start(ap, fmt);
00258 log_printf(CONSOLE, "%s: ", progname);
00259 log_vprintf(CONSOLE, fmt, ap);
00260 va_end(ap);
00261
00262 log_printf(CONSOLE, ": ");
00263 rc = rdd_strerror(errcode, msg, sizeof msg);
00264 if (rc == RDD_NOMEM) {
00265 log_printf(CONSOLE, "<error message too long>");
00266 } else if (rc == RDD_OK) {
00267 log_printf(CONSOLE, msg);
00268 } else {
00269 log_printf(CONSOLE, "internal error: "
00270 "unknown error code [%d]\n", errcode);
00271 abort();
00272 }
00273
00274 log_printf(CONSOLE, "\n");
00275
00276 log_flush();
00277 exit(EXIT_FAILURE);
00278 }