diff --git a/include/misc.h b/include/misc.h index ca9b8a9d..e89a016f 100644 --- a/include/misc.h +++ b/include/misc.h @@ -123,6 +123,15 @@ typedef short coord; #define hours(x) (60*60*(x)) #define days(x) (60*60*24*(x)) +extern int debug; + +/* + * If EXPR is true, an internal error occured. + * Return EXPR != 0. + * Usage: if (CANT_HAPPEN(...)) recovery_code(); + */ +#define CANT_HAPPEN(expr) ((expr) ? oops(#expr, __FILE__, __LINE__) : 0) + typedef int (*qsort_func_t) (const void *, const void *); /* return codes from command routines */ diff --git a/include/prototypes.h b/include/prototypes.h index 553940fe..59b25bc2 100644 --- a/include/prototypes.h +++ b/include/prototypes.h @@ -128,6 +128,7 @@ extern int has_helpful_engineer(coord x, coord y, natid cn); /* log.c */ extern void loginit(s_char *); extern void logerror(s_char *, ...) ATTRIBUTE((format (printf, 1, 2))); +extern int oops(char *, char *, int); /* maps.c */ extern int draw_map(int, s_char, int, struct nstr_sect *, int); extern int unit_map(int, int, struct nstr_sect *, s_char *); diff --git a/src/lib/common/log.c b/src/lib/common/log.c index f3200ec7..4e959896 100644 --- a/src/lib/common/log.c +++ b/src/lib/common/log.c @@ -99,3 +99,15 @@ logerror(s_char *format, ...) #endif va_end(list); } + +/* + * Log internal error MSG occured in FILE:LINE. + * If debugging, call abort(), else return 1. + */ +int +oops(char *msg, char *file, int line) +{ + logerror("Oops: %s in %s:%d\n", msg, file, line); + if (debug) abort(); + return 1; +} diff --git a/src/server/main.c b/src/server/main.c index 0af848f4..fbe69c52 100644 --- a/src/server/main.c +++ b/src/server/main.c @@ -80,13 +80,19 @@ static void loc_NTTerm(void); static int mainpid = 0; #endif +/* + * Debugging? + * If yes, don't fork into background, don't catch certain signals, + * call abort() on internal error. + */ +int debug = 0; + int main(int argc, char **argv) { time_t now; int hour[2]; int flags = 0; - int debug = 0; int op; char *config_file = NULL; extern char *optarg;