From 056b19eb91c03c8a8d5f261fa38450b5238986dc Mon Sep 17 00:00:00 2001 From: nandesu-utils <70854931+nandesu-utils@users.noreply.github.com> Date: Wed, 24 Aug 2022 23:50:24 +0300 Subject: refactored call_external code unluckily here the code neglected the fact that glib will set an error to a location that was pointed by the error pointer if it is not null. but it was of an undefined value hence profanity crashed. now it is null as it must be. also spawn error is returned when glib could not spawn the task for some reason like the executable file does not exist but if the exit status was non-zero it neglected the exit error and tried to output a spawn error instead. now we check whether the process that we instantiated has exited successfully also now code uses `g_spawn_check_wait_status` which `g_spawn_check_exit_status` has been aliased to. --- src/common.c | 39 ++++++++++++++++++++++----------------- 1 file changed, 22 insertions(+), 17 deletions(-) diff --git a/src/common.c b/src/common.c index b2496087..f5b59612 100644 --- a/src/common.c +++ b/src/common.c @@ -445,9 +445,10 @@ get_mentions(gboolean whole_word, gboolean case_sensitive, const char* const mes gboolean call_external(gchar** argv, gchar** std_out, gchar** std_err) { - GError *spawn_error, *status_error; - gboolean spawn_result; - gint exit_status; + GError *spawn_error = NULL; + GError *exit_error = NULL; + gboolean is_successful; + gint wait_status; GSpawnFlags flags = G_SPAWN_SEARCH_PATH; if (std_out == NULL) @@ -455,30 +456,34 @@ call_external(gchar** argv, gchar** std_out, gchar** std_err) if (std_err == NULL) flags |= G_SPAWN_STDERR_TO_DEV_NULL; - spawn_result = g_spawn_sync(NULL, // Inherit the parent PWD. + is_successful = g_spawn_sync(NULL, // Inherit the parent PWD. argv, NULL, // Inherit the parent environment. flags, NULL, NULL, // No func. before exec() in child. std_out, std_err, - &exit_status, &spawn_error); + &wait_status, &spawn_error); - if (!spawn_result || !g_spawn_check_exit_status(exit_status, &status_error)) { + if (!is_successful) { gchar* cmd = g_strjoinv(" ", argv); - if (spawn_error && spawn_error->message) { - log_error("Spawning '%s' failed with '%s'.", cmd, spawn_error->message); - g_error_free(spawn_error); - } else if (status_error && status_error->message) { - log_error("Spawning '%s' failed with '%s'.", cmd, status_error->message); - g_error_free(status_error); - spawn_result = FALSE; - } else { - log_error("Spawning '%s' failed with.", cmd); - } + log_error("could not spawn '%s' with error '%s'", cmd, spawn_error->message); + + g_error_free(spawn_error); g_free(cmd); } + else { + is_successful = g_spawn_check_wait_status(wait_status, &exit_error); + + if (!is_successful) { + gchar* cmd = g_strjoinv(" ", argv); + log_error("'%s' exited with error '%s'", cmd, exit_error->message); + + g_error_free(exit_error); + g_free(cmd); + } + } - return spawn_result; + return is_successful; } gchar** -- cgit 1.4.1-2-gfad0 From e1ed012f72495e2d2bdd10520eb943fbba932ed4 Mon Sep 17 00:00:00 2001 From: nandesu-utils <70854931+nandesu-utils@users.noreply.github.com> Date: Thu, 25 Aug 2022 00:10:22 +0300 Subject: support for formatting in avatar executable in before it just used the input command line as it was but this fixes this by adding formatting using `format_call_external_argv` which is already used in `url open` executable. --- src/common.c | 24 ++++++++++++------------ src/xmpp/avatar.c | 16 +++++++++++++--- 2 files changed, 25 insertions(+), 15 deletions(-) diff --git a/src/common.c b/src/common.c index f5b59612..de35ea2d 100644 --- a/src/common.c +++ b/src/common.c @@ -445,8 +445,8 @@ get_mentions(gboolean whole_word, gboolean case_sensitive, const char* const mes gboolean call_external(gchar** argv, gchar** std_out, gchar** std_err) { - GError *spawn_error = NULL; - GError *exit_error = NULL; + GError* spawn_error = NULL; + GError* exit_error = NULL; gboolean is_successful; gint wait_status; @@ -457,22 +457,22 @@ call_external(gchar** argv, gchar** std_out, gchar** std_err) flags |= G_SPAWN_STDERR_TO_DEV_NULL; is_successful = g_spawn_sync(NULL, // Inherit the parent PWD. - argv, - NULL, // Inherit the parent environment. - flags, - NULL, NULL, // No func. before exec() in child. - std_out, std_err, - &wait_status, &spawn_error); + argv, + NULL, // Inherit the parent environment. + flags, + NULL, NULL, // No func. before exec() in child. + std_out, std_err, + &wait_status, &spawn_error); if (!is_successful) { gchar* cmd = g_strjoinv(" ", argv); - log_error("could not spawn '%s' with error '%s'", cmd, spawn_error->message); + log_error("Spawning '%s' failed with with error '%s'", cmd, spawn_error ? spawn_error->message : "Unknown, spawn_error is NULL"); + ; g_error_free(spawn_error); g_free(cmd); - } - else { - is_successful = g_spawn_check_wait_status(wait_status, &exit_error); + } else { + is_successful = g_spawn_check_exit_status(wait_status, &exit_error); if (!is_successful) { gchar* cmd = g_strjoinv(" ", argv); diff --git a/src/xmpp/avatar.c b/src/xmpp/avatar.c index 9345ba3a..fb3b01ea 100644 --- a/src/xmpp/avatar.c +++ b/src/xmpp/avatar.c @@ -339,10 +339,20 @@ _avatar_request_item_result_handler(xmpp_stanza_t* const stanza, void* const use // if we shall open it if (g_hash_table_contains(shall_open, from_attr)) { - gchar* argv[] = { prefs_get_string(PREF_AVATAR_CMD), filename->str, NULL }; - if (!call_external(argv, NULL, NULL)) { - cons_show_error("Unable to display avatar: check the logs for more information."); + gchar* cmdtemplate = prefs_get_string(PREF_AVATAR_CMD); + + if (cmdtemplate == NULL) { + cons_show_error("No default `avatar open` command found in executables preferences."); + } else { + gchar** argv = format_call_external_argv(cmdtemplate, NULL, filename->str); + + if (!call_external(argv, NULL, NULL)) { + cons_show_error("Unable to display avatar: check the logs for more information."); + } + + g_strfreev(argv); } + g_hash_table_remove(shall_open, from_attr); } -- cgit 1.4.1-2-gfad0