Initial working version
This commit is contained in:
parent
3bf8ccebf8
commit
5ea0bbfc87
11 changed files with 648 additions and 1 deletions
44
wire_proto.go
Normal file
44
wire_proto.go
Normal file
|
|
@ -0,0 +1,44 @@
|
|||
package journal
|
||||
|
||||
import (
|
||||
"encoding/binary"
|
||||
"io"
|
||||
"net"
|
||||
)
|
||||
|
||||
var (
|
||||
wireProtocolAttributeSeparator = []byte{'='}
|
||||
wireProtocolAttributeTerminator = []byte{'\n'}
|
||||
)
|
||||
|
||||
// WireWrite is the lowest-level routine. It writes a journal entry using the
|
||||
// native wire protocol documented at https://systemd.io/JOURNAL_NATIVE_PROTOCOL/ .
|
||||
// Invalid attributes are silently skipped. It appends to buf as needed.
|
||||
//
|
||||
// As long as w supports the net.buffersWriter interface, the write will be
|
||||
// atomic, and this function is safe to use across goroutines. Otherwise,
|
||||
// writes may be interleaved.
|
||||
func WireWrite(buf *net.Buffers, w io.Writer, attrs []Attr) error {
|
||||
for i := range attrs {
|
||||
key := attrs[i].Key.key
|
||||
if key == "" {
|
||||
// silently discard invalid attributes
|
||||
continue
|
||||
}
|
||||
|
||||
*buf = append(*buf, []byte(key))
|
||||
if attrs[i].UseTextProto() {
|
||||
*buf = append(*buf, wireProtocolAttributeSeparator)
|
||||
*buf = append(*buf, attrs[i].Value)
|
||||
} else {
|
||||
var valueSize [9]byte
|
||||
valueSize[0] = '\n'
|
||||
binary.LittleEndian.PutUint64(valueSize[1:], uint64(len(attrs[i].Value)))
|
||||
*buf = append(*buf, valueSize[:])
|
||||
*buf = append(*buf, attrs[i].Value)
|
||||
}
|
||||
*buf = append(*buf, wireProtocolAttributeTerminator)
|
||||
}
|
||||
_, err := buf.WriteTo(w)
|
||||
return err
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue