diff --git a/src/core/linux/log.c b/src/core/linux/log.c index 221890c..de9be14 100644 --- a/src/core/linux/log.c +++ b/src/core/linux/log.c @@ -42,20 +42,16 @@ int use_syslog = 0; -int default_log_writer(H3270 GNUC_UNUSED(*session), const char *module, int GNUC_UNUSED(rc), const char *fmt, va_list arg_ptr) { +int default_log_writer(H3270 GNUC_UNUSED(*session), void GNUC_UNUSED(*userdata), const char *module, int GNUC_UNUSED(rc), const char *message) { #ifdef HAVE_SYSLOG if(use_syslog) { - vsyslog(LOG_INFO, fmt, arg_ptr); + syslog(LOG_INFO, "%s: %s", module, message); } else { - printf("%s:\t",module); - vprintf(fmt,arg_ptr); - printf("\n"); + printf("%s %s\n", module, message); fflush(stdout); } #else - printf("%s:\t",module); - vprintf(fmt,arg_ptr); - printf("\n"); + printf("%s %s\n", module, message); fflush(stdout); #endif return 0; diff --git a/src/core/log.c b/src/core/log.c index 2eef69c..081963f 100644 --- a/src/core/log.c +++ b/src/core/log.c @@ -51,8 +51,12 @@ LIB3270_LOG_HANDLER loghandler = default_log_writer; /*---[ Implementacao ]--------------------------------------------------------------------------------------*/ -static void write_log(const H3270 *session, const char *module, int rc, const char *fmt, va_list arg_ptr) { +static void write_log(const H3270 *session, const char *module, int rc, const char *fmt, va_list args) { + // 'mount' message. + char *message = lib3270_vsprintf(fmt,args); + + // Write log if(session) { if(session->log.file) { @@ -72,9 +76,7 @@ static void write_log(const H3270 *session, const char *module, int rc, const ch strftime(timestamp, 79, "%x %X", localtime(<ime)); #endif // HAVE_LOCALTIME_R - fprintf(f,"%s %s\t",timestamp,module); - vfprintf(f,fmt,arg_ptr); - fprintf(f,"\n"); + fprintf(f,"%s %s\t%s\n",timestamp,module,message); fclose(f); @@ -82,14 +84,16 @@ static void write_log(const H3270 *session, const char *module, int rc, const ch } - session->log.handler(session,module ? module : LIB3270_STRINGIZE_VALUE_OF(PRODUCT_NAME),rc,fmt,arg_ptr); + session->log.handler(session,session->log.userdata,module ? module : LIB3270_STRINGIZE_VALUE_OF(PRODUCT_NAME),rc,message); } else { - loghandler(session, (module ? module : LIB3270_STRINGIZE_VALUE_OF(PRODUCT_NAME)),rc,fmt,arg_ptr); + loghandler(session, NULL, (module ? module : LIB3270_STRINGIZE_VALUE_OF(PRODUCT_NAME)),rc,message); } + lib3270_free(message); + } LIB3270_EXPORT const char * lib3270_get_log_filename(const H3270 * hSession) { diff --git a/src/core/session.c b/src/core/session.c index d305f58..136463a 100644 --- a/src/core/session.c +++ b/src/core/session.c @@ -199,8 +199,8 @@ static int load(H3270 *session, const char GNUC_UNUSED(*filename)) { return errno = ENOTSUP; } -static int def_trace(const H3270 GNUC_UNUSED(*session), void GNUC_UNUSED(*userdata), const char *fmt, va_list args) { - vfprintf(stdout,fmt,args); +static int def_trace(const H3270 GNUC_UNUSED(*session), void GNUC_UNUSED(*userdata), const char *message) { + printf("%s",message); fflush(stdout); return 0; } diff --git a/src/core/trace_ds.c b/src/core/trace_ds.c index ad4b776..9f2dbf6 100644 --- a/src/core/trace_ds.c +++ b/src/core/trace_ds.c @@ -73,6 +73,53 @@ /* Statics */ static void wtrace(H3270 *session, const char *fmt, ...); +static void write_trace(const H3270 *session, const char *fmt, va_list args) { + + // 'mount' message. + char *message = lib3270_vsprintf(fmt,args); + + if(session->trace.file) { + + // Has log file. Use it if possible. + FILE *f = fopen(session->trace.file, "a"); + + if(f) { + + time_t ltime = time(0); + + char timestamp[80]; +#ifdef HAVE_LOCALTIME_R + struct tm tm; + strftime(timestamp, 79, "%x %X", localtime_r(<ime,&tm)); +#else + strftime(timestamp, 79, "%x %X", localtime(<ime)); +#endif // HAVE_LOCALTIME_R + + fprintf(f,"%s %s\n",timestamp,message); + + fclose(f); + + } + + } + + session->trace.handler(session,session->trace.userdata,message); + + lib3270_free(message); + +} + +/** + * @brief Write to the trace file. + */ +static void wtrace(H3270 *session, const char *fmt, ...) { + va_list args; + va_start(args, fmt); + write_trace(session, fmt, args); + va_end(args); +} + + /* display a (row,col) */ const char * rcba(H3270 *hSession, int baddr) { static char buf[48]; @@ -161,7 +208,7 @@ void trace_dsn(H3270 *session, const char *fmt, ...) { /* print out message */ va_start(args, fmt); - session->trace.handler(session,session->trace.userdata,fmt, args); + write_trace(session,fmt,args); va_end(args); } @@ -176,18 +223,7 @@ void trace_ssl(H3270 *session, const char *fmt, ...) { /* print out message */ va_start(args, fmt); - session->trace.handler(session,session->trace.userdata,fmt, args); - va_end(args); -} - - -/** - * @brief Write to the trace file. - */ -static void wtrace(H3270 *session, const char *fmt, ...) { - va_list args; - va_start(args, fmt); - session->trace.handler(session,session->trace.userdata,fmt, args); + write_trace(session, fmt, args); va_end(args); } @@ -195,7 +231,7 @@ LIB3270_EXPORT void lib3270_write_trace(H3270 *session, const char *fmt, ...) { va_list args; va_start(args, fmt); - session->trace.handler(session,session->trace.userdata,fmt, args); + write_trace(session, fmt, args); va_end(args); } @@ -206,7 +242,7 @@ LIB3270_EXPORT void lib3270_write_dstrace(H3270 *session, const char *fmt, ...) return; va_start(args, fmt); - session->trace.handler(session,session->trace.userdata,fmt, args); + write_trace(session, fmt, args); va_end(args); } @@ -217,7 +253,7 @@ LIB3270_EXPORT void lib3270_write_nettrace(H3270 *session, const char *fmt, ...) return; va_start(args, fmt); - session->trace.handler(session,session->trace.userdata,fmt, args); + write_trace(session, fmt, args); va_end(args); } @@ -228,7 +264,7 @@ LIB3270_EXPORT void lib3270_write_screen_trace(H3270 *session, const char *fmt, return; va_start(args, fmt); - session->trace.handler(session,session->trace.userdata,fmt, args); + write_trace(session, fmt, args); va_end(args); } @@ -239,7 +275,7 @@ LIB3270_EXPORT void lib3270_write_event_trace(H3270 *session, const char *fmt, . return; va_start(args, fmt); - session->trace.handler(session,session->trace.userdata,fmt, args); + write_trace(session, fmt, args); va_end(args); } @@ -250,7 +286,7 @@ LIB3270_EXPORT void lib3270_trace_event(H3270 *session, const char *fmt, ...) { return; va_start(args, fmt); - session->trace.handler(session,session->trace.userdata,fmt, args); + write_trace(session, fmt, args); va_end(args); } diff --git a/src/core/windows/log.c b/src/core/windows/log.c index 4b9d08b..f1c1213 100644 --- a/src/core/windows/log.c +++ b/src/core/windows/log.c @@ -41,10 +41,7 @@ /*---[ Implement ]------------------------------------------------------------------------------------------*/ -int default_log_writer(H3270 GNUC_UNUSED(*session), const char *module, int rc, const char *fmt, va_list arg_ptr) { - lib3270_autoptr(char) msg = lib3270_vsprintf(fmt,arg_ptr); - - debug("%s",msg); +int default_log_writer(H3270 GNUC_UNUSED(*session), const char *module, int rc, const char *msg) { if(hEventLog) { lib3270_autoptr(char) username = lib3270_get_user_name(); diff --git a/src/include/internals.h b/src/include/internals.h index 6e4fa14..b25e34a 100644 --- a/src/include/internals.h +++ b/src/include/internals.h @@ -635,6 +635,7 @@ struct _h3270 { struct { char *file; ///< @brief Log file name (if set). LIB3270_LOG_HANDLER handler; + void *userdata; } log; struct { @@ -739,7 +740,7 @@ LIB3270_INTERNAL void clear_chr(H3270 *hSession, int baddr); LIB3270_INTERNAL unsigned char get_field_attribute(H3270 *session, int baddr); /// @brief Default log writer. -LIB3270_INTERNAL int default_log_writer(H3270 *session, const char *module, int rc, const char *fmt, va_list arg_ptr); +LIB3270_INTERNAL int default_log_writer(H3270 *session, void *dunno, const char *module, int rc, const char *message); /// @brief The active log handler. LIB3270_INTERNAL LIB3270_LOG_HANDLER loghandler; diff --git a/src/include/lib3270/log.h b/src/include/lib3270/log.h index a877281..04773c2 100644 --- a/src/include/lib3270/log.h +++ b/src/include/lib3270/log.h @@ -52,7 +52,7 @@ extern "C" { #endif -typedef int (*LIB3270_LOG_HANDLER)(const H3270 *, const char *, int, const char *, va_list); +typedef int (*LIB3270_LOG_HANDLER)(const H3270 *, void *, const char *, int, const char *); LIB3270_EXPORT void lib3270_set_log_handler(H3270 *session, const LIB3270_LOG_HANDLER loghandler); LIB3270_EXPORT int lib3270_set_log_filename(H3270 * hSession, const char *name); diff --git a/src/include/lib3270/trace.h b/src/include/lib3270/trace.h index e2bbebb..89adcc4 100644 --- a/src/include/lib3270/trace.h +++ b/src/include/lib3270/trace.h @@ -45,7 +45,7 @@ extern "C" { #define LIB3270_AS_PRINTF(a,b) __attribute__((format(printf, a, b))) #endif -typedef int (*LIB3270_TRACE_HANDLER)(const H3270 *, void *, const char *, va_list); +typedef int (*LIB3270_TRACE_HANDLER)(const H3270 *, void *, const char *); /** * @brief Set trace filename. diff --git a/src/testprogram/testprogram.c b/src/testprogram/testprogram.c index b13256e..6a0c985 100644 --- a/src/testprogram/testprogram.c +++ b/src/testprogram/testprogram.c @@ -50,16 +50,6 @@ const char *trace_file = "test.trace"; -static int write_trace(const H3270 GNUC_UNUSED(*session), void GNUC_UNUSED(*userdata), const char *fmt, va_list args) { - FILE *out = fopen(trace_file,"a"); - if(out) { - - vfprintf(out,fmt,args); - fclose(out); - } - return 0; -} - static void online_group_state_changed(H3270 GNUC_UNUSED(*hSession), void GNUC_UNUSED(*dunno)) { printf("\n\n%s\n\n",__FUNCTION__); } @@ -138,8 +128,7 @@ int main(int argc, char *argv[]) { return 0; case 't': - trace_file = optarg; - lib3270_set_trace_handler(h,write_trace,NULL); + lib3270_set_trace_filename(h,optarg); lib3270_set_toggle(h,LIB3270_TOGGLE_DS_TRACE,1); break; } -- libgit2 0.21.2