From ea94c0ecc07b1542028aea143a5bc9748f19ef2f Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Sun, 6 Aug 2017 12:01:04 +0200 Subject: ... --- zsig/zsig.go | 37 +++++++++++++++++++++++++++++++++++-- 1 file changed, 35 insertions(+), 2 deletions(-) diff --git a/zsig/zsig.go b/zsig/zsig.go index 97c7824..e647cb4 100644 --- a/zsig/zsig.go +++ b/zsig/zsig.go @@ -126,6 +126,7 @@ func (z *Reader) readString() (string, error) { type Writer struct { Header wroteHeader bool + w io.Writer } // TODO @@ -134,6 +135,7 @@ func NewWriter(w io.Writer) (*Writer, error) { Header: Header{ OS: osUnix, // UNIX }, + w: w, } return z, nil } @@ -157,8 +159,39 @@ func (z *Writer) Write(p []byte) (n int, err error) { le.PutUint32(buf[4:8], uint32(z.ModTime.Unix())) } buf[9] = z.OS - // TODO - // w.Write(buf[:10]) + if _, err := z.w.Write(buf[:10]); err != nil { + return 0, err + } + if z.Extra != nil { + if len(z.Extra) > 0xffff { + return 0, errors.New("Extra data is too large") + } + var sz [2]byte + le.PutUint16(sz[:2], uint16(len(z.Extra))) + if _, err := z.w.Write(sz[:2]); err != nil { + return 0, err + } + if _, err := z.w.Write(z.Extra); err != nil { + return 0, err + } + } + if z.Name != "" { + if _, err := io.WriteString(z.w, z.Name); err != nil { + return 0, err + } + if _, err := z.w.Write([]byte{0}); err != nil { + return 0, err + } + } + if z.Comment != "" { + if _, err := io.WriteString(z.w, z.Comment); err != nil { + return 0, err + } + if _, err := z.w.Write([]byte{0}); err != nil { + return 0, err + } + } + } panic("not implemented") } -- cgit v1.2.3