You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
111 lines
4.3 KiB
111 lines
4.3 KiB
/*****************************************************************************
|
|
* archive.c: libarchive based stream filter
|
|
*****************************************************************************
|
|
* Copyright (C) 2014 Videolan Team
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify it
|
|
* under the terms of the GNU Lesser General Public License as published by
|
|
* the Free Software Foundation; either version 2.1 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public License
|
|
* along with this program; if not, write to the Free Software Foundation,
|
|
* Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
|
|
*****************************************************************************/
|
|
|
|
#include "archive.h"
|
|
|
|
#include <vlc_plugin.h>
|
|
#include <vlc_stream.h>
|
|
|
|
#include <archive.h>
|
|
|
|
/****************************************************************************
|
|
* Module descriptor
|
|
*****************************************************************************/
|
|
vlc_module_begin()
|
|
set_shortname( "libarchive" )
|
|
set_category( CAT_INPUT )
|
|
set_subcategory( SUBCAT_INPUT_ACCESS )
|
|
set_description( N_( "libarchive access" ) )
|
|
set_capability( "access", 0 )
|
|
add_shortcut( "archive" )
|
|
set_callbacks( AccessOpen, AccessClose )
|
|
add_submodule()
|
|
set_shortname( "libarchive" )
|
|
set_subcategory( SUBCAT_INPUT_STREAM_FILTER )
|
|
set_description( N_( "libarchive stream filter" ) )
|
|
set_capability( "stream_filter", 14 ) /* less than rar and gzip */
|
|
set_callbacks( StreamOpen, StreamClose )
|
|
vlc_module_end()
|
|
|
|
bool ProbeArchiveFormat(stream_t *p_stream)
|
|
{
|
|
struct
|
|
{
|
|
const uint16_t i_offset;
|
|
const uint8_t i_length;
|
|
const char * const p_bytes;
|
|
} const magicbytes[9] = {
|
|
/* keep heaviest at top */
|
|
{ 257, 5, "ustar" }, //TAR
|
|
{ 0, 7, "Rar!\x1A\x07" }, //RAR
|
|
{ 0, 4, "xar!" }, //XAR
|
|
{ 2, 3, "-lh" }, //LHA/LHZ
|
|
{ 0, 3, "PAX" }, //PAX
|
|
{ 0, 6, "070707" }, //CPIO
|
|
{ 0, 6, "070701" }, //CPIO
|
|
{ 0, 6, "070702" }, //CPIO
|
|
{ 0, 4, "MSCH" }, //CAB
|
|
};
|
|
|
|
const uint8_t *p_peek;
|
|
int i_peek = vlc_stream_Peek(p_stream, &p_peek, magicbytes[0].i_offset + magicbytes[0].i_length);
|
|
|
|
for(int i=0; i<9;i++)
|
|
{
|
|
if (i_peek <= magicbytes[i].i_offset + magicbytes[i].i_length)
|
|
continue;
|
|
else if ( !memcmp(p_peek + magicbytes[i].i_offset,
|
|
magicbytes[i].p_bytes,
|
|
magicbytes[i].i_length) )
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
void EnableArchiveFormats(struct archive *p_archive)
|
|
{
|
|
// archive_read_support_filter_bzip2(p_archive);
|
|
// archive_read_support_filter_compress(p_archive);
|
|
// archive_read_support_filter_gzip(p_archive);
|
|
// archive_read_support_filter_grzip(p_archive);
|
|
// archive_read_support_filter_lrzip(p_archive);
|
|
// archive_read_support_filter_lzip(p_archive);
|
|
archive_read_support_filter_lzma(p_archive);
|
|
archive_read_support_filter_lzop(p_archive);
|
|
archive_read_support_filter_none(p_archive);
|
|
archive_read_support_filter_rpm(p_archive);
|
|
archive_read_support_filter_uu(p_archive);
|
|
archive_read_support_filter_xz(p_archive);
|
|
|
|
// archive_read_support_format_7zip(p_archive);
|
|
archive_read_support_format_ar(p_archive);
|
|
archive_read_support_format_cab(p_archive);
|
|
archive_read_support_format_cpio(p_archive);
|
|
archive_read_support_format_gnutar(p_archive);
|
|
// archive_read_support_format_iso9660(p_archive);
|
|
archive_read_support_format_lha(p_archive);
|
|
archive_read_support_format_mtree(p_archive);
|
|
archive_read_support_format_rar(p_archive);
|
|
archive_read_support_format_raw(p_archive);
|
|
archive_read_support_format_tar(p_archive);
|
|
archive_read_support_format_xar(p_archive);
|
|
// archive_read_support_format_zip(p_archive);
|
|
}
|
|
|