CityCat4
@CityCat4
//COPY01 EXEC PGM=IEBGENER

Почему mc выдает ошибку при входе в каталог с пробелом в имени?

Все это делается в командной строке запущенного mc.

Создаю каталог с пробелом в имени:
# mkdir '/tmp/test test2'
Создает нормально. Пытаюсь в него перейти:
# cd '/tmp/test test2'
mc выкидывает красное окошко с сообщением, что каталог не найден. Если перейти в него нажатием 'enter' на каталоге выдаст сообщение "Warning: cannot change to /tmp/test test2", но оглавление каталога покажет, можно копировать и удалять файлы - с панелей. При попытке выполнить любую команду через командную строку, команда игнорируется, выбрасывает в каталог верхнего уровня.

WTF?

mc 4.8.19, ext4
# uname -a
Linux geobase0 4.4.39-calculate #1 SMP PREEMPT Fri Jan 13 13:45:12 UTC 2017 x86_64 Intel(R) Core(TM) i7-5960X CPU @ 3.00GHz GenuineIntel GNU/Linux


UPD: Это все происходит, если login-shell tcsh, если login-shell bash, ошибки не возникает. Потому что tcsh как-то специально обрабатывается в subshell.c, зачем - пока непонятно.
  • Вопрос задан
  • 296 просмотров
Пригласить эксперта
Ответы на вопрос 2
saboteur_kiev
@saboteur_kiev Куратор тега Linux
software engineer
А так:
cd /tmp/test\ test2
Ответ написан
CityCat4
@CityCat4 Автор вопроса
//COPY01 EXEC PGM=IEBGENER
Все чудесатее и чудесатее...

Это долбаное сообщение выдается следующим кодом:
if (bPathNotEq && mc_global.shell->type == SHELL_TCSH)
        {
            char rp_subshell_cwd[PATH_MAX];
            char rp_current_panel_cwd[PATH_MAX];
            char *p_subshell_cwd, *p_current_panel_cwd;

            p_subshell_cwd = mc_realpath (subshell_cwd, rp_subshell_cwd);
            p_current_panel_cwd = mc_realpath (pcwd, rp_current_panel_cwd);

            if (p_subshell_cwd == NULL)
                p_subshell_cwd = subshell_cwd;
            if (p_current_panel_cwd == NULL)
                p_current_panel_cwd = pcwd;
            bPathNotEq = strcmp (p_subshell_cwd, p_current_panel_cwd) != 0;
        }

        if (bPathNotEq && !DIR_IS_DOT (pcwd))
        {
            char *cwd;

            cwd =
                vfs_path_to_str_flags (subshell_get_cwd_from_current_panel (), 0,
                                       VPF_STRIP_PASSWORD);
            vfs_print_message (_("Warning: Cannot change to %s.\n"), cwd);
            g_free (cwd);
        }


Здесь subshell_cwd заполняется вызовом feed_subshell(), а pcwd - вызовом subshell_get_cwd_from_current_panel(). Первая содержит неправильное значение, вторая правильное. Естественно, условие срабатывает и бэмц. subshell_cwd в feed_subshell() заполняется через стандартный read():
bytes = read (subshell_pipe[READ], subshell_cwd, sizeof (subshell_cwd));


И вот тут я пока затупил - если mc запускается из tcsh, то read, найдя имя каталога с пробелом - читает до ближайшего слэша!. Если из bash - читает ровно столько, сколько надо. WTF?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы