--- src/lib/report-lib.c +++ src/lib/report-lib.c @@ -41,5 +41,7 @@ vfprintf(stderr,text,ap); fprintf(stderr,"\n"); + va_end(ap); + if(stat == GPM_STAT_OOPS) exit(1); /* may a lib function call exit ???? */ } --- src/report.c +++ src/report.c @@ -71,9 +71,18 @@ void gpm_report(int line, char *file, int stat, char *text, ... ) { FILE *console = NULL; - va_list ap; + va_list ap,ap2; +#ifdef HAVE_VSYSLOG + va_list ap_sys; +#endif + int exit_request=0; /* 0 -> return is requested + 1 -> exit(1) is requested + 2 -> _exit(1) is requested */ va_start(ap,text); +#ifdef HAVE_VSYSLOG + va_copy(ap_sys,ap); +#endif switch(option.run_status) { /******************** STARTUP *****************/ @@ -82,7 +91,7 @@ case GPM_STAT_INFO: #ifdef HAVE_VSYSLOG syslog(LOG_INFO | LOG_USER, GPM_STRING_INFO); - vsyslog(LOG_INFO | LOG_USER, text, ap); + vsyslog(LOG_INFO | LOG_USER, text, ap_sys); #endif fprintf(stderr,GPM_STRING_INFO); vfprintf(stderr,text,ap); @@ -92,7 +101,7 @@ case GPM_STAT_WARN: #ifdef HAVE_VSYSLOG syslog(LOG_DAEMON | LOG_WARNING, GPM_STRING_WARN); - vsyslog(LOG_DAEMON | LOG_WARNING, text, ap); + vsyslog(LOG_DAEMON | LOG_WARNING, text, ap_sys); #endif fprintf(stderr,GPM_STRING_WARN); vfprintf(stderr,text,ap); @@ -102,7 +111,7 @@ case GPM_STAT_ERR: #ifdef HAVE_VSYSLOG syslog(LOG_DAEMON | LOG_ERR, GPM_STRING_ERR); - vsyslog(LOG_DAEMON | LOG_ERR, text, ap); + vsyslog(LOG_DAEMON | LOG_ERR, text, ap_sys); #endif fprintf(stderr,GPM_STRING_ERR); vfprintf(stderr,text,ap); @@ -112,13 +121,13 @@ case GPM_STAT_OOPS: #ifdef HAVE_VSYSLOG syslog(LOG_DAEMON | LOG_ERR, GPM_STRING_OOPS); - vsyslog(LOG_DAEMON | LOG_ERR, text, ap); + vsyslog(LOG_DAEMON | LOG_ERR, text, ap_sys); #endif fprintf(stderr,GPM_STRING_OOPS); vfprintf(stderr,text,ap); fprintf(stderr,"\n"); - exit(1); /* we should have a oops()-function,but this works,too*/ + exit_request=1; /* we should have a oops()-function,but this works,too*/ break; } break; /* startup sequence */ @@ -129,14 +138,14 @@ case GPM_STAT_INFO: #ifdef HAVE_VSYSLOG syslog(LOG_INFO | LOG_USER, GPM_STRING_INFO); - vsyslog(LOG_INFO | LOG_USER, text, ap); + vsyslog(LOG_INFO | LOG_USER, text, ap_sys); #endif break; case GPM_STAT_WARN: #ifdef HAVE_VSYSLOG syslog(LOG_DAEMON | LOG_WARNING, GPM_STRING_WARN); - vsyslog(LOG_DAEMON | LOG_WARNING, text, ap); + vsyslog(LOG_DAEMON | LOG_WARNING, text, ap_sys); #endif if((console = fopen(GPM_SYS_CONSOLE,"a")) != NULL) { fprintf(console,GPM_STRING_WARN); @@ -149,8 +158,9 @@ case GPM_STAT_ERR: #ifdef HAVE_VSYSLOG syslog(LOG_DAEMON | LOG_ERR, GPM_STRING_ERR); - vsyslog(LOG_DAEMON | LOG_ERR, text, ap); + vsyslog(LOG_DAEMON | LOG_ERR, text, ap_sys); #endif + va_copy(ap2,ap); if((console = fopen(GPM_SYS_CONSOLE,"a")) != NULL) { fprintf(console,GPM_STRING_ERR); vfprintf(console,text,ap); @@ -160,22 +170,24 @@ if((console = fopen(option.consolename,"a")) != NULL) { fprintf(console,GPM_STRING_ERR); - vfprintf(console,text,ap); + vfprintf(console,text,ap2); fprintf(console,"\n"); fclose(console); } + + va_end(ap2); break; case GPM_STAT_OOPS: #ifdef HAVE_VSYSLOG syslog(LOG_DAEMON | LOG_ERR, GPM_STRING_OOPS); - vsyslog(LOG_DAEMON | LOG_ERR, text, ap); + vsyslog(LOG_DAEMON | LOG_ERR, text, ap_sys); #endif fprintf(stderr,GPM_STRING_OOPS); vfprintf(stderr,text,ap); fprintf(stderr,"\n"); - _exit(1); /* we are the fork()-child */ + exit_request=2; /* we are the fork()-child */ break; } break; /* running gpm */ @@ -203,10 +215,21 @@ vfprintf(console,text,ap); fprintf(console,"\n"); - if(stat == GPM_STAT_OOPS) exit(1); - + if(stat == GPM_STAT_OOPS) exit_request=1; + break; } /* switch for current modus */ + + va_end(ap); +#ifdef HAVE_VSYSLOG + va_end(ap_sys); +#endif + + if (exit_request == 2) + _exit(1); + if (exit_request == 1) + exit(1); + return; } /* gpm_report */