.github
apt
ar
ar_test.go
header.go
reader.go
write.go
deb822
dpkg
internal
LICENSE
README.md
go.mod
go.sum
Signed-off-by: Matheus Sampaio Queiroga <srherobrine20@gmail.com>
55 lines
1.0 KiB
Go
55 lines
1.0 KiB
Go
package ar
|
|
|
|
import "io"
|
|
|
|
type Writer struct {
|
|
w io.Writer
|
|
size int64
|
|
previusHeader *Header
|
|
}
|
|
|
|
func NewWriter(w io.Writer) (wr *Writer, err error) {
|
|
// Write ar magic header
|
|
if _, err = w.Write([]byte(arMagic)); err == nil {
|
|
wr = &Writer{w: w, size: 0}
|
|
}
|
|
return
|
|
}
|
|
|
|
func (w *Writer) WriteFile(data []byte, hdr *Header) (n int64, err error) {
|
|
if w.size <= 0 {
|
|
if err = w.WriteHeader(hdr); err == nil {
|
|
n2, err2 := w.Write(data)
|
|
n = int64(n2)
|
|
if err2 != nil {
|
|
err = err2
|
|
}
|
|
}
|
|
}
|
|
return
|
|
}
|
|
|
|
func (w *Writer) Write(p []byte) (n int, err error) {
|
|
if w.size <= 0 {
|
|
return 0, io.EOF
|
|
} else if int64(len(p)) > w.size {
|
|
p = p[0:w.size]
|
|
}
|
|
n, err = w.w.Write(p)
|
|
w.size -= int64(n)
|
|
if w.size == 0 && (w.previusHeader.Size&1) == 1 {
|
|
w.w.Write([]byte{0x0A}) // Ignore the last byte if the size is odd
|
|
}
|
|
return
|
|
}
|
|
|
|
func (w *Writer) WriteHeader(hdr *Header) error {
|
|
if w.size > 0 {
|
|
return io.ErrShortWrite
|
|
}
|
|
w.size = hdr.Size
|
|
w.previusHeader = hdr
|
|
_, err := w.w.Write(hdr.gnuHeader()) // Writed gnu header
|
|
return err
|
|
}
|