Commit 5cfbfd8a545f3beedaeacc831dc5ec4b6fe6d636
1 parent
0a66b0a0
Exists in
master
and in
2 other branches
Adding property to set a session based log file.
Showing
5 changed files
with
87 additions
and
4 deletions
Show diff stats
src/core/log.c
| @@ -30,6 +30,8 @@ | @@ -30,6 +30,8 @@ | ||
| 30 | * | 30 | * |
| 31 | */ | 31 | */ |
| 32 | 32 | ||
| 33 | +#include <config.h> | ||
| 34 | + | ||
| 33 | #ifdef WIN32 | 35 | #ifdef WIN32 |
| 34 | #include <winsock2.h> | 36 | #include <winsock2.h> |
| 35 | #include <windows.h> | 37 | #include <windows.h> |
| @@ -49,6 +51,56 @@ static void (*loghandler)(H3270 *session, const char *module, int rc, const char | @@ -49,6 +51,56 @@ static void (*loghandler)(H3270 *session, const char *module, int rc, const char | ||
| 49 | 51 | ||
| 50 | /*---[ Implementacao ]--------------------------------------------------------------------------------------*/ | 52 | /*---[ Implementacao ]--------------------------------------------------------------------------------------*/ |
| 51 | 53 | ||
| 54 | +static void logfile(H3270 *session, const char *module, int rc, const char *fmt, va_list arg_ptr) { | ||
| 55 | + | ||
| 56 | + FILE *f = fopen(session->logfile, "a"); | ||
| 57 | + | ||
| 58 | + if(f) { | ||
| 59 | + | ||
| 60 | + time_t ltime = time(0); | ||
| 61 | + | ||
| 62 | + char timestamp[80]; | ||
| 63 | +#ifdef HAVE_LOCALTIME_R | ||
| 64 | + struct tm tm; | ||
| 65 | + strftime(timestamp, 79, "%x %X", localtime_r(<ime,&tm)); | ||
| 66 | +#else | ||
| 67 | + strftime(timestamp, 79, "%x %X", localtime(<ime)); | ||
| 68 | +#endif // HAVE_LOCALTIME_R | ||
| 69 | + | ||
| 70 | + fprintf(f,"%s %s\t",timestamp,module); | ||
| 71 | + vfprintf(f,fmt,arg_ptr); | ||
| 72 | + fprintf(f,"\n"); | ||
| 73 | + | ||
| 74 | + fclose(f); | ||
| 75 | + | ||
| 76 | + } else { | ||
| 77 | + | ||
| 78 | + loghandler(session,module,rc,fmt,arg_ptr); | ||
| 79 | + | ||
| 80 | + } | ||
| 81 | + | ||
| 82 | +} | ||
| 83 | + | ||
| 84 | +LIB3270_EXPORT const char * lib3270_get_log_filename(H3270 * hSession) { | ||
| 85 | + return hSession->logfile; | ||
| 86 | +} | ||
| 87 | + | ||
| 88 | +LIB3270_EXPORT int lib3270_set_log_filename(H3270 * hSession, const char *filename) { | ||
| 89 | + | ||
| 90 | + if(hSession->logfile) { | ||
| 91 | + lib3270_free(hSession->logfile); | ||
| 92 | + } | ||
| 93 | + | ||
| 94 | + if(filename && *filename) { | ||
| 95 | + hSession->logfile = lib3270_strdup(filename); | ||
| 96 | + } else { | ||
| 97 | + hSession->logfile = NULL; | ||
| 98 | + } | ||
| 99 | + | ||
| 100 | + return 0; | ||
| 101 | + | ||
| 102 | +} | ||
| 103 | + | ||
| 52 | LIB3270_EXPORT void lib3270_set_log_handler(void (*handler)(H3270 *, const char *, int, const char *, va_list)) { | 104 | LIB3270_EXPORT void lib3270_set_log_handler(void (*handler)(H3270 *, const char *, int, const char *, va_list)) { |
| 53 | loghandler = handler ? handler : default_log_writer; | 105 | loghandler = handler ? handler : default_log_writer; |
| 54 | } | 106 | } |
| @@ -56,7 +108,13 @@ LIB3270_EXPORT void lib3270_set_log_handler(void (*handler)(H3270 *, const char | @@ -56,7 +108,13 @@ LIB3270_EXPORT void lib3270_set_log_handler(void (*handler)(H3270 *, const char | ||
| 56 | LIB3270_EXPORT int lib3270_write_log(H3270 *session, const char *module, const char *fmt, ...) { | 108 | LIB3270_EXPORT int lib3270_write_log(H3270 *session, const char *module, const char *fmt, ...) { |
| 57 | va_list arg_ptr; | 109 | va_list arg_ptr; |
| 58 | va_start(arg_ptr, fmt); | 110 | va_start(arg_ptr, fmt); |
| 59 | - loghandler(session,module ? module : LIB3270_STRINGIZE_VALUE_OF(PRODUCT_NAME),0,fmt,arg_ptr); | 111 | + |
| 112 | + if(session->logfile) { | ||
| 113 | + logfile(session,module ? module : LIB3270_STRINGIZE_VALUE_OF(PRODUCT_NAME),0,fmt,arg_ptr); | ||
| 114 | + } else { | ||
| 115 | + loghandler(session,module ? module : LIB3270_STRINGIZE_VALUE_OF(PRODUCT_NAME),0,fmt,arg_ptr); | ||
| 116 | + } | ||
| 117 | + | ||
| 60 | va_end(arg_ptr); | 118 | va_end(arg_ptr); |
| 61 | return 0; | 119 | return 0; |
| 62 | } | 120 | } |
| @@ -64,12 +122,22 @@ LIB3270_EXPORT int lib3270_write_log(H3270 *session, const char *module, const c | @@ -64,12 +122,22 @@ LIB3270_EXPORT int lib3270_write_log(H3270 *session, const char *module, const c | ||
| 64 | LIB3270_EXPORT int lib3270_write_rc(H3270 *session, const char *module, int rc, const char *fmt, ...) { | 122 | LIB3270_EXPORT int lib3270_write_rc(H3270 *session, const char *module, int rc, const char *fmt, ...) { |
| 65 | va_list arg_ptr; | 123 | va_list arg_ptr; |
| 66 | va_start(arg_ptr, fmt); | 124 | va_start(arg_ptr, fmt); |
| 67 | - loghandler(session,module ? module : LIB3270_STRINGIZE_VALUE_OF(PRODUCT_NAME),rc,fmt,arg_ptr); | 125 | + |
| 126 | + if(session->logfile) { | ||
| 127 | + logfile(session,module ? module : LIB3270_STRINGIZE_VALUE_OF(PRODUCT_NAME),rc,fmt,arg_ptr); | ||
| 128 | + } else { | ||
| 129 | + loghandler(session,module ? module : LIB3270_STRINGIZE_VALUE_OF(PRODUCT_NAME),rc,fmt,arg_ptr); | ||
| 130 | + } | ||
| 131 | + | ||
| 68 | va_end(arg_ptr); | 132 | va_end(arg_ptr); |
| 69 | return rc; | 133 | return rc; |
| 70 | } | 134 | } |
| 71 | 135 | ||
| 72 | LIB3270_EXPORT void lib3270_write_va_log(H3270 *session, const char *module, const char *fmt, va_list arg) { | 136 | LIB3270_EXPORT void lib3270_write_va_log(H3270 *session, const char *module, const char *fmt, va_list arg) { |
| 73 | - loghandler(session,module ? module : LIB3270_STRINGIZE_VALUE_OF(PRODUCT_NAME),0,fmt,arg); | 137 | + if(session->logfile) { |
| 138 | + logfile(session,module ? module : LIB3270_STRINGIZE_VALUE_OF(PRODUCT_NAME),0,fmt,arg); | ||
| 139 | + } else { | ||
| 140 | + loghandler(session,module ? module : LIB3270_STRINGIZE_VALUE_OF(PRODUCT_NAME),0,fmt,arg); | ||
| 141 | + } | ||
| 74 | } | 142 | } |
| 75 | 143 |
src/core/properties/string.c
| @@ -183,6 +183,14 @@ LIB3270_EXPORT const LIB3270_STRING_PROPERTY * lib3270_get_string_properties_lis | @@ -183,6 +183,14 @@ LIB3270_EXPORT const LIB3270_STRING_PROPERTY * lib3270_get_string_properties_lis | ||
| 183 | }, | 183 | }, |
| 184 | 184 | ||
| 185 | { | 185 | { |
| 186 | + .name = "logfile", // Property name. | ||
| 187 | + .group = LIB3270_ACTION_GROUP_NONE, // Property group. | ||
| 188 | + .description = N_( "The log file name"), // Property description. | ||
| 189 | + .get = lib3270_get_log_filename, // Get value. | ||
| 190 | + .set = lib3270_set_log_filename // Set value. | ||
| 191 | + }, | ||
| 192 | + | ||
| 193 | + { | ||
| 186 | .name = NULL, | 194 | .name = NULL, |
| 187 | .description = NULL, | 195 | .description = NULL, |
| 188 | .get = NULL, | 196 | .get = NULL, |
src/core/session.c
| @@ -147,7 +147,8 @@ void lib3270_session_free(H3270 *h) { | @@ -147,7 +147,8 @@ void lib3270_session_free(H3270 *h) { | ||
| 147 | // Release inputs; | 147 | // Release inputs; |
| 148 | lib3270_linked_list_free(&h->input.list); | 148 | lib3270_linked_list_free(&h->input.list); |
| 149 | 149 | ||
| 150 | - trace("Releasing session %p",h); | 150 | + // Release logfile |
| 151 | + release_pointer(h->logfile); | ||
| 151 | lib3270_free(h); | 152 | lib3270_free(h); |
| 152 | 153 | ||
| 153 | } | 154 | } |
src/include/internals.h
src/include/lib3270/log.h
| @@ -57,6 +57,9 @@ LIB3270_EXPORT int lib3270_write_log(H3270 *session, const char *module, const | @@ -57,6 +57,9 @@ LIB3270_EXPORT int lib3270_write_log(H3270 *session, const char *module, const | ||
| 57 | LIB3270_EXPORT int lib3270_write_rc(H3270 *session, const char *module, int rc, const char *fmt, ...) LIB3270_GNUC_FORMAT(4,5); | 57 | LIB3270_EXPORT int lib3270_write_rc(H3270 *session, const char *module, int rc, const char *fmt, ...) LIB3270_GNUC_FORMAT(4,5); |
| 58 | LIB3270_EXPORT void lib3270_write_va_log(H3270 *session, const char *module, const char *fmt, va_list arg); | 58 | LIB3270_EXPORT void lib3270_write_va_log(H3270 *session, const char *module, const char *fmt, va_list arg); |
| 59 | 59 | ||
| 60 | +LIB3270_EXPORT int lib3270_set_log_filename(H3270 * hSession, const char *name); | ||
| 61 | +LIB3270_EXPORT const char * lib3270_get_log_filename(H3270 * hSession); | ||
| 62 | + | ||
| 60 | /** | 63 | /** |
| 61 | * @brief Send logs to system log (if available) | 64 | * @brief Send logs to system log (if available) |
| 62 | * | 65 | * |