libarchive

package module
v0.0.0-...-7d4eb2a Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 18, 2024 License: MIT Imports: 10 Imported by: 0

README

libarchive-go

libarchive go bindings

Features

  • Read from multipart files
  • Read from single rar files
  • Seek support (limited to what libarchive supports)
  • Password protected files support
  • Read from reader

Installation

go get github.com/javi11/libarchive-go

You will need to have libarchive installed with pkg-config support.

sudo apt-get install libarchive-dev

Usage

Read from multipart files
package main

import (
    "fmt"
    "github.com/javi11/libarchive-go"
)

func main() {
  	files := []string{
		"./fixtures/test_read_format_rar_multivolume.part0001.rar.uu",
		"./fixtures/test_read_format_rar_multivolume.part0002.rar.uu",
		"./fixtures/test_read_format_rar_multivolume.part0003.rar.uu",
		"./fixtures/test_read_format_rar_multivolume.part0004.rar.uu",
	}

	fo, err := NewFilesOpen(files)
	if err != nil {
		panic(err)
	}

	defer func() {
		err := fo.Free()

		if err != nil {
			panic(err)
		}
	}()

	defer func() {
		err := fo.Close()
		if err != nil {
			panic(err)
		}
	}()

	entry, err := fo.Next()
	if err != nil {
		panic(err)
	}

	name := entry.PathName()
	fmt.Println(name)

	buf := make([]byte, 1024)
	_, err = io.ReadFull(fo, buf)
	if err != nil {
		panic(err)
	}
}
Read from single rar files
package main

import (
	"fmt"
	"github.com/javi11/libarchive-go"
)

func main() {
	fo, err := NewFileOpen("./fixtures/test_read_format_rar.rar")
	if err != nil {
		panic(err)
	}

	defer func() {
		err := fo.Free()

		if err != nil {
			panic(err)
		}
	}()

	defer func() {
		err := fo.Close()
		if err != nil {
			panic(err)
		}
	}()

	entry, err := fo.Next()
	if err != nil {
		panic(err)
	}

	name := entry.PathName()
	fmt.Println(name)

	buf := make([]byte, 1024)
	_, err = io.ReadFull(fo, buf)
	if err != nil {
		panic(err)
	}
}
Seek support

package main

import (
	"fmt"
	"github.com/javi11/libarchive-go"
)

func main() {
	fo, err := NewFileOpen("./fixtures/test_read_format_rar.rar")
	if err != nil {
		panic(err)
	}

	defer func() {
		err := fo.Free()

		if err != nil {
			panic(err)
		}
	}()

	defer func() {
		err := fo.Close()
		if err != nil {
			panic(err)
		}
	}()

	entry, err := fo.Next()
	if err != nil {
		panic(err)
	}

	name := entry.PathName()
	fmt.Println(name)

	buf := make([]byte, 1024)
	_, err = io.ReadFull(fo, buf)
	if err != nil {
		panic(err)
	}

	_, err = fo.Seek(0, io.SeekStart)
	if err != nil {
		panic(err)
	}

	_, err = io.ReadFull(fo, buf)
	if err != nil {
		panic(err)
	}
}
Custom Fs
package main

import (
	"fmt"
	"github.com/javi11/libarchive-go"
)

func main() {
	fo, err := NewFileOpen("./fixtures/test_read_format_rar.rar")
	if err != nil {
		t.Fatalf("Error on creating Archive from a io.Reader:\n %s", err)
	}

	defer func() {
		err := fo.Free()

		if err != nil {
			panic(err)
		}
	}()

	defer func() {
		err := fo.Close()
		if err != nil {
			panic(err)
		}
	}()

	entry, err := fo.Next()
	if err != nil {
		panic(err)
	}

	name := entry.PathName()
	fmt.Println(name)

	buf := make([]byte, 1024)
	_, err = io.ReadFull(fo, buf)
	if err != nil {
		panic(err)
	}

	assert.Equal(t, 1024, len(buf))

	_, err = fo.Seek(0, io.SeekStart)
	if err != nil {
		panic(err)
	}

	_, err = io.ReadFull(fo, buf)
	if err != nil {
		panic(err)
	}
}

Documentation

Index

Constants

View Source
const (
	ARCHIVE_EOF    = 1
	ARCHIVE_OK     = 0
	ARCHIVE_RETRY  = -10
	ARCHIVE_WARN   = -20
	ARCHIVE_FAILED = C.ARCHIVE_FAILED
	ARCHIVE_FATAL  = -30
)

Variables

View Source
var (
	FileTypeRegFile = C.AE_IFREG
	FileTypeSymLink = C.AE_IFLNK
	FileTypeSocket  = C.AE_IFSOCK
	FileTypeCharDev = C.AE_IFCHR
	FileTypeBlkDev  = C.AE_IFBLK
	FileTypeDir     = C.AE_IFDIR
	FileTypeFIFO    = C.AE_IFIFO
)
View Source
var (
	ErrArchiveRetry = errors.New("libarchive: RETRY [operation failed but can be retried]")
	ErrArchiveWarn  = errors.New("libarchive: WARN [success but non-critical error]")
	ErrArchiveFatal = errors.New("libarchive: FATAL [critical error, archive closing]")
)

Functions

This section is empty.

Types

type ArchiveEntry

type ArchiveEntry interface {
	Stat() os.FileInfo
	PathName() string
}

type RarFile

type RarFile struct {
	// contains filtered or unexported fields
}

func NewFilesOpen

func NewFilesOpen(
	filePaths []string,
	password string,
	fs fs.FS,
) (*RarFile, error)

func (*RarFile) Close

func (r *RarFile) Close() error

func (*RarFile) Free

func (r *RarFile) Free() error

func (*RarFile) Next

func (r *RarFile) Next() (ArchiveEntry, error)

func (*RarFile) Read

func (r *RarFile) Read(b []byte) (int, error)

func (*RarFile) Seek

func (r *RarFile) Seek(offset int64, whence int) (int64, error)

func (*RarFile) Size

func (r *RarFile) Size() int

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL