Files
.github
apt
ar
ar_test.go
header.go
reader.go
write.go
deb822
dpkg
internal
LICENSE
README.md
go.mod
go.sum
Matheus Sampaio Queiroga 1cd953f90f Start dpkg
Signed-off-by: Matheus Sampaio Queiroga <srherobrine20@gmail.com>
2025-03-11 22:50:43 -03:00

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
}