On Mon, Sep 05, 2005 at 07:43:57AM +0400, Alexey Tourbin wrote: > Как читать поток cpio, я разобрался. Теперь дальше, как парсить cpio? > У него какой-то хитрый padding (см. TODO). Как libmagic подключить -- > вроде ясно, magic_buffer(). > > Что-то такое есть в rpm-4_0-4.0.4/lib/{cpio,fsm}.{c,h}, но им > воспользоваться очень проблемно. Нет, задолбало на Си писать. Это контрпродуктивно. Можно что-нибудь сделать, а можно сидеть и пейсать на Си. Ну его в баню. Написал на шелле, с кешированием для каталогов. Для робота это важно -- очень долго (с распаковкой всех rpm'ов) только один раз будет работать. $ ./rpmfile -h Usage: rpmfile [-h] [*FILE*...] [*DIR*...] $ ./rpmfile ~/build/repo/i586/RPMS.hasher/qa-robot-0.2-alt1.noarch.rpm /usr/bin/bugs 100755 Bourne shell script text executable /usr/bin/csv2tab 100755 perl script text executable ... $ ./rpmfile ~/build/repo/i586/RPMS.hasher |sort -t$'\t' -k1,1 -u libsqlite3 /usr/lib/libsqlite3.so.0 120777 symbolic link to `libsqlite3.so.0.8.6' libsqlite3-devel /usr/include/sqlite3.h 100644 ASCII C program text ... $ То есть если "дампить" каталог, то впереди добавляется ещё подно поле -- имя пакета. Правильнее было бы добавлять не имя пакета, а собственно имя файла, но мне сейчас нужнее имя пакета. А кеширование работает так: $ rm -rf ~/tmp/tmp $ mkdir -p ~/tmp/tmp $ time workdir=~/tmp/tmp ./rpmfile ~/build/repo/i586/RPMS.hasher >/dev/null workdir=~/tmp/tmp ./rpmfile ~/build/repo/i586/RPMS.hasher > /dev/null 16,70s user 4,81s system 95% cpu 22,606 total $ time workdir=~/tmp/tmp ./rpmfile ~/build/repo/i586/RPMS.hasher >/dev/null workdir=~/tmp/tmp ./rpmfile ~/build/repo/i586/RPMS.hasher > /dev/null 1,46s user 0,22s system 99% cpu 1,685 total $ Трюк с paste(1) -- по моему, красиво. :)