Files
drop/libraries/libarchive/src/archive.rs
T
Jamie Winsor a069bd2a98 fix segmentation fault
add read_block function to reader
2016-01-11 19:38:01 -08:00

228 lines
7.1 KiB
Rust

use std::default::Default;
use std::str;
use std::ffi::CStr;
use libarchive3_sys::ffi;
use error::ErrCode;
pub enum ReadCompression {
All,
Bzip2,
Compress,
Gzip,
Lzip,
Lzma,
None,
Program(String),
Rpm,
Uu,
Xz,
}
pub enum ReadFormat {
SevenZip,
All,
Ar,
Cab,
Cpio,
Empty,
Gnutar,
Iso9660,
Lha,
Mtree,
Rar,
Raw,
Tar,
Xar,
Zip,
}
pub enum ReadFilter {
All,
Bzip2,
Compress,
Gzip,
Grzip,
Lrzip,
Lzip,
Lzma,
Lzop,
None,
Program(String),
ProgramSignature(String, Option<extern "C" fn() -> ()>, usize),
Rpm,
Uu,
Xz,
}
pub enum WriteFormat {
SevenZip,
ArBsd,
ArSvr4,
Cpio,
CpioNewc,
Gnutar,
Iso9660,
Mtree,
MtreeClassic,
Pax,
PaxRestricted,
Shar,
SharDump,
Ustar,
V7tar,
Xar,
Zip,
}
pub enum WriteFilter {
B64Encode,
Bzip2,
Compress,
Grzip,
Gzip,
Lrzip,
Lzip,
Lzma,
Lzop,
None,
Program(String),
UuEncode,
Xz,
}
pub trait Handle {
unsafe fn handle(&self) -> *mut ffi::Struct_archive;
fn err_code(&self) -> ErrCode {
let code = unsafe { ffi::archive_errno(self.handle()) };
ErrCode(code)
}
fn err_msg(&self) -> String {
unsafe {
let c_str = CStr::from_ptr(ffi::archive_error_string(self.handle()));
let buf = c_str.to_bytes();
String::from(str::from_utf8(buf).unwrap())
}
}
}
pub trait Entry {
unsafe fn entry(&self) -> *mut ffi::Struct_archive_entry;
fn pathname(&self) -> &str {
let c_str: &CStr = unsafe { CStr::from_ptr(ffi::archive_entry_pathname(self.entry())) };
let buf: &[u8] = c_str.to_bytes();
str::from_utf8(buf).unwrap()
}
fn size(&self) -> i64 {
unsafe { ffi::archive_entry_size(self.entry()) }
}
}
pub enum ExtractOption {
// The user and group IDs should be set on the restored file. By default, the user and group
// IDs are not restored.
Owner,
// Full permissions (including SGID, SUID, and sticky bits) should be restored exactly as
// specified, without obeying the current umask. Note that SUID and SGID bits can only be
// restored if the user and group ID of the object on disk are correct. If
// `ExtractOption::Owner` is not specified, then SUID and SGID bits will only be restored if
// the default user and group IDs of newly-created objects on disk happen to match those
// specified in the archive entry. By default, only basic permissions are restored, and umask
// is obeyed.
Permissions,
// The timestamps (mtime, ctime, and atime) should be restored. By default, they are ignored.
// Note that restoring of atime is not currently supported.
Time,
// Existing files on disk will not be overwritten. By default, existing regular files are
// truncated and overwritten; existing directories will have their permissions updated; other
// pre-existing objects are unlinked and recreated from scratch.
NoOverwrite,
// Existing files on disk will be unlinked before any attempt to create them. In some cases,
// this can prove to be a significant performance improvement. By default, existing files are
// truncated and rewritten, but the file is not recreated. In particular, the default behavior
// does not break existing hard links.
Unlink,
// Attempt to restore ACLs. By default, extended ACLs are ignored.
ACL,
// Attempt to restore extended file flags. By default, file flags are ignored.
FFlags,
// Attempt to restore POSIX.1e extended attributes. By default, they are ignored.
XAttr,
// Refuse to extract any object whose final location would be altered by a symlink on disk.
// This is intended to help guard against a variety of mischief caused by archives that
// (deliberately or otherwise) extract files outside of the current directory. The default is
// not to perform this check. If ARCHIVE_EXTRACT_UNLINK is specified together with this option,
// the library will remove any intermediate symlinks it finds and return an error only if such
// symlink could not be removed.
SecureSymlinks,
// Refuse to extract a path that contains a `..` element anywhere within it. The default is to
// not refuse such paths. Note that paths ending in `..` always cause an error, regardless of
// this flag.
SecureNoDotDot,
// Default: Create parent directories as needed
NoAutoDir,
// Default: Overwrite files, even if one on disk is newer
NoOverwriteNewer,
// Scan data for blocks of NUL bytes and try to recreate them with holes. This results in
// sparse files, independent of whether the archive format supports or uses them.
Sparse,
// Default: Do not restore Mac extended metadata
// This has no effect except on Mac OS
MacMetadata,
// Default: Use HFS+ compression if it was compressed
// This has no effect except on Mac OS v10.6 or later
NoHFSCompression,
// Default: Do not use HFS+ compression if it was not compressed
// This has no effect except on Mac OS v10.6 or later
HFSCompressionForced,
// Default: Do not reject entries with absolute paths */
SecureNoAbsolutePaths,
// Default: Do not clear no-change flags when unlinking object */
ClearNoChangeFFlags,
}
pub struct ExtractOptions {
pub flags: i32,
}
impl ExtractOptions {
pub fn new() -> Self {
ExtractOptions::default()
}
pub fn add(&mut self, opt: ExtractOption) -> &mut Self {
let flag = match opt {
ExtractOption::Owner => ffi::ARCHIVE_EXTRACT_OWNER,
ExtractOption::Permissions => ffi::ARCHIVE_EXTRACT_PERM,
ExtractOption::Time => ffi::ARCHIVE_EXTRACT_TIME,
ExtractOption::NoOverwrite => ffi::ARCHIVE_EXTRACT_NO_OVERWRITE,
ExtractOption::Unlink => ffi::ARCHIVE_EXTRACT_UNLINK,
ExtractOption::ACL => ffi::ARCHIVE_EXTRACT_ACL,
ExtractOption::FFlags => ffi::ARCHIVE_EXTRACT_FFLAGS,
ExtractOption::XAttr => ffi::ARCHIVE_EXTRACT_XATTR,
ExtractOption::SecureSymlinks => ffi::ARCHIVE_EXTRACT_SECURE_SYMLINKS,
ExtractOption::SecureNoDotDot => ffi::ARCHIVE_EXTRACT_SECURE_NODOTDOT,
ExtractOption::NoAutoDir => ffi::ARCHIVE_EXTRACT_NO_AUTODIR,
ExtractOption::NoOverwriteNewer => ffi::ARCHIVE_EXTRACT_NO_OVERWRITE_NEWER,
ExtractOption::Sparse => ffi::ARCHIVE_EXTRACT_SPARSE,
ExtractOption::MacMetadata => ffi::ARCHIVE_EXTRACT_MAC_METADATA,
ExtractOption::NoHFSCompression => ffi::ARCHIVE_EXTRACT_NO_HFS_COMPRESSION,
ExtractOption::HFSCompressionForced => ffi::ARCHIVE_EXTRACT_HFS_COMPRESSION_FORCED,
ExtractOption::SecureNoAbsolutePaths => ffi::ARCHIVE_EXTRACT_SECURE_NOABSOLUTEPATHS,
ExtractOption::ClearNoChangeFFlags => ffi::ARCHIVE_EXTRACT_CLEAR_NOCHANGE_FFLAGS,
};
self.flags |= flag;
self
}
}
impl Default for ExtractOptions {
fn default() -> ExtractOptions {
ExtractOptions { flags: 0 }
}
}