iso9660

package module
v0.0.0-...-5dbc9e9 Latest Latest
Warning

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

Go to latest
Published: Oct 19, 2023 License: Apache-2.0 Imports: 15 Imported by: 0

README

iso9660

GoDoc

A package for reading and creating ISO9660, forked from https://github.com/kdomanski/iso9660.

Requires Go 1.13 or newer.

Joliet and Rock Ridge extensions are not supported.

Examples

Extracting an ISO

package main

import (
  "log"

  "github.com/KarpelesLab/iso9660/isoutil"
)

func main() {
  f, err := os.Open("/home/user/myImage.iso")
  if err != nil {
    log.Fatalf("failed to open file: %s", err)
  }
  defer f.Close()

  if err = isoutil.ExtractImageToDirectory(f, "/home/user/target_dir"); err != nil {
    log.Fatalf("failed to extract image: %s", err)
  }
}

Creating an ISO

package main

import (
  "log"
  "os"

  "github.com/KarpelesLab/iso9660"
)

func main() {
  writer, err := iso9660.NewWriter()
  if err != nil {
    log.Fatalf("failed to create writer: %s", err)
  }

  // set volume name
  writer.Primary.VolumeIdentifier = "testvol"

  err = writer.AddLocalFile("/home/user/myFile.txt", "folder/MYFILE.TXT")
  if err != nil {
    log.Fatalf("failed to add file: %s", err)
  }

  outputFile, err := os.OpenFile("/home/user/output.iso", os.O_WRONLY | os.O_TRUNC | os.O_CREATE, 0644)
  if err != nil {
    log.Fatalf("failed to create file: %s", err)
  }

  err = writer.WriteTo(outputFile)
  if err != nil {
    log.Fatalf("failed to write ISO image: %s", err)
  }

  err = outputFile.Close()
  if err != nil {
    log.Fatalf("failed to close output file: %s", err)
  }
}

Streaming an ISO via HTTP

It is possible to stream a dynamically generated file on request via HTTP in order to include files or customize configuration files:

import (
  "http"
  "log"

  "github.com/KarpelesLab/iso9660"
)

func ServeHTTP(rw http.RequestWriter, req *http.Request) {
  writer, err := iso9660.NewWriter()
  if err != nil {
    log.Fatalf("failed to create writer: %s", err)
  }

  // set volume name
  writer.Primary.VolumeIdentifier = "LIVE IMAGE"

  if syslinux, err := iso9660.NewItemFile("/pkg/main/sys-boot.syslinux.core/share/syslinux/isolinux.bin"); err == nil {
    writer.AddBootEntry(&iso9660.BootCatalogEntry{BootInfoTable: true}, isolinux, "isolinux/isolinux.bin")
    writer.AddLocalFile("/pkg/main/sys-boot.syslinux.core/share/syslinux/linux.c32", "isolinux/linux.c32")
    writer.AddLocalFile("/pkg/main/sys-boot.syslinux.core/share/syslinux/ldlinux.c32", "isolinux/ldlinux.c32")
  }

  writer.AddLocalFile("kernel.img", "isolinux/kernel.img")
  writer.AddLocalFile("initrd.img", "isolinux/initrd.img")
  writer.AddLocalFile("root.squashfs", "root.img")
  writer.AddFile(getSyslinuxConfig(), "isolinux/isolinux.cfg")

  rw.Header().Set("Content-Type", "application/x-iso9660-image")
  writer.WriteTo(rw)
}

Documentation

Overview

Package iso9660 implements reading and creating basic ISO9660 images.

Index

Constants

View Source
const (
	ElToritoX86 ElToritoPlatform = 0
	ElToritoPPC ElToritoPlatform = 1
	ElToritoMac ElToritoPlatform = 2
	ElToritoEFI ElToritoPlatform = 0xef

	ElToritoNoEmul    ElToritoEmul = 0
	ElToritoFloppy122 ElToritoEmul = 1
	ElToritoFloppy144 ElToritoEmul = 2
	ElToritoFloppy288 ElToritoEmul = 3
	ElToritoHDD       ElToritoEmul = 4
)

Variables

View Source
var (
	// ErrFileTooLarge is returned when trying to process a file of size greater
	// than 4GB, which due to the 32-bit address limitation is not possible
	// except with ISO 9660-Level 3
	ErrFileTooLarge = errors.New("file is exceeding the maximum file size of 4GB")
	ErrIsDir        = errors.New("is a directory")
)

Functions

func MarshalString

func MarshalString(s string, padToLength int) []byte

func UnmarshalInt16LSBMSB

func UnmarshalInt16LSBMSB(data []byte) (int16, error)

UnmarshalInt16LSBMSB decodes a 16-bit integer in both byte orders, as defined in ECMA-119 7.3.3

func UnmarshalInt32LSBMSB

func UnmarshalInt32LSBMSB(data []byte) (int32, error)

UnmarshalInt32LSBMSB decodes a 32-bit integer in both byte orders, as defined in ECMA-119 7.3.3

func WriteInt16LSBMSB

func WriteInt16LSBMSB(dst []byte, value int16)

WriteInt16LSBMSB writes a 16-bit integer in both byte orders, as defined in ECMA-119 7.2.3

func WriteInt32LSBMSB

func WriteInt32LSBMSB(dst []byte, value int32)

WriteInt32LSBMSB writes a 32-bit integer in both byte orders, as defined in ECMA-119 7.3.3

Types

type BootCatalogEntry

type BootCatalogEntry struct {
	Platform      ElToritoPlatform
	BootMedia     ElToritoEmul // 0=NoEmul, 2=1.44MB disk, 4=HDD
	BootInfoTable bool
	// contains filtered or unexported fields
}

type BootVolumeDescriptorBody

type BootVolumeDescriptorBody struct {
	BootSystemIdentifier string
	BootIdentifier       string
	BootSystemUse        [1977]byte
}

BootVolumeDescriptorBody represents the data in bytes 7-2047 of a Boot Record as defined in ECMA-119 8.2

func (*BootVolumeDescriptorBody) MarshalBinary

func (bvd *BootVolumeDescriptorBody) MarshalBinary() ([]byte, error)

MarshalBinary encodes a BootVolumeDescriptorBody into binary form

func (*BootVolumeDescriptorBody) UnmarshalBinary

func (bvd *BootVolumeDescriptorBody) UnmarshalBinary(data []byte) error

UnmarshalBinary decodes a BootVolumeDescriptorBody from binary form

type DirectoryEntry

type DirectoryEntry struct {
	ExtendedAtributeRecordLength byte
	ExtentLocation               int32
	ExtentLength                 int32
	RecordingDateTime            RecordingTimestamp
	FileFlags                    byte
	FileUnitSize                 byte
	InterleaveGap                byte
	VolumeSequenceNumber         int16
	Identifier                   string
	SystemUse                    []byte
}

DirectoryEntry contains data from a Directory Descriptor as described by ECMA-119 9.1

func (*DirectoryEntry) Clone

func (de *DirectoryEntry) Clone() DirectoryEntry

func (*DirectoryEntry) MarshalBinary

func (de *DirectoryEntry) MarshalBinary() ([]byte, error)

MarshalBinary encodes a DirectoryEntry to binary form

func (*DirectoryEntry) UnmarshalBinary

func (de *DirectoryEntry) UnmarshalBinary(data []byte) error

UnmarshalBinary decodes a DirectoryEntry from binary form

type ElToritoEmul

type ElToritoEmul byte

type ElToritoPlatform

type ElToritoPlatform byte

type File

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

File is a os.FileInfo-compatible wrapper around an ISO9660 directory entry

func (*File) GetChildren

func (f *File) GetChildren() ([]*File, error)

GetChildren returns the chilren entries in case of a directory or an error in case of a file

func (*File) IsDir

func (f *File) IsDir() bool

IsDir returns true if the entry is a directory or false otherwise

func (*File) ModTime

func (f *File) ModTime() time.Time

ModTime returns the entry's recording time

func (*File) Mode

func (f *File) Mode() os.FileMode

Mode returns os.FileMode flag set with the os.ModeDir flag enabled in case of directories

func (*File) Name

func (f *File) Name() string

Name returns the base name of the given entry

func (*File) Reader

func (f *File) Reader() io.Reader

Reader returns a reader that allows to read the file's data. If File is a directory, it returns nil.

func (*File) Size

func (f *File) Size() int64

Size returns the size in bytes of the extent occupied by the file or directory

func (*File) Sys

func (f *File) Sys() interface{}

Sys returns nil

type Image

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

Image is a wrapper around an image file that allows reading its ISO9660 data

func OpenImage

func OpenImage(ra io.ReaderAt) (*Image, error)

OpenImage returns an Image reader reating from a given file

func (*Image) Label

func (i *Image) Label() (string, error)

func (*Image) RootDir

func (i *Image) RootDir() (*File, error)

RootDir returns the File structure corresponding to the root directory of the first primary volume

type ImageWriter

type ImageWriter struct {
	Primary *PrimaryVolumeDescriptorBody
	Catalog string // Catalog is the path of the boot catalog on disk. Defaults to "BOOT.CAT"
	// contains filtered or unexported fields
}

ImageWriter is responsible for staging an image's contents and writing them to an image.

func NewWriter

func NewWriter() (*ImageWriter, error)

NewWriter creates a new ImageWrite.

func (*ImageWriter) AddBootEntry

func (iw *ImageWriter) AddBootEntry(boot *BootCatalogEntry, data Item, filePath string) error

AddBootEntry adds a El Torito boot entry to the image. Typical usage (BootCatalogEntry defaults to X86 with no emulation)

err = AddBootEntry(&BootCatalogEntry{BootInfoTable: true}, NewItemFile("syslinux/isolinux.bin"), "isolinux/isolinux.bin")

func (*ImageWriter) AddFile

func (iw *ImageWriter) AddFile(data io.Reader, filePath string) error

AddFile adds a file to the ImageWriter. All path components are mangled to match basic ISO9660 filename requirements.

func (*ImageWriter) AddLocalFile

func (iw *ImageWriter) AddLocalFile(localPath, filePath string) error

AddLocalFile adds a file to the ImageWriter from the local filesystem. localPath must be an existing and readable file, and filePath will be the path on the ISO image.

func (*ImageWriter) WriteTo

func (iw *ImageWriter) WriteTo(w io.Writer) error

type Item

type Item interface {
	io.Reader
	Size() int64
	Close() error
	// contains filtered or unexported methods
}

func NewItemConcat

func NewItemConcat(items ...Item) Item

NewItemConcat returns a single Item object actually representing multiple items being concatenated.

func NewItemFile

func NewItemFile(filename string) (Item, error)

func NewItemReader

func NewItemReader(r io.Reader) (Item, error)

type PrimaryVolumeDescriptorBody

type PrimaryVolumeDescriptorBody struct {
	SystemIdentifier              string
	VolumeIdentifier              string
	VolumeSpaceSize               int32
	VolumeSetSize                 int16
	VolumeSequenceNumber          int16
	LogicalBlockSize              int16
	PathTableSize                 int32
	TypeLPathTableLoc             int32
	OptTypeLPathTableLoc          int32
	TypeMPathTableLoc             int32
	OptTypeMPathTableLoc          int32
	RootDirectoryEntry            *DirectoryEntry
	VolumeSetIdentifier           string
	PublisherIdentifier           string
	DataPreparerIdentifier        string
	ApplicationIdentifier         string
	CopyrightFileIdentifier       string
	AbstractFileIdentifier        string
	BibliographicFileIdentifier   string
	VolumeCreationDateAndTime     VolumeDescriptorTimestamp
	VolumeModificationDateAndTime VolumeDescriptorTimestamp
	VolumeExpirationDateAndTime   VolumeDescriptorTimestamp
	VolumeEffectiveDateAndTime    VolumeDescriptorTimestamp
	FileStructureVersion          byte
	ApplicationUsed               [512]byte
}

PrimaryVolumeDescriptorBody represents the data in bytes 7-2047 of a Primary Volume Descriptor as defined in ECMA-119 8.4

func (PrimaryVolumeDescriptorBody) MarshalBinary

func (pvd PrimaryVolumeDescriptorBody) MarshalBinary() ([]byte, error)

MarshalBinary encodes the PrimaryVolumeDescriptorBody to its binary form

func (*PrimaryVolumeDescriptorBody) UnmarshalBinary

func (pvd *PrimaryVolumeDescriptorBody) UnmarshalBinary(data []byte) error

UnmarshalBinary decodes a PrimaryVolumeDescriptorBody from binary form as defined in ECMA-119 8.4

type RecordingTimestamp

type RecordingTimestamp time.Time

RecordingTimestamp represents a time and date format that can be encoded according to ECMA-119 9.1.5

func (RecordingTimestamp) MarshalBinary

func (ts RecordingTimestamp) MarshalBinary(dst []byte)

MarshalBinary encodes the RecordingTimestamp in its binary form to a buffer of the length of 7 or more bytes

func (*RecordingTimestamp) UnmarshalBinary

func (ts *RecordingTimestamp) UnmarshalBinary(data []byte) error

UnmarshalBinary decodes a RecordingTimestamp from binary form

type VolumeDescriptorTimestamp

type VolumeDescriptorTimestamp struct {
	Year      int
	Month     int
	Day       int
	Hour      int
	Minute    int
	Second    int
	Hundredth int
	Offset    int
}

VolumeDescriptorTimestamp represents a time and date format that can be encoded according to ECMA-119 8.4.26.1

func VolumeDescriptorTimestampFromTime

func VolumeDescriptorTimestampFromTime(t time.Time) VolumeDescriptorTimestamp

VolumeDescriptorTimestampFromTime converts time.Time to VolumeDescriptorTimestamp

func (*VolumeDescriptorTimestamp) MarshalBinary

func (ts *VolumeDescriptorTimestamp) MarshalBinary() ([]byte, error)

MarshalBinary encodes the timestamp into a binary form

func (*VolumeDescriptorTimestamp) UnmarshalBinary

func (ts *VolumeDescriptorTimestamp) UnmarshalBinary(data []byte) error

UnmarshalBinary decodes a VolumeDescriptorTimestamp from binary form

Directories

Path Synopsis
cmd

Jump to

Keyboard shortcuts

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