Merge branch '4270_cleanup'

* 4270_cleanup: (33 commits)
  Upate po/*.po files.
  mc.lib: move xterm alt-shift-arrow definitions to lib/tty/key.c.
  mc.lib: [terminal:linux] is same as [terminal:console].
  (delete_region, copy_region): rename arguments.
  src/editor/editwidget.c: grammar.
  mceditor: use MB_LEN_MAX constant.
  (string_file_name): use mc_g_string_copy.
  (complete_engine, insert_text): don't calculate text length twice.
  lib/strutil/strutilutf8.c: use MB_LEN_MAX constant.
  Remove get_process_stats() test.
  Use g_get_monotonic_time() instead of g_get_real_time().
  (learn_key): return NULL if buffer is empty.
  (learn_key): use g_get_real_time () to simplify time comparision.
  (get_key_code): use g_get_real_time () to simplify time comparision.
  (xmouse_get_event): use g_get_real_time () to simplify time comparision.
  lib/tty/key.c: use named constants for time intervals.
  (file_mask_dialog): indentation.
  Reimplement compiler options checking.
  lib/util.c: remove unneeded include.
  lib/keybind.h: remove unneeded includes.
  ...
This commit is contained in:
Andrew Borodin 2021-11-21 15:19:38 +03:00
commit eff779b246
94 changed files with 1161 additions and 1118 deletions

View File

@ -7,6 +7,10 @@ m4_include([m4.include/gnulib/windows-stat-inodes.m4])
m4_include([m4.include/gnulib/sys_types_h.m4])
m4_include([m4.include/ax_path_lib_pcre.m4])
m4_include([m4.include/dx_doxygen.m4])
m4_include([m4.include/ax_require_defined.m4])
m4_include([m4.include/ax_check_compile_flag.m4])
m4_include([m4.include/ax_append_flag.m4])
m4_include([m4.include/ax_append_compile_flags.m4])
m4_include([m4.include/mc-cflags.m4])
m4_include([m4.include/ax_gcc_func_attribute.m4])
m4_include([m4.include/mc-check-search-type.m4])

View File

@ -53,7 +53,7 @@ fi
AC_ARG_ENABLE([werror],
AS_HELP_STRING([--enable-werror], [Handle all compiler warnings as errors]))
if test "x$enable_werror" = xyes; then
mc_CHECK_ONE_CFLAG([-Werror])
AX_APPEND_COMPILE_FLAGS([-Werror], [mc_configured_cflags])
fi
dnl Compiler can generate warnings for unrecognized flags added to CFLAGS
@ -311,13 +311,6 @@ if test x$with_mmap != xno; then
fi
fi
dnl Sequent wants getprocessstats
AC_CHECK_LIB(seq, get_process_stats, [
LIBS="$LIBS -lseq"
AC_DEFINE(HAVE_GET_PROCESS_STATS, 1,
[Define if you have function `get_process_stats' and
have to use that instead of gettimeofday])])
mc_GET_FS_INFO

View File

@ -16,8 +16,8 @@ GNU Midnight Commander (also referred to as MC) is a user shell with
text-mode full-screen interface. It can be run on the OS console,
in xterm and other terminal emulators.
GNU Midnight Commander allows you to manage files while making most of
you screen and giving you a clear representation of the filesystem, yet
GNU Midnight Commander allows you to manage files while making the most of
your screen and giving you a clear representation of the filesystem, yet
it's simple enough to be run over a telnet or ssh session.
GNU Midnight Commander is released under the GNU General Public

View File

@ -1,9 +1,6 @@
#ifndef MC__KEYBIND_H
#define MC__KEYBIND_H
#include <sys/types.h>
#include <sys/time.h> /* time_t */
#include "lib/global.h"
/*** typedefs(not structures) and defined constants **********************************************/

View File

@ -27,6 +27,7 @@
#include <stdlib.h>
#include <langinfo.h>
#include <limits.h> /* MB_LEN_MAX */
#include <string.h>
#include "lib/global.h"
@ -51,7 +52,7 @@ struct utf8_tool
struct term_form
{
char text[BUF_MEDIUM * 6];
char text[BUF_MEDIUM * MB_LEN_MAX];
size_t width;
gboolean compose;
};
@ -512,7 +513,7 @@ str_utf8_make_make_term_form (const char *text, size_t length)
static const char *
str_utf8_term_form (const char *text)
{
static char result[BUF_MEDIUM * 6];
static char result[BUF_MEDIUM * MB_LEN_MAX];
const struct term_form *pre_form;
pre_form = str_utf8_make_make_term_form (text, (size_t) (-1));
@ -677,7 +678,7 @@ utf8_tool_compose (char *buffer, size_t size)
static const char *
str_utf8_fit_to_term (const char *text, int width, align_crt_t just_mode)
{
static char result[BUF_MEDIUM * 6];
static char result[BUF_MEDIUM * MB_LEN_MAX];
const struct term_form *pre_form;
struct utf8_tool tool;
@ -750,7 +751,7 @@ str_utf8_fit_to_term (const char *text, int width, align_crt_t just_mode)
static const char *
str_utf8_term_trim (const char *text, int width)
{
static char result[BUF_MEDIUM * 6];
static char result[BUF_MEDIUM * MB_LEN_MAX];
const struct term_form *pre_form;
struct utf8_tool tool;
@ -827,7 +828,7 @@ str_utf8_term_char_width (const char *text)
static const char *
str_utf8_term_substring (const char *text, int start, int width)
{
static char result[BUF_MEDIUM * 6];
static char result[BUF_MEDIUM * MB_LEN_MAX];
const struct term_form *pre_form;
struct utf8_tool tool;
@ -858,7 +859,7 @@ str_utf8_term_substring (const char *text, int start, int width)
static const char *
str_utf8_trunc (const char *text, int width)
{
static char result[MC_MAXPATHLEN * 6 * 2];
static char result[MC_MAXPATHLEN * MB_LEN_MAX * 2];
const struct term_form *pre_form;
struct utf8_tool tool;
@ -920,7 +921,7 @@ str_utf8_column_to_pos (const char *text, size_t pos)
{
gunichar uni;
uni = g_utf8_get_char_validated (text, 6);
uni = g_utf8_get_char_validated (text, MB_LEN_MAX);
if ((uni != (gunichar) (-1)) && (uni != (gunichar) (-2)))
{
if (g_unichar_isprint (uni))

View File

@ -89,11 +89,11 @@
/*** global variables ****************************************************************************/
int mou_auto_repeat = 100;
int double_click_speed = 250;
int mou_auto_repeat = 100; /* ms */
int double_click_speed = 250; /* ms */
gboolean old_esc_mode = TRUE;
/* timeout for old_esc_mode in usec */
int old_esc_mode_timeout = 1000000; /* settable via env */
int old_esc_mode_timeout = G_USEC_PER_SEC; /* us, settable via env */
gboolean use_8th_bit_as_meta = FALSE;
gboolean bracketed_pasting_in_progress = FALSE;
@ -220,8 +220,8 @@ const key_code_name_t key_name_conv_tab[] = {
/*** file scope macro definitions ****************************************************************/
#define GET_TIME(tv) (gettimeofday(&tv, (struct timezone *) NULL))
#define DIF_TIME(t1, t2) ((t2.tv_sec - t1.tv_sec) * 1000 + (t2.tv_usec - t1.tv_usec)/1000)
#define MC_MSEC_PER_SEC 1000
#define MC_USEC_PER_MSEC 1000
/* The maximum sequence length (32 + null terminator) */
#define SEQ_BUFFER_LEN 33
@ -382,6 +382,11 @@ static key_define_t xterm_key_defines[] = {
{KEY_M_CTRL | KEY_M_ALT | KEY_HOME, ESC_STR "OH", MCKEY_NOACTION},
{KEY_M_CTRL | KEY_M_ALT | KEY_END, ESC_STR "OF", MCKEY_NOACTION},
{KEY_M_SHIFT | KEY_M_ALT | KEY_UP, ESC_STR "[1;4A", MCKEY_NOACTION},
{KEY_M_SHIFT | KEY_M_ALT | KEY_DOWN, ESC_STR "[1;4B", MCKEY_NOACTION},
{KEY_M_SHIFT | KEY_M_ALT | KEY_RIGHT, ESC_STR "[1;4C", MCKEY_NOACTION},
{KEY_M_SHIFT | KEY_M_ALT | KEY_LEFT, ESC_STR "[1;4D", MCKEY_NOACTION},
/* rxvt keys with modifiers */
{KEY_M_SHIFT | KEY_UP, ESC_STR "[a", MCKEY_NOACTION},
{KEY_M_SHIFT | KEY_DOWN, ESC_STR "[b", MCKEY_NOACTION},
@ -640,7 +645,7 @@ try_channels (gboolean set_timeout)
if (set_timeout)
{
time_out.tv_sec = 0;
time_out.tv_usec = 100000;
time_out.tv_usec = 100 * MC_USEC_PER_MSEC;
timeptr = &time_out;
}
@ -741,8 +746,7 @@ getch_with_delay (void)
static void
xmouse_get_event (Gpm_Event * ev, gboolean extended)
{
static struct timeval tv1 = { 0, 0 }; /* Force first click as single */
static struct timeval tv2;
static gint64 tv1 = 0; /* Force first click as single */
static int clicks = 0;
static int last_btn = 0;
int btn;
@ -811,13 +815,12 @@ xmouse_get_event (Gpm_Event * ev, gboolean extended)
/* don't generate GPM_UP after mouse wheel */
/* need for menu event handling */
ev->type = 0;
tv1.tv_sec = 0;
tv1.tv_usec = 0;
tv1 = 0;
}
else
{
ev->type = GPM_UP | (GPM_SINGLE << clicks);
GET_TIME (tv1);
tv1 = g_get_monotonic_time ();
}
ev->buttons = 0;
last_btn = 0;
@ -831,6 +834,8 @@ xmouse_get_event (Gpm_Event * ev, gboolean extended)
}
else
{
gint64 tv2;
if (btn >= 32 && btn <= 34)
{
btn -= 32;
@ -839,8 +844,8 @@ xmouse_get_event (Gpm_Event * ev, gboolean extended)
else
ev->type = GPM_DOWN;
GET_TIME (tv2);
if (tv1.tv_sec != 0 && DIF_TIME (tv1, tv2) < double_click_speed)
tv2 = g_get_monotonic_time ();
if (tv1 != 0 && tv2 - tv1 < (gint64) double_click_speed * MC_USEC_PER_MSEC)
{
clicks++;
clicks %= 3;
@ -1153,8 +1158,8 @@ getch_with_timeout (unsigned int delay_us)
int c;
struct timeval time_out;
time_out.tv_sec = delay_us / 1000000u;
time_out.tv_usec = delay_us % 1000000u;
time_out.tv_sec = delay_us / G_USEC_PER_SEC;
time_out.tv_usec = delay_us % G_USEC_PER_SEC;
tty_nodelay (TRUE);
FD_ZERO (&Read_FD_Set);
FD_SET (input_fd, &Read_FD_Set);
@ -1731,7 +1736,7 @@ get_key_code (int no_delay)
{
int c;
static key_def *this = NULL, *parent;
static struct timeval esctime = { -1, -1 };
static gint64 esc_time = -1;
static int lastnodelay = -1;
if (no_delay != lastnodelay)
@ -1790,22 +1795,8 @@ get_key_code (int no_delay)
tty_nodelay (FALSE);
if (c == -1)
{
struct timeval current, time_out;
if (this == NULL || parent == NULL || parent->action != MCKEY_ESCAPE || !old_esc_mode ||
esctime.tv_sec == -1)
return -1;
GET_TIME (current);
time_out.tv_sec = old_esc_mode_timeout / 1000000 + esctime.tv_sec;
time_out.tv_usec = old_esc_mode_timeout % 1000000 + esctime.tv_usec;
if (time_out.tv_usec > 1000000)
{
time_out.tv_usec -= 1000000;
time_out.tv_sec++;
}
if (current.tv_sec < time_out.tv_sec ||
(current.tv_sec == time_out.tv_sec && current.tv_usec < time_out.tv_usec))
esc_time == -1 || g_get_monotonic_time () < esc_time + old_esc_mode_timeout)
return -1;
this = NULL;
@ -1869,11 +1860,11 @@ get_key_code (int no_delay)
{
if (no_delay != 0)
{
GET_TIME (esctime);
esc_time = g_get_monotonic_time ();
goto nodelay_try_again;
}
esctime.tv_sec = -1;
esc_time = -1;
c = getch_with_timeout (old_esc_mode_timeout);
if (c != -1)
continue;
@ -2000,7 +1991,7 @@ tty_get_event (struct Gpm_Event *event, gboolean redo_event, gboolean block)
if (redo_event)
{
time_out.tv_usec = mou_auto_repeat * 1000;
time_out.tv_usec = mou_auto_repeat * MC_USEC_PER_MSEC;
time_out.tv_sec = 0;
time_addr = &time_out;
@ -2165,12 +2156,11 @@ tty_getch (void)
char *
learn_key (void)
{
/* LEARN_TIMEOUT in usec */
#define LEARN_TIMEOUT 200000
/* LEARN_TIMEOUT in ms */
#define LEARN_TIMEOUT 200
fd_set Read_FD_Set;
struct timeval endtime;
struct timeval time_out;
gint64 end_time;
int c;
char buffer[256];
char *p = buffer;
@ -2181,32 +2171,25 @@ learn_key (void)
c = tty_lowlevel_getch (); /* Sanity check, should be unnecessary */
learn_store_key (buffer, &p, c);
GET_TIME (endtime);
endtime.tv_usec += LEARN_TIMEOUT;
if (endtime.tv_usec > 1000000)
{
endtime.tv_usec -= 1000000;
endtime.tv_sec++;
}
end_time = g_get_monotonic_time () + LEARN_TIMEOUT * MC_USEC_PER_MSEC;
tty_nodelay (TRUE);
while (TRUE)
{
while ((c = tty_lowlevel_getch ()) == -1)
{
GET_TIME (time_out);
time_out.tv_usec = endtime.tv_usec - time_out.tv_usec;
if (time_out.tv_usec < 0)
time_out.tv_sec++;
time_out.tv_sec = endtime.tv_sec - time_out.tv_sec;
if (time_out.tv_sec >= 0 && time_out.tv_usec > 0)
{
FD_ZERO (&Read_FD_Set);
FD_SET (input_fd, &Read_FD_Set);
select (input_fd + 1, &Read_FD_Set, NULL, NULL, &time_out);
}
else
gint64 time_out;
struct timeval tv;
time_out = end_time - g_get_monotonic_time ();
if (time_out <= 0)
break;
tv.tv_sec = time_out / G_USEC_PER_SEC;
tv.tv_usec = time_out % G_USEC_PER_SEC;
FD_ZERO (&Read_FD_Set);
FD_SET (input_fd, &Read_FD_Set);
select (input_fd + 1, &Read_FD_Set, NULL, NULL, &tv);
}
if (c == -1)
break;
@ -2215,7 +2198,7 @@ learn_key (void)
tty_keypad (TRUE);
tty_nodelay (FALSE);
*p = '\0';
return g_strdup (buffer);
return (buffer[0] != '\0' ? g_strdup (buffer) : NULL);
#undef LEARN_TIMEOUT
}

View File

@ -40,7 +40,6 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
@ -1522,7 +1521,7 @@ mc_time_elapsed (gint64 * timestamp, gint64 delay)
{
gint64 now;
now = g_get_real_time ();
now = g_get_monotonic_time ();
if (now >= *timestamp && now < *timestamp + delay)
return FALSE;

View File

@ -991,18 +991,6 @@ canonicalize_pathname (char *path)
/* --------------------------------------------------------------------------------------------- */
#ifdef HAVE_GET_PROCESS_STATS
int
gettimeofday (struct timeval *tp, void *tzp)
{
(void) tzp;
return get_process_stats (tp, PS_SELF, 0, 0);
}
#endif /* HAVE_GET_PROCESS_STATS */
/* --------------------------------------------------------------------------------------------- */
char *
mc_realpath (const char *path, char *resolved_path)
{

View File

@ -870,7 +870,7 @@ vfs_s_dir_uptodate (struct vfs_class *me, struct vfs_s_inode *ino)
return 0;
}
tim = g_get_real_time ();
tim = g_get_monotonic_time ();
return (tim < ino->timestamp);
}

View File

@ -129,7 +129,7 @@ vfs_addstamp (struct vfs_class *v, vfsid id)
stamp = g_new (struct vfs_stamping, 1);
stamp->v = v;
stamp->id = id;
stamp->time = g_get_real_time ();
stamp->time = g_get_monotonic_time ();
stamps = g_slist_append (stamps, stamp);
}
@ -152,7 +152,7 @@ vfs_stamp (struct vfs_class *v, vfsid id)
stamp = g_slist_find_custom (stamps, &what, vfs_stamp_compare);
if (stamp != NULL && stamp->data != NULL)
{
VFS_STAMPING (stamp->data)->time = g_get_real_time ();
VFS_STAMPING (stamp->data)->time = g_get_monotonic_time ();
ret = TRUE;
}
@ -247,7 +247,7 @@ vfs_expire (gboolean now)
return;
locked = TRUE;
curr_time = g_get_real_time ();
curr_time = g_get_monotonic_time ();
exp_time = curr_time - vfs_timeout * G_USEC_PER_SEC;
if (now)

View File

@ -149,10 +149,10 @@ input_eval_marks (WInput * in, long *start_mark, long *end_mark)
/* --------------------------------------------------------------------------------------------- */
static void
delete_region (WInput * in, int x_first, int x_last)
delete_region (WInput * in, int start, int end)
{
int first = MIN (x_first, x_last);
int last = MAX (x_first, x_last);
int first = MIN (start, end);
int last = MAX (start, end);
input_mark_cmd (in, FALSE);
in->point = first;
@ -487,10 +487,10 @@ delete_char (WInput * in)
/* --------------------------------------------------------------------------------------------- */
static void
copy_region (WInput * in, int x_first, int x_last)
copy_region (WInput * in, int start, int end)
{
int first = MIN (x_first, x_last);
int last = MAX (x_first, x_last);
int first = MIN (start, end);
int last = MAX (start, end);
if (last == first)
{

View File

@ -983,7 +983,11 @@ insert_text (WInput * in, char *text, ssize_t size)
text_len = strlen (text);
buff_len = str_length (in->buffer);
size = MIN (size, (ssize_t) text_len) + start - end;
if (size < 0)
size = (ssize_t) text_len;
else
size = MIN (size, (ssize_t) text_len);
size += start - end;
if (strlen (in->buffer) + size >= (size_t) in->current_max_size)
{
/* Expand the buffer */
@ -1210,7 +1214,7 @@ complete_engine (WInput * in, int what_to_do)
{
char *lc_complete = in->completions[0];
if (!insert_text (in, lc_complete, strlen (lc_complete)) || in->completions[1] != NULL)
if (!insert_text (in, lc_complete, -1) || in->completions[1] != NULL)
tty_beep ();
else
input_complete_free (in);
@ -1278,7 +1282,7 @@ complete_engine (WInput * in, int what_to_do)
{
listbox_get_current (complete_list, &q, NULL);
if (q != NULL)
insert_text (in, q, strlen (q));
insert_text (in, q, -1);
}
if (q != NULL || end != min_end)
input_complete_free (in);

View File

@ -587,7 +587,7 @@ status_msg_init (status_msg_t * sm, const char *title, double delay, status_msg_
/* repaint screen to remove previous finished dialog */
mc_refresh ();
start = g_get_real_time ();
start = g_get_monotonic_time ();
sm->dlg = dlg_create (TRUE, 0, 0, 7, MIN (MAX (40, COLS / 2), COLS), WPOS_CENTER, FALSE,
dialog_colors, NULL, NULL, NULL, title);

View File

@ -0,0 +1,46 @@
# ============================================================================
# https://www.gnu.org/software/autoconf-archive/ax_append_compile_flags.html
# ============================================================================
#
# SYNOPSIS
#
# AX_APPEND_COMPILE_FLAGS([FLAG1 FLAG2 ...], [FLAGS-VARIABLE], [EXTRA-FLAGS], [INPUT])
#
# DESCRIPTION
#
# For every FLAG1, FLAG2 it is checked whether the compiler works with the
# flag. If it does, the flag is added FLAGS-VARIABLE
#
# If FLAGS-VARIABLE is not specified, the current language's flags (e.g.
# CFLAGS) is used. During the check the flag is always added to the
# current language's flags.
#
# If EXTRA-FLAGS is defined, it is added to the current language's default
# flags (e.g. CFLAGS) when the check is done. The check is thus made with
# the flags: "CFLAGS EXTRA-FLAGS FLAG". This can for example be used to
# force the compiler to issue an error when a bad flag is given.
#
# INPUT gives an alternative input source to AC_COMPILE_IFELSE.
#
# NOTE: This macro depends on the AX_APPEND_FLAG and
# AX_CHECK_COMPILE_FLAG. Please keep this macro in sync with
# AX_APPEND_LINK_FLAGS.
#
# LICENSE
#
# Copyright (c) 2011 Maarten Bosmans <mkbosmans@gmail.com>
#
# Copying and distribution of this file, with or without modification, are
# permitted in any medium without royalty provided the copyright notice
# and this notice are preserved. This file is offered as-is, without any
# warranty.
#serial 7
AC_DEFUN([AX_APPEND_COMPILE_FLAGS],
[AX_REQUIRE_DEFINED([AX_CHECK_COMPILE_FLAG])
AX_REQUIRE_DEFINED([AX_APPEND_FLAG])
for flag in $1; do
AX_CHECK_COMPILE_FLAG([$flag], [AX_APPEND_FLAG([$flag], [$2])], [], [$3], [$4])
done
])dnl AX_APPEND_COMPILE_FLAGS

View File

@ -0,0 +1,50 @@
# ===========================================================================
# https://www.gnu.org/software/autoconf-archive/ax_append_flag.html
# ===========================================================================
#
# SYNOPSIS
#
# AX_APPEND_FLAG(FLAG, [FLAGS-VARIABLE])
#
# DESCRIPTION
#
# FLAG is appended to the FLAGS-VARIABLE shell variable, with a space
# added in between.
#
# If FLAGS-VARIABLE is not specified, the current language's flags (e.g.
# CFLAGS) is used. FLAGS-VARIABLE is not changed if it already contains
# FLAG. If FLAGS-VARIABLE is unset in the shell, it is set to exactly
# FLAG.
#
# NOTE: Implementation based on AX_CFLAGS_GCC_OPTION.
#
# LICENSE
#
# Copyright (c) 2008 Guido U. Draheim <guidod@gmx.de>
# Copyright (c) 2011 Maarten Bosmans <mkbosmans@gmail.com>
#
# Copying and distribution of this file, with or without modification, are
# permitted in any medium without royalty provided the copyright notice
# and this notice are preserved. This file is offered as-is, without any
# warranty.
#serial 8
AC_DEFUN([AX_APPEND_FLAG],
[dnl
AC_PREREQ(2.64)dnl for _AC_LANG_PREFIX and AS_VAR_SET_IF
AS_VAR_PUSHDEF([FLAGS], [m4_default($2,_AC_LANG_PREFIX[FLAGS])])
AS_VAR_SET_IF(FLAGS,[
AS_CASE([" AS_VAR_GET(FLAGS) "],
[*" $1 "*], [AC_RUN_LOG([: FLAGS already contains $1])],
[
AS_VAR_APPEND(FLAGS,[" $1"])
AC_RUN_LOG([: FLAGS="$FLAGS"])
])
],
[
AS_VAR_SET(FLAGS,[$1])
AC_RUN_LOG([: FLAGS="$FLAGS"])
])
AS_VAR_POPDEF([FLAGS])dnl
])dnl AX_APPEND_FLAG

View File

@ -0,0 +1,53 @@
# ===========================================================================
# https://www.gnu.org/software/autoconf-archive/ax_check_compile_flag.html
# ===========================================================================
#
# SYNOPSIS
#
# AX_CHECK_COMPILE_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS], [INPUT])
#
# DESCRIPTION
#
# Check whether the given FLAG works with the current language's compiler
# or gives an error. (Warnings, however, are ignored)
#
# ACTION-SUCCESS/ACTION-FAILURE are shell commands to execute on
# success/failure.
#
# If EXTRA-FLAGS is defined, it is added to the current language's default
# flags (e.g. CFLAGS) when the check is done. The check is thus made with
# the flags: "CFLAGS EXTRA-FLAGS FLAG". This can for example be used to
# force the compiler to issue an error when a bad flag is given.
#
# INPUT gives an alternative input source to AC_COMPILE_IFELSE.
#
# NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. Please keep this
# macro in sync with AX_CHECK_{PREPROC,LINK}_FLAG.
#
# LICENSE
#
# Copyright (c) 2008 Guido U. Draheim <guidod@gmx.de>
# Copyright (c) 2011 Maarten Bosmans <mkbosmans@gmail.com>
#
# Copying and distribution of this file, with or without modification, are
# permitted in any medium without royalty provided the copyright notice
# and this notice are preserved. This file is offered as-is, without any
# warranty.
#serial 6
AC_DEFUN([AX_CHECK_COMPILE_FLAG],
[AC_PREREQ(2.64)dnl for _AC_LANG_PREFIX and AS_VAR_IF
AS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_[]_AC_LANG_ABBREV[]flags_$4_$1])dnl
AC_CACHE_CHECK([whether _AC_LANG compiler accepts $1], CACHEVAR, [
ax_check_save_flags=$[]_AC_LANG_PREFIX[]FLAGS
_AC_LANG_PREFIX[]FLAGS="$[]_AC_LANG_PREFIX[]FLAGS $4 $1"
AC_COMPILE_IFELSE([m4_default([$5],[AC_LANG_PROGRAM()])],
[AS_VAR_SET(CACHEVAR,[yes])],
[AS_VAR_SET(CACHEVAR,[no])])
_AC_LANG_PREFIX[]FLAGS=$ax_check_save_flags])
AS_VAR_IF(CACHEVAR,yes,
[m4_default([$2], :)],
[m4_default([$3], :)])
AS_VAR_POPDEF([CACHEVAR])dnl
])dnl AX_CHECK_COMPILE_FLAGS

View File

@ -0,0 +1,37 @@
# ===========================================================================
# https://www.gnu.org/software/autoconf-archive/ax_require_defined.html
# ===========================================================================
#
# SYNOPSIS
#
# AX_REQUIRE_DEFINED(MACRO)
#
# DESCRIPTION
#
# AX_REQUIRE_DEFINED is a simple helper for making sure other macros have
# been defined and thus are available for use. This avoids random issues
# where a macro isn't expanded. Instead the configure script emits a
# non-fatal:
#
# ./configure: line 1673: AX_CFLAGS_WARN_ALL: command not found
#
# It's like AC_REQUIRE except it doesn't expand the required macro.
#
# Here's an example:
#
# AX_REQUIRE_DEFINED([AX_CHECK_LINK_FLAG])
#
# LICENSE
#
# Copyright (c) 2014 Mike Frysinger <vapier@gentoo.org>
#
# Copying and distribution of this file, with or without modification, are
# permitted in any medium without royalty provided the copyright notice
# and this notice are preserved. This file is offered as-is, without any
# warranty.
#serial 2
AC_DEFUN([AX_REQUIRE_DEFINED], [dnl
m4_ifndef([$1], [m4_fatal([macro ]$1[ is not defined; is a m4 file missing?])])
])dnl AX_REQUIRE_DEFINED

View File

@ -3,104 +3,88 @@ dnl
dnl Check flags supported by C compiler
dnl
dnl @author Slava Zanko <slavazanko@gmail.com>
dnl @version 2013-01-16
dnl @modified by Andrew Borodin <aborodin@vmail.ru>
dnl @version 2021-09-19
dnl @license GPL
dnl @copyright Free Software Foundation, Inc.
AC_DEFUN([mc_CHECK_ONE_CFLAG],[
AC_MSG_CHECKING([whether ${CC} accepts $1])
safe_CFLAGS=$CFLAGS
case "$CC" in
clang*)
CFLAGS="-Werror $1"
;;
*)
CFLAGS="$1"
;;
esac
AC_COMPILE_IFELSE(
[AC_LANG_PROGRAM([], [[return 0;]])],
[mc_check_one_cflag=yes],
[mc_check_one_cflag=no])
CFLAGS=$safe_CFLAGS
AC_MSG_RESULT([$mc_check_one_cflag])
if test x$mc_check_one_cflag = xyes; then
mc_configured_cflags="$mc_configured_cflags $1"
fi
])
AC_DEFUN([mc_CHECK_CFLAGS],[
AC_LANG_PUSH(C)
mc_configured_cflags=""
dnl Sorted -f options:
dnl AC_MSG_CHECKING([CC is $CC])
case "$CC" in
gcc*)
mc_CHECK_ONE_CFLAG([-fdiagnostics-show-option])
dnl mc_CHECK_ONE_CFLAG([-fno-stack-protector])
;;
*)
;;
esac
dnl AC_MSG_CHECKING([CC is $CC])
dnl Sorted -W options:
mc_CHECK_ONE_CFLAG([-Wassign-enum])
mc_CHECK_ONE_CFLAG([-Wbad-function-cast])
mc_CHECK_ONE_CFLAG([-Wcomment])
mc_CHECK_ONE_CFLAG([-Wconditional-uninitialized])
mc_CHECK_ONE_CFLAG([-Wdeclaration-after-statement])
mc_CHECK_ONE_CFLAG([-Wfloat-conversion])
mc_CHECK_ONE_CFLAG([-Wfloat-equal])
mc_CHECK_ONE_CFLAG([-Wformat])
mc_CHECK_ONE_CFLAG([-Wformat-security])
mc_CHECK_ONE_CFLAG([-Wformat-signedness])
mc_CHECK_ONE_CFLAG([-Wimplicit])
mc_CHECK_ONE_CFLAG([-Wimplicit-fallthrough])
mc_CHECK_ONE_CFLAG([-Wignored-qualifiers])
mc_CHECK_ONE_CFLAG([-Wlogical-not-parentheses])
mc_CHECK_ONE_CFLAG([-Wmaybe-uninitialized])
mc_CHECK_ONE_CFLAG([-Wmissing-braces])
mc_CHECK_ONE_CFLAG([-Wmissing-declarations])
mc_CHECK_ONE_CFLAG([-Wmissing-field-initializers])
mc_CHECK_ONE_CFLAG([-Wmissing-format-attribute])
mc_CHECK_ONE_CFLAG([-Wmissing-parameter-type])
mc_CHECK_ONE_CFLAG([-Wmissing-prototypes])
mc_CHECK_ONE_CFLAG([-Wmissing-variable-declarations])
mc_CHECK_ONE_CFLAG([-Wnested-externs])
mc_CHECK_ONE_CFLAG([-Wno-long-long])
mc_CHECK_ONE_CFLAG([-Wno-unreachable-code])
mc_CHECK_ONE_CFLAG([-Wparentheses])
mc_CHECK_ONE_CFLAG([-Wpointer-arith])
mc_CHECK_ONE_CFLAG([-Wpointer-sign])
mc_CHECK_ONE_CFLAG([-Wredundant-decls])
mc_CHECK_ONE_CFLAG([-Wreturn-type])
mc_CHECK_ONE_CFLAG([-Wsequence-point])
mc_CHECK_ONE_CFLAG([-Wshadow])
mc_CHECK_ONE_CFLAG([-Wsign-compare])
dnl mc_CHECK_ONE_CFLAG([-Wstrict-aliasing])
mc_CHECK_ONE_CFLAG([-Wstrict-prototypes])
mc_CHECK_ONE_CFLAG([-Wswitch])
mc_CHECK_ONE_CFLAG([-Wswitch-default])
mc_CHECK_ONE_CFLAG([-Wtype-limits])
mc_CHECK_ONE_CFLAG([-Wundef])
mc_CHECK_ONE_CFLAG([-Wuninitialized])
mc_CHECK_ONE_CFLAG([-Wunreachable-code])
mc_CHECK_ONE_CFLAG([-Wunused-but-set-variable])
mc_CHECK_ONE_CFLAG([-Wunused-function])
mc_CHECK_ONE_CFLAG([-Wunused-label])
mc_CHECK_ONE_CFLAG([-Wunused-parameter])
mc_CHECK_ONE_CFLAG([-Wunused-result])
mc_CHECK_ONE_CFLAG([-Wunused-value])
mc_CHECK_ONE_CFLAG([-Wunused-variable])
mc_CHECK_ONE_CFLAG([-Wwrite-strings])
dnl https://stackoverflow.com/questions/52557417/how-to-check-support-compile-flag-in-autoconf-for-clang
case "$CC" in
clang*)
EXTRA_OPTION="-Werror"
;;
*)
EXTRA_OPTION=""
;;
esac
dnl Sorted -f options:
case "$CC" in
gcc*)
AX_APPEND_COMPILE_FLAGS([-fdiagnostics-show-option], [mc_configured_cflags])
dnl AX_APPEND_COMPILE_FLAGS([-fno-stack-protector], [mc_configured_cflags])
;;
*)
;;
esac
dnl Sorted -W options:
AX_APPEND_COMPILE_FLAGS([-Wassign-enum], [mc_configured_cflags], [$EXTRA_OPTION])
AX_APPEND_COMPILE_FLAGS([-Wbad-function-cast], [mc_configured_cflags], [$EXTRA_OPTION])
AX_APPEND_COMPILE_FLAGS([-Wcomment], [mc_configured_cflags], [$EXTRA_OPTION])
AX_APPEND_COMPILE_FLAGS([-Wconditional-uninitialized], [mc_configured_cflags], [$EXTRA_OPTION])
AX_APPEND_COMPILE_FLAGS([-Wdeclaration-after-statement], [mc_configured_cflags], [$EXTRA_OPTION])
AX_APPEND_COMPILE_FLAGS([-Wfloat-conversion], [mc_configured_cflags], [$EXTRA_OPTION])
AX_APPEND_COMPILE_FLAGS([-Wfloat-equal], [mc_configured_cflags], [$EXTRA_OPTION])
AX_APPEND_COMPILE_FLAGS([-Wformat], [mc_configured_cflags], [$EXTRA_OPTION])
AX_APPEND_COMPILE_FLAGS([-Wformat-security], [mc_configured_cflags], [$EXTRA_OPTION])
AX_APPEND_COMPILE_FLAGS([-Wformat-signedness], [mc_configured_cflags], [$EXTRA_OPTION])
AX_APPEND_COMPILE_FLAGS([-Wimplicit], [mc_configured_cflags], [$EXTRA_OPTION])
AX_APPEND_COMPILE_FLAGS([-Wimplicit-fallthrough], [mc_configured_cflags], [$EXTRA_OPTION])
AX_APPEND_COMPILE_FLAGS([-Wignored-qualifiers], [mc_configured_cflags], [$EXTRA_OPTION])
AX_APPEND_COMPILE_FLAGS([-Wlogical-not-parentheses], [mc_configured_cflags], [$EXTRA_OPTION])
AX_APPEND_COMPILE_FLAGS([-Wmaybe-uninitialized], [mc_configured_cflags], [$EXTRA_OPTION])
AX_APPEND_COMPILE_FLAGS([-Wmissing-braces], [mc_configured_cflags], [$EXTRA_OPTION])
AX_APPEND_COMPILE_FLAGS([-Wmissing-declarations], [mc_configured_cflags], [$EXTRA_OPTION])
AX_APPEND_COMPILE_FLAGS([-Wmissing-field-initializers], [mc_configured_cflags], [$EXTRA_OPTION])
AX_APPEND_COMPILE_FLAGS([-Wmissing-format-attribute], [mc_configured_cflags], [$EXTRA_OPTION])
AX_APPEND_COMPILE_FLAGS([-Wmissing-parameter-type], [mc_configured_cflags], [$EXTRA_OPTION])
AX_APPEND_COMPILE_FLAGS([-Wmissing-prototypes], [mc_configured_cflags], [$EXTRA_OPTION])
AX_APPEND_COMPILE_FLAGS([-Wmissing-variable-declarations], [mc_configured_cflags], [$EXTRA_OPTION])
AX_APPEND_COMPILE_FLAGS([-Wnested-externs], [mc_configured_cflags], [$EXTRA_OPTION])
AX_APPEND_COMPILE_FLAGS([-Wno-long-long], [mc_configured_cflags], [$EXTRA_OPTION])
AX_APPEND_COMPILE_FLAGS([-Wno-unreachable-code], [mc_configured_cflags], [$EXTRA_OPTION])
AX_APPEND_COMPILE_FLAGS([-Wparentheses], [mc_configured_cflags], [$EXTRA_OPTION])
AX_APPEND_COMPILE_FLAGS([-Wpointer-arith], [mc_configured_cflags], [$EXTRA_OPTION])
AX_APPEND_COMPILE_FLAGS([-Wpointer-sign], [mc_configured_cflags], [$EXTRA_OPTION])
AX_APPEND_COMPILE_FLAGS([-Wredundant-decls], [mc_configured_cflags], [$EXTRA_OPTION])
AX_APPEND_COMPILE_FLAGS([-Wreturn-type], [mc_configured_cflags], [$EXTRA_OPTION])
AX_APPEND_COMPILE_FLAGS([-Wsequence-point], [mc_configured_cflags], [$EXTRA_OPTION])
AX_APPEND_COMPILE_FLAGS([-Wshadow], [mc_configured_cflags], [$EXTRA_OPTION])
AX_APPEND_COMPILE_FLAGS([-Wsign-compare], [mc_configured_cflags], [$EXTRA_OPTION])
dnl AX_APPEND_COMPILE_FLAGS([-Wstrict-aliasing], [mc_configured_cflags], [$EXTRA_OPTION])
AX_APPEND_COMPILE_FLAGS([-Wstrict-prototypes], [mc_configured_cflags], [$EXTRA_OPTION])
AX_APPEND_COMPILE_FLAGS([-Wswitch], [mc_configured_cflags], [$EXTRA_OPTION])
AX_APPEND_COMPILE_FLAGS([-Wswitch-default], [mc_configured_cflags], [$EXTRA_OPTION])
AX_APPEND_COMPILE_FLAGS([-Wtype-limits], [mc_configured_cflags], [$EXTRA_OPTION])
AX_APPEND_COMPILE_FLAGS([-Wundef], [mc_configured_cflags], [$EXTRA_OPTION])
AX_APPEND_COMPILE_FLAGS([-Wuninitialized], [mc_configured_cflags], [$EXTRA_OPTION])
AX_APPEND_COMPILE_FLAGS([-Wunreachable-code], [mc_configured_cflags], [$EXTRA_OPTION])
AX_APPEND_COMPILE_FLAGS([-Wunused-but-set-variable], [mc_configured_cflags], [$EXTRA_OPTION])
AX_APPEND_COMPILE_FLAGS([-Wunused-function], [mc_configured_cflags], [$EXTRA_OPTION])
AX_APPEND_COMPILE_FLAGS([-Wunused-label], [mc_configured_cflags], [$EXTRA_OPTION])
AX_APPEND_COMPILE_FLAGS([-Wunused-parameter], [mc_configured_cflags], [$EXTRA_OPTION])
AX_APPEND_COMPILE_FLAGS([-Wunused-result], [mc_configured_cflags], [$EXTRA_OPTION])
AX_APPEND_COMPILE_FLAGS([-Wunused-value], [mc_configured_cflags], [$EXTRA_OPTION])
AX_APPEND_COMPILE_FLAGS([-Wunused-variable], [mc_configured_cflags], [$EXTRA_OPTION])
AX_APPEND_COMPILE_FLAGS([-Wwrite-strings], [mc_configured_cflags], [$EXTRA_OPTION])
AC_LANG_POP()
])

View File

@ -42,33 +42,7 @@ kpslash=\\eOQ
kpnumlock=\\eOP
[terminal:linux]
insert=\\e[2~
f11=\\e[23~
f12=\\e[24~
f13=\\e[25~
f14=\\e[26~
f15=\\e[28~
f16=\\e[29~
f17=\\e[31~
f18=\\e[32~
f19=\\e[33~
f20=\\e[34~
kpleft=\\eOt
kpright=\\eOv
kpup=\\eOx
kpdown=\\eOr
kphome=\\eOw
kpend=\\eOq
kpnpage=\\eOs
kpppage=\\eOy
kpplus=\\eOl
kpminus=\\eOS
kpasterisk=\\eOR
kpinsert=\\eOp
kpdelete=\\eOn
kpenter=\\eOM
kpslash=\\eOQ
kpnumlock=\\eOP
copy=console
[terminal:xterm]
insert=\\e[2~
@ -110,12 +84,6 @@ right=\\eOC
left=\\e[D
left=\\eOD
# arrows with modifiers
alt-shift-right=\\e[1\;4C
alt-shift-left=\\e[1\;4D
alt-shift-up=\\e[1\;4A
alt-shift-down=\\e[1\;4B
[terminal:alacritty]
copy=xterm

View File

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Midnight Commander\n"
"Report-Msgid-Bugs-To: http://www.midnight-commander.org/\n"
"POT-Creation-Date: 2021-09-26 10:06+0300\n"
"POT-Creation-Date: 2021-11-21 15:18+0300\n"
"PO-Revision-Date: 2021-07-26 20:16+0000\n"
"Last-Translator: Transifex Bot <>\n"
"Language-Team: Azerbaijani (http://www.transifex.com/mc/mc/language/az/)\n"
@ -2864,7 +2864,8 @@ msgstr "&Ağac"
msgid "&Listing format..."
msgstr ""
msgid "&Sort order..."
#, fuzzy
msgid "S&ort order..."
msgstr "&Sıralama əmri..."
msgid "&Filter..."
@ -2879,8 +2880,9 @@ msgstr "FT&P bağı ..."
msgid "S&hell link..."
msgstr ""
msgid "S&FTP link..."
msgstr ""
#, fuzzy
msgid "&SFTP link..."
msgstr "FT&P bağı ..."
msgid "Paneli&ze"
msgstr ""

View File

@ -13,7 +13,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Midnight Commander\n"
"Report-Msgid-Bugs-To: http://www.midnight-commander.org/\n"
"POT-Creation-Date: 2021-09-26 10:06+0300\n"
"POT-Creation-Date: 2021-11-21 15:18+0300\n"
"PO-Revision-Date: 2021-07-26 20:16+0000\n"
"Last-Translator: Transifex Bot <>\n"
"Language-Team: Belarusian (http://www.transifex.com/mc/mc/language/be/)\n"
@ -3056,7 +3056,8 @@ msgstr "Дрэва(&T)"
msgid "&Listing format..."
msgstr "Фармат спіса(&L)..."
msgid "&Sort order..."
#, fuzzy
msgid "S&ort order..."
msgstr "Упарадкаваць(&S)..."
msgid "&Filter..."
@ -3071,7 +3072,8 @@ msgstr "Злучэнне праз FTP(&F)..."
msgid "S&hell link..."
msgstr "Злучэнне праз абалонку(&H)..."
msgid "S&FTP link..."
#, fuzzy
msgid "&SFTP link..."
msgstr "Злучэнне праз SFTP(&F)..."
msgid "Paneli&ze"

View File

@ -11,7 +11,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Midnight Commander\n"
"Report-Msgid-Bugs-To: http://www.midnight-commander.org/\n"
"POT-Creation-Date: 2021-09-26 10:06+0300\n"
"POT-Creation-Date: 2021-11-21 15:18+0300\n"
"PO-Revision-Date: 2021-07-26 20:16+0000\n"
"Last-Translator: Transifex Bot <>\n"
"Language-Team: Bulgarian (http://www.transifex.com/mc/mc/language/bg/)\n"
@ -3032,7 +3032,8 @@ msgstr "Дърво"
msgid "&Listing format..."
msgstr "&Формат на списък"
msgid "&Sort order..."
#, fuzzy
msgid "S&ort order..."
msgstr "Ред на сортиране..."
msgid "&Filter..."
@ -3047,7 +3048,8 @@ msgstr "FTP връзка..."
msgid "S&hell link..."
msgstr "S&hell връзка..."
msgid "S&FTP link..."
#, fuzzy
msgid "&SFTP link..."
msgstr "S&FTP връзка..."
msgid "Paneli&ze"

View File

@ -16,7 +16,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Midnight Commander\n"
"Report-Msgid-Bugs-To: http://www.midnight-commander.org/\n"
"POT-Creation-Date: 2021-09-26 10:06+0300\n"
"POT-Creation-Date: 2021-11-21 15:18+0300\n"
"PO-Revision-Date: 2021-07-26 20:16+0000\n"
"Last-Translator: Transifex Bot <>\n"
"Language-Team: Catalan (http://www.transifex.com/mc/mc/language/ca/)\n"
@ -3074,7 +3074,8 @@ msgstr "Ar&bre"
msgid "&Listing format..."
msgstr "Format del &llistat..."
msgid "&Sort order..."
#, fuzzy
msgid "S&ort order..."
msgstr "&Ordenació..."
msgid "&Filter..."
@ -3089,7 +3090,8 @@ msgstr "Enllaç per a F&TP..."
msgid "S&hell link..."
msgstr "Enllaç per a l'i&ntèrpret..."
msgid "S&FTP link..."
#, fuzzy
msgid "&SFTP link..."
msgstr "Enllaç per a &SFTP..."
msgid "Paneli&ze"

View File

@ -14,7 +14,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Midnight Commander\n"
"Report-Msgid-Bugs-To: http://www.midnight-commander.org/\n"
"POT-Creation-Date: 2021-09-26 10:06+0300\n"
"POT-Creation-Date: 2021-11-21 15:18+0300\n"
"PO-Revision-Date: 2021-07-26 20:16+0000\n"
"Last-Translator: Transifex Bot <>\n"
"Language-Team: Czech (http://www.transifex.com/mc/mc/language/cs/)\n"
@ -3066,7 +3066,8 @@ msgstr "S&trom"
msgid "&Listing format..."
msgstr "&Formát výpisu…"
msgid "&Sort order..."
#, fuzzy
msgid "S&ort order..."
msgstr "&Pořadí…"
msgid "&Filter..."
@ -3081,7 +3082,8 @@ msgstr "FT&P spojení…"
msgid "S&hell link..."
msgstr "S&hell spojení…"
msgid "S&FTP link..."
#, fuzzy
msgid "&SFTP link..."
msgstr "SFTP sp&ojení…"
msgid "Paneli&ze"

View File

@ -13,7 +13,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Midnight Commander\n"
"Report-Msgid-Bugs-To: http://www.midnight-commander.org/\n"
"POT-Creation-Date: 2021-09-26 10:06+0300\n"
"POT-Creation-Date: 2021-11-21 15:18+0300\n"
"PO-Revision-Date: 2021-07-26 20:16+0000\n"
"Last-Translator: Transifex Bot <>\n"
"Language-Team: Danish (http://www.transifex.com/mc/mc/language/da/)\n"
@ -3060,7 +3060,8 @@ msgstr "&Træ"
msgid "&Listing format..."
msgstr "&Listeformat..."
msgid "&Sort order..."
#, fuzzy
msgid "S&ort order..."
msgstr "&Sorteringsrækkefølge..."
msgid "&Filter..."
@ -3075,7 +3076,8 @@ msgstr "FT&P-henvisning..."
msgid "S&hell link..."
msgstr "S&kalhenvisning..."
msgid "S&FTP link..."
#, fuzzy
msgid "&SFTP link..."
msgstr "S&FTP-link..."
msgid "Paneli&ze"

View File

@ -20,7 +20,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Midnight Commander\n"
"Report-Msgid-Bugs-To: http://www.midnight-commander.org/\n"
"POT-Creation-Date: 2021-09-26 10:06+0300\n"
"POT-Creation-Date: 2021-11-21 15:18+0300\n"
"PO-Revision-Date: 2021-07-26 20:16+0000\n"
"Last-Translator: Transifex Bot <>\n"
"Language-Team: German (http://www.transifex.com/mc/mc/language/de/)\n"
@ -3077,7 +3077,8 @@ msgstr "&Baum"
msgid "&Listing format..."
msgstr "&Listenformat..."
msgid "&Sort order..."
#, fuzzy
msgid "S&ort order..."
msgstr "&Sortierreihenfolge..."
msgid "&Filter..."
@ -3092,7 +3093,8 @@ msgstr "FT&P-Verbindung..."
msgid "S&hell link..."
msgstr "S&hell-Verbindung..."
msgid "S&FTP link..."
#, fuzzy
msgid "&SFTP link..."
msgstr "S&FTP-Verbindung..."
msgid "Paneli&ze"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Midnight Commander\n"
"Report-Msgid-Bugs-To: http://www.midnight-commander.org/\n"
"POT-Creation-Date: 2021-09-26 10:06+0300\n"
"POT-Creation-Date: 2021-11-21 15:18+0300\n"
"PO-Revision-Date: 2015-02-26 09:48+0000\n"
"Last-Translator: Piotr Drąg <piotrdrag@gmail.com>\n"
"Language-Team: German (Switzerland) (http://www.transifex.com/projects/p/mc/"
@ -2862,7 +2862,7 @@ msgstr ""
msgid "&Listing format..."
msgstr ""
msgid "&Sort order..."
msgid "S&ort order..."
msgstr ""
msgid "&Filter..."
@ -2877,7 +2877,7 @@ msgstr ""
msgid "S&hell link..."
msgstr ""
msgid "S&FTP link..."
msgid "&SFTP link..."
msgstr ""
msgid "Paneli&ze"

View File

@ -12,7 +12,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Midnight Commander\n"
"Report-Msgid-Bugs-To: http://www.midnight-commander.org/\n"
"POT-Creation-Date: 2021-09-26 10:06+0300\n"
"POT-Creation-Date: 2021-11-21 15:18+0300\n"
"PO-Revision-Date: 2021-07-26 20:16+0000\n"
"Last-Translator: Transifex Bot <>\n"
"Language-Team: Greek (http://www.transifex.com/mc/mc/language/el/)\n"
@ -2948,7 +2948,8 @@ msgstr "&Δέντρο"
msgid "&Listing format..."
msgstr ""
msgid "&Sort order..."
#, fuzzy
msgid "S&ort order..."
msgstr "&Σειρά ταξινόμησης..."
msgid "&Filter..."
@ -2963,7 +2964,8 @@ msgstr "Δεσμος FT&P..."
msgid "S&hell link..."
msgstr "Δεσμος κε&λύφους..."
msgid "S&FTP link..."
#, fuzzy
msgid "&SFTP link..."
msgstr "Δεσμός S&FTP..."
msgid "Paneli&ze"

View File

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Midnight Commander\n"
"Report-Msgid-Bugs-To: http://www.midnight-commander.org/\n"
"POT-Creation-Date: 2021-09-26 10:06+0300\n"
"POT-Creation-Date: 2021-11-21 15:18+0300\n"
"PO-Revision-Date: 2021-07-26 20:16+0000\n"
"Last-Translator: Transifex Bot <>\n"
"Language-Team: English (United Kingdom) (http://www.transifex.com/mc/mc/"
@ -2880,7 +2880,7 @@ msgstr ""
msgid "&Listing format..."
msgstr ""
msgid "&Sort order..."
msgid "S&ort order..."
msgstr ""
msgid "&Filter..."
@ -2895,7 +2895,7 @@ msgstr ""
msgid "S&hell link..."
msgstr ""
msgid "S&FTP link..."
msgid "&SFTP link..."
msgstr ""
msgid "Paneli&ze"

View File

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Midnight Commander\n"
"Report-Msgid-Bugs-To: http://www.midnight-commander.org/\n"
"POT-Creation-Date: 2021-09-26 10:06+0300\n"
"POT-Creation-Date: 2021-11-21 15:18+0300\n"
"PO-Revision-Date: 2021-07-26 20:16+0000\n"
"Last-Translator: Transifex Bot <>\n"
"Language-Team: Esperanto (http://www.transifex.com/mc/mc/language/eo/)\n"
@ -3058,7 +3058,8 @@ msgstr "&Arbo"
msgid "&Listing format..."
msgstr "&Listo-aranĝo..."
msgid "&Sort order..."
#, fuzzy
msgid "S&ort order..."
msgstr "&Ordigi laŭ..."
msgid "&Filter..."
@ -3073,7 +3074,8 @@ msgstr "FT&P-ligilo..."
msgid "S&hell link..."
msgstr "Ŝ&ela ligilo..."
msgid "S&FTP link..."
#, fuzzy
msgid "&SFTP link..."
msgstr "&SFTP-ligilo..."
msgid "Paneli&ze"

View File

@ -13,7 +13,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Midnight Commander\n"
"Report-Msgid-Bugs-To: http://www.midnight-commander.org/\n"
"POT-Creation-Date: 2021-09-26 10:06+0300\n"
"POT-Creation-Date: 2021-11-21 15:18+0300\n"
"PO-Revision-Date: 2021-08-03 17:59+0000\n"
"Last-Translator: David Martin <dhmartina@yahoo.es>\n"
"Language-Team: Spanish (http://www.transifex.com/mc/mc/language/es/)\n"
@ -3066,7 +3066,8 @@ msgstr "ár&Bol"
msgid "&Listing format..."
msgstr "for&Mato de listado..."
msgid "&Sort order..."
#, fuzzy
msgid "S&ort order..."
msgstr "&Ordenar..."
msgid "&Filter..."
@ -3081,7 +3082,8 @@ msgstr "conexión por FT&P..."
msgid "S&hell link..."
msgstr "conexión por SS&H..."
msgid "S&FTP link..."
#, fuzzy
msgid "&SFTP link..."
msgstr "conexión por SF&TP..."
msgid "Paneli&ze"

View File

@ -11,7 +11,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Midnight Commander\n"
"Report-Msgid-Bugs-To: http://www.midnight-commander.org/\n"
"POT-Creation-Date: 2021-09-26 10:06+0300\n"
"POT-Creation-Date: 2021-11-21 15:18+0300\n"
"PO-Revision-Date: 2021-08-08 12:32+0000\n"
"Last-Translator: Priit Jõerüüt <transifex@joeruut.com>\n"
"Language-Team: Estonian (http://www.transifex.com/mc/mc/language/et/)\n"
@ -3047,7 +3047,8 @@ msgstr "&Puu"
msgid "&Listing format..."
msgstr "&Loendi vormindus"
msgid "&Sort order..."
#, fuzzy
msgid "S&ort order..."
msgstr "&Sortimine..."
msgid "&Filter..."
@ -3062,7 +3063,8 @@ msgstr "F&TP ühendus..."
msgid "S&hell link..."
msgstr "K&esta ühendus..."
msgid "S&FTP link..."
#, fuzzy
msgid "&SFTP link..."
msgstr "S&FTP ühendus..."
msgid "Paneli&ze"

View File

@ -9,7 +9,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Midnight Commander\n"
"Report-Msgid-Bugs-To: http://www.midnight-commander.org/\n"
"POT-Creation-Date: 2021-09-26 10:06+0300\n"
"POT-Creation-Date: 2021-11-21 15:18+0300\n"
"PO-Revision-Date: 2021-07-26 20:16+0000\n"
"Last-Translator: Transifex Bot <>\n"
"Language-Team: Basque (http://www.transifex.com/mc/mc/language/eu/)\n"
@ -3053,7 +3053,8 @@ msgstr "Zu&haitza"
msgid "&Listing format..."
msgstr "&Zerrenda formatua"
msgid "&Sort order..."
#, fuzzy
msgid "S&ort order..."
msgstr "&Sailkatzeko ordena..."
msgid "&Filter..."
@ -3068,7 +3069,8 @@ msgstr "FT&P esteka..."
msgid "S&hell link..."
msgstr "S&hell esteka..."
msgid "S&FTP link..."
#, fuzzy
msgid "&SFTP link..."
msgstr "S&FTP esteka..."
msgid "Paneli&ze"

View File

@ -12,7 +12,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Midnight Commander\n"
"Report-Msgid-Bugs-To: http://www.midnight-commander.org/\n"
"POT-Creation-Date: 2021-09-26 10:06+0300\n"
"POT-Creation-Date: 2021-11-21 15:18+0300\n"
"PO-Revision-Date: 2021-07-26 20:16+0000\n"
"Last-Translator: Transifex Bot <>\n"
"Language-Team: Persian (http://www.transifex.com/mc/mc/language/fa/)\n"
@ -2866,8 +2866,9 @@ msgstr ""
msgid "&Listing format..."
msgstr ""
msgid "&Sort order..."
msgstr ""
#, fuzzy
msgid "S&ort order..."
msgstr "ترتیب مرتب‌سازی"
msgid "&Filter..."
msgstr ""
@ -2881,7 +2882,7 @@ msgstr ""
msgid "S&hell link..."
msgstr ""
msgid "S&FTP link..."
msgid "&SFTP link..."
msgstr ""
msgid "Paneli&ze"

View File

@ -11,7 +11,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Midnight Commander\n"
"Report-Msgid-Bugs-To: http://www.midnight-commander.org/\n"
"POT-Creation-Date: 2021-09-26 10:06+0300\n"
"POT-Creation-Date: 2021-11-21 15:18+0300\n"
"PO-Revision-Date: 2021-07-26 20:16+0000\n"
"Last-Translator: Transifex Bot <>\n"
"Language-Team: Finnish (http://www.transifex.com/mc/mc/language/fi/)\n"
@ -2968,7 +2968,8 @@ msgstr "&Puu"
msgid "&Listing format..."
msgstr "&Luettelomuoto..."
msgid "&Sort order..."
#, fuzzy
msgid "S&ort order..."
msgstr "&Järjestys"
msgid "&Filter..."
@ -2983,7 +2984,8 @@ msgstr "FT&P linkki..."
msgid "S&hell link..."
msgstr "S&hell linkki..."
msgid "S&FTP link..."
#, fuzzy
msgid "&SFTP link..."
msgstr "S&FTP linkki..."
msgid "Paneli&ze"

View File

@ -17,7 +17,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Midnight Commander\n"
"Report-Msgid-Bugs-To: http://www.midnight-commander.org/\n"
"POT-Creation-Date: 2021-09-26 10:06+0300\n"
"POT-Creation-Date: 2021-11-21 15:18+0300\n"
"PO-Revision-Date: 2021-07-26 20:16+0000\n"
"Last-Translator: Transifex Bot <>\n"
"Language-Team: French (http://www.transifex.com/mc/mc/language/fr/)\n"
@ -3055,7 +3055,8 @@ msgstr "&Arborescence"
msgid "&Listing format..."
msgstr "Format de &Listing ..."
msgid "&Sort order..."
#, fuzzy
msgid "S&ort order..."
msgstr "&Ordre de tri..."
msgid "&Filter..."
@ -3070,7 +3071,8 @@ msgstr "Lien &FTP..."
msgid "S&hell link..."
msgstr "Lien S&hell..."
msgid "S&FTP link..."
#, fuzzy
msgid "&SFTP link..."
msgstr "Lien &SFTP..."
msgid "Paneli&ze"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Midnight Commander\n"
"Report-Msgid-Bugs-To: http://www.midnight-commander.org/\n"
"POT-Creation-Date: 2021-09-26 10:06+0300\n"
"POT-Creation-Date: 2021-11-21 15:18+0300\n"
"PO-Revision-Date: 2015-02-26 09:48+0000\n"
"Last-Translator: Piotr Drąg <piotrdrag@gmail.com>\n"
"Language-Team: French (Canada) (http://www.transifex.com/projects/p/mc/"
@ -2862,7 +2862,7 @@ msgstr ""
msgid "&Listing format..."
msgstr ""
msgid "&Sort order..."
msgid "S&ort order..."
msgstr ""
msgid "&Filter..."
@ -2877,7 +2877,7 @@ msgstr ""
msgid "S&hell link..."
msgstr ""
msgid "S&FTP link..."
msgid "&SFTP link..."
msgstr ""
msgid "Paneli&ze"

View File

@ -12,7 +12,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Midnight Commander\n"
"Report-Msgid-Bugs-To: http://www.midnight-commander.org/\n"
"POT-Creation-Date: 2021-09-26 10:06+0300\n"
"POT-Creation-Date: 2021-11-21 15:18+0300\n"
"PO-Revision-Date: 2021-07-26 20:16+0000\n"
"Last-Translator: Transifex Bot <>\n"
"Language-Team: Galician (http://www.transifex.com/mc/mc/language/gl/)\n"
@ -3057,7 +3057,8 @@ msgstr "Ár&Bore"
msgid "&Listing format..."
msgstr "Formato de &ista..."
msgid "&Sort order..."
#, fuzzy
msgid "S&ort order..."
msgstr "&Ordenar..."
msgid "&Filter..."
@ -3072,7 +3073,8 @@ msgstr "Conexión por FT&P..."
msgid "S&hell link..."
msgstr "Conexión por &Terminal..."
msgid "S&FTP link..."
#, fuzzy
msgid "&SFTP link..."
msgstr "Ligazón S&FTP..."
msgid "Paneli&ze"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Midnight Commander\n"
"Report-Msgid-Bugs-To: http://www.midnight-commander.org/\n"
"POT-Creation-Date: 2021-09-26 10:06+0300\n"
"POT-Creation-Date: 2021-11-21 15:18+0300\n"
"PO-Revision-Date: 2021-07-26 20:16+0000\n"
"Last-Translator: Transifex Bot <>\n"
"Language-Team: Croatian (http://www.transifex.com/mc/mc/language/hr/)\n"
@ -2862,7 +2862,7 @@ msgstr ""
msgid "&Listing format..."
msgstr ""
msgid "&Sort order..."
msgid "S&ort order..."
msgstr ""
msgid "&Filter..."
@ -2877,7 +2877,7 @@ msgstr ""
msgid "S&hell link..."
msgstr ""
msgid "S&FTP link..."
msgid "&SFTP link..."
msgstr ""
msgid "Paneli&ze"

View File

@ -12,7 +12,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Midnight Commander\n"
"Report-Msgid-Bugs-To: http://www.midnight-commander.org/\n"
"POT-Creation-Date: 2021-09-26 10:06+0300\n"
"POT-Creation-Date: 2021-11-21 15:18+0300\n"
"PO-Revision-Date: 2021-07-26 20:16+0000\n"
"Last-Translator: Transifex Bot <>\n"
"Language-Team: Hungarian (http://www.transifex.com/mc/mc/language/hu/)\n"
@ -3031,7 +3031,8 @@ msgstr "Köny&vtárfa"
msgid "&Listing format..."
msgstr ""
msgid "&Sort order..."
#, fuzzy
msgid "S&ort order..."
msgstr "&Rendezési mód..."
msgid "&Filter..."
@ -3046,7 +3047,8 @@ msgstr "&FTP-kapcsolat..."
msgid "S&hell link..."
msgstr "Sh&ell-kapcsolat..."
msgid "S&FTP link..."
#, fuzzy
msgid "&SFTP link..."
msgstr "S&FTP link..."
msgid "Paneli&ze"

View File

@ -10,7 +10,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Midnight Commander\n"
"Report-Msgid-Bugs-To: http://www.midnight-commander.org/\n"
"POT-Creation-Date: 2021-09-26 10:06+0300\n"
"POT-Creation-Date: 2021-11-21 15:18+0300\n"
"PO-Revision-Date: 2021-07-26 20:16+0000\n"
"Last-Translator: Transifex Bot <>\n"
"Language-Team: Interlingua (http://www.transifex.com/mc/mc/language/ia/)\n"
@ -2882,7 +2882,7 @@ msgstr "&Arbore"
msgid "&Listing format..."
msgstr ""
msgid "&Sort order..."
msgid "S&ort order..."
msgstr ""
msgid "&Filter..."
@ -2897,8 +2897,9 @@ msgstr "Ligamine FT&P..."
msgid "S&hell link..."
msgstr ""
msgid "S&FTP link..."
msgstr ""
#, fuzzy
msgid "&SFTP link..."
msgstr "Ligamine FT&P..."
msgid "Paneli&ze"
msgstr ""

View File

@ -10,7 +10,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Midnight Commander\n"
"Report-Msgid-Bugs-To: http://www.midnight-commander.org/\n"
"POT-Creation-Date: 2021-09-26 10:06+0300\n"
"POT-Creation-Date: 2021-11-21 15:18+0300\n"
"PO-Revision-Date: 2021-07-26 20:16+0000\n"
"Last-Translator: Transifex Bot <>\n"
"Language-Team: Indonesian (http://www.transifex.com/mc/mc/language/id/)\n"
@ -2899,7 +2899,7 @@ msgstr ""
msgid "&Listing format..."
msgstr ""
msgid "&Sort order..."
msgid "S&ort order..."
msgstr ""
msgid "&Filter..."
@ -2914,7 +2914,7 @@ msgstr ""
msgid "S&hell link..."
msgstr ""
msgid "S&FTP link..."
msgid "&SFTP link..."
msgstr ""
msgid "Paneli&ze"

View File

@ -11,7 +11,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Midnight Commander\n"
"Report-Msgid-Bugs-To: http://www.midnight-commander.org/\n"
"POT-Creation-Date: 2021-09-26 10:06+0300\n"
"POT-Creation-Date: 2021-11-21 15:18+0300\n"
"PO-Revision-Date: 2021-09-29 09:45+0200\n"
"Last-Translator: Marco Ciampa <ciampix@libero.it>\n"
"Language-Team: Italian (http://www.transifex.com/projects/p/mc/language/"
@ -3060,7 +3060,8 @@ msgstr "A&lbero"
msgid "&Listing format..."
msgstr "Formato &lista..."
msgid "&Sort order..."
#, fuzzy
msgid "S&ort order..."
msgstr "&Ordina per..."
msgid "&Filter..."
@ -3075,7 +3076,8 @@ msgstr "Connessione FT&P..."
msgid "S&hell link..."
msgstr "Connessione S&hell..."
msgid "S&FTP link..."
#, fuzzy
msgid "&SFTP link..."
msgstr "Connessione S&FTP..."
msgid "Paneli&ze"
@ -4364,7 +4366,8 @@ msgid "sftp: %s"
msgstr "sftp: %s"
msgid "sftp: failed to convert remote host IP address into text form"
msgstr "sftp: fallita conversione indirizzo IP host remoto nella forma testuale"
msgstr ""
"sftp: fallita conversione indirizzo IP host remoto nella forma testuale"
#, c-format
msgid "sftp: making connection to %s"

View File

@ -13,7 +13,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Midnight Commander\n"
"Report-Msgid-Bugs-To: http://www.midnight-commander.org/\n"
"POT-Creation-Date: 2021-09-26 10:06+0300\n"
"POT-Creation-Date: 2021-11-21 15:18+0300\n"
"PO-Revision-Date: 2021-07-26 20:16+0000\n"
"Last-Translator: Transifex Bot <>\n"
"Language-Team: Japanese (http://www.transifex.com/mc/mc/language/ja/)\n"
@ -2882,7 +2882,8 @@ msgstr "ツリー(&T)"
msgid "&Listing format..."
msgstr ""
msgid "&Sort order..."
#, fuzzy
msgid "S&ort order..."
msgstr "整列順(&S)..."
msgid "&Filter..."
@ -2897,8 +2898,9 @@ msgstr "FTP リンク(&P)..."
msgid "S&hell link..."
msgstr ""
msgid "S&FTP link..."
msgstr ""
#, fuzzy
msgid "&SFTP link..."
msgstr "FTP リンク(&P)..."
msgid "Paneli&ze"
msgstr ""

View File

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Midnight Commander\n"
"Report-Msgid-Bugs-To: http://www.midnight-commander.org/\n"
"POT-Creation-Date: 2021-09-26 10:06+0300\n"
"POT-Creation-Date: 2021-11-21 15:18+0300\n"
"PO-Revision-Date: 2021-07-26 20:16+0000\n"
"Last-Translator: Transifex Bot <>\n"
"Language-Team: Georgian (http://www.transifex.com/mc/mc/language/ka/)\n"
@ -2865,7 +2865,7 @@ msgstr "&ხე"
msgid "&Listing format..."
msgstr ""
msgid "&Sort order..."
msgid "S&ort order..."
msgstr ""
msgid "&Filter..."
@ -2880,7 +2880,8 @@ msgstr ""
msgid "S&hell link..."
msgstr ""
msgid "S&FTP link..."
#, fuzzy
msgid "&SFTP link..."
msgstr "S&FTP ბმა..."
msgid "Paneli&ze"

View File

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Midnight Commander\n"
"Report-Msgid-Bugs-To: http://www.midnight-commander.org/\n"
"POT-Creation-Date: 2021-09-26 10:06+0300\n"
"POT-Creation-Date: 2021-11-21 15:18+0300\n"
"PO-Revision-Date: 2021-07-26 20:16+0000\n"
"Last-Translator: Transifex Bot <>\n"
"Language-Team: Kazakh (http://www.transifex.com/mc/mc/language/kk/)\n"
@ -2862,7 +2862,7 @@ msgstr ""
msgid "&Listing format..."
msgstr ""
msgid "&Sort order..."
msgid "S&ort order..."
msgstr ""
msgid "&Filter..."
@ -2877,7 +2877,7 @@ msgstr ""
msgid "S&hell link..."
msgstr ""
msgid "S&FTP link..."
msgid "&SFTP link..."
msgstr ""
msgid "Paneli&ze"

View File

@ -12,7 +12,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Midnight Commander\n"
"Report-Msgid-Bugs-To: http://www.midnight-commander.org/\n"
"POT-Creation-Date: 2021-09-26 10:06+0300\n"
"POT-Creation-Date: 2021-11-21 15:18+0300\n"
"PO-Revision-Date: 2021-07-26 20:16+0000\n"
"Last-Translator: Transifex Bot <>\n"
"Language-Team: Korean (http://www.transifex.com/mc/mc/language/ko/)\n"
@ -3055,7 +3055,8 @@ msgstr "트리구조(&T)"
msgid "&Listing format..."
msgstr "목록 형식(&L)..."
msgid "&Sort order..."
#, fuzzy
msgid "S&ort order..."
msgstr "정렬 순서(&S)..."
msgid "&Filter..."
@ -3070,7 +3071,8 @@ msgstr "FTP 링크(&P)..."
msgid "S&hell link..."
msgstr "쉘 링크(&H)..."
msgid "S&FTP link..."
#, fuzzy
msgid "&SFTP link..."
msgstr "SFTP 링크(&F)..."
msgid "Paneli&ze"

View File

@ -14,7 +14,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Midnight Commander\n"
"Report-Msgid-Bugs-To: http://www.midnight-commander.org/\n"
"POT-Creation-Date: 2021-09-26 10:06+0300\n"
"POT-Creation-Date: 2021-11-21 15:18+0300\n"
"PO-Revision-Date: 2021-07-26 20:16+0000\n"
"Last-Translator: Transifex Bot <>\n"
"Language-Team: Lithuanian (http://www.transifex.com/mc/mc/language/lt/)\n"
@ -2947,7 +2947,8 @@ msgstr "&Medis"
msgid "&Listing format..."
msgstr ""
msgid "&Sort order..."
#, fuzzy
msgid "S&ort order..."
msgstr "Rik. t&varka..."
msgid "&Filter..."
@ -2962,8 +2963,9 @@ msgstr "FT&P ryšys..."
msgid "S&hell link..."
msgstr "Apli&nkos ryšys..."
msgid "S&FTP link..."
msgstr ""
#, fuzzy
msgid "&SFTP link..."
msgstr "FT&P ryšys..."
msgid "Paneli&ze"
msgstr ""

View File

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Midnight Commander\n"
"Report-Msgid-Bugs-To: http://www.midnight-commander.org/\n"
"POT-Creation-Date: 2021-09-26 10:06+0300\n"
"POT-Creation-Date: 2021-11-21 15:18+0300\n"
"PO-Revision-Date: 2021-07-26 20:16+0000\n"
"Last-Translator: Transifex Bot <>\n"
"Language-Team: Latvian (http://www.transifex.com/mc/mc/language/lv/)\n"
@ -2866,7 +2866,8 @@ msgstr "&Koks"
msgid "&Listing format..."
msgstr ""
msgid "&Sort order..."
#, fuzzy
msgid "S&ort order..."
msgstr "&Kārtotā secībā..."
msgid "&Filter..."
@ -2881,8 +2882,9 @@ msgstr "FT&P saite..."
msgid "S&hell link..."
msgstr ""
msgid "S&FTP link..."
msgstr ""
#, fuzzy
msgid "&SFTP link..."
msgstr "FT&P saite..."
msgid "Paneli&ze"
msgstr ""

380
po/mc.pot

File diff suppressed because it is too large Load Diff

View File

@ -9,7 +9,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Midnight Commander\n"
"Report-Msgid-Bugs-To: http://www.midnight-commander.org/\n"
"POT-Creation-Date: 2021-09-26 10:06+0300\n"
"POT-Creation-Date: 2021-11-21 15:18+0300\n"
"PO-Revision-Date: 2021-07-26 20:16+0000\n"
"Last-Translator: Transifex Bot <>\n"
"Language-Team: Mongolian (http://www.transifex.com/mc/mc/language/mn/)\n"
@ -2865,7 +2865,8 @@ msgstr "&Мод"
msgid "&Listing format..."
msgstr "&Жагшаалтын формат"
msgid "&Sort order..."
#, fuzzy
msgid "S&ort order..."
msgstr "Эрэмбэлэх &дараалал..."
msgid "&Filter..."
@ -2880,8 +2881,9 @@ msgstr "&FTP-холбоос..."
msgid "S&hell link..."
msgstr "S&hell-холбоос..."
msgid "S&FTP link..."
msgstr ""
#, fuzzy
msgid "&SFTP link..."
msgstr "&FTP-холбоос..."
msgid "Paneli&ze"
msgstr "&Панелиз"

View File

@ -10,7 +10,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Midnight Commander\n"
"Report-Msgid-Bugs-To: http://www.midnight-commander.org/\n"
"POT-Creation-Date: 2021-09-26 10:06+0300\n"
"POT-Creation-Date: 2021-11-21 15:18+0300\n"
"PO-Revision-Date: 2021-07-29 12:31+0000\n"
"Last-Translator: heskjestad <cato@heskjestad.xyz>\n"
"Language-Team: Norwegian Bokmål (http://www.transifex.com/mc/mc/language/"
@ -3065,7 +3065,8 @@ msgstr "&Tre"
msgid "&Listing format..."
msgstr "&Utlistingsformat ..."
msgid "&Sort order..."
#, fuzzy
msgid "S&ort order..."
msgstr "Sorterings&rekkefølge ..."
msgid "&Filter..."
@ -3080,7 +3081,8 @@ msgstr "Koble til FT&P ..."
msgid "S&hell link..."
msgstr "Koble til &skall ..."
msgid "S&FTP link..."
#, fuzzy
msgid "&SFTP link..."
msgstr "K&oble til SFTP ..."
msgid "Paneli&ze"

View File

@ -14,7 +14,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Midnight Commander\n"
"Report-Msgid-Bugs-To: http://www.midnight-commander.org/\n"
"POT-Creation-Date: 2021-09-26 10:06+0300\n"
"POT-Creation-Date: 2021-11-21 15:18+0300\n"
"PO-Revision-Date: 2021-07-26 20:16+0000\n"
"Last-Translator: Transifex Bot <>\n"
"Language-Team: Dutch (http://www.transifex.com/mc/mc/language/nl/)\n"
@ -3059,7 +3059,8 @@ msgstr "&Boom"
msgid "&Listing format..."
msgstr "&Lijstformaat..."
msgid "&Sort order..."
#, fuzzy
msgid "S&ort order..."
msgstr "&Sorteervolgorde... "
msgid "&Filter..."
@ -3074,7 +3075,8 @@ msgstr "FT&P-Verbinding... "
msgid "S&hell link..."
msgstr "S&hellverbinding... "
msgid "S&FTP link..."
#, fuzzy
msgid "&SFTP link..."
msgstr "S&FTP-link..."
msgid "Paneli&ze"

View File

@ -10,7 +10,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Midnight Commander\n"
"Report-Msgid-Bugs-To: http://www.midnight-commander.org/\n"
"POT-Creation-Date: 2021-09-26 10:06+0300\n"
"POT-Creation-Date: 2021-11-21 15:18+0300\n"
"PO-Revision-Date: 2021-07-27 11:29+0000\n"
"Last-Translator: Piotr Drąg <piotrdrag@gmail.com>\n"
"Language-Team: Polish (http://www.transifex.com/mc/mc/language/pl/)\n"
@ -3068,7 +3068,8 @@ msgstr "&Drzewo"
msgid "&Listing format..."
msgstr "&Format wyświetlania…"
msgid "&Sort order..."
#, fuzzy
msgid "S&ort order..."
msgstr "Porządek s&ortowania…"
msgid "&Filter..."
@ -3083,7 +3084,8 @@ msgstr "Połączenie FT&P…"
msgid "S&hell link..."
msgstr "Połączenie po po&włoce…"
msgid "S&FTP link..."
#, fuzzy
msgid "&SFTP link..."
msgstr "Połączenie S&FTP…"
msgid "Paneli&ze"

View File

@ -12,7 +12,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Midnight Commander\n"
"Report-Msgid-Bugs-To: http://www.midnight-commander.org/\n"
"POT-Creation-Date: 2021-09-26 10:06+0300\n"
"POT-Creation-Date: 2021-11-21 15:18+0300\n"
"PO-Revision-Date: 2021-07-26 23:56+0000\n"
"Last-Translator: Gilberto Jorge <gmj125@gmail.com>\n"
"Language-Team: Portuguese (http://www.transifex.com/mc/mc/language/pt/)\n"
@ -3065,7 +3065,8 @@ msgstr "&Árvore"
msgid "&Listing format..."
msgstr "Formato da &listagem..."
msgid "&Sort order..."
#, fuzzy
msgid "S&ort order..."
msgstr "&Ordenação..."
msgid "&Filter..."
@ -3080,7 +3081,8 @@ msgstr "Ligação FT&P..."
msgid "S&hell link..."
msgstr "Ligação s&hell..."
msgid "S&FTP link..."
#, fuzzy
msgid "&SFTP link..."
msgstr "Ligação S&FTP..."
msgid "Paneli&ze"

View File

@ -13,7 +13,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Midnight Commander\n"
"Report-Msgid-Bugs-To: http://www.midnight-commander.org/\n"
"POT-Creation-Date: 2021-09-26 10:06+0300\n"
"POT-Creation-Date: 2021-11-21 15:18+0300\n"
"PO-Revision-Date: 2021-07-26 20:16+0000\n"
"Last-Translator: Transifex Bot <>\n"
"Language-Team: Portuguese (Brazil) (http://www.transifex.com/mc/mc/language/"
@ -2980,7 +2980,8 @@ msgstr "&Árvore"
msgid "&Listing format..."
msgstr ""
msgid "&Sort order..."
#, fuzzy
msgid "S&ort order..."
msgstr "&Ordem..."
msgid "&Filter..."
@ -2995,8 +2996,9 @@ msgstr "Ligação FT&P..."
msgid "S&hell link..."
msgstr ""
msgid "S&FTP link..."
msgstr ""
#, fuzzy
msgid "&SFTP link..."
msgstr "Ligação FT&P..."
msgid "Paneli&ze"
msgstr ""

View File

@ -16,7 +16,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Midnight Commander\n"
"Report-Msgid-Bugs-To: http://www.midnight-commander.org/\n"
"POT-Creation-Date: 2021-09-26 10:06+0300\n"
"POT-Creation-Date: 2021-11-21 15:18+0300\n"
"PO-Revision-Date: 2021-07-26 20:16+0000\n"
"Last-Translator: Transifex Bot <>\n"
"Language-Team: Romanian (http://www.transifex.com/mc/mc/language/ro/)\n"
@ -3066,7 +3066,8 @@ msgstr "Arbore"
msgid "&Listing format..."
msgstr "formatul de &listare "
msgid "&Sort order..."
#, fuzzy
msgid "S&ort order..."
msgstr "&Ordinea sortării..."
msgid "&Filter..."
@ -3081,7 +3082,8 @@ msgstr "Conectare FT&P..."
msgid "S&hell link..."
msgstr "Conectare s&hell..."
msgid "S&FTP link..."
#, fuzzy
msgid "&SFTP link..."
msgstr "Conectare S&FTP..."
msgid "Paneli&ze"

View File

@ -21,7 +21,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Midnight Commander\n"
"Report-Msgid-Bugs-To: http://www.midnight-commander.org/\n"
"POT-Creation-Date: 2021-09-26 10:06+0300\n"
"POT-Creation-Date: 2021-11-21 15:18+0300\n"
"PO-Revision-Date: 2021-07-26 20:16+0000\n"
"Last-Translator: Transifex Bot <>\n"
"Language-Team: Russian (http://www.transifex.com/mc/mc/language/ru/)\n"
@ -3072,7 +3072,8 @@ msgstr "Дерев&о"
msgid "&Listing format..."
msgstr "Фор&мат списка..."
msgid "&Sort order..."
#, fuzzy
msgid "S&ort order..."
msgstr "Порядок &сортировки..."
msgid "&Filter..."
@ -3087,7 +3088,8 @@ msgstr "&FTP-соединение..."
msgid "S&hell link..."
msgstr "S&hell-соединение..."
msgid "S&FTP link..."
#, fuzzy
msgid "&SFTP link..."
msgstr "&SFTP-соединение..."
msgid "Paneli&ze"

View File

@ -15,7 +15,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Midnight Commander\n"
"Report-Msgid-Bugs-To: http://www.midnight-commander.org/\n"
"POT-Creation-Date: 2021-09-26 10:06+0300\n"
"POT-Creation-Date: 2021-11-21 15:18+0300\n"
"PO-Revision-Date: 2021-07-26 20:16+0000\n"
"Last-Translator: Transifex Bot <>\n"
"Language-Team: Slovak (http://www.transifex.com/mc/mc/language/sk/)\n"
@ -3049,7 +3049,8 @@ msgstr "&Strom"
msgid "&Listing format..."
msgstr "&Formát výpisu..."
msgid "&Sort order..."
#, fuzzy
msgid "S&ort order..."
msgstr "&Poradie výpisu..."
msgid "&Filter..."
@ -3064,7 +3065,8 @@ msgstr "&Pripojenie FTP..."
msgid "S&hell link..."
msgstr "Pripojenie s&hell..."
msgid "S&FTP link..."
#, fuzzy
msgid "&SFTP link..."
msgstr "Pripojenie S&FTP..."
msgid "Paneli&ze"

View File

@ -10,7 +10,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Midnight Commander\n"
"Report-Msgid-Bugs-To: http://www.midnight-commander.org/\n"
"POT-Creation-Date: 2021-09-26 10:06+0300\n"
"POT-Creation-Date: 2021-11-21 15:18+0300\n"
"PO-Revision-Date: 2021-07-26 20:16+0000\n"
"Last-Translator: Transifex Bot <>\n"
"Language-Team: Slovenian (http://www.transifex.com/mc/mc/language/sl/)\n"
@ -2874,7 +2874,8 @@ msgstr "&Drevo"
msgid "&Listing format..."
msgstr ""
msgid "&Sort order..."
#, fuzzy
msgid "S&ort order..."
msgstr "&Vrstni red..."
msgid "&Filter..."
@ -2889,8 +2890,9 @@ msgstr "FT&P povezava..."
msgid "S&hell link..."
msgstr "&Lupinska povezava..."
msgid "S&FTP link..."
msgstr ""
#, fuzzy
msgid "&SFTP link..."
msgstr "FT&P povezava..."
msgid "Paneli&ze"
msgstr ""

View File

@ -9,7 +9,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Midnight Commander\n"
"Report-Msgid-Bugs-To: http://www.midnight-commander.org/\n"
"POT-Creation-Date: 2021-09-26 10:06+0300\n"
"POT-Creation-Date: 2021-11-21 15:18+0300\n"
"PO-Revision-Date: 2021-07-26 20:16+0000\n"
"Last-Translator: Transifex Bot <>\n"
"Language-Team: Serbian (http://www.transifex.com/mc/mc/language/sr/)\n"
@ -3027,7 +3027,8 @@ msgstr "&Стабло"
msgid "&Listing format..."
msgstr ""
msgid "&Sort order..."
#, fuzzy
msgid "S&ort order..."
msgstr "Редослед &ређања..."
msgid "&Filter..."
@ -3042,7 +3043,8 @@ msgstr "&ФТП веза..."
msgid "S&hell link..."
msgstr "Веза &љуске..."
msgid "S&FTP link..."
#, fuzzy
msgid "&SFTP link..."
msgstr "&СФТП веза..."
msgid "Paneli&ze"

View File

@ -16,7 +16,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Midnight Commander\n"
"Report-Msgid-Bugs-To: http://www.midnight-commander.org/\n"
"POT-Creation-Date: 2021-09-26 10:06+0300\n"
"POT-Creation-Date: 2021-11-21 15:18+0300\n"
"PO-Revision-Date: 2021-07-26 20:16+0000\n"
"Last-Translator: Transifex Bot <>\n"
"Language-Team: Swedish (http://www.transifex.com/mc/mc/language/sv/)\n"
@ -3053,7 +3053,8 @@ msgstr "&Träd"
msgid "&Listing format..."
msgstr "&Listformat..."
msgid "&Sort order..."
#, fuzzy
msgid "S&ort order..."
msgstr "&Sorteringsordning..."
msgid "&Filter..."
@ -3068,7 +3069,8 @@ msgstr "FT&P-länk..."
msgid "S&hell link..."
msgstr "S&kallänk..."
msgid "S&FTP link..."
#, fuzzy
msgid "&SFTP link..."
msgstr "SFTP-l&änk..."
msgid "Paneli&ze"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Midnight Commander\n"
"Report-Msgid-Bugs-To: http://www.midnight-commander.org/\n"
"POT-Creation-Date: 2021-09-26 10:06+0300\n"
"POT-Creation-Date: 2021-11-21 15:18+0300\n"
"PO-Revision-Date: 2021-07-26 20:16+0000\n"
"Last-Translator: Transifex Bot <>\n"
"Language-Team: Silesian (http://www.transifex.com/mc/mc/language/szl/)\n"
@ -2862,7 +2862,7 @@ msgstr ""
msgid "&Listing format..."
msgstr ""
msgid "&Sort order..."
msgid "S&ort order..."
msgstr ""
msgid "&Filter..."
@ -2877,7 +2877,7 @@ msgstr ""
msgid "S&hell link..."
msgstr ""
msgid "S&FTP link..."
msgid "&SFTP link..."
msgstr ""
msgid "Paneli&ze"

View File

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Midnight Commander\n"
"Report-Msgid-Bugs-To: http://www.midnight-commander.org/\n"
"POT-Creation-Date: 2021-09-26 10:06+0300\n"
"POT-Creation-Date: 2021-11-21 15:18+0300\n"
"PO-Revision-Date: 2021-07-26 20:16+0000\n"
"Last-Translator: Transifex Bot <>\n"
"Language-Team: Tamil (http://www.transifex.com/mc/mc/language/ta/)\n"
@ -2862,7 +2862,7 @@ msgstr ""
msgid "&Listing format..."
msgstr ""
msgid "&Sort order..."
msgid "S&ort order..."
msgstr ""
msgid "&Filter..."
@ -2877,7 +2877,7 @@ msgstr ""
msgid "S&hell link..."
msgstr ""
msgid "S&FTP link..."
msgid "&SFTP link..."
msgstr ""
msgid "Paneli&ze"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Midnight Commander\n"
"Report-Msgid-Bugs-To: http://www.midnight-commander.org/\n"
"POT-Creation-Date: 2021-09-26 10:06+0300\n"
"POT-Creation-Date: 2021-11-21 15:18+0300\n"
"PO-Revision-Date: 2021-07-26 20:16+0000\n"
"Last-Translator: Transifex Bot <>\n"
"Language-Team: Telugu (http://www.transifex.com/mc/mc/language/te/)\n"
@ -2861,7 +2861,7 @@ msgstr ""
msgid "&Listing format..."
msgstr ""
msgid "&Sort order..."
msgid "S&ort order..."
msgstr ""
msgid "&Filter..."
@ -2876,7 +2876,7 @@ msgstr ""
msgid "S&hell link..."
msgstr ""
msgid "S&FTP link..."
msgid "&SFTP link..."
msgstr ""
msgid "Paneli&ze"

View File

@ -14,7 +14,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Midnight Commander\n"
"Report-Msgid-Bugs-To: http://www.midnight-commander.org/\n"
"POT-Creation-Date: 2021-09-26 10:06+0300\n"
"POT-Creation-Date: 2021-11-21 15:18+0300\n"
"PO-Revision-Date: 2021-07-26 20:16+0000\n"
"Last-Translator: Transifex Bot <>\n"
"Language-Team: Turkish (http://www.transifex.com/mc/mc/language/tr/)\n"
@ -3043,7 +3043,8 @@ msgstr "&Ağaç"
msgid "&Listing format..."
msgstr "&Listeleme biçimi..."
msgid "&Sort order..."
#, fuzzy
msgid "S&ort order..."
msgstr "&Sıralama türü..."
msgid "&Filter..."
@ -3058,7 +3059,8 @@ msgstr "FT&P bağı..."
msgid "S&hell link..."
msgstr "&SSH bağı..."
msgid "S&FTP link..."
#, fuzzy
msgid "&SFTP link..."
msgstr "FT&P bağı..."
msgid "Paneli&ze"

View File

@ -16,7 +16,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Midnight Commander\n"
"Report-Msgid-Bugs-To: http://www.midnight-commander.org/\n"
"POT-Creation-Date: 2021-09-26 10:06+0300\n"
"POT-Creation-Date: 2021-11-21 15:18+0300\n"
"PO-Revision-Date: 2021-07-26 20:16+0000\n"
"Last-Translator: Transifex Bot <>\n"
"Language-Team: Ukrainian (http://www.transifex.com/mc/mc/language/uk/)\n"
@ -3064,7 +3064,8 @@ msgstr "Д&eрево"
msgid "&Listing format..."
msgstr "&Формат списку"
msgid "&Sort order..."
#, fuzzy
msgid "S&ort order..."
msgstr "Порядок &сортування…"
msgid "&Filter..."
@ -3079,7 +3080,8 @@ msgstr "&FTP-з’єднання…"
msgid "S&hell link..."
msgstr "&Shell-з’єднання…"
msgid "S&FTP link..."
#, fuzzy
msgid "&SFTP link..."
msgstr "S&FTP-з’єднання…"
msgid "Paneli&ze"

View File

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Midnight Commander\n"
"Report-Msgid-Bugs-To: http://www.midnight-commander.org/\n"
"POT-Creation-Date: 2021-09-26 10:06+0300\n"
"POT-Creation-Date: 2021-11-21 15:18+0300\n"
"PO-Revision-Date: 2021-07-26 20:16+0000\n"
"Last-Translator: Transifex Bot <>\n"
"Language-Team: Vietnamese (http://www.transifex.com/mc/mc/language/vi/)\n"
@ -2864,7 +2864,8 @@ msgstr "&Cây thư mục"
msgid "&Listing format..."
msgstr ""
msgid "&Sort order..."
#, fuzzy
msgid "S&ort order..."
msgstr "t&Hứ tự sắp xếp..."
msgid "&Filter..."
@ -2879,8 +2880,9 @@ msgstr "kết nối &FTP..."
msgid "S&hell link..."
msgstr "kết nối &Shell..."
msgid "S&FTP link..."
msgstr ""
#, fuzzy
msgid "&SFTP link..."
msgstr "kết nối &FTP..."
msgid "Paneli&ze"
msgstr ""

View File

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Midnight Commander\n"
"Report-Msgid-Bugs-To: http://www.midnight-commander.org/\n"
"POT-Creation-Date: 2021-09-26 10:06+0300\n"
"POT-Creation-Date: 2021-11-21 15:18+0300\n"
"PO-Revision-Date: 2021-07-26 20:16+0000\n"
"Last-Translator: Transifex Bot <>\n"
"Language-Team: Walloon (http://www.transifex.com/mc/mc/language/wa/)\n"
@ -2862,7 +2862,8 @@ msgstr "Å&be"
msgid "&Listing format..."
msgstr ""
msgid "&Sort order..."
#, fuzzy
msgid "S&ort order..."
msgstr "Ôrde po &Relire..."
msgid "&Filter..."
@ -2877,8 +2878,9 @@ msgstr "Loyén &FTP..."
msgid "S&hell link..."
msgstr ""
msgid "S&FTP link..."
msgstr ""
#, fuzzy
msgid "&SFTP link..."
msgstr "Loyén &FTP..."
msgid "Paneli&ze"
msgstr ""

View File

@ -17,7 +17,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Midnight Commander\n"
"Report-Msgid-Bugs-To: http://www.midnight-commander.org/\n"
"POT-Creation-Date: 2021-09-26 10:06+0300\n"
"POT-Creation-Date: 2021-11-21 15:18+0300\n"
"PO-Revision-Date: 2021-07-26 20:16+0000\n"
"Last-Translator: Transifex Bot <>\n"
"Language-Team: Chinese (China) (http://www.transifex.com/mc/mc/language/"
@ -3044,7 +3044,8 @@ msgstr "树(&T)"
msgid "&Listing format..."
msgstr "列表格式(&L)…"
msgid "&Sort order..."
#, fuzzy
msgid "S&ort order..."
msgstr "排序(&S)..."
msgid "&Filter..."
@ -3059,7 +3060,8 @@ msgstr "FTP 链接(&P)..."
msgid "S&hell link..."
msgstr "S&hell 链接..."
msgid "S&FTP link..."
#, fuzzy
msgid "&SFTP link..."
msgstr "SFTP 链接(&S)..."
msgid "Paneli&ze"

View File

@ -9,7 +9,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Midnight Commander\n"
"Report-Msgid-Bugs-To: http://www.midnight-commander.org/\n"
"POT-Creation-Date: 2021-09-26 10:06+0300\n"
"POT-Creation-Date: 2021-11-21 15:18+0300\n"
"PO-Revision-Date: 2021-07-26 20:16+0000\n"
"Last-Translator: Transifex Bot <>\n"
"Language-Team: Chinese (Taiwan) (http://www.transifex.com/mc/mc/language/"
@ -2897,7 +2897,8 @@ msgstr "樹狀"
msgid "&Listing format..."
msgstr "列表格式..."
msgid "&Sort order..."
#, fuzzy
msgid "S&ort order..."
msgstr "排列順序..."
msgid "&Filter..."
@ -2912,7 +2913,8 @@ msgstr "連結 FTP..."
msgid "S&hell link..."
msgstr "連結 Shell..."
msgid "S&FTP link..."
#, fuzzy
msgid "&SFTP link..."
msgstr "連結 SFTP..."
msgid "Paneli&ze"

View File

@ -494,7 +494,7 @@ edit_dialog_command_execute (WDialog * h, long command)
/* --------------------------------------------------------------------------------------------- */
/*
* Translate the keycode into either 'command' or 'char_for_insertion'.
* 'command' is one of the editor commands from cmddef.h.
* 'command' is one of the editor commands from lib/keybind.h.
*/
static gboolean
@ -516,12 +516,12 @@ edit_translate_key (WEdit * edit, long x_key, int *cmd, int *ch)
#else
int c;
if (edit->charpoint >= 4)
if (edit->charpoint >= MB_LEN_MAX)
{
edit->charpoint = 0;
edit->charbuf[edit->charpoint] = '\0';
}
if (edit->charpoint < 4)
if (edit->charpoint < MB_LEN_MAX)
{
edit->charbuf[edit->charpoint++] = x_key;
edit->charbuf[edit->charpoint] = '\0';
@ -530,7 +530,7 @@ edit_translate_key (WEdit * edit, long x_key, int *cmd, int *ch)
/* input from 8-bit locale */
if (!mc_global.utf8_display)
{
/* source in 8-bit codeset */
/* source is in 8-bit codeset */
c = convert_from_input_c (x_key);
if (is_printable (c))
@ -556,7 +556,7 @@ edit_translate_key (WEdit * edit, long x_key, int *cmd, int *ch)
if (edit->utf8)
{
/* source in UTF-8 codeset */
/* source is in UTF-8 codeset */
if (res < 0)
{
char_for_insertion = x_key;
@ -576,7 +576,7 @@ edit_translate_key (WEdit * edit, long x_key, int *cmd, int *ch)
/* 8-bit source */
if (res < 0)
{
/* not finised multibyte input (in meddle multibyte utf-8 char) */
/* not finished multibyte input (we're in the middle of multibyte utf-8 char) */
goto fin;
}
@ -589,7 +589,7 @@ edit_translate_key (WEdit * edit, long x_key, int *cmd, int *ch)
goto fin;
}
/* unprinteble utf input, skip it */
/* non-printable utf-8 input, skip it */
edit->charbuf[0] = '\0';
edit->charpoint = 0;
}

View File

@ -5,6 +5,8 @@
#ifndef MC__EDIT_WIDGET_H
#define MC__EDIT_WIDGET_H
#include <limits.h> /* MB_LEN_MAX */
#include "lib/search.h" /* mc_search_t */
#include "lib/widget.h" /* Widget */
@ -80,7 +82,7 @@ struct WEdit
/* multibyte support */
gboolean utf8; /* It's multibyte file codeset */
GIConv converter;
char charbuf[4 + 1];
char charbuf[MB_LEN_MAX + 1];
int charpoint;
#endif

View File

@ -80,10 +80,8 @@
#endif
#include "fileopctx.h"
#include "file.h" /* file operation routines */
#include "filenot.h"
#include "hotlist.h" /* hotlist_show() */
#include "panel.h" /* WPanel */
#include "tree.h" /* tree_chdir() */
#include "filemanager.h" /* change_panel() */
#include "command.h" /* cmdline */
@ -769,66 +767,6 @@ edit_cmd_new (void)
vfs_path_free (fname_vpath, TRUE);
}
/* --------------------------------------------------------------------------------------------- */
/** Invoked by F5. Copy, default to the other panel. */
void
copy_cmd (WPanel * panel)
{
save_cwds_stat ();
if (panel_operate (panel, OP_COPY, FALSE))
{
update_panels (UP_OPTIMIZE, UP_KEEPSEL);
repaint_screen ();
}
}
/* --------------------------------------------------------------------------------------------- */
/** Invoked by F6. Move/rename, default to the other panel, ignore marks. */
void
rename_cmd (WPanel * panel)
{
save_cwds_stat ();
if (panel_operate (panel, OP_MOVE, FALSE))
{
update_panels (UP_OPTIMIZE, UP_KEEPSEL);
repaint_screen ();
}
}
/* --------------------------------------------------------------------------------------------- */
/** Invoked by F15. Copy, default to the same panel, ignore marks. */
void
copy_cmd_local (WPanel * panel)
{
save_cwds_stat ();
if (panel_operate (panel, OP_COPY, TRUE))
{
update_panels (UP_OPTIMIZE, UP_KEEPSEL);
repaint_screen ();
}
}
/* --------------------------------------------------------------------------------------------- */
/** Invoked by F16. Move/rename, default to the same panel. */
void
rename_cmd_local (WPanel * panel)
{
save_cwds_stat ();
if (panel_operate (panel, OP_MOVE, TRUE))
{
update_panels (UP_OPTIMIZE, UP_KEEPSEL);
repaint_screen ();
}
}
/* --------------------------------------------------------------------------------------------- */
void
@ -880,35 +818,6 @@ mkdir_cmd (WPanel * panel)
g_free (dir);
}
/* --------------------------------------------------------------------------------------------- */
void
delete_cmd (WPanel * panel)
{
save_cwds_stat ();
if (panel_operate (panel, OP_DELETE, FALSE))
{
update_panels (UP_OPTIMIZE, UP_KEEPSEL);
repaint_screen ();
}
}
/* --------------------------------------------------------------------------------------------- */
/** Invoked by F18. Remove selected file, regardless of marked files. */
void
delete_cmd_local (WPanel * panel)
{
save_cwds_stat ();
if (panel_operate (panel, OP_DELETE, TRUE))
{
update_panels (UP_OPTIMIZE, UP_KEEPSEL);
repaint_screen ();
}
}
/* --------------------------------------------------------------------------------------------- */
/** Invoked from the left/right menus */

View File

@ -9,6 +9,7 @@
#include "lib/global.h"
#include "file.h" /* panel_operate() */
#include "panel.h"
/*** typedefs(not structures) and defined constants **********************************************/
@ -56,13 +57,7 @@ void edit_cmd_new (void);
#ifdef USE_INTERNAL_EDIT
void edit_cmd_force_internal (const WPanel * panel);
#endif
void copy_cmd (WPanel * panel);
void copy_cmd_local (WPanel * panel);
void rename_cmd (WPanel * panel);
void rename_cmd_local (WPanel * panel);
void mkdir_cmd (WPanel * panel);
void delete_cmd (WPanel * panel);
void delete_cmd_local (WPanel * panel);
void filter_cmd (void);
void reread_cmd (void);
void vfs_list (WPanel * panel);
@ -104,5 +99,75 @@ const char *chattr_get_as_str (unsigned long attr);
/* find.c */
void find_cmd (WPanel * panel);
/* --------------------------------------------------------------------------------------------- */
/*** inline functions ****************************************************************************/
/* --------------------------------------------------------------------------------------------- */
/**
* Copy, default to the other panel.
*/
static inline void
copy_cmd (WPanel * panel)
{
panel_operate (panel, OP_COPY, FALSE);
}
/* --------------------------------------------------------------------------------------------- */
/**
* Copy, default to the same panel, ignore marks.
*/
static inline void
copy_cmd_local (WPanel * panel)
{
panel_operate (panel, OP_COPY, TRUE);
}
/* --------------------------------------------------------------------------------------------- */
/**
* Move/rename, default to the other panel.
*/
static inline void
rename_cmd (WPanel * panel)
{
panel_operate (panel, OP_MOVE, FALSE);
}
/* --------------------------------------------------------------------------------------------- */
/**
* Move/rename, default to the same panel, ignore marks.
*/
static inline void
rename_cmd_local (WPanel * panel)
{
panel_operate (panel, OP_MOVE, TRUE);
}
/* --------------------------------------------------------------------------------------------- */
/**
* Remove.
*/
static inline void
delete_cmd (WPanel * panel)
{
panel_operate (panel, OP_DELETE, FALSE);
}
/* --------------------------------------------------------------------------------------------- */
/**
* Remove, ignore marks.
*/
static inline void
delete_cmd_local (WPanel * panel)
{
panel_operate (panel, OP_DELETE, TRUE);
}
/* --------------------------------------------------------------------------------------------- */
#endif /* MC__CMD_H */

View File

@ -101,6 +101,8 @@ const char *op_names[3] = {
#define FILEOP_UPDATE_INTERVAL 2
#define FILEOP_STALLING_INTERVAL 4
#define FILEOP_UPDATE_INTERVAL_US (FILEOP_UPDATE_INTERVAL * G_USEC_PER_SEC)
#define FILEOP_STALLING_INTERVAL_US (FILEOP_STALLING_INTERVAL * G_USEC_PER_SEC)
/*** file scope type declarations ****************************************************************/
@ -809,25 +811,26 @@ panel_operate_init_totals (const WPanel * panel, const vfs_path_t * source,
static FileProgressStatus
progress_update_one (file_op_total_context_t * tctx, file_op_context_t * ctx, off_t add)
{
struct timeval tv_current;
static struct timeval tv_start = { 0, 0 };
gint64 tv_current;
static gint64 tv_start = -1;
tctx->progress_count++;
tctx->progress_bytes += (uintmax_t) add;
if (tv_start.tv_sec == 0)
{
gettimeofday (&tv_start, (struct timezone *) NULL);
}
gettimeofday (&tv_current, (struct timezone *) NULL);
if ((tv_current.tv_sec - tv_start.tv_sec) > FILEOP_UPDATE_INTERVAL)
tv_current = g_get_monotonic_time ();
if (tv_start < 0)
tv_start = tv_current;
if (tv_current - tv_start > FILEOP_UPDATE_INTERVAL_US)
{
if (verbose && ctx->dialog_type == FILEGUI_DIALOG_MULTI_ITEM)
{
file_progress_show_count (ctx, tctx->progress_count, ctx->progress_count);
file_progress_show_total (tctx, ctx, tctx->progress_bytes, TRUE);
}
tv_start.tv_sec = tv_current.tv_sec;
tv_start = tv_current;
}
return check_progress_buttons (ctx);
@ -1109,32 +1112,27 @@ files_error (const char *format, const char *file1, const char *file2)
static void
copy_file_file_display_progress (file_op_total_context_t * tctx, file_op_context_t * ctx,
struct timeval tv_current, struct timeval tv_transfer_start,
off_t file_size, off_t n_read_total)
gint64 tv_current, gint64 tv_transfer_start, off_t file_size,
off_t file_part)
{
long dt;
gint64 dt;
/* 1. Update rotating dash after some time */
/* Update rotating dash after some time */
rotate_dash (TRUE);
/* 3. Compute ETA */
dt = (tv_current.tv_sec - tv_transfer_start.tv_sec);
/* Compute ETA */
dt = (tv_current - tv_transfer_start) / G_USEC_PER_SEC;
if (n_read_total == 0)
if (file_part == 0)
ctx->eta_secs = 0.0;
else
{
ctx->eta_secs = ((dt / (double) n_read_total) * file_size) - dt;
ctx->bps = n_read_total / ((dt < 1) ? 1 : dt);
}
ctx->eta_secs = ((dt / (double) file_part) * file_size) - dt;
/* 4. Compute BPS rate */
ctx->bps_time = (tv_current.tv_sec - tv_transfer_start.tv_sec);
if (ctx->bps_time < 1)
ctx->bps_time = 1;
ctx->bps = n_read_total / ctx->bps_time;
/* Compute BPS rate */
ctx->bps_time = MAX (1, dt);
ctx->bps = file_part / ctx->bps_time;
/* 5. Compute total ETA and BPS */
/* Compute total ETA and BPS */
if (ctx->progress_bytes != 0)
{
uintmax_t remain_bytes;
@ -1142,10 +1140,10 @@ copy_file_file_display_progress (file_op_total_context_t * tctx, file_op_context
remain_bytes = ctx->progress_bytes - tctx->copied_bytes;
#if 1
{
int total_secs = tv_current.tv_sec - tctx->transfer_start.tv_sec;
gint64 total_secs;
if (total_secs < 1)
total_secs = 1;
total_secs = (tv_current - tctx->transfer_start) / G_USEC_PER_SEC;
total_secs = MAX (1, total_secs);
tctx->bps = tctx->copied_bytes / total_secs;
tctx->eta_secs = (tctx->bps != 0) ? remain_bytes / tctx->bps : 0;
@ -2224,7 +2222,7 @@ copy_file_file (file_op_total_context_t * tctx, file_op_context_t * ctx,
gboolean dst_exists = FALSE, appending = FALSE;
off_t file_size = -1;
FileProgressStatus return_status, temp_status;
struct timeval tv_transfer_start;
gint64 tv_transfer_start;
dest_status_t dst_status = DEST_NONE;
int open_flags;
vfs_path_t *src_vpath = NULL, *dst_vpath = NULL;
@ -2390,7 +2388,7 @@ copy_file_file (file_op_total_context_t * tctx, file_op_context_t * ctx,
}
}
gettimeofday (&tv_transfer_start, (struct timezone *) NULL);
tv_transfer_start = g_get_monotonic_time ();
while ((src_desc = mc_open (src_vpath, O_RDONLY | O_LINEAR)) < 0 && !ctx->skip_all)
{
@ -2529,7 +2527,7 @@ copy_file_file (file_op_total_context_t * tctx, file_op_context_t * ctx,
ctx->eta_secs = 0.0;
ctx->bps = 0;
if (tctx->bps == 0 || (file_size / (tctx->bps)) > FILEOP_UPDATE_INTERVAL)
if (tctx->bps == 0 || (file_size / tctx->bps) > FILEOP_UPDATE_INTERVAL)
file_progress_show (ctx, 0, file_size, "", TRUE);
else
file_progress_show (ctx, 1, 1, "", TRUE);
@ -2539,9 +2537,10 @@ copy_file_file (file_op_total_context_t * tctx, file_op_context_t * ctx,
if (return_status == FILE_CONT)
{
size_t bufsize;
off_t n_read_total = 0;
struct timeval tv_current, tv_last_update, tv_last_input;
int secs, update_secs;
off_t file_part = 0;
gint64 tv_current, tv_last_update;
gint64 tv_last_input = 0;
gint64 usecs, update_usecs;
const char *stalled_msg = "";
gboolean is_first_time = TRUE;
@ -2571,15 +2570,15 @@ copy_file_file (file_op_total_context_t * tctx, file_op_context_t * ctx,
if (n_read == 0)
break;
gettimeofday (&tv_current, NULL);
tv_current = g_get_monotonic_time ();
if (n_read > 0)
{
char *t = buf;
n_read_total += n_read;
file_part += n_read;
gettimeofday (&tv_last_input, NULL);
tv_last_input = tv_current;
/* dst_write */
while ((n_written = mc_write (dest_desc, t, (size_t) n_read)) < n_read)
@ -2618,26 +2617,24 @@ copy_file_file (file_op_total_context_t * tctx, file_op_context_t * ctx,
}
}
tctx->copied_bytes = tctx->progress_bytes + n_read_total + ctx->do_reget;
tctx->copied_bytes = tctx->progress_bytes + file_part + ctx->do_reget;
secs = (tv_current.tv_sec - tv_last_update.tv_sec);
update_secs = (tv_current.tv_sec - tv_last_input.tv_sec);
usecs = tv_current - tv_last_update;
update_usecs = tv_current - tv_last_input;
if (is_first_time || secs > FILEOP_UPDATE_INTERVAL)
if (is_first_time || usecs > FILEOP_UPDATE_INTERVAL_US)
{
copy_file_file_display_progress (tctx, ctx,
tv_current,
tv_transfer_start, file_size, n_read_total);
copy_file_file_display_progress (tctx, ctx, tv_current, tv_transfer_start,
file_size, file_part);
tv_last_update = tv_current;
}
is_first_time = FALSE;
if (update_secs > FILEOP_STALLING_INTERVAL)
if (update_usecs > FILEOP_STALLING_INTERVAL_US)
stalled_msg = _("(stalled)");
force_update =
(tv_current.tv_sec - tctx->transfer_start.tv_sec) > FILEOP_UPDATE_INTERVAL;
force_update = (tv_current - tctx->transfer_start) > FILEOP_UPDATE_INTERVAL_US;
if (verbose && ctx->dialog_type == FILEGUI_DIALOG_MULTI_ITEM)
{
@ -2645,7 +2642,7 @@ copy_file_file (file_op_total_context_t * tctx, file_op_context_t * ctx,
file_progress_show_total (tctx, ctx, tctx->copied_bytes, force_update);
}
file_progress_show (ctx, n_read_total + ctx->do_reget, file_size, stalled_msg,
file_progress_show (ctx, file_part + ctx->do_reget, file_size, stalled_msg,
force_update);
mc_refresh ();
@ -3240,6 +3237,8 @@ panel_operate (void *source_panel, FileOperation operation, gboolean force_singl
linklist = free_linklist (linklist);
dest_dirs = free_linklist (dest_dirs);
save_cwds_stat ();
if (single_entry)
{
source = check_single_entry (panel, force_single, &src_stat);
@ -3271,7 +3270,7 @@ panel_operate (void *source_panel, FileOperation operation, gboolean force_singl
}
tctx = file_op_total_context_new ();
gettimeofday (&tctx->transfer_start, (struct timezone *) NULL);
tctx->transfer_start = g_get_monotonic_time ();
#ifdef ENABLE_BACKGROUND
/* Did the user select to do a background operation? */
@ -3457,6 +3456,8 @@ panel_operate (void *source_panel, FileOperation operation, gboolean force_singl
file_op_total_context_destroy (tctx);
ret_fast:
/* update panels before redraw screen in file_op_total_context_destroy() */
update_panels (UP_OPTIMIZE, UP_KEEPSEL);
file_op_context_destroy (ctx);
return ret_val;

View File

@ -1057,11 +1057,11 @@ file_progress_show_total (file_op_total_context_t * tctx, file_op_context_t * ct
if (ui->time_label != NULL)
{
struct timeval tv_current;
gint64 tv_current;
char buffer4[BUF_TINY];
gettimeofday (&tv_current, NULL);
file_frmt_time (buffer2, tv_current.tv_sec - tctx->transfer_start.tv_sec);
tv_current = g_get_monotonic_time ();
file_frmt_time (buffer2, (tv_current - tctx->transfer_start) / G_USEC_PER_SEC);
if (ctx->progress_totals_computed)
{
@ -1270,8 +1270,7 @@ file_progress_real_query_replace (file_op_context_t * ctx, enum OperationMode mo
/* --------------------------------------------------------------------------------------------- */
char *
file_mask_dialog (file_op_context_t * ctx, FileOperation operation,
gboolean only_one,
file_mask_dialog (file_op_context_t * ctx, FileOperation operation, gboolean only_one,
const char *format, const void *text, const char *def_text, gboolean * do_bg)
{
size_t fmd_xlen;
@ -1336,16 +1335,16 @@ file_mask_dialog (file_op_context_t * ctx, FileOperation operation,
quick_widget_t quick_widgets[] = {
/* *INDENT-OFF* */
QUICK_LABELED_INPUT (fmd_buf, input_label_above,
easy_patterns ? "*" : "^(.*)$", "input-def", &source_mask,
NULL, FALSE, FALSE, INPUT_COMPLETE_FILENAMES),
QUICK_LABELED_INPUT (fmd_buf, input_label_above, easy_patterns ? "*" : "^(.*)$",
"input-def", &source_mask, NULL, FALSE, FALSE,
INPUT_COMPLETE_FILENAMES),
QUICK_START_COLUMNS,
QUICK_SEPARATOR (FALSE),
QUICK_NEXT_COLUMN,
QUICK_CHECKBOX (N_("&Using shell patterns"), &source_easy_patterns, NULL),
QUICK_STOP_COLUMNS,
QUICK_LABELED_INPUT (N_("to:"), input_label_above,
def_text_secure, "input2", &dest_dir, NULL, FALSE, FALSE, INPUT_COMPLETE_FILENAMES),
QUICK_LABELED_INPUT (N_("to:"), input_label_above, def_text_secure, "input2", &dest_dir,
NULL, FALSE, FALSE, INPUT_COMPLETE_FILENAMES),
QUICK_SEPARATOR (TRUE),
QUICK_START_COLUMNS,
QUICK_CHECKBOX (N_("Follow &links"), &ctx->follow_links, NULL),

View File

@ -22,10 +22,9 @@ void file_op_context_create_ui (file_op_context_t * ctx, gboolean with_eta,
filegui_dialog_type_t dialog_type);
void file_op_context_destroy_ui (file_op_context_t * ctx);
char *file_mask_dialog (file_op_context_t * ctx, FileOperation operation,
gboolean only_one,
const char *format, const void *text,
const char *def_text, gboolean * do_bg);
char *file_mask_dialog (file_op_context_t * ctx, FileOperation operation, gboolean only_one,
const char *format, const void *text, const char *def_text,
gboolean * do_bg);
FileProgressStatus check_progress_buttons (file_op_context_t * ctx);

View File

@ -199,7 +199,7 @@ create_panel_menu (void)
entries =
g_list_prepend (entries,
menu_entry_create (_("&Listing format..."), CK_SetupListingFormat));
entries = g_list_prepend (entries, menu_entry_create (_("&Sort order..."), CK_Sort));
entries = g_list_prepend (entries, menu_entry_create (_("S&ort order..."), CK_Sort));
entries = g_list_prepend (entries, menu_entry_create (_("&Filter..."), CK_Filter));
#ifdef HAVE_CHARSET
entries = g_list_prepend (entries, menu_entry_create (_("&Encoding..."), CK_SelectCodepage));
@ -212,7 +212,7 @@ create_panel_menu (void)
entries = g_list_prepend (entries, menu_entry_create (_("S&hell link..."), CK_ConnectFish));
#endif
#ifdef ENABLE_VFS_SFTP
entries = g_list_prepend (entries, menu_entry_create (_("S&FTP link..."), CK_ConnectSftp));
entries = g_list_prepend (entries, menu_entry_create (_("&SFTP link..."), CK_ConnectSftp));
#endif
entries = g_list_prepend (entries, menu_entry_create (_("Paneli&ze"), CK_Panelize));
entries = g_list_prepend (entries, menu_separator_create ());

View File

@ -10,7 +10,6 @@
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/time.h>
#include <inttypes.h> /* uintmax_t */
#include "lib/global.h"
@ -171,7 +170,7 @@ typedef struct
uintmax_t copied_bytes;
size_t bps;
size_t bps_count;
struct timeval transfer_start;
gint64 transfer_start;
double eta_secs;
gboolean ask_overwrite;

View File

@ -455,8 +455,7 @@ string_file_name (file_entry_t * fe, int len)
{
(void) len;
g_string_set_size (string_file_name_buffer, 0);
g_string_append_len (string_file_name_buffer, fe->fname->str, fe->fname->len);
mc_g_string_copy (string_file_name_buffer, fe->fname);
return string_file_name_buffer->str;
}
@ -2762,7 +2761,6 @@ start_search (WPanel * panel)
panel->quick_search.ch[0] = '\0';
panel->quick_search.chpoint = 0;
display_mini_info (panel);
mc_refresh ();
}
}
@ -2771,6 +2769,9 @@ start_search (WPanel * panel)
static void
stop_search (WPanel * panel)
{
if (!panel->quick_search.active)
return;
panel->quick_search.active = FALSE;
/* if user overrdied search string, we need to store it

View File

@ -105,7 +105,7 @@ learn_button (WButton * button, int action)
*/
gboolean seq_ok = FALSE;
if (*seq != '\0' && strcmp (seq, "\\e") != 0 && strcmp (seq, "\\e\\e") != 0
if (strcmp (seq, "\\e") != 0 && strcmp (seq, "\\e\\e") != 0
&& strcmp (seq, "^m") != 0 && strcmp (seq, "^i") != 0
&& (seq[1] != '\0' || *seq < ' ' || *seq > '~'))
{

View File

@ -765,7 +765,7 @@ fish_dir_load (struct vfs_class *me, struct vfs_s_inode *dir, char *remote_path)
vfs_print_message (_("fish: Reading directory %s..."), remote_path);
dir->timestamp = g_get_real_time () + fish_directory_timeout * G_USEC_PER_SEC;
dir->timestamp = g_get_monotonic_time () + fish_directory_timeout * G_USEC_PER_SEC;
quoted_path = strutils_shell_escape (remote_path);
(void) fish_command_v (me, super, NONE, FISH_SUPER (super)->scr_ls, "FISH_FILENAME=%s;\n",

View File

@ -1493,14 +1493,14 @@ ftpfs_linear_abort (struct vfs_class *me, vfs_file_handler_t * fh)
gint64 start_tim;
char buf[BUF_8K];
start_tim = g_get_real_time ();
start_tim = g_get_monotonic_time ();
/* flush the remaining data */
while (read (dsock, buf, sizeof (buf)) > 0)
{
gint64 tim;
tim = g_get_real_time ();
tim = g_get_monotonic_time ();
if (tim > start_tim + ABORT_TIMEOUT)
{
@ -1752,7 +1752,7 @@ ftpfs_dir_load (struct vfs_class *me, struct vfs_s_inode *dir, char *remote_path
return (-1);
}
dir->timestamp = g_get_real_time () + ftpfs_directory_timeout * G_USEC_PER_SEC;
dir->timestamp = g_get_monotonic_time () + ftpfs_directory_timeout * G_USEC_PER_SEC;
if (ftp_super->strict == RFC_STRICT)
sock = ftpfs_open_data_connection (me, super, "LIST", 0, TYPE_ASCII, 0);

View File

@ -55,7 +55,7 @@
#endif
#ifdef ENABLE_VFS_SFTP
#include "sftpfs/init.h"
#include "sftpfs/sftpfs.h"
#endif
#ifdef ENABLE_VFS_SFS

View File

@ -8,7 +8,5 @@ libvfs_sftpfs_la_SOURCES = \
connection.c \
dir.c \
file.c \
init.c init.h \
internal.c internal.h \
vfs_class.c \
vfs_subclass.c
sftpfs.c sftpfs.h

View File

@ -70,6 +70,7 @@ sftpfs_opendir (const vfs_path_t * vpath, GError ** mcerror)
sftpfs_super_t *sftpfs_super;
const vfs_path_element_t *path_element;
LIBSSH2_SFTP_HANDLE *handle;
const GString *fixfname;
mc_return_val_if_error (mcerror, NULL);
@ -80,13 +81,12 @@ sftpfs_opendir (const vfs_path_t * vpath, GError ** mcerror)
sftpfs_super = SFTP_SUPER (super);
fixfname = sftpfs_fix_filename (path_element->path);
while (TRUE)
{
const GString *fixfname;
int libssh_errno;
fixfname = sftpfs_fix_filename (path_element->path);
handle =
libssh2_sftp_open_ex (sftpfs_super->sftp_session, fixfname->str, fixfname->len, 0, 0,
LIBSSH2_SFTP_OPENDIR);
@ -177,6 +177,7 @@ sftpfs_mkdir (const vfs_path_t * vpath, mode_t mode, GError ** mcerror)
struct vfs_s_super *super;
sftpfs_super_t *sftpfs_super;
const vfs_path_element_t *path_element;
const GString *fixfname;
mc_return_val_if_error (mcerror, -1);
@ -192,12 +193,10 @@ sftpfs_mkdir (const vfs_path_t * vpath, mode_t mode, GError ** mcerror)
if (sftpfs_super->sftp_session == NULL)
return -1;
fixfname = sftpfs_fix_filename (path_element->path);
do
{
const GString *fixfname;
fixfname = sftpfs_fix_filename (path_element->path);
res =
libssh2_sftp_mkdir_ex (sftpfs_super->sftp_session, fixfname->str, fixfname->len, mode);
if (res >= 0)
@ -227,6 +226,7 @@ sftpfs_rmdir (const vfs_path_t * vpath, GError ** mcerror)
struct vfs_s_super *super;
sftpfs_super_t *sftpfs_super;
const vfs_path_element_t *path_element;
const GString *fixfname;
mc_return_val_if_error (mcerror, -1);
@ -242,12 +242,10 @@ sftpfs_rmdir (const vfs_path_t * vpath, GError ** mcerror)
if (sftpfs_super->sftp_session == NULL)
return -1;
fixfname = sftpfs_fix_filename (path_element->path);
do
{
const GString *fixfname;
fixfname = sftpfs_fix_filename (path_element->path);
res = libssh2_sftp_rmdir_ex (sftpfs_super->sftp_session, fixfname->str, fixfname->len);
if (res >= 0)
break;

View File

@ -131,11 +131,12 @@ sftpfs_open_file (vfs_file_handler_t * fh, int flags, mode_t mode, GError ** mce
sftpfs_file_handler_t *file = SFTP_FILE_HANDLER (fh);
sftpfs_super_t *super = SFTP_SUPER (fh->ino->super);
char *name;
const GString *fixfname;
(void) mode;
mc_return_val_if_error (mcerror, FALSE);
name = vfs_s_fullpath (sftpfs_class, fh->ino);
name = vfs_s_fullpath (vfs_sftpfs_ops, fh->ino);
if (name == NULL)
return FALSE;
@ -156,13 +157,12 @@ sftpfs_open_file (vfs_file_handler_t * fh, int flags, mode_t mode, GError ** mce
else
sftp_open_flags = LIBSSH2_FXF_READ;
fixfname = sftpfs_fix_filename (name);
while (TRUE)
{
const GString *fixfname;
int libssh_errno;
fixfname = sftpfs_fix_filename (name);
file->handle =
libssh2_sftp_open_ex (super->sftp_session, fixfname->str, fixfname->len,
sftp_open_flags, sftp_open_mode, LIBSSH2_SFTP_OPENFILE);

View File

@ -1,67 +0,0 @@
/* Virtual File System: SFTP file system.
The interface function
Copyright (C) 2011-2021
Free Software Foundation, Inc.
Written by:
Ilia Maslakov <il.smind@gmail.com>, 2011
Slava Zanko <slavazanko@gmail.com>, 2011, 2012
This file is part of the Midnight Commander.
The Midnight Commander is free software: you can redistribute it
and/or modify it under the terms of the GNU General Public License as
published by the Free Software Foundation, either version 3 of the License,
or (at your option) any later version.
The Midnight Commander is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <config.h>
#include "lib/global.h"
#include "lib/vfs/netutil.h"
#include "init.h"
#include "internal.h"
/*** global variables ****************************************************************************/
struct vfs_s_subclass sftpfs_subclass;
struct vfs_class *sftpfs_class = VFS_CLASS (&sftpfs_subclass);
/*** file scope macro definitions ****************************************************************/
/*** file scope type declarations ****************************************************************/
/*** file scope variables ************************************************************************/
/*** file scope functions ************************************************************************/
/* --------------------------------------------------------------------------------------------- */
/* --------------------------------------------------------------------------------------------- */
/*** public functions ****************************************************************************/
/* --------------------------------------------------------------------------------------------- */
/**
* Initialization of SFTP Virtual File Sysytem.
*/
void
vfs_init_sftpfs (void)
{
tcp_init ();
vfs_init_subclass (&sftpfs_subclass, "sftpfs", VFSF_NOLINKS | VFSF_REMOTE, "sftp");
sftpfs_init_class ();
sftpfs_init_subclass ();
vfs_register_class (sftpfs_class);
}
/* --------------------------------------------------------------------------------------------- */

View File

@ -142,17 +142,16 @@ sftpfs_stat_init (sftpfs_super_t ** super, const vfs_path_element_t ** path_elem
const vfs_path_t * vpath, GError ** mcerror, int stat_type,
LIBSSH2_SFTP_ATTRIBUTES * attrs)
{
const GString *fixfname;
int res;
if (!sftpfs_op_init (super, path_element, vpath, mcerror))
return -1;
fixfname = sftpfs_fix_filename ((*path_element)->path);
do
{
const GString *fixfname;
fixfname = sftpfs_fix_filename ((*path_element)->path);
res = libssh2_sftp_stat_ex ((*super)->sftp_session, fixfname->str, fixfname->len,
stat_type, attrs);
if (res >= 0)
@ -346,17 +345,16 @@ sftpfs_readlink (const vfs_path_t * vpath, char *buf, size_t size, GError ** mce
{
sftpfs_super_t *super = NULL;
const vfs_path_element_t *path_element = NULL;
const GString *fixfname;
int res;
if (!sftpfs_op_init (&super, &path_element, vpath, mcerror))
return -1;
fixfname = sftpfs_fix_filename (path_element->path);
do
{
const GString *fixfname;
fixfname = sftpfs_fix_filename (path_element->path);
res =
libssh2_sftp_symlink_ex (super->sftp_session, fixfname->str, fixfname->len, buf, size,
LIBSSH2_SFTP_READLINK);
@ -442,6 +440,7 @@ sftpfs_utime (const vfs_path_t * vpath, time_t atime, time_t mtime, GError ** mc
sftpfs_super_t *super = NULL;
const vfs_path_element_t *path_element = NULL;
LIBSSH2_SFTP_ATTRIBUTES attrs;
const GString *fixfname;
int res;
res = sftpfs_stat_init (&super, &path_element, vpath, mcerror, LIBSSH2_SFTP_LSTAT, &attrs);
@ -452,12 +451,10 @@ sftpfs_utime (const vfs_path_t * vpath, time_t atime, time_t mtime, GError ** mc
attrs.atime = atime;
attrs.mtime = mtime;
fixfname = sftpfs_fix_filename (path_element->path);
do
{
const GString *fixfname;
fixfname = sftpfs_fix_filename (path_element->path);
res =
libssh2_sftp_stat_ex (super->sftp_session, fixfname->str, fixfname->len,
LIBSSH2_SFTP_SETSTAT, &attrs);
@ -497,6 +494,7 @@ sftpfs_chmod (const vfs_path_t * vpath, mode_t mode, GError ** mcerror)
sftpfs_super_t *super = NULL;
const vfs_path_element_t *path_element = NULL;
LIBSSH2_SFTP_ATTRIBUTES attrs;
const GString *fixfname;
int res;
res = sftpfs_stat_init (&super, &path_element, vpath, mcerror, LIBSSH2_SFTP_LSTAT, &attrs);
@ -506,12 +504,10 @@ sftpfs_chmod (const vfs_path_t * vpath, mode_t mode, GError ** mcerror)
attrs.flags = LIBSSH2_SFTP_ATTR_PERMISSIONS;
attrs.permissions = mode;
fixfname = sftpfs_fix_filename (path_element->path);
do
{
const GString *fixfname;
fixfname = sftpfs_fix_filename (path_element->path);
res =
libssh2_sftp_stat_ex (super->sftp_session, fixfname->str, fixfname->len,
LIBSSH2_SFTP_SETSTAT, &attrs);
@ -549,17 +545,16 @@ sftpfs_unlink (const vfs_path_t * vpath, GError ** mcerror)
{
sftpfs_super_t *super = NULL;
const vfs_path_element_t *path_element = NULL;
const GString *fixfname;
int res;
if (!sftpfs_op_init (&super, &path_element, vpath, mcerror))
return -1;
fixfname = sftpfs_fix_filename (path_element->path);
do
{
const GString *fixfname;
fixfname = sftpfs_fix_filename (path_element->path);
res = libssh2_sftp_unlink_ex (super->sftp_session, fixfname->str, fixfname->len);
if (res >= 0)
break;
@ -591,6 +586,7 @@ sftpfs_rename (const vfs_path_t * vpath1, const vfs_path_t * vpath2, GError ** m
const GString *ctmp_path;
char *tmp_path;
unsigned int tmp_path_len;
const GString *fixfname;
int res;
if (!sftpfs_op_init (&super, &path_element2, vpath2, mcerror))
@ -602,12 +598,10 @@ sftpfs_rename (const vfs_path_t * vpath1, const vfs_path_t * vpath2, GError ** m
path_element1 = vfs_path_get_by_index (vpath1, -1);
fixfname = sftpfs_fix_filename (path_element1->path);
do
{
const GString *fixfname;
fixfname = sftpfs_fix_filename (path_element1->path);
res =
libssh2_sftp_rename_ex (super->sftp_session, fixfname->str, fixfname->len, tmp_path,
tmp_path_len, LIBSSH2_SFTP_SYMLINK);

View File

@ -62,12 +62,10 @@ typedef struct
extern GString *sftpfs_filename_buffer;
extern struct vfs_s_subclass sftpfs_subclass;
extern struct vfs_class *sftpfs_class;
extern struct vfs_class *vfs_sftpfs_ops;
/*** declarations of public functions ************************************************************/
void sftpfs_init_class (void);
void sftpfs_init_subclass (void);
void sftpfs_init_config_variables_patterns (void);
void sftpfs_deinit_config_variables_patterns (void);

View File

@ -1,12 +1,13 @@
/* Virtual File System: SFTP file system.
The VFS class functions
The interface function
Copyright (C) 2011-2021
Free Software Foundation, Inc.
Written by:
Ilia Maslakov <il.smind@gmail.com>, 2011
Slava Zanko <slavazanko@gmail.com>, 2011, 2012
Slava Zanko <slavazanko@gmail.com>, 2011-2013
Andrew Borodin <aborodin@vmail.ru>, 2021
This file is part of the Midnight Commander.
@ -26,22 +27,32 @@
#include <config.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h> /* memset() */
#include "lib/global.h"
#include "lib/widget.h"
#include "lib/vfs/netutil.h"
#include "lib/vfs/utilvfs.h"
#include "lib/vfs/gc.h"
#include "lib/widget.h"
#include "lib/tty/tty.h" /* tty_enable_interrupt_key () */
#include "internal.h"
#include "sftpfs.h"
/*** global variables ****************************************************************************/
struct vfs_s_subclass sftpfs_subclass;
struct vfs_class *vfs_sftpfs_ops = VFS_CLASS (&sftpfs_subclass); /* used in file.c */
/*** file scope macro definitions ****************************************************************/
/*** file scope type declarations ****************************************************************/
/*** file scope variables ************************************************************************/
/* --------------------------------------------------------------------------------------------- */
/*** file scope functions ************************************************************************/
/* --------------------------------------------------------------------------------------------- */
/**
@ -326,6 +337,7 @@ sftpfs_cb_utime (const vfs_path_t * vpath, mc_timesbuf_t * times)
{
int rc;
GError *mcerror = NULL;
#ifdef HAVE_UTIMENSAT
time_t atime = (*times)[0].tv_sec;
time_t mtime = (*times)[1].tv_sec;
@ -485,7 +497,7 @@ sftpfs_cb_close (void *data)
super->fd_usage--;
if (super->fd_usage == 0)
vfs_stamp_create (sftpfs_class, super);
vfs_stamp_create (vfs_sftpfs_ops, super);
rc = sftpfs_close_file (fh, &mcerror);
mc_error_message (&mcerror, NULL);
@ -493,7 +505,7 @@ sftpfs_cb_close (void *data)
if (fh->handle != -1)
close (fh->handle);
vfs_s_free_inode (sftpfs_class, fh->ino);
vfs_s_free_inode (vfs_sftpfs_ops, fh->ino);
return rc;
}
@ -630,6 +642,7 @@ static int
sftpfs_cb_errno (struct vfs_class *me)
{
(void) me;
return errno;
}
@ -661,48 +674,194 @@ sftpfs_cb_fill_names (struct vfs_class *me, fill_names_f func)
}
}
/* --------------------------------------------------------------------------------------------- */
/*** public functions ****************************************************************************/
/* --------------------------------------------------------------------------------------------- */
/**
* Initialization of VFS class structure.
* Callback for checking if connection is equal to existing connection.
*
* @return the VFS class structure.
* @param vpath_element path element with connetion data
* @param super data with exists connection
* @param vpath unused
* @param cookie unused
* @return TRUE if connections is equal, FALSE otherwise
*/
void
sftpfs_init_class (void)
static gboolean
sftpfs_archive_same (const vfs_path_element_t * vpath_element, struct vfs_s_super *super,
const vfs_path_t * vpath, void *cookie)
{
sftpfs_class->init = sftpfs_cb_init;
sftpfs_class->done = sftpfs_cb_done;
int result;
vfs_path_element_t *orig_connect_info;
sftpfs_class->fill_names = sftpfs_cb_fill_names;
(void) vpath;
(void) cookie;
sftpfs_class->opendir = sftpfs_cb_opendir;
sftpfs_class->readdir = sftpfs_cb_readdir;
sftpfs_class->closedir = sftpfs_cb_closedir;
sftpfs_class->mkdir = sftpfs_cb_mkdir;
sftpfs_class->rmdir = sftpfs_cb_rmdir;
orig_connect_info = SFTP_SUPER (super)->original_connection_info;
sftpfs_class->stat = sftpfs_cb_stat;
sftpfs_class->lstat = sftpfs_cb_lstat;
sftpfs_class->fstat = sftpfs_cb_fstat;
sftpfs_class->readlink = sftpfs_cb_readlink;
sftpfs_class->symlink = sftpfs_cb_symlink;
sftpfs_class->link = sftpfs_cb_link;
sftpfs_class->utime = sftpfs_cb_utime;
sftpfs_class->mknod = sftpfs_cb_mknod;
sftpfs_class->chown = sftpfs_cb_chown;
sftpfs_class->chmod = sftpfs_cb_chmod;
result = ((g_strcmp0 (vpath_element->host, orig_connect_info->host) == 0)
&& (g_strcmp0 (vpath_element->user, orig_connect_info->user) == 0)
&& (vpath_element->port == orig_connect_info->port));
sftpfs_class->open = sftpfs_cb_open;
sftpfs_class->read = sftpfs_cb_read;
sftpfs_class->write = sftpfs_cb_write;
sftpfs_class->close = sftpfs_cb_close;
sftpfs_class->lseek = sftpfs_cb_lseek;
sftpfs_class->unlink = sftpfs_cb_unlink;
sftpfs_class->rename = sftpfs_cb_rename;
sftpfs_class->ferrno = sftpfs_cb_errno;
return result;
}
/* --------------------------------------------------------------------------------------------- */
static struct vfs_s_super *
sftpfs_new_archive (struct vfs_class *me)
{
sftpfs_super_t *arch;
arch = g_new0 (sftpfs_super_t, 1);
arch->base.me = me;
arch->base.name = g_strdup (PATH_SEP_STR);
arch->auth_type = NONE;
arch->config_auth_type = NONE;
arch->socket_handle = LIBSSH2_INVALID_SOCKET;
return VFS_SUPER (arch);
}
/* --------------------------------------------------------------------------------------------- */
/**
* Callback for opening new connection.
*
* @param super connection data
* @param vpath unused
* @param vpath_element path element with connetion data
* @return 0 if success, -1 otherwise
*/
static int
sftpfs_open_archive (struct vfs_s_super *super, const vfs_path_t * vpath,
const vfs_path_element_t * vpath_element)
{
GError *mcerror = NULL;
sftpfs_super_t *sftpfs_super = SFTP_SUPER (super);
int ret_value;
(void) vpath;
if (vpath_element->host == NULL || *vpath_element->host == '\0')
{
vfs_print_message ("%s", _("sftp: Invalid host name."));
vpath_element->class->verrno = EPERM;
return -1;
}
sftpfs_super->original_connection_info = vfs_path_element_clone (vpath_element);
super->path_element = vfs_path_element_clone (vpath_element);
sftpfs_fill_connection_data_from_config (super, &mcerror);
if (mc_error_message (&mcerror, &ret_value))
{
vpath_element->class->verrno = ret_value;
return -1;
}
super->root =
vfs_s_new_inode (vpath_element->class, super,
vfs_s_default_stat (vpath_element->class, S_IFDIR | 0755));
ret_value = sftpfs_open_connection (super, &mcerror);
mc_error_message (&mcerror, NULL);
return ret_value;
}
/* --------------------------------------------------------------------------------------------- */
/**
* Callback for closing connection.
*
* @param me unused
* @param super connection data
*/
static void
sftpfs_free_archive (struct vfs_class *me, struct vfs_s_super *super)
{
GError *mcerror = NULL;
(void) me;
sftpfs_close_connection (super, "Normal Shutdown", &mcerror);
vfs_path_element_free (SFTP_SUPER (super)->original_connection_info);
mc_error_message (&mcerror, NULL);
}
/* --------------------------------------------------------------------------------------------- */
/**
* Callback for getting directory content.
*
* @param me unused
* @param dir unused
* @param remote_path unused
* @return always 0
*/
static int
sftpfs_cb_dir_load (struct vfs_class *me, struct vfs_s_inode *dir, char *remote_path)
{
(void) me;
(void) dir;
(void) remote_path;
return 0;
}
/* --------------------------------------------------------------------------------------------- */
/*** public functions ****************************************************************************/
/* --------------------------------------------------------------------------------------------- */
/**
* Initialization of SFTP Virtual File Sysytem.
*/
void
vfs_init_sftpfs (void)
{
tcp_init ();
vfs_init_subclass (&sftpfs_subclass, "sftpfs", VFSF_NOLINKS | VFSF_REMOTE, "sftp");
vfs_sftpfs_ops->init = sftpfs_cb_init;
vfs_sftpfs_ops->done = sftpfs_cb_done;
vfs_sftpfs_ops->fill_names = sftpfs_cb_fill_names;
vfs_sftpfs_ops->opendir = sftpfs_cb_opendir;
vfs_sftpfs_ops->readdir = sftpfs_cb_readdir;
vfs_sftpfs_ops->closedir = sftpfs_cb_closedir;
vfs_sftpfs_ops->mkdir = sftpfs_cb_mkdir;
vfs_sftpfs_ops->rmdir = sftpfs_cb_rmdir;
vfs_sftpfs_ops->stat = sftpfs_cb_stat;
vfs_sftpfs_ops->lstat = sftpfs_cb_lstat;
vfs_sftpfs_ops->fstat = sftpfs_cb_fstat;
vfs_sftpfs_ops->readlink = sftpfs_cb_readlink;
vfs_sftpfs_ops->symlink = sftpfs_cb_symlink;
vfs_sftpfs_ops->link = sftpfs_cb_link;
vfs_sftpfs_ops->utime = sftpfs_cb_utime;
vfs_sftpfs_ops->mknod = sftpfs_cb_mknod;
vfs_sftpfs_ops->chown = sftpfs_cb_chown;
vfs_sftpfs_ops->chmod = sftpfs_cb_chmod;
vfs_sftpfs_ops->open = sftpfs_cb_open;
vfs_sftpfs_ops->read = sftpfs_cb_read;
vfs_sftpfs_ops->write = sftpfs_cb_write;
vfs_sftpfs_ops->close = sftpfs_cb_close;
vfs_sftpfs_ops->lseek = sftpfs_cb_lseek;
vfs_sftpfs_ops->unlink = sftpfs_cb_unlink;
vfs_sftpfs_ops->rename = sftpfs_cb_rename;
vfs_sftpfs_ops->ferrno = sftpfs_cb_errno;
sftpfs_subclass.archive_same = sftpfs_archive_same;
sftpfs_subclass.new_archive = sftpfs_new_archive;
sftpfs_subclass.open_archive = sftpfs_open_archive;
sftpfs_subclass.free_archive = sftpfs_free_archive;
sftpfs_subclass.fh_new = sftpfs_fh_new;
sftpfs_subclass.dir_load = sftpfs_cb_dir_load;
vfs_register_class (vfs_sftpfs_ops);
}
/* --------------------------------------------------------------------------------------------- */

View File

@ -3,8 +3,8 @@
* \brief Header: SFTP FS
*/
#ifndef MC__VFS_SFTPFS_INIT_H
#define MC__VFS_SFTPFS_INIT_H
#ifndef MC__VFS_SFTPFS_H
#define MC__VFS_SFTPFS_H
/*** typedefs(not structures) and defined constants **********************************************/
@ -20,4 +20,4 @@ void vfs_init_sftpfs (void);
/*** inline functions ****************************************************************************/
#endif /* MC__VFS_SFTPFS_INIT_H */
#endif /* MC__VFS_SFTPFS_H */

View File

@ -1,201 +0,0 @@
/* Virtual File System: SFTP file system.
The VFS subclass functions
Copyright (C) 2011-2021
Free Software Foundation, Inc.
Written by:
Ilia Maslakov <il.smind@gmail.com>, 2011
Slava Zanko <slavazanko@gmail.com>, 2011, 2012, 2013
This file is part of the Midnight Commander.
The Midnight Commander is free software: you can redistribute it
and/or modify it under the terms of the GNU General Public License as
published by the Free Software Foundation, either version 3 of the License,
or (at your option) any later version.
The Midnight Commander is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <config.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h> /* memset() */
#include "lib/global.h"
#include "lib/widget.h"
#include "lib/vfs/utilvfs.h"
#include "internal.h"
/*** global variables ****************************************************************************/
/*** file scope macro definitions ****************************************************************/
/*** file scope type declarations ****************************************************************/
/*** file scope variables ************************************************************************/
/*** file scope functions ************************************************************************/
/* --------------------------------------------------------------------------------------------- */
/**
* Callback for checking if connection is equal to existing connection.
*
* @param vpath_element path element with connetion data
* @param super data with exists connection
* @param vpath unused
* @param cookie unused
* @return TRUE if connections is equal, FALSE otherwise
*/
static gboolean
sftpfs_cb_is_equal_connection (const vfs_path_element_t * vpath_element, struct vfs_s_super *super,
const vfs_path_t * vpath, void *cookie)
{
int result;
vfs_path_element_t *orig_connect_info;
(void) vpath;
(void) cookie;
orig_connect_info = SFTP_SUPER (super)->original_connection_info;
result = ((g_strcmp0 (vpath_element->host, orig_connect_info->host) == 0)
&& (g_strcmp0 (vpath_element->user, orig_connect_info->user) == 0)
&& (vpath_element->port == orig_connect_info->port));
return result;
}
/* --------------------------------------------------------------------------------------------- */
static struct vfs_s_super *
sftpfs_cb_init_connection (struct vfs_class *me)
{
sftpfs_super_t *arch;
arch = g_new0 (sftpfs_super_t, 1);
arch->base.me = me;
arch->base.name = g_strdup (PATH_SEP_STR);
arch->auth_type = NONE;
arch->config_auth_type = NONE;
arch->socket_handle = LIBSSH2_INVALID_SOCKET;
return VFS_SUPER (arch);
}
/* --------------------------------------------------------------------------------------------- */
/**
* Callback for opening new connection.
*
* @param super connection data
* @param vpath unused
* @param vpath_element path element with connetion data
* @return 0 if success, -1 otherwise
*/
static int
sftpfs_cb_open_connection (struct vfs_s_super *super,
const vfs_path_t * vpath, const vfs_path_element_t * vpath_element)
{
GError *mcerror = NULL;
sftpfs_super_t *sftpfs_super = SFTP_SUPER (super);
int ret_value;
(void) vpath;
if (vpath_element->host == NULL || *vpath_element->host == '\0')
{
vfs_print_message ("%s", _("sftp: Invalid host name."));
vpath_element->class->verrno = EPERM;
return -1;
}
sftpfs_super->original_connection_info = vfs_path_element_clone (vpath_element);
super->path_element = vfs_path_element_clone (vpath_element);
sftpfs_fill_connection_data_from_config (super, &mcerror);
if (mc_error_message (&mcerror, &ret_value))
{
vpath_element->class->verrno = ret_value;
return -1;
}
super->root =
vfs_s_new_inode (vpath_element->class, super,
vfs_s_default_stat (vpath_element->class, S_IFDIR | 0755));
ret_value = sftpfs_open_connection (super, &mcerror);
mc_error_message (&mcerror, NULL);
return ret_value;
}
/* --------------------------------------------------------------------------------------------- */
/**
* Callback for closing connection.
*
* @param me unused
* @param super connection data
*/
static void
sftpfs_cb_close_connection (struct vfs_class *me, struct vfs_s_super *super)
{
GError *mcerror = NULL;
(void) me;
sftpfs_close_connection (super, "Normal Shutdown", &mcerror);
vfs_path_element_free (SFTP_SUPER (super)->original_connection_info);
mc_error_message (&mcerror, NULL);
}
/* --------------------------------------------------------------------------------------------- */
/**
* Callback for getting directory content.
*
* @param me unused
* @param dir unused
* @param remote_path unused
* @return always 0
*/
static int
sftpfs_cb_dir_load (struct vfs_class *me, struct vfs_s_inode *dir, char *remote_path)
{
(void) me;
(void) dir;
(void) remote_path;
return 0;
}
/* --------------------------------------------------------------------------------------------- */
/*** public functions ****************************************************************************/
/* --------------------------------------------------------------------------------------------- */
/**
* Initialization of VFS subclass structure.
*
* @return VFS subclass structure.
*/
void
sftpfs_init_subclass (void)
{
sftpfs_subclass.archive_same = sftpfs_cb_is_equal_connection;
sftpfs_subclass.new_archive = sftpfs_cb_init_connection;
sftpfs_subclass.open_archive = sftpfs_cb_open_connection;
sftpfs_subclass.free_archive = sftpfs_cb_close_connection;
sftpfs_subclass.fh_new = sftpfs_fh_new;
sftpfs_subclass.dir_load = sftpfs_cb_dir_load;
}
/* --------------------------------------------------------------------------------------------- */