github.com/hugelgupf/u-root@v0.0.0-20191023214958-4807c632154c/pkg/multiboot/reader.go (about)

     1  // Copyright 2019 the u-root Authors. All rights reserved
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package multiboot
     6  
     7  import (
     8  	"compress/gzip"
     9  	"fmt"
    10  	"io"
    11  	"io/ioutil"
    12  	"os"
    13  )
    14  
    15  type kernelReader struct {
    16  	buf []byte
    17  	off int
    18  }
    19  
    20  func (kr kernelReader) ReadAt(p []byte, off int64) (n int, err error) {
    21  	if off < 0 || off > int64(len(kr.buf)) {
    22  		return 0, fmt.Errorf("bad offset %v", off)
    23  	}
    24  	if n = copy(p, kr.buf[off:]); n < len(p) {
    25  		err = io.EOF
    26  	}
    27  	return n, err
    28  }
    29  
    30  func (kr *kernelReader) Read(p []byte) (n int, err error) {
    31  	if n = copy(p, kr.buf[kr.off:]); n < len(p) {
    32  		err = io.EOF
    33  	}
    34  	kr.off += n
    35  	return n, err
    36  }
    37  
    38  func readGzip(r io.Reader) ([]byte, error) {
    39  	z, err := gzip.NewReader(r)
    40  	if err != nil {
    41  		return nil, err
    42  	}
    43  	defer z.Close()
    44  	return ioutil.ReadAll(z)
    45  }
    46  
    47  func readFile(name string) ([]byte, error) {
    48  	f, err := os.Open(name)
    49  	if err != nil {
    50  		return nil, err
    51  	}
    52  	defer f.Close()
    53  	b, err := readGzip(f)
    54  	if err == nil {
    55  		return b, err
    56  	}
    57  	if _, err := f.Seek(0, io.SeekStart); err != nil {
    58  		return nil, fmt.Errorf("cannot rewind file: %v", err)
    59  	}
    60  
    61  	return ioutil.ReadAll(f)
    62  }