• Записи 1544
  • Теги 109
  • Комментарии 3323

Лог жизни

О FUSE для WAD-файлов

Вчера вдруг вспомнил о своей давней идее освоить FUSE (библиотеку для работы с файловыми системами из userspace). Когда-то я разбирал основы и тогда задумался над тем, чтобы написать модуль для монтирования WAD-файлов, которые использовались в старом добром Doom и ему подобных играх, так как у них довольно простая внутренняя структура.
И вот вчера внезапно произошло то самое складывание в голове всего в единую цельную картину. И это сразу же дало мотивацию сесть и начать писать. Сначала я сделал простую утилиту для извлечения отдельного элемента из WAD-файла для тестирования. Потом пришлось прерваться — мы с Tellой договорились прогуляться по городу. Прогулка прошла хорошо, если не считать, что чуть было не попали под дождь. Но своевременно это поняли и добрались до моста Богдана Хмельницкого буквально в момент начала дождя, где и спрятались. А перед дождем удалось сделать несколько весьма атмосферных фото.
Вернулся я достаточно поздно и занялся переделкой написанной утилиты для работы с FUSE. И тут меня ждала первая неприятность: я долго не мог понять, как правильно передавать имя файла, который требуется смонтировать. Потом выяснилось, что у FUSE есть собственные инструменты для разбора параметров командной строки, и нужно использовать их. Но с этим я разобрался только сегодня, и то далеко не сразу. И вот наконец, первый запуск программы, не приведший к ошибке. Захожу в подкаталог монтирования и с радостью вижу там имена элементов из WAD-файла! Правда, сначала они выводились криво из-за того, что я забыл добавить нулевой байт. Но это я исправил быстро. А вот с другой ошибкой — тем, что список файлов получить удалось, а прочитать какой-либо из них — нет, провозился долго. А ошибка там оказалась довольно примитивная. Я давно не писал на C и благополучно забыл, что функция fread возвращает не число прочитанных байт, а число прочитанных блоков указанного размера. Причем сначала я думал, что проблемы в поиске нужного элемента в WAD или определении его размера. Но сделал отладочный вывод — там было все нормально. И только когда вывел вообще все что можно, и обнаружил, что fread возвращает единицу, понял, откуда берется проблема.
После этого все заработало. Но не обошлось без last-minute bug. Решил сделать по-нормальному: вынести некоторые процедуры из h-файла в c-файл, а в заголовочном оставить только их объявления. Но ошибочно в спешке одну из процедур принял за структуру (ввело в заблуждение слово struct в начале), и оставил ее в h-файле. А потом долго не мог понять, почему линковщик ругается на дважды определенный символ, который к тому же вообще экспортироваться не должен. Потом еще какое-то время ушло на то, чтобы выгрузить получившееся на GitHub и написать краткое описание.
Но все это было не зря: снова удалось почувствовать себя Настоящим Компьютерщиком, который может творить то, что не каждому доступно!
А еще обнаружил, что кто-то поставил звездочку (GitHubовский аналог like) моей другой разработке — JavaScript-библиотеке CondiLoader для асинхронной загрузки JavaScript и CSS. Что ж, хоть кто-то ее заметил!

3 комментария:

MadTechGuy
0

О, ты занялся разработкой файловых систем для FUSE? Желаю тебе больших достижений в этом деле! FUSE — вообще одно из самых гениальных изобретений в Linux, крайне удобная в использовании штука, с ней можно столько всего интересного придумать…

Нет
Aksion
0

Блин, ты так подробно подходишь к бытовому описанию, делал бы уже тогда технический полностью пост с подробным описанием работы с кодом и подробностями техническими. (как на хабр хабр). А то вроде все подробно, но не понятно о чем, что да как

4X_Pro
0

Для раздела «Повседневное» основной критерий о чем писать — эмоциональная значимость. А с технической точки зрения там уже и так все описано: структура WAD-файла есть в Wikipedia, а дальше нужно только прочитать его заголовок, список entiries и написать несколько функций, одна из которых будет переводить данные из списка entries в формат, нужный файловой системе, другая — вычислять смещение и читать нужный кусок файла.. Потом указатели на эти функции помещаются в специальную структуру и передаются функции fuse_main.

Написать комментарий
Прикрепить файлы: (не более 4 файлов, не более 102400 Кб каждый, 102400 Кб всего)


Задать вопрос