? ?
flag

eddy_em


eddy_em, posts by tag: linux - LiveJournal


Entries by tag: linux

Так, с UNIX-сокетами разобрались, теперь INET…
flag
eddy_em
А началось все с того, что я просто захотел в свою библиотеку сниппетов добавить функции открытия сокета и выдачи файлового дескриптора (пока такой функции нет, сразу запускается поток или клиента, или сервера, обслуживающий кольцевой буфер приема и попутно запускающий обработчики данных, если указаны).
Парсер /proc/net/unix работает и выдает правильный тип сокета. А вот с сетевыми просто жопа какая-то: если сокет не SOCK_STREAM, то никаких способов узнать, что это, нет! Даже просто слушающий сокет на локалхосте не отображается нигде, пока к нему кто-нибудь не подсоединится.
Стал тестировать с netcat. И обнаружил интересную вещь! Если я запускаю сервер на netcat, то вот такие варианты (ishtar - имя моего компьютера) работают (в смысле - я могу подсоединиться к этим сокетам из своего приложения): nc -l 12341, nc -l ishtar 12341, nc -l -p 12341 и даже nc -l 127.0.0.1 12341. Но стоит мне написать nc -l localhost 12341, как все "ломается": «Connection refused».
Ну и да, похоже, все-таки придется смириться с тем, что присоединиться я смогу лишь к сокетам SOCK_STREAM, а если вдруг сокет будет, скажем, SOCK_SEQPACKET, то всë, приплыли…
UPD: "болван" подсказал, что это может быть из-за IPv6. И действительно: только сменил AF_INET на AF_UNSPEC, как все заработало.

promo eddy_em 二月 18, 09:43 4
Buy for 10 tokens
По-отдельности все четыре в своей "мультиплате" проверил. Т.к. использовал преобразователь 485+232 на CH340, быстрей 2Мбод проверить не вышло, нужно на pl2303 искать, или, что проще — два интерфейса между собой соединить. А мне вчера дипсик как раз почти и сказал, что ошибка у меня в ДНК, когда я…

Оказывается, с UNIX-сокетами все не так-то и просто…
flag
eddy_em
Для них нет getaddrinfo, по которой можно перебирать типы! Поэтому, чтобы понять, какой же тип сокета открыл сервер, нужно или перебирать все возможные типы, или парсить /proc/net/unix, или вообще парсить /proc/PID/fd, чтобы обнаружить inode этого сокета, а потом при помощи другого сокета NETLINK_SOCK_DIAG получить этот тип.
Ну и дичь…
Пожалуй, буду просто перебирать все возможные типы! Хотя, нет: "болван" пишет, что этот способ ненадежен, и можно подключиться, выбрав неправильный тип, а потом поймать ошибку.
Неужто парсить /proc/net/unix?

Как ядро передает 9-10 бит через UART?
flag
eddy_em
Дописываю работу с пятью последовательными портами на USB CDC, и мы с дипсиком сошлись во мнении, что можно забить на 9-битные передачи (т.е. 8 бит + четность или 9 и больше бит). Однако, через "честный" последовательный порт отлично работает передача 9-битных данных, сам когда-то так делал, эмулируя девятый бит четностью.
Через CDC просто передается поток данных, поэтому четность там как бы "включается" в состав данных. Выходит, невозможно передать через классический CDC (без всяких vendor и т.п.) 8 бит с четностью?
UPD
На пятый день сидения в тюрьме Зоркий Глаз обнаружил, что отсутствует одна стена…

Дошло до меня: ядро просто посылает байты. И принимает байты. А уж задача железяки — контролировать четность и т.п. В общем, и 8 бит с четностью можно реализовать. Почитать только, отсеивает ли сам STM32 приходящие данные с неправильной четностью, или это мне нужно делать.

"-pedantic-errors", говорите?
flag
eddy_em
А в gcc, оказывается, еще чуть ли не с седьмой версии болтается баг. Как только ты пытаешься собрать с этим флагом нечто вполне законное, например:
 static void *procthread(void* v){ typedef void (*procfn_t)(Image*); void (*process)(Image*) = (procfn_t)v; 

(в поток через аргумент потока передается функция, которая будет запускаться каждый раз, как получено очередное изображение с камеры), как gcc выдает ошибку:
ISO C forbids conversion of function pointer to object pointer type

Предлагают избавиться с помощью union'а. И действительно, на вот такую конструкцию
 static void *procthread(void* v){ union{ void *ptr; void (*fn)(Image*); } fptr; fptr.ptr = v; typedef void (*procfn_t)(Image*); void (*process)(Image*) = (procfn_t) fptr.fn; 

gcc не ругается. Но выглядит оно как-то, мягко говоря, излишне.
Tags: ,

А я говорил "FAR manager в linux" не нужен!..
flag
eddy_em
Сижу, ищу, как элементарную вещь сделать: VFS для хранения дерева содержимого внешних носителей. А то жестких дисков у меня много, все постоянно держать включенными не хочется, да и некоторые просто "постоянно внешние". А хочется иметь возможность найти, на каком из дисков что-то лежит. Хотя бы — простейшую навигацию по VFS с нулями вместо файлов, но чтобы это не занимало так много места, как тупой клон симлинков или дерева файлов с файлами нулевого размера. В FAR, ЕМНИП, это было лет 25 назад.
Читать выхлоп tree очень неудобно.
Или единственный вменяемый вариант - сделать в /tmp полный клон ФС (но с файлами нулевого размера), а затем "затарить" его и в mc смотреть? Правда, размеров и дат создания не будет…
В гугле меня, похоже, забанили: и на английском искал, и на русском, но даже вменяемо сформулировать не могу. Попытать что ли deepseek?

Фигня какая-то с qt-creator…
flag
eddy_em
Вообще невозможно стало работать: после предпоследнего обновления IDE стала адски тормозить! Прямо иной раз прокручиваешь, а оно как замедленное кино… Набираешь код, а он по букоффке в секунду…
Что странно: сам creator уже довольно давно не обновлялся, обновились лишь некоторые библиотеки. Может, пересобрать его нафиг?

Обновления — зло!
flag
eddy_em
Пытался сегодня со своего ноутбука студентам лекцию запустить. А до этого обновил и не проверил. Вуаля: не работает (что-то в grub поломалось при обновлении)!
ОК, дома загружаюсь с флешки, делаю chroot, запускаю cl-update. Заодно обновил grub. Загрузилось. Но теперь без иксов!
Смотрю, а в уйме пакетов по умолчанию флаг "wayland" выставлен! ОК, выставил глобально "-wayland" и пересобираю. Но есть у меня подозрение, что дело вовсе не в этом, а в новом ядре. Просто беда с этими ядрами! На большинстве компьютеров мне и так уже пришлось "заморозить", потому что а) из свежих версий выкинули поддержку reiserfs, б) старые nvidia'вские модули не работают со слишком новыми ядрами.
К пущему ужасу на ноуте процессор AMD! Уж не знаю, что мною руководствовало при выборе, но обычно я исключительно intel выбираю, т.к. AMD — то еще дерьмо. Особенно видео.
Тут еще этот "вяленый" чертов! Сегодня погуглил: для него не существует вменяемого аналога xrandr. И, спрашивается, как от иксов на эту дрянь переходить, если простыми скриптами я не смогу "на лету" переконфигурировать (подключить к ноуту телик или проектор, сменить раскладку экранов: расширять или же дублировать и т.д., и т.п.)?
Такое впечатление, что в разработчики ядра проникла какая-то маздайная крыса, которая усиленно пытается уничтожить операционку. Мало ли нам что ли Шатлворта с Поцтерингом? Еще и до святого добрались — до ядра!!!

UPD: как я и думал, дело было не в флаге "wayland", а в проблеме с firmware. Обнаружил по проблеме в загрузке "фирмвари" при modprobe amdgpu: файл отсутствует. Поставил sys-kernel/linux-firmware - заработало. ХЗ, что за дичь: то ли emerge -c "убил" этот пакет, то ли раньше эти файлы при установке ядра появлялись, а теперь - нет... В общем, лучше таки не пользоваться дефолтным калькулейтовским ядром, а свое собирать. И тоже маскировать, чтобы не обновлялось "самостоятельно"!!!

Ничего себе!
flag
eddy_em
В sudo обнаружили уязвимость. Эксплойт проверил: работает.
Надо пошустрей обновлять все компы, где по-глупости есть sudo.

Решение проблемы с сетью.
flag
eddy_em
Итак, как оказалось, есть такие непонятные вещи, как MTU и MSS, о которых я впервые узнал как раз намедни (когда увидел, что этот самый MTU у ppp на 8 байт меньше, чем у остальных).
И почему я сразу не наткнулся на эту замечательную статью в генту-вики? Там как раз описываются все вещи, необходимые для организации домашнего маршрутизатора.
Проблема синхронизации размеров MSS с MTU решается одной строчкой:
iptables -A FORWARD -t mangle -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

Ну и т.к. в дефолтном ядре кальки все, что только можно, запихнули в модули, нужно добавить в /etc/modules-load.d/net.conf автозагрузку модуля xt_tcpmss.

Вот почему все так сложно?
Tags:

Проблемы с сетью так и не решил...
flag
eddy_em
Все также яндекс и гугл моментально летают. На самом шлюзе все сайты спокойно в links открываются, а вот на клиентах все плохо. Если на проводных добрая половина сайтов отваливается по таймауту, но со второй-третьей попытки грузится, то на wifi вообще глухо (кроме упомянутых гугла и яндекса).
Не пойму, что я так мог нарукожопить в трех соснах?.. Сейчас вот тоже, открывая ЖЖ, попал на таймаут при попытке TLS-соединения. На алик когда захожу, тоже SSL-соединение висит… Однако, ни одной цепочки DROP в iptables нет. Вызову наружу (интернет или рабочая локалка) под MASQUERADE. В рабочей сети нет проблем, а вот интернет… Еще и роутер, зараза, каждые пару минут dhcp-запрос зачем-то делает, хотя у меня lease-time на оба внутренних интерфейса стоит 100 суток!

UPD: проблема была решена (правда, только на компьютерах) совершенно невообразимым образом! Уменьшил MTU с 1500 до 1492 (как у ppp по умолчанию), вуаля! А вот с лопатофонами такой трюк, увы, не проканает…
Странно: почему этого косяка не было, когда интернет был подключен через роутер?