aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2017-08-06 12:01:04 +0200
committerDimitri Sokolyuk <demon@dim13.org>2017-08-06 12:01:04 +0200
commitea94c0ecc07b1542028aea143a5bc9748f19ef2f (patch)
tree332884c1dfb730de8ab30d101ec0b26ce7767933
parent30d6f2dc02372f0e9947196a8c287f3b106da08b (diff)
...
-rw-r--r--zsig/zsig.go37
1 files 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")
}