У меня есть куча огромных файлов pcap (> 10 ГБ), сжатых с помощью lzma. Мне нужно разобрать их на моей машине, и у меня недостаточно места, чтобы сначала распаковать их. Есть много библиотек, которые могут передавать lzma из файла. Проблема на стороне libpcap, я несколько раз читал его API и не смог найти способ разобрать буфер. Что я вижу в исходном коде libs, так это то, что он сначала читает магический байт и заголовок файла с fread
:
amt_read = fread((char *)&magic, 1, sizeof(magic), fp);
...
amt_read = fread(((char *)&hdr) + sizeof hdr.magic, 1, sizeof(hdr) - sizeof(hdr.magic), fp);
А затем pcap_next_packet
также использует fread
для чтения следующего пакета из файла. Таким образом, похоже, что ему сложно передать буфер из потока lzma. С другой стороны, эти функции хранятся в структура pcap_t в виде указателей. Таким образом, я могу реализовать для него свои собственные процедуры, однако таким образом мне придется дублировать много кода из libpcap. Кто-нибудь знает, как это сделать без взлома libpcap?
Я что-то упустил в API libpcap?
Обновление: с помощью @Martin и других мне удалось заставить его работать. Я опубликую реализацию, чтобы люди, которые ищут способ сделать это, могли ее использовать.
if (check_file_exists("/path/to/file.pcap.xz")) {
return;
}
// first open a pipe
FILE *pipe = popen("xz -d -c /path/to/file.pcap.xz", "r");
if (!pipe) {
// handle error somehow
return;
}
char errbuff[256];
// note pcap_fopen_offline function that takes FILE* instead of name
pcap_t *pcap = pcap_fopen_offline(pipe, errbuff);
struct pcap_pkthdr *header;
uint8_t *data;
while (pcap_next_ex(pcap, &header, &data)) {
// handle packets
}