diff options
| author | Felix Morgner <felix.morgner@gmail.com> | 2026-08-24 11:16:07 +0200 |
|---|---|---|
| committer | Felix Morgner <felix.morgner@gmail.com> | 2026-08-24 11:16:07 +0200 |
| commit | c068f22329d5cc722622a2183bbb22eef2093df7 (patch) | |
| tree | 12d56c1aede67988a55e241364606bfbb4dba933 /src/parsec_server/sys_err_sv.cpp | |
| download | openparsec-main.tar.xz openparsec-main.zip | |
Diffstat (limited to 'src/parsec_server/sys_err_sv.cpp')
| -rwxr-xr-x | src/parsec_server/sys_err_sv.cpp | 185 |
1 files changed, 185 insertions, 0 deletions
diff --git a/src/parsec_server/sys_err_sv.cpp b/src/parsec_server/sys_err_sv.cpp new file mode 100755 index 0000000..42a056d --- /dev/null +++ b/src/parsec_server/sys_err_sv.cpp @@ -0,0 +1,185 @@ +/* + * PARSEC - Error Handling Code + * + * $Author: uberlinuxguy $ - $Date: 2004/09/15 12:26:07 $ + * + * Orginally written by: + * Copyright (c) Clemens Beer <cbx@parsec.org> 2001 + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +// C library +#include <errno.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <stdarg.h> + +// compilation flags/debug support +#include "config.h" +#include "debug.h" + +// general definitions +#include "general.h" +#include "objstruc.h" + +// global externals +#include "globals.h" + +// proprietary module headers +#include "sys_util_sv.h" + + +// common error strings ------------------------------------------------------- +// +static char err_exit[] = "Parsec error exit"; +static char err_emem[] = "Parsec memory error exit"; +static char err_ndef[] = "Unrecoverable error"; +static char err_nmem[] = "Memory allocation failed"; +static char err_msg1[] = "\n%s: %s"; +static char err_msg2[] = "\n%s: %s (%s, line %u)."; + +// cleanup macro -------------------------------------------------------------- +// +#define CLEAN_UP(x) SYSs_CleanUp() + + +// exit function if critical error occurred ----------------------------------- +// +void SYSs_PanicFunction( const char *msg, const char *file, unsigned line ) +{ + // print error message + if ( ( msg != NULL ) && ( *msg != 0 ) ) { + + // print custom message if provided and not empty + fprintf( stderr, err_msg1, err_exit, msg ); + + } else if ( ( msg != NULL ) && ( errno > 0 ) ) { + + // print errno error if provided message is empty + fprintf( stderr, err_msg2, err_exit, strerror( errno ), file, line ); + + } else { + + // print generic error message if no message provided + fprintf( stderr, err_msg2, err_exit, err_ndef, file, line ); + } + fprintf( stderr, "\n" ); + + // just to be sure + fflush( stderr ); + + CLEAN_UP(0); + //FIXME_GAMESERVER: check whether exit also automatically calls the destructor of the GameServer instance + exit( EXIT_FAILURE ); +} + + +// exit function if memory allocation failed ---------------------------------- +// +void SYSs_OutOfMemFunction( const char *msg, const char *file, unsigned line ) +{ + // print error message + if ( ( msg != NULL ) && ( *msg != 0 ) ) { + + // print custom message if provided and not empty + fprintf( stderr, err_msg1, err_emem, msg ); + + } else if ( ( msg != NULL ) && ( errno > 0 ) ) { + + // print errno error if provided message is empty + fprintf( stderr, err_msg2, err_emem, strerror( errno ), file, line ); + + } else { + + // print generic error message if no message provided + fprintf( stderr, err_msg2, err_emem, err_nmem, file, line ); + } + fprintf( stderr, "\n" ); + + // just to be sure + fflush( stderr ); + + CLEAN_UP(0); + //FIXME_GAMESERVER: check whether exit also automatically calls the destructor of the GameServer instance + exit( EXIT_FAILURE ); +} + + +// generic string paste area -------------------------------------------------- +// +#define PASTE_STR_LEN 255 +static char paste_str[ PASTE_STR_LEN + 1 ]; + +// prints error message and exits --------------------------------------------- +// +void SYSs_PError( const char *message, ... ) +{ + va_list ap; + va_start( ap, message ); + + // print custom message if provided + if ( message != NULL ) { + fprintf ( stderr, "\n%s: ", sys_ProgramName ); + vfprintf( stderr, message, ap ); + fprintf ( stderr, "\n" ); + } else { + fprintf( stderr, "\n%s: SYSs_PError().\n", sys_ProgramName ); + } + fflush( stderr ); + + // display error message box + if ( message != NULL ) { + vsprintf( paste_str, message, ap ); + fprintf ( stderr, "SYSs_PError(): %s.", paste_str ); + } else { + fprintf ( stderr, "SYSs_PError(): %s.", err_ndef ); + } + + va_end( ap ); + + CLEAN_UP(0); + //FIXME_GAMESERVER: check whether exit also automatically calls the destructor of the GameServer instance + exit( EXIT_FAILURE ); +} + + +// clean up functions that must be called in any case (if at all possible) ---- +// +void SYSs_CriticalCleanUp() +{ + //NOTE: + // this function is not declared in any header, + // since it is only used by DEBUG.C, which + // contains a prototype in order to call + // SYSs_CriticalCleanUp(). + + int static was_here = FALSE; + + if ( !was_here ) { + was_here = TRUE; + + // kill networking system; + // must not be done after SYSs_KillFrameTimer() + //FIXME_GAMESERVER: ???? + //NETs_KillAPI(); + + // kill timer code + //FIXME_GAMESERVER: ???? + //SYSs_KillFrameTimer(); + } +} + |
