Commit fa528fb5bb97b91b53f250c4f685e1d3d7706ca0
1 parent
37bf41db
Exists in
master
and in
2 other branches
Implementing default log file from command line option.
Showing
3 changed files
with
76 additions
and
15 deletions
Show diff stats
src/include/pw3270/application.h
| @@ -73,6 +73,7 @@ GList * pw3270_application_get_keypad_models(GApplication *app); | @@ -73,6 +73,7 @@ GList * pw3270_application_get_keypad_models(GApplication *app); | ||
| 73 | 73 | ||
| 74 | void pw3270_application_set_ui_style(GApplication *app, PW3270_UI_STYLE type); | 74 | void pw3270_application_set_ui_style(GApplication *app, PW3270_UI_STYLE type); |
| 75 | PW3270_UI_STYLE pw3270_application_get_ui_style(GApplication *app); | 75 | PW3270_UI_STYLE pw3270_application_get_ui_style(GApplication *app); |
| 76 | +void pw3270_application_set_log_filename(GApplication *app, const gchar *filename); | ||
| 76 | 77 | ||
| 77 | // Plugins | 78 | // Plugins |
| 78 | void pw3270_application_plugin_foreach(GApplication *app, GFunc func, gpointer user_data); | 79 | void pw3270_application_plugin_foreach(GApplication *app, GFunc func, gpointer user_data); |
src/main/main.c
| @@ -57,11 +57,6 @@ static gboolean quit_signal(GtkApplication *app) { | @@ -57,11 +57,6 @@ static gboolean quit_signal(GtkApplication *app) { | ||
| 57 | } | 57 | } |
| 58 | #endif // G_OS_UNIX | 58 | #endif // G_OS_UNIX |
| 59 | 59 | ||
| 60 | -static void g_log_to_lib3270(const gchar *log_domain,GLogLevelFlags G_GNUC_UNUSED(log_level),const gchar *message,gpointer G_GNUC_UNUSED(user_data)) { | ||
| 61 | - debug("%s",message); | ||
| 62 | - lib3270_write_log(NULL,log_domain ? log_domain : G_STRINGIFY(PRODUCT_NAME),"%s",message); | ||
| 63 | -} | ||
| 64 | - | ||
| 65 | int main (int argc, char **argv) { | 60 | int main (int argc, char **argv) { |
| 66 | 61 | ||
| 67 | int status = -1; | 62 | int status = -1; |
| @@ -86,8 +81,6 @@ int main (int argc, char **argv) { | @@ -86,8 +81,6 @@ int main (int argc, char **argv) { | ||
| 86 | } | 81 | } |
| 87 | #endif // _WIN32 | 82 | #endif // _WIN32 |
| 88 | 83 | ||
| 89 | - g_log_set_default_handler(g_log_to_lib3270,NULL); | ||
| 90 | - | ||
| 91 | bind_textdomain_codeset(PACKAGE_NAME, "UTF-8"); | 84 | bind_textdomain_codeset(PACKAGE_NAME, "UTF-8"); |
| 92 | textdomain(PACKAGE_NAME); | 85 | textdomain(PACKAGE_NAME); |
| 93 | 86 |
src/objects/application/application.c
| @@ -56,6 +56,7 @@ struct _pw3270Application { | @@ -56,6 +56,7 @@ struct _pw3270Application { | ||
| 56 | 56 | ||
| 57 | GSettings * settings; | 57 | GSettings * settings; |
| 58 | GList * keypads; | 58 | GList * keypads; |
| 59 | + gchar * logfile; | ||
| 59 | gboolean allow_tabs; ///< @brief Always open window. | 60 | gboolean allow_tabs; ///< @brief Always open window. |
| 60 | 61 | ||
| 61 | GSList * plugins; ///< @brief Handlers of the loaded plugins. | 62 | GSList * plugins; ///< @brief Handlers of the loaded plugins. |
| @@ -127,10 +128,22 @@ static void window_removed(GtkApplication *application, GtkWindow *window) { | @@ -127,10 +128,22 @@ static void window_removed(GtkApplication *application, GtkWindow *window) { | ||
| 127 | 128 | ||
| 128 | } | 129 | } |
| 129 | 130 | ||
| 131 | +static void g_log_to_lib3270(const gchar *log_domain,GLogLevelFlags G_GNUC_UNUSED(log_level),const gchar *message,gpointer G_GNUC_UNUSED(user_data)) { | ||
| 132 | + debug("%s",message); | ||
| 133 | + lib3270_write_log( | ||
| 134 | + NULL, | ||
| 135 | + log_domain ? log_domain : G_STRINGIFY(PRODUCT_NAME), | ||
| 136 | + "%s", | ||
| 137 | + message | ||
| 138 | + ); | ||
| 139 | +} | ||
| 140 | + | ||
| 130 | static void pw3270Application_class_init(pw3270ApplicationClass *klass) { | 141 | static void pw3270Application_class_init(pw3270ApplicationClass *klass) { |
| 131 | 142 | ||
| 132 | GObjectClass *object_class = G_OBJECT_CLASS(klass); | 143 | GObjectClass *object_class = G_OBJECT_CLASS(klass); |
| 133 | 144 | ||
| 145 | + g_log_set_default_handler(g_log_to_lib3270,NULL); | ||
| 146 | + | ||
| 134 | object_class->get_property = get_property; | 147 | object_class->get_property = get_property; |
| 135 | object_class->set_property = set_property; | 148 | object_class->set_property = set_property; |
| 136 | object_class->finalize = finalize; | 149 | object_class->finalize = finalize; |
| @@ -217,12 +230,6 @@ static gboolean on_user_interface(const gchar G_GNUC_UNUSED(*option), const gcha | @@ -217,12 +230,6 @@ static gboolean on_user_interface(const gchar G_GNUC_UNUSED(*option), const gcha | ||
| 217 | 230 | ||
| 218 | } | 231 | } |
| 219 | 232 | ||
| 220 | -static gboolean on_log_file(const gchar G_GNUC_UNUSED(*option), const gchar *value, gpointer G_GNUC_UNUSED(dunno), GError **error) { | ||
| 221 | - pw3270Application *app = PW3270_APPLICATION(g_application_get_default()); | ||
| 222 | - | ||
| 223 | - return TRUE; | ||
| 224 | -} | ||
| 225 | - | ||
| 226 | static gboolean on_allow_tabs(const gchar G_GNUC_UNUSED(*option), const gchar *value, gpointer G_GNUC_UNUSED(dunno), GError **error) { | 233 | static gboolean on_allow_tabs(const gchar G_GNUC_UNUSED(*option), const gchar *value, gpointer G_GNUC_UNUSED(dunno), GError **error) { |
| 227 | pw3270Application *app = PW3270_APPLICATION(g_application_get_default()); | 234 | pw3270Application *app = PW3270_APPLICATION(g_application_get_default()); |
| 228 | app->allow_tabs = (g_ascii_strcasecmp(value,"no") != 0); | 235 | app->allow_tabs = (g_ascii_strcasecmp(value,"no") != 0); |
| @@ -234,13 +241,19 @@ static gboolean on_allow_tabs(const gchar G_GNUC_UNUSED(*option), const gchar *v | @@ -234,13 +241,19 @@ static gboolean on_allow_tabs(const gchar G_GNUC_UNUSED(*option), const gchar *v | ||
| 234 | return TRUE; | 241 | return TRUE; |
| 235 | } | 242 | } |
| 236 | 243 | ||
| 244 | +static gboolean on_logfile(const gchar G_GNUC_UNUSED(*option), const gchar *value, gpointer G_GNUC_UNUSED(dunno), GError **error) { | ||
| 245 | + pw3270Application *app = PW3270_APPLICATION(g_application_get_default()); | ||
| 246 | + pw3270_application_set_log_filename(app,value); | ||
| 247 | + return TRUE; | ||
| 248 | +} | ||
| 249 | + | ||
| 237 | static void pw3270Application_init(pw3270Application *app) { | 250 | static void pw3270Application_init(pw3270Application *app) { |
| 238 | 251 | ||
| 239 | static GOptionEntry cmd_options[] = { | 252 | static GOptionEntry cmd_options[] = { |
| 240 | 253 | ||
| 241 | { "user-interface", 'U', 0, G_OPTION_ARG_CALLBACK, &on_user_interface, N_( "Set the user-interface type" ), NULL }, | 254 | { "user-interface", 'U', 0, G_OPTION_ARG_CALLBACK, &on_user_interface, N_( "Set the user-interface type" ), NULL }, |
| 242 | - { "log-filename", 'l', 0, G_OPTION_ARG_CALLBACK, &on_log_file, N_( "Set custom log file for the active session" ), NULL }, | ||
| 243 | - { "allow-tabs", 'T', 0, G_OPTION_ARG_CALLBACK, &on_allow_tabs, N_( "If 'no' allways open a window" ), NULL }, | 255 | + { "allow-tabs", 'T', 0, G_OPTION_ARG_CALLBACK, &on_allow_tabs, N_( "If 'no' allways open a window" ), NULL }, |
| 256 | + { "logfile", 'l', 0, G_OPTION_ARG_CALLBACK, &on_logfile, N_( "Set default log file name" ), NULL }, | ||
| 244 | { NULL } | 257 | { NULL } |
| 245 | 258 | ||
| 246 | }; | 259 | }; |
| @@ -355,6 +368,13 @@ static void finalize(GObject *object) { | @@ -355,6 +368,13 @@ static void finalize(GObject *object) { | ||
| 355 | application->settings = NULL; | 368 | application->settings = NULL; |
| 356 | } | 369 | } |
| 357 | 370 | ||
| 371 | + lib3270_set_log_handler(NULL,NULL,NULL); | ||
| 372 | + | ||
| 373 | + if(application->logfile) { | ||
| 374 | + g_free(application->logfile); | ||
| 375 | + application->logfile = NULL; | ||
| 376 | + } | ||
| 377 | + | ||
| 358 | g_list_free_full(application->keypads,g_object_unref); | 378 | g_list_free_full(application->keypads,g_object_unref); |
| 359 | 379 | ||
| 360 | G_OBJECT_CLASS(pw3270Application_parent_class)->finalize(object); | 380 | G_OBJECT_CLASS(pw3270Application_parent_class)->finalize(object); |
| @@ -640,3 +660,50 @@ GList * pw3270_application_get_keypad_models(GApplication *app) { | @@ -640,3 +660,50 @@ GList * pw3270_application_get_keypad_models(GApplication *app) { | ||
| 640 | return PW3270_APPLICATION(app)->keypads; | 660 | return PW3270_APPLICATION(app)->keypads; |
| 641 | } | 661 | } |
| 642 | 662 | ||
| 663 | +static int loghandler(const H3270 *hSession, pw3270Application *app, const char *module, int code, const char *message) { | ||
| 664 | + | ||
| 665 | + if(!app->logfile) { | ||
| 666 | + return -1; | ||
| 667 | + } | ||
| 668 | + | ||
| 669 | + FILE *f = fopen(app->logfile,"a"); | ||
| 670 | + | ||
| 671 | + if(f) { | ||
| 672 | + time_t ltime = time(0); | ||
| 673 | + | ||
| 674 | + char timestamp[80]; | ||
| 675 | +#ifdef HAVE_LOCALTIME_R | ||
| 676 | + struct tm tm; | ||
| 677 | + strftime(timestamp, 79, "%x %X", localtime_r(<ime,&tm)); | ||
| 678 | +#else | ||
| 679 | + strftime(timestamp, 79, "%x %X", localtime(<ime)); | ||
| 680 | +#endif // HAVE_LOCALTIME_R | ||
| 681 | + | ||
| 682 | + fprintf(f,"%s %s\t%s\n",timestamp,module,message); | ||
| 683 | + | ||
| 684 | + fclose(f); | ||
| 685 | + } | ||
| 686 | + | ||
| 687 | + return 0; | ||
| 688 | +} | ||
| 689 | + | ||
| 690 | +void pw3270_application_set_log_filename(GApplication *app, const gchar *filename) { | ||
| 691 | + | ||
| 692 | + g_return_if_fail(PW3270_IS_APPLICATION(app)); | ||
| 693 | + | ||
| 694 | + pw3270Application * application = PW3270_APPLICATION(app); | ||
| 695 | + | ||
| 696 | + if(application->logfile) { | ||
| 697 | + g_free(application->logfile); | ||
| 698 | + application->logfile = NULL; | ||
| 699 | + } | ||
| 700 | + | ||
| 701 | + if(filename) { | ||
| 702 | + application->logfile = g_strdup(filename); | ||
| 703 | + lib3270_set_log_handler(NULL,(LIB3270_LOG_HANDLER) loghandler, app); | ||
| 704 | + } else { | ||
| 705 | + lib3270_set_log_handler(NULL,NULL,NULL); | ||
| 706 | + } | ||
| 707 | + | ||
| 708 | +} | ||
| 709 | + |