On Mon, Sep 05, 2005 at 07:43:57AM +0400, Alexey Tourbin wrote: > On Sat, Sep 03, 2005 at 01:00:07AM +0400, Dmitry V. Levin wrote: > > librpmio может предоставить cpio-архив в виде обычного потока, для > > которого, кажется, применимы операции типа fsetpos(3). Но поскольку этот > > cpio-архив на практике запакован, прозрачной распаковки всё равно не > > миновать. Считать первые N байт каждого файла этого cpio-потока librpmio > > вряд ли поможет, лучше поискать другие средства. > > Как читать поток cpio, я разобрался. Теперь дальше, как парсить cpio? Его даже ядро читать умеет (в initramfs) ;) > У него какой-то хитрый padding (см. TODO). Как libmagic подключить -- > вроде ясно, magic_buffer(). #define N_ALIGN(len) ((((len) + 1) & ~3) + 2) ... parse_header(collected); /* тут this_header уже продвинут за struct cpio_header */ next_header = this_header + N_ALIGN(name_len) + body_len; next_header = (next_header + 3) & ~3; Правда, после SkipIt (пропуск до позиции next_header) там есть ещё Reset: static int __init do_reset(void) { while(count && *victim == '\0') eat(1); if (count && (this_header & 3)) error("broken padding"); return 1; }