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 }