Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Chattr / chflags dialog + misc #2614

Open
wants to merge 6 commits into
base: master
Choose a base branch
from
Open

Chattr / chflags dialog + misc #2614

wants to merge 6 commits into from

Conversation

akruphi
Copy link
Contributor

@akruphi akruphi commented Jan 4, 2025

Возможно странно ловятся ошибки работы с атрибутами: для устройств или любых файлах на разделах, не поддерживающих атрибуты, - ловятся, а для симлинков на обычных разделах нет ошибки, хотя и lsattr и mc->File->chattr на них также ругаются кодом 95 "Operation not supported". Но по всей навороченной касакдности вызовов внутри far2l (sdc_fs_flags_get обернутое вокруг bugaware_ioctl_pint) я запутался теряются ли там errno или просто lsattr не умеет, то что умеет ext4.

Разобрался - см. ниже UPD3.

  • UPD: Новый диалог для выставления известных мне из <linux/fs.h> и <sys/stat.h> атрибутов/флагов.

(!) Протестировано только на linux - возможно на *BSD или macOS будут сюрпризы, хотя вроде бы не должно - в коде все системно зависимые места максимально обложены #ifdef.

image

image

image

image

image

image

  • UPD2: в тг-чате обратили внимание, что

    если кликать мышкой в область открывающих квадратных скобок флажков атрибутов, то выставляется/снимается не тот флажок, куда тыкнул, а тот, на котором курсорная рамка сейчас стоит

    Проверил - действительно иногда есть такое - очень странное поведение при том, что никаких выделенных '[' там нет - это просто второй символ в строке списка (первый либо ' ', либо '*').

    Это общее для всех VMenu и связано с реализацией горизонтальной прокрутки:

    far2l/far2l/src/vmenu.cpp

    Lines 1215 to 1222 in 9fb2133

    if (MouseEvent->dwButtonState & FROM_LEFT_1ST_BUTTON_PRESSED
    && (MsX == X1 + 2
    || MsX == X2 - 1 - ((CheckFlags(VMENU_COMBOBOX) || CheckFlags(VMENU_LISTBOX)) ? 0 : 2))) {
    while (IsMouseButtonPressed())
    ProcessKey(MsX == X1 + 2 ? KEY_ALTLEFT : KEY_ALTRIGHT);
    return TRUE;
    }
    - т.е. при нажатии в области на 2 символа отстоящие от края происходит попытка прокручивания без смены активной строки. Без правки VMenu::ProcessMouse() такое поведение не поменять - наверное когда-то в будущем 🤯

  • UPD3:

    а для симлинков на обычных разделах нет ошибки

    Разобрался, взглянув внимательнее в потроха: в WinPort/src/sudo/sudo_client_api.cpp в sdc_fs_flags_get() и sdc_fs_flags_set() для именно Linux используется open(path, O_RDONLY); к которому затем применяется bugaware_ioctl_pint(fd, FS_IOC_GETFLAGS, flags);. Так вот open() без маски O_NOFOLLOW переходит по symlink и работает с целевым файлом. Для *BSD/macOS используется sdc_stat, который такое вроде вытворять не должен.

    Как про такое поведение предупреждать пользователей? Добавить строку как и в Ctrl+A, например, "For symlinks flags are displayed and will be modified for the original object"? Или сразу, если работаем с симлинк, то делать { Set } disabled и не позволять менять галочки?

    Сделал всегда жесткое предупреждение и отвал без показа флагов:
    image

@akruphi akruphi changed the title misc Chattr / chflags dialog + misc Jan 6, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant