aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2017-07-26 03:17:36 +0200
committerDimitri Sokolyuk <demon@dim13.org>2017-07-26 03:17:36 +0200
commit4be28d7709c434c5427d388a91b760a1188bc408 (patch)
tree836a645d7b5ac2e4d705a81314a6c2fa9114c4ff
parentaaef79577ef5d1e6cdcb0d85b6f628ed5b05ed24 (diff)
Export Reader
-rw-r--r--zsig/zsig.go68
1 files changed, 29 insertions, 39 deletions
diff --git a/zsig/zsig.go b/zsig/zsig.go
index e70568b..c375362 100644
--- a/zsig/zsig.go
+++ b/zsig/zsig.go
@@ -24,18 +24,14 @@ const (
var fake = []byte{gzipID1, gzipID2, gzipDeflate, flagComment, 0, 0, 0, 0, 0, 3}
-type header struct {
+type Reader struct {
Comment string
Extra []byte
ModTime time.Time
Name string
OS byte
-}
-
-type Reader struct {
- header
- r *bufio.Reader
- digest uint32 // CRC32 IEEE
+ Digest uint32 // CRC32 IEEE
+ *bufio.Reader
}
func noEOF(err error) error {
@@ -48,69 +44,67 @@ func noEOF(err error) error {
var le = binary.LittleEndian
func NewReader(r io.Reader) (*Reader, error) {
- z := &Reader{r: bufio.NewReader(r)}
- hdr, err := z.readHeader()
- if err != nil {
+ z := &Reader{Reader: bufio.NewReader(r)}
+ if err := z.readHeader(); err != nil {
return nil, err
}
- z.header = hdr
return z, nil
}
-func (z *Reader) readHeader() (hdr header, err error) {
+func (z *Reader) readHeader() error {
var buf [10]byte
- if _, err := io.ReadFull(z.r, buf[:10]); err != nil {
- return hdr, err
+ if _, err := io.ReadFull(z, buf[:10]); err != nil {
+ return err
}
if buf[0] != gzipID1 || buf[1] != gzipID2 || buf[2] != gzipDeflate {
- return hdr, ErrHeader
+ return ErrHeader
}
flg := buf[3]
if t := le.Uint32(buf[4:8]); t > 0 {
- hdr.ModTime = time.Unix(int64(t), 0)
+ z.ModTime = time.Unix(int64(t), 0)
}
- hdr.OS = buf[9]
- z.digest = crc32.ChecksumIEEE(buf[:10])
+ z.OS = buf[9]
+ z.Digest = crc32.ChecksumIEEE(buf[:10])
if flg&flagExtra != 0 {
- if _, err = io.ReadFull(z.r, buf[:2]); err != nil {
- return hdr, noEOF(err)
+ if _, err := io.ReadFull(z, buf[:2]); err != nil {
+ return noEOF(err)
}
- z.digest = crc32.Update(z.digest, crc32.IEEETable, buf[:2])
+ z.Digest = crc32.Update(z.Digest, crc32.IEEETable, buf[:2])
data := make([]byte, le.Uint16(buf[:2]))
- if _, err := io.ReadFull(z.r, data); err != nil {
- return hdr, noEOF(err)
+ if _, err := io.ReadFull(z, data); err != nil {
+ return noEOF(err)
}
- z.digest = crc32.Update(z.digest, crc32.IEEETable, data)
- hdr.Extra = data
+ z.Digest = crc32.Update(z.Digest, crc32.IEEETable, data)
+ z.Extra = data
}
if flg&flagName != 0 {
s, err := z.readString()
if err != nil {
- return hdr, err
+ return err
}
- hdr.Name = s
+ z.Name = s
}
if flg&flagComment != 0 {
s, err := z.readString()
if err != nil {
- return hdr, err
+ return err
}
- hdr.Comment = s
+ z.Comment = s
}
if flg&flagHdrCrc != 0 {
- if _, err := io.ReadFull(z.r, buf[:2]); err != nil {
- return hdr, noEOF(err)
+ if _, err := io.ReadFull(z, buf[:2]); err != nil {
+ return noEOF(err)
}
digest := le.Uint16(buf[:2])
- if digest != uint16(z.digest) {
- return hdr, ErrHeader
+ if digest != uint16(z.Digest) {
+ return ErrHeader
}
}
- return hdr, nil
+ return nil
}
func (z *Reader) readString() (string, error) {
- s, err := z.r.ReadString(0)
+ s, err := z.ReadString(0)
if err != nil {
return "", err
}
@@ -119,7 +113,3 @@ func (z *Reader) readString() (string, error) {
}
return s, nil
}
-
-func (z *Reader) Read(p []byte) (n int, err error) {
- return z.r.Read(p)
-}