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 | * |