1
0

header.go 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. package loader
  2. import (
  3. "encoding/binary"
  4. "fmt"
  5. "io"
  6. )
  7. // HeaderSize is the byte size of the MAK v2 header
  8. const HeaderSize = 32
  9. // ReadHeader reads a MAK v2 header from a reader
  10. func ReadHeader(r io.Reader) (*Header, error) {
  11. var h Header
  12. if _, err := io.ReadFull(r, h.Magic[:]); err != nil {
  13. return nil, fmt.Errorf("reading magic: %w", err)
  14. }
  15. // Check magic
  16. if string(h.Magic[:]) != Magic {
  17. return nil, fmt.Errorf("invalid magic: %s", string(h.Magic[:]))
  18. }
  19. if err := binary.Read(r, binary.LittleEndian, &h.Version); err != nil {
  20. return nil, fmt.Errorf("reading version: %w", err)
  21. }
  22. if err := binary.Read(r, binary.LittleEndian, &h.Flags); err != nil {
  23. return nil, fmt.Errorf("reading flags: %w", err)
  24. }
  25. if err := binary.Read(r, binary.LittleEndian, &h.SectionCount); err != nil {
  26. return nil, fmt.Errorf("reading section count: %w", err)
  27. }
  28. if err := binary.Read(r, binary.LittleEndian, &h.Alignment); err != nil {
  29. return nil, fmt.Errorf("reading alignment: %w", err)
  30. }
  31. if _, err := io.ReadFull(r, h.Reserved[:]); err != nil {
  32. return nil, fmt.Errorf("reading reserved: %w", err)
  33. }
  34. return &h, nil
  35. }
  36. // WriteHeader writes a MAK v2 header to a writer
  37. func WriteHeader(w io.Writer, h *Header) error {
  38. if _, err := w.Write(h.Magic[:]); err != nil {
  39. return err
  40. }
  41. if err := binary.Write(w, binary.LittleEndian, h.Version); err != nil {
  42. return err
  43. }
  44. if err := binary.Write(w, binary.LittleEndian, h.Flags); err != nil {
  45. return err
  46. }
  47. if err := binary.Write(w, binary.LittleEndian, h.SectionCount); err != nil {
  48. return err
  49. }
  50. if err := binary.Write(w, binary.LittleEndian, h.Alignment); err != nil {
  51. return err
  52. }
  53. if _, err := w.Write(h.Reserved[:]); err != nil {
  54. return err
  55. }
  56. return nil
  57. }