diff --git a/internal/buffer/buffer.go b/internal/buffer/buffer.go new file mode 100644 index 0000000..d2999bc --- /dev/null +++ b/internal/buffer/buffer.go @@ -0,0 +1,39 @@ +package fuseshim + +import ( + "unsafe" + + "github.com/jacobsa/fuse/internal/fusekernel" +) + +// Buffer provides a mechanism for constructing a message from multiple +// segments. +type Buffer []byte + +// alloc allocates size bytes and returns a pointer to the new +// segment. +func (w *Buffer) Alloc(size uintptr) unsafe.Pointer { + s := int(size) + if len(*w)+s > cap(*w) { + old := *w + *w = make([]byte, len(*w), 2*cap(*w)+s) + copy(*w, old) + } + l := len(*w) + *w = (*w)[:l+s] + return unsafe.Pointer(&(*w)[l]) +} + +// reset clears out the contents of the buffer. +func (w *Buffer) reset() { + for i := range (*w)[:cap(*w)] { + (*w)[i] = 0 + } + *w = (*w)[:0] +} + +func NewBuffer(extra uintptr) (buf Buffer) { + const hdrSize = unsafe.Sizeof(fusekernel.OutHeader{}) + buf = make(Buffer, hdrSize, hdrSize+extra) + return +}