summaryrefslogtreecommitdiffhomepage
path: root/dhcpv4/bsdp/boot_image.go
diff options
context:
space:
mode:
Diffstat (limited to 'dhcpv4/bsdp/boot_image.go')
-rw-r--r--dhcpv4/bsdp/boot_image.go45
1 files changed, 18 insertions, 27 deletions
diff --git a/dhcpv4/bsdp/boot_image.go b/dhcpv4/bsdp/boot_image.go
index 88a9404..fa9b1a6 100644
--- a/dhcpv4/bsdp/boot_image.go
+++ b/dhcpv4/bsdp/boot_image.go
@@ -3,6 +3,8 @@ package bsdp
import (
"encoding/binary"
"fmt"
+
+ "github.com/u-root/u-root/pkg/uio"
)
// BootImageType represents the different BSDP boot image types.
@@ -60,16 +62,14 @@ func (b BootImageID) String() string {
return s + " " + t + " image"
}
-// BootImageIDFromBytes deserializes a collection of 4 bytes to a BootImageID.
-func BootImageIDFromBytes(bytes []byte) (*BootImageID, error) {
- if len(bytes) < 4 {
- return nil, fmt.Errorf("not enough bytes to serialize BootImageID")
- }
- return &BootImageID{
- IsInstall: bytes[0]&0x80 != 0,
- ImageType: BootImageType(bytes[0] & 0x7f),
- Index: binary.BigEndian.Uint16(bytes[2:]),
- }, nil
+// Unmarshal reads b's binary representation from buf.
+func (b *BootImageID) Unmarshal(buf *uio.Lexer) error {
+ byte0 := buf.Read8()
+ _ = buf.Read8()
+ b.IsInstall = byte0&0x80 != 0
+ b.ImageType = BootImageType(byte0 & 0x7f)
+ b.Index = buf.Read16()
+ return buf.Error()
}
// BootImage describes a boot image - contains the boot image ID and the name.
@@ -87,25 +87,16 @@ func (b *BootImage) ToBytes() []byte {
}
// String converts a BootImage to a human-readable representation.
-func (b *BootImage) String() string {
+func (b BootImage) String() string {
return fmt.Sprintf("%v %v", b.Name, b.ID.String())
}
-// BootImageFromBytes returns a deserialized BootImage struct from bytes.
-func BootImageFromBytes(bytes []byte) (*BootImage, error) {
- // Should at least contain 4 bytes of BootImageID + byte for length of
- // boot image name.
- if len(bytes) < 5 {
- return nil, fmt.Errorf("not enough bytes to serialize BootImage")
- }
- imageID, err := BootImageIDFromBytes(bytes[:4])
- if err != nil {
- return nil, err
- }
- nameLength := int(bytes[4])
- if 5+nameLength > len(bytes) {
- return nil, fmt.Errorf("not enough bytes for BootImage")
+// Unmarshal reads data from buf into b.
+func (b *BootImage) Unmarshal(buf *uio.Lexer) error {
+ if err := (&b.ID).Unmarshal(buf); err != nil {
+ return err
}
- name := string(bytes[5 : 5+nameLength])
- return &BootImage{ID: *imageID, Name: name}, nil
+ nameLength := buf.Read8()
+ b.Name = string(buf.Consume(int(nameLength)))
+ return buf.Error()
}