From 50f4717f45502a04e83fcb6a782a5e900d5ed076 Mon Sep 17 00:00:00 2001 From: Andrew Borodin Date: Fri, 17 Mar 2023 19:50:19 +0300 Subject: [PATCH] Minor optimization of chown/chmod/chattr operations. (try_chmod): create filename when required. (try_chown): likewise. (try_advanced_chown): likewise. (try_chattr): likewise. Signed-off-by: Andrew Borodin --- src/filemanager/achown.c | 8 +++++--- src/filemanager/chattr.c | 10 ++++++---- src/filemanager/chmod.c | 8 +++++--- src/filemanager/chown.c | 8 +++++--- 4 files changed, 21 insertions(+), 13 deletions(-) diff --git a/src/filemanager/achown.c b/src/filemanager/achown.c index 1f0fefe8c..de8582357 100644 --- a/src/filemanager/achown.c +++ b/src/filemanager/achown.c @@ -847,9 +847,7 @@ static gboolean try_advanced_chown (const vfs_path_t * p, mode_t m, uid_t u, gid_t g) { int chmod_result; - const char *fname; - - fname = x_basename (vfs_path_as_str (p)); + const char *fname = NULL; while ((chmod_result = mc_chmod (p, m)) == -1 && !ignore_all) { @@ -857,6 +855,8 @@ try_advanced_chown (const vfs_path_t * p, mode_t m, uid_t u, gid_t g) int result; char *msg; + if (fname == NULL) + fname = x_basename (vfs_path_as_str (p)); msg = g_strdup_printf (_("Cannot chmod \"%s\"\n%s"), fname, unix_error_string (my_errno)); result = query_dialog (MSG_ERROR, msg, D_ERROR, 4, _("&Ignore"), _("Ignore &all"), _("&Retry"), @@ -892,6 +892,8 @@ try_advanced_chown (const vfs_path_t * p, mode_t m, uid_t u, gid_t g) int result; char *msg; + if (fname == NULL) + fname = x_basename (vfs_path_as_str (p)); msg = g_strdup_printf (_("Cannot chown \"%s\"\n%s"), fname, unix_error_string (my_errno)); result = query_dialog (MSG_ERROR, msg, D_ERROR, 4, _("&Ignore"), _("Ignore &all"), _("&Retry"), diff --git a/src/filemanager/chattr.c b/src/filemanager/chattr.c index adf9e07be..552f4a791 100644 --- a/src/filemanager/chattr.c +++ b/src/filemanager/chattr.c @@ -5,7 +5,7 @@ Free Software Foundation, Inc. Written by: - Andrew Borodin , 2020-2022 + Andrew Borodin , 2020-2023 This file is part of the Midnight Commander. @@ -1109,15 +1109,17 @@ next_file (const WPanel * panel) static gboolean try_chattr (const char *p, unsigned long m) { + const char *fname = NULL; + while (fsetflags (p, m) == -1 && !ignore_all) { int my_errno = errno; int result; char *msg; - msg = - g_strdup_printf (_("Cannot chattr \"%s\"\n%s"), x_basename (p), - unix_error_string (my_errno)); + if (fname == NULL) + fname = x_basename (vfs_path_as_str (p)); + msg = g_strdup_printf (_("Cannot chattr \"%s\"\n%s"), fname, unix_error_string (my_errno)); result = query_dialog (MSG_ERROR, msg, D_ERROR, 4, _("&Ignore"), _("Ignore &all"), _("&Retry"), _("&Cancel")); diff --git a/src/filemanager/chmod.c b/src/filemanager/chmod.c index 8eb41fb96..b1e9da239 100644 --- a/src/filemanager/chmod.c +++ b/src/filemanager/chmod.c @@ -426,15 +426,17 @@ next_file (const WPanel * panel) static gboolean try_chmod (const vfs_path_t * p, mode_t m) { + const char *fname = NULL; + while (mc_chmod (p, m) == -1 && !ignore_all) { int my_errno = errno; int result; char *msg; - msg = - g_strdup_printf (_("Cannot chmod \"%s\"\n%s"), x_basename (vfs_path_as_str (p)), - unix_error_string (my_errno)); + if (fname == NULL) + fname = x_basename (vfs_path_as_str (p)); + msg = g_strdup_printf (_("Cannot chmod \"%s\"\n%s"), fname, unix_error_string (my_errno)); result = query_dialog (MSG_ERROR, msg, D_ERROR, 4, _("&Ignore"), _("Ignore &all"), _("&Retry"), _("&Cancel")); diff --git a/src/filemanager/chown.c b/src/filemanager/chown.c index 3b000d068..845a429c9 100644 --- a/src/filemanager/chown.c +++ b/src/filemanager/chown.c @@ -298,15 +298,17 @@ next_file (const WPanel * panel) static gboolean try_chown (const vfs_path_t * p, uid_t u, gid_t g) { + const char *fname = NULL; + while (mc_chown (p, u, g) == -1 && !ignore_all) { int my_errno = errno; int result; char *msg; - msg = - g_strdup_printf (_("Cannot chown \"%s\"\n%s"), x_basename (vfs_path_as_str (p)), - unix_error_string (my_errno)); + if (fname == NULL) + fname = x_basename (vfs_path_as_str (p)); + msg = g_strdup_printf (_("Cannot chown \"%s\"\n%s"), fname, unix_error_string (my_errno)); result = query_dialog (MSG_ERROR, msg, D_ERROR, 4, _("&Ignore"), _("Ignore &all"), _("&Retry"), _("&Cancel"));